diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..b7db779
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,12 @@
+/.gradle
+/baksmali/build
+/dexlib/build
+/dexlib2/build
+/dexlib2/accessorTestGenerator/build
+/smali/build
+/util/build
+/smalidea/build
+*.iml
+*.ipr
+*.iws
+.idea
diff --git a/NOTICE b/NOTICE
new file mode 100644
index 0000000..7f27c9f
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,85 @@
+The majority of smali/baksmali is written and copyrighted by me (Ben Gruver)
+and released under the following license:
+
+*******************************************************************************
+Copyright (c) 2010 Ben Gruver (JesusFreke)
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+3. The name of the author may not be used to endorse or promote products
+   derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*******************************************************************************
+
+
+Unless otherwise stated in the code/commit message, any changes with the
+committer of bgruv@google.com or wkal@google.com is copyrighted by
+Google Inc. and released under the following license:
+
+*******************************************************************************
+Copyright 2011, Google Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+    * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*******************************************************************************
+
+
+Various portions of the code are taken from the Android Open Source Project,
+and are used in accordance with the following license:
+
+*******************************************************************************
+Copyright (C) 2007 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*******************************************************************************
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..a5169b4
--- /dev/null
+++ b/README.md
@@ -0,0 +1,19 @@
+### About
+
+smali/baksmali is an assembler/disassembler for the dex format used by dalvik, Android's Java VM implementation. The syntax is loosely based on Jasmin's/dedexer's syntax, and supports the full functionality of the dex format (annotations, debug info, line info, etc.)
+
+Downloads are at  https://bitbucket.org/JesusFreke/smali/downloads/. If you are interested in submitting a patch, feel free to send me a pull request here.
+
+See [the wiki](https://github.com/JesusFreke/smali/wiki) for more info/news/release notes/etc.
+
+#### Support
+- [github Issue tracker](https://github.com/JesusFreke/smali/issues) - For any bugs/issues/feature requests
+- [#smali on freenode](http://webchat.freenode.net/?channels=smali) - Free free to drop by and ask a question. Don't expect an instant response, but if you hang around someone will respond.
+
+
+#### Some useful links for getting started with smali
+
+- [Official dex bytecode reference](https://source.android.com/devices/tech/dalvik/dalvik-bytecode.html)
+- [Registers wiki page](https://github.com/JesusFreke/smali/wiki/Registers)
+- [Types, Methods and Fields wiki page](https://github.com/JesusFreke/smali/wiki/TypesMethodsAndFields)
+- [Official dex format reference](https://source.android.com/devices/tech/dalvik/dex-format.html)
diff --git a/baksmali-2.4.0.jar b/baksmali-2.4.0.jar
deleted file mode 100644
index 5bc0188..0000000
Binary files a/baksmali-2.4.0.jar and /dev/null differ
diff --git a/baksmali/build.gradle b/baksmali/build.gradle
new file mode 100644
index 0000000..aae88a3
--- /dev/null
+++ b/baksmali/build.gradle
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+buildscript {
+    repositories {
+        mavenCentral()
+    }
+    dependencies {
+        classpath depends.proguard_gradle
+    }
+}
+
+dependencies {
+    compile project(':util')
+    compile project(':dexlib2')
+    compile depends.guava
+    compile depends.jcommander
+
+    testCompile depends.junit
+    testCompile project(':smali')
+}
+
+processResources.inputs.property('version', version)
+processResources.expand('version': version)
+
+// Build a separate jar that contains all dependencies
+task fatJar(type: Jar) {
+    from sourceSets.main.output
+    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
+
+    classifier = 'fat'
+
+    manifest {
+        attributes('Main-Class': 'org.jf.baksmali.Main')
+    }
+
+    doLast {
+        if (!System.getProperty('os.name').toLowerCase().contains('windows')) {
+            ant.symlink(link: file("${destinationDir}/baksmali.jar"), resource: archivePath, overwrite: true)
+        }
+    }
+}
+tasks.getByPath('build').dependsOn(fatJar)
+
+uploadArchives {
+    repositories.mavenDeployer {
+        pom.project {
+            description 'baksmali is a disassembler for dalvik bytecode'
+            scm {
+                url 'https://github.com/JesusFreke/smali/tree/master/baksmali'
+            }
+        }
+    }
+}
+
+task proguard(type: proguard.gradle.ProGuardTask, dependsOn: fatJar) {
+    def outFile = fatJar.destinationDir.getPath() + '/' + fatJar.baseName + '-' + fatJar.version + '-small' + '.' + fatJar.extension
+
+    injars fatJar.archivePath
+    outjars outFile
+
+    libraryjars "${System.properties['java.home']}/lib/rt.jar"
+
+    dontobfuscate
+    dontoptimize
+
+    keep 'public class org.jf.baksmali.Main { public static void main(java.lang.String[]); }'
+    keep 'public class org.jf.util.jcommander.ColonParameterSplitter'
+    keep 'class com.beust.jcommander.** { *; }'
+    keepclassmembers 'enum * { public static **[] values(); public static ** valueOf(java.lang.String); }'
+
+    dontwarn 'com.google.common.**'
+    dontnote 'com.google.common.**'
+}
+
+tasks.getByPath(':release').dependsOn(proguard)
+
+task fastbuild(dependsOn: build) {
+}
+
+task fb(dependsOn: fastbuild) {
+}
+
+tasks.getByPath('javadoc').onlyIf({
+    !gradle.taskGraph.hasTask(fastbuild)
+})
+
+tasks.getByPath('test').onlyIf({
+    !gradle.taskGraph.hasTask(fastbuild)
+})
\ No newline at end of file
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/AnnotationFormatter.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/AnnotationFormatter.java
new file mode 100644
index 0000000..1310f19
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/AnnotationFormatter.java
@@ -0,0 +1,69 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors;
+
+import org.jf.baksmali.Adaptors.EncodedValue.AnnotationEncodedValueAdaptor;
+import org.jf.dexlib2.AnnotationVisibility;
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.util.IndentingWriter;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.IOException;
+import java.util.Collection;
+
+public class AnnotationFormatter {
+
+    public static void writeTo(@Nonnull IndentingWriter writer,
+                               @Nonnull Collection<? extends Annotation> annotations,
+                               @Nullable String containingClass) throws IOException {
+        boolean first = true;
+        for (Annotation annotation: annotations) {
+            if (!first) {
+                writer.write('\n');
+            }
+            first = false;
+
+            writeTo(writer, annotation, containingClass);
+        }
+    }
+
+    public static void writeTo(@Nonnull IndentingWriter writer, @Nonnull Annotation annotation,
+                               @Nullable String containingClass) throws IOException {
+        writer.write(".annotation ");
+        writer.write(AnnotationVisibility.getVisibility(annotation.getVisibility()));
+        writer.write(' ');
+        writer.write(annotation.getType());
+        writer.write('\n');
+
+        AnnotationEncodedValueAdaptor.writeElementsTo(writer, annotation.getElements(), containingClass);
+
+        writer.write(".end annotation\n");
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/BlankMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/BlankMethodItem.java
new file mode 100644
index 0000000..d007849
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/BlankMethodItem.java
@@ -0,0 +1,48 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors;
+
+import org.jf.util.IndentingWriter;
+
+//a "spacer" between instructions
+public class BlankMethodItem extends MethodItem {
+    public BlankMethodItem(int codeAddress) {
+        super(codeAddress);
+    }
+
+    public double getSortOrder() {
+        return Integer.MAX_VALUE;
+    }
+
+    public boolean writeTo(IndentingWriter writer) {
+        //we didn't technically print something, but returning true indicates that a newline should be printed
+        //after this method item, which is the intended functionality
+        return true;
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/CatchMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/CatchMethodItem.java
new file mode 100644
index 0000000..4b545ee
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/CatchMethodItem.java
@@ -0,0 +1,97 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors;
+
+import org.jf.baksmali.BaksmaliOptions;
+import org.jf.util.IndentingWriter;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.IOException;
+
+public class CatchMethodItem extends MethodItem {
+    private final String exceptionType;
+
+    private final LabelMethodItem tryStartLabel;
+    private final LabelMethodItem tryEndLabel;
+    private final LabelMethodItem handlerLabel;
+
+    public CatchMethodItem(@Nonnull BaksmaliOptions options, @Nonnull MethodDefinition.LabelCache labelCache,
+                           int codeAddress, @Nullable String exceptionType, int startAddress, int endAddress,
+                           int handlerAddress) {
+        super(codeAddress);
+        this.exceptionType = exceptionType;
+
+        tryStartLabel = labelCache.internLabel(new LabelMethodItem(options, startAddress, "try_start_"));
+
+        //use the address from the last covered instruction, but make the label
+        //name refer to the address of the next instruction
+        tryEndLabel = labelCache.internLabel(new EndTryLabelMethodItem(options, codeAddress, endAddress));
+
+        if (exceptionType == null) {
+            handlerLabel = labelCache.internLabel(new LabelMethodItem(options, handlerAddress, "catchall_"));
+        } else {
+            handlerLabel = labelCache.internLabel(new LabelMethodItem(options, handlerAddress, "catch_"));
+        }
+    }
+
+    public LabelMethodItem getTryStartLabel() {
+        return tryStartLabel;
+    }
+
+    public LabelMethodItem getTryEndLabel() {
+        return tryEndLabel;
+    }
+
+    public LabelMethodItem getHandlerLabel() {
+        return handlerLabel;
+    }
+
+    public double getSortOrder() {
+        //sort after instruction and end_try label
+        return 102;
+    }
+
+    @Override
+    public boolean writeTo(IndentingWriter writer) throws IOException {
+        if (exceptionType == null) {
+            writer.write(".catchall");
+        } else {
+            writer.write(".catch ");
+            writer.write(exceptionType);
+        }
+        writer.write(" {");
+        tryStartLabel.writeTo(writer);
+        writer.write(" .. ");
+        tryEndLabel.writeTo(writer);
+        writer.write("} ");
+        handlerLabel.writeTo(writer);
+        return true;
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/ClassDefinition.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/ClassDefinition.java
new file mode 100644
index 0000000..73603f1
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/ClassDefinition.java
@@ -0,0 +1,331 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors;
+
+import org.jf.baksmali.BaksmaliOptions;
+import org.jf.dexlib2.AccessFlags;
+import org.jf.dexlib2.dexbacked.DexBackedClassDef;
+import org.jf.dexlib2.iface.*;
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction21c;
+import org.jf.dexlib2.iface.reference.FieldReference;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.dexlib2.util.ReferenceUtil;
+import org.jf.util.IndentingWriter;
+import org.jf.util.StringUtils;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class ClassDefinition {
+    @Nonnull public final BaksmaliOptions options;
+    @Nonnull public final ClassDef classDef;
+    @Nonnull private final HashSet<String> fieldsSetInStaticConstructor;
+
+    protected boolean validationErrors;
+
+    public ClassDefinition(@Nonnull BaksmaliOptions options, @Nonnull ClassDef classDef) {
+        this.options = options;
+        this.classDef = classDef;
+        fieldsSetInStaticConstructor = findFieldsSetInStaticConstructor(classDef);
+    }
+
+    public boolean hadValidationErrors() {
+        return validationErrors;
+    }
+
+    @Nonnull
+    private static HashSet<String> findFieldsSetInStaticConstructor(@Nonnull ClassDef classDef) {
+        HashSet<String> fieldsSetInStaticConstructor = new HashSet<String>();
+
+        for (Method method: classDef.getDirectMethods()) {
+            if (method.getName().equals("<clinit>")) {
+                MethodImplementation impl = method.getImplementation();
+                if (impl != null) {
+                    for (Instruction instruction: impl.getInstructions()) {
+                        switch (instruction.getOpcode()) {
+                            case SPUT:
+                            case SPUT_BOOLEAN:
+                            case SPUT_BYTE:
+                            case SPUT_CHAR:
+                            case SPUT_OBJECT:
+                            case SPUT_SHORT:
+                            case SPUT_WIDE: {
+                                Instruction21c ins = (Instruction21c)instruction;
+                                FieldReference fieldRef = (FieldReference)ins.getReference();
+                                try {
+                                    fieldRef.validateReference();
+                                    if (fieldRef.getDefiningClass().equals((classDef.getType()))) {
+                                        fieldsSetInStaticConstructor.add(ReferenceUtil.getShortFieldDescriptor(fieldRef));
+                                    }
+                                } catch (Reference.InvalidReferenceException ex) {
+                                    // Just ignore for now. We'll deal with it when processing the instruction
+                                }
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return fieldsSetInStaticConstructor;
+    }
+
+    public void writeTo(IndentingWriter writer) throws IOException {
+        writeClass(writer);
+        writeSuper(writer);
+        writeSourceFile(writer);
+        writeInterfaces(writer);
+        writeAnnotations(writer);
+        Set<String> staticFields = writeStaticFields(writer);
+        writeInstanceFields(writer, staticFields);
+        Set<String> directMethods = writeDirectMethods(writer);
+        writeVirtualMethods(writer, directMethods);
+    }
+
+    private void writeClass(IndentingWriter writer) throws IOException {
+        writer.write(".class ");
+        writeAccessFlags(writer);
+        writer.write(classDef.getType());
+        writer.write('\n');
+    }
+
+    private void writeAccessFlags(IndentingWriter writer) throws IOException {
+        for (AccessFlags accessFlag: AccessFlags.getAccessFlagsForClass(classDef.getAccessFlags())) {
+            writer.write(accessFlag.toString());
+            writer.write(' ');
+        }
+    }
+
+    private void writeSuper(IndentingWriter writer) throws IOException {
+        String superClass = classDef.getSuperclass();
+        if (superClass != null) {
+            writer.write(".super ");
+            writer.write(superClass);
+            writer.write('\n');
+        }
+    }
+
+    private void writeSourceFile(IndentingWriter writer) throws IOException {
+        String sourceFile = classDef.getSourceFile();
+        if (sourceFile != null) {
+            writer.write(".source \"");
+            StringUtils.writeEscapedString(writer, sourceFile);
+            writer.write("\"\n");
+        }
+    }
+
+    private void writeInterfaces(IndentingWriter writer) throws IOException {
+        List<String> interfaces = classDef.getInterfaces();
+
+        if (interfaces.size() != 0) {
+            writer.write('\n');
+            writer.write("# interfaces\n");
+            for (String interfaceName: interfaces) {
+                writer.write(".implements ");
+                writer.write(interfaceName);
+                writer.write('\n');
+            }
+        }
+    }
+
+    private void writeAnnotations(IndentingWriter writer) throws IOException {
+        Collection<? extends Annotation> classAnnotations = classDef.getAnnotations();
+        if (classAnnotations.size() != 0) {
+            writer.write("\n\n");
+            writer.write("# annotations\n");
+
+            String containingClass = null;
+            if (options.implicitReferences) {
+                containingClass = classDef.getType();
+            }
+
+            AnnotationFormatter.writeTo(writer, classAnnotations, containingClass);
+        }
+    }
+
+    private Set<String> writeStaticFields(IndentingWriter writer) throws IOException {
+        boolean wroteHeader = false;
+        Set<String> writtenFields = new HashSet<String>();
+
+        Iterable<? extends Field> staticFields;
+        if (classDef instanceof DexBackedClassDef) {
+            staticFields = ((DexBackedClassDef)classDef).getStaticFields(false);
+        } else {
+            staticFields = classDef.getStaticFields();
+        }
+
+        for (Field field: staticFields) {
+            if (!wroteHeader) {
+                writer.write("\n\n");
+                writer.write("# static fields");
+                wroteHeader = true;
+            }
+            writer.write('\n');
+
+            boolean setInStaticConstructor;
+            IndentingWriter fieldWriter = writer;
+            String fieldString = ReferenceUtil.getShortFieldDescriptor(field);
+            if (!writtenFields.add(fieldString)) {
+                writer.write("# duplicate field ignored\n");
+                fieldWriter = new CommentingIndentingWriter(writer);
+                System.err.println(String.format("Ignoring duplicate field: %s->%s", classDef.getType(), fieldString));
+                setInStaticConstructor = false;
+            } else {
+                setInStaticConstructor = fieldsSetInStaticConstructor.contains(fieldString);
+            }
+            FieldDefinition.writeTo(options, fieldWriter, field, setInStaticConstructor);
+        }
+        return writtenFields;
+    }
+
+    private void writeInstanceFields(IndentingWriter writer, Set<String> staticFields) throws IOException {
+        boolean wroteHeader = false;
+        Set<String> writtenFields = new HashSet<String>();
+
+        Iterable<? extends Field> instanceFields;
+        if (classDef instanceof DexBackedClassDef) {
+            instanceFields = ((DexBackedClassDef)classDef).getInstanceFields(false);
+        } else {
+            instanceFields = classDef.getInstanceFields();
+        }
+
+        for (Field field: instanceFields) {
+            if (!wroteHeader) {
+                writer.write("\n\n");
+                writer.write("# instance fields");
+                wroteHeader = true;
+            }
+            writer.write('\n');
+
+            IndentingWriter fieldWriter = writer;
+            String fieldString = ReferenceUtil.getShortFieldDescriptor(field);
+            if (!writtenFields.add(fieldString)) {
+                writer.write("# duplicate field ignored\n");
+                fieldWriter = new CommentingIndentingWriter(writer);
+                System.err.println(String.format("Ignoring duplicate field: %s->%s", classDef.getType(), fieldString));
+            } else if (staticFields.contains(fieldString)) {
+                System.err.println(String.format("Duplicate static+instance field found: %s->%s",
+                        classDef.getType(), fieldString));
+                System.err.println("You will need to rename one of these fields, including all references.");
+
+                writer.write("# There is both a static and instance field with this signature.\n" +
+                             "# You will need to rename one of these fields, including all references.\n");
+            }
+            FieldDefinition.writeTo(options, fieldWriter, field, false);
+        }
+    }
+
+    private Set<String> writeDirectMethods(IndentingWriter writer) throws IOException {
+        boolean wroteHeader = false;
+        Set<String> writtenMethods = new HashSet<String>();
+
+        Iterable<? extends Method> directMethods;
+        if (classDef instanceof DexBackedClassDef) {
+            directMethods = ((DexBackedClassDef)classDef).getDirectMethods(false);
+        } else {
+            directMethods = classDef.getDirectMethods();
+        }
+
+        for (Method method: directMethods) {
+            if (!wroteHeader) {
+                writer.write("\n\n");
+                writer.write("# direct methods");
+                wroteHeader = true;
+            }
+            writer.write('\n');
+
+            // TODO: check for method validation errors
+            String methodString = ReferenceUtil.getMethodDescriptor(method, true);
+
+            IndentingWriter methodWriter = writer;
+            if (!writtenMethods.add(methodString)) {
+                writer.write("# duplicate method ignored\n");
+                methodWriter = new CommentingIndentingWriter(writer);
+            }
+
+            MethodImplementation methodImpl = method.getImplementation();
+            if (methodImpl == null) {
+                MethodDefinition.writeEmptyMethodTo(methodWriter, method, options);
+            } else {
+                MethodDefinition methodDefinition = new MethodDefinition(this, method, methodImpl);
+                methodDefinition.writeTo(methodWriter);
+            }
+        }
+        return writtenMethods;
+    }
+
+    private void writeVirtualMethods(IndentingWriter writer, Set<String> directMethods) throws IOException {
+        boolean wroteHeader = false;
+        Set<String> writtenMethods = new HashSet<String>();
+
+        Iterable<? extends Method> virtualMethods;
+        if (classDef instanceof DexBackedClassDef) {
+            virtualMethods = ((DexBackedClassDef)classDef).getVirtualMethods(false);
+        } else {
+            virtualMethods = classDef.getVirtualMethods();
+        }
+
+        for (Method method: virtualMethods) {
+            if (!wroteHeader) {
+                writer.write("\n\n");
+                writer.write("# virtual methods");
+                wroteHeader = true;
+            }
+            writer.write('\n');
+
+            // TODO: check for method validation errors
+            String methodString = ReferenceUtil.getMethodDescriptor(method, true);
+
+            IndentingWriter methodWriter = writer;
+            if (!writtenMethods.add(methodString)) {
+                writer.write("# duplicate method ignored\n");
+                methodWriter = new CommentingIndentingWriter(writer);
+            } else if (directMethods.contains(methodString)) {
+                writer.write("# There is both a direct and virtual method with this signature.\n" +
+                             "# You will need to rename one of these methods, including all references.\n");
+                System.err.println(String.format("Duplicate direct+virtual method found: %s->%s",
+                        classDef.getType(), methodString));
+                System.err.println("You will need to rename one of these methods, including all references.");
+            }
+
+            MethodImplementation methodImpl = method.getImplementation();
+            if (methodImpl == null) {
+                MethodDefinition.writeEmptyMethodTo(methodWriter, method, options);
+            } else {
+                MethodDefinition methodDefinition = new MethodDefinition(this, method, methodImpl);
+                methodDefinition.writeTo(methodWriter);
+            }
+        }
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/CommentMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/CommentMethodItem.java
new file mode 100644
index 0000000..8ac4396
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/CommentMethodItem.java
@@ -0,0 +1,55 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors;
+
+import org.jf.util.IndentingWriter;
+
+import java.io.IOException;
+
+public class CommentMethodItem extends MethodItem {
+    //private final StringTemplate template;
+    private final String comment;
+    private final double sortOrder;
+
+    public CommentMethodItem(String comment, int codeAddress, double sortOrder) {
+        super(codeAddress);
+        this.comment = comment;
+        this.sortOrder = sortOrder;
+    }
+
+    public double getSortOrder() {
+        return sortOrder;
+    }
+
+    public boolean writeTo(IndentingWriter writer) throws IOException {
+        writer.write('#');
+        writer.write(comment);
+        return true;
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/CommentedOutMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/CommentedOutMethodItem.java
new file mode 100644
index 0000000..aaeb6a6
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/CommentedOutMethodItem.java
@@ -0,0 +1,52 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors;
+
+import org.jf.util.IndentingWriter;
+
+import java.io.IOException;
+
+public class CommentedOutMethodItem extends MethodItem {
+    private final MethodItem commentedOutMethodItem;
+
+    public CommentedOutMethodItem(MethodItem commentedOutMethodItem) {
+        super(commentedOutMethodItem.getCodeAddress());
+        this.commentedOutMethodItem = commentedOutMethodItem;
+    }
+
+    public double getSortOrder() {
+        return commentedOutMethodItem.getSortOrder() + .001;
+    }
+
+    public boolean writeTo(IndentingWriter writer) throws IOException {
+        writer.write('#');
+        commentedOutMethodItem.writeTo(writer);
+        return true;
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/CommentingIndentingWriter.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/CommentingIndentingWriter.java
new file mode 100644
index 0000000..c63da1c
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/CommentingIndentingWriter.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors;
+
+import org.jf.util.IndentingWriter;
+
+import java.io.IOException;
+import java.io.Writer;
+
+public class CommentingIndentingWriter extends IndentingWriter {
+    public CommentingIndentingWriter(Writer writer) {
+        super(writer);
+    }
+
+    @Override protected void writeIndent() throws IOException {
+        writer.write("# ");
+        super.writeIndent();
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/Debug/BeginEpilogueMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Debug/BeginEpilogueMethodItem.java
new file mode 100644
index 0000000..a1294fc
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Debug/BeginEpilogueMethodItem.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors.Debug;
+
+import org.jf.util.IndentingWriter;
+
+import java.io.IOException;
+
+public class BeginEpilogueMethodItem extends DebugMethodItem {
+    public BeginEpilogueMethodItem(int codeAddress, int sortOrder) {
+        super(codeAddress, sortOrder);
+    }
+
+    @Override
+    public boolean writeTo(IndentingWriter writer) throws IOException {
+        writer.write(".prologue");
+        return true;
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/Debug/DebugMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Debug/DebugMethodItem.java
new file mode 100644
index 0000000..86d30f9
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Debug/DebugMethodItem.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors.Debug;
+
+import org.jf.baksmali.Adaptors.MethodItem;
+import org.jf.baksmali.Adaptors.RegisterFormatter;
+import org.jf.dexlib2.DebugItemType;
+import org.jf.dexlib2.iface.debug.*;
+import org.jf.util.ExceptionWithContext;
+
+public abstract class DebugMethodItem extends MethodItem {
+    private final int sortOrder;
+
+    protected DebugMethodItem(int codeAddress, int sortOrder) {
+        super(codeAddress);
+        this.sortOrder = sortOrder;
+    }
+
+    @Override public double getSortOrder() { return sortOrder; }
+
+    public static DebugMethodItem build(RegisterFormatter registerFormatter, DebugItem debugItem) {
+        int codeAddress = debugItem.getCodeAddress();
+        switch (debugItem.getDebugItemType()) {
+            case DebugItemType.START_LOCAL:
+                return new StartLocalMethodItem(codeAddress, -1, registerFormatter, (StartLocal)debugItem);
+            case DebugItemType.END_LOCAL:
+                return new EndLocalMethodItem(codeAddress, -1, registerFormatter, (EndLocal)debugItem);
+            case DebugItemType.RESTART_LOCAL:
+                return new RestartLocalMethodItem(codeAddress, -1, registerFormatter, (RestartLocal)debugItem);
+            case DebugItemType.EPILOGUE_BEGIN:
+                return new BeginEpilogueMethodItem(codeAddress, -4);
+            case DebugItemType.PROLOGUE_END:
+                return new EndPrologueMethodItem(codeAddress, -4);
+            case DebugItemType.SET_SOURCE_FILE:
+                return new SetSourceFileMethodItem(codeAddress, -3, (SetSourceFile)debugItem);
+            case DebugItemType.LINE_NUMBER:
+                return new LineNumberMethodItem(codeAddress, -2, (LineNumber)debugItem);
+            default:
+                throw new ExceptionWithContext("Invalid debug item type: %d", debugItem.getDebugItemType());
+        }
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/Debug/EndLocalMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Debug/EndLocalMethodItem.java
new file mode 100644
index 0000000..231e049
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Debug/EndLocalMethodItem.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors.Debug;
+
+import org.jf.baksmali.Adaptors.RegisterFormatter;
+import org.jf.dexlib2.iface.debug.EndLocal;
+import org.jf.util.IndentingWriter;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+
+public class EndLocalMethodItem extends DebugMethodItem {
+    @Nonnull private final EndLocal endLocal;
+    @Nonnull private final RegisterFormatter registerFormatter;
+
+    public EndLocalMethodItem(int codeAddress, int sortOrder, @Nonnull RegisterFormatter registerFormatter,
+                                @Nonnull EndLocal endLocal) {
+        super(codeAddress, sortOrder);
+        this.endLocal = endLocal;
+        this.registerFormatter = registerFormatter;
+    }
+
+    @Override
+    public boolean writeTo(IndentingWriter writer) throws IOException {
+        writer.write(".end local ");
+        registerFormatter.writeTo(writer, endLocal.getRegister());
+
+        String name = endLocal.getName();
+        String type = endLocal.getType();
+        String signature = endLocal.getSignature();
+        if (name != null || type != null || signature != null) {
+            writer.write("    # ");
+            LocalFormatter.writeLocal(writer, name, type, signature);
+        }
+        return true;
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/Debug/EndPrologueMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Debug/EndPrologueMethodItem.java
new file mode 100644
index 0000000..369c38f
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Debug/EndPrologueMethodItem.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors.Debug;
+
+import org.jf.util.IndentingWriter;
+
+import java.io.IOException;
+
+public class EndPrologueMethodItem extends DebugMethodItem {
+    public EndPrologueMethodItem(int codeAddress, int sortOrder) {
+        super(codeAddress, sortOrder);
+    }
+
+    @Override
+    public boolean writeTo(IndentingWriter writer) throws IOException {
+        writer.write(".prologue");
+        return true;
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/Debug/LineNumberMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Debug/LineNumberMethodItem.java
new file mode 100644
index 0000000..91473bd
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Debug/LineNumberMethodItem.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors.Debug;
+
+import org.jf.dexlib2.iface.debug.LineNumber;
+import org.jf.util.IndentingWriter;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+
+public class LineNumberMethodItem extends DebugMethodItem {
+    private final int lineNumber;
+
+    public LineNumberMethodItem(int codeAddress, int sortOrder, @Nonnull LineNumber lineNumber) {
+        super(codeAddress, sortOrder);
+        this.lineNumber = lineNumber.getLineNumber();
+    }
+
+    @Override
+    public boolean writeTo(IndentingWriter writer) throws IOException {
+        writer.write(".line ");
+        writer.printUnsignedIntAsDec(lineNumber);
+        return true;
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/Debug/LocalFormatter.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Debug/LocalFormatter.java
new file mode 100644
index 0000000..62ed995
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Debug/LocalFormatter.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors.Debug;
+
+import org.jf.baksmali.Adaptors.ReferenceFormatter;
+import org.jf.util.IndentingWriter;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.IOException;
+
+public class LocalFormatter {
+    /**
+     * Writes out the given local info
+     *
+     * The written string will be something like:
+     *
+     * "localVar":Ljava/lang/String;, "SomeSignature"
+     * "localVar":Ljava/lang/String;
+     * "localVar":V, "SomeSignature"
+     * null:Ljava/lang/String;, "SomeSignature"
+     * null:V, "SomeSignature"
+     *
+     * One of name, type or signature must be non-null
+     */
+    public static void writeLocal(@Nonnull IndentingWriter writer, @Nullable String name, @Nullable String type,
+                                  @Nullable String signature) throws IOException {
+        if (name != null) {
+            ReferenceFormatter.writeStringReference(writer, name);
+        } else {
+            writer.write("null");
+        }
+        writer.write(':');
+        if (type != null) {
+            writer.write(type);
+        } else {
+            writer.write("V");
+        }
+        if (signature != null) {
+            writer.write(", ");
+            ReferenceFormatter.writeStringReference(writer, signature);
+        }
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/Debug/RestartLocalMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Debug/RestartLocalMethodItem.java
new file mode 100644
index 0000000..4461719
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Debug/RestartLocalMethodItem.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors.Debug;
+
+import org.jf.baksmali.Adaptors.RegisterFormatter;
+import org.jf.dexlib2.iface.debug.RestartLocal;
+import org.jf.util.IndentingWriter;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+
+public class RestartLocalMethodItem extends DebugMethodItem {
+    @Nonnull private final RestartLocal restartLocal;
+    @Nonnull private final RegisterFormatter registerFormatter;
+
+    public RestartLocalMethodItem(int codeAddress, int sortOrder, @Nonnull RegisterFormatter registerFormatter,
+                              @Nonnull RestartLocal restartLocal) {
+        super(codeAddress, sortOrder);
+        this.restartLocal = restartLocal;
+        this.registerFormatter = registerFormatter;
+    }
+
+    @Override
+    public boolean writeTo(IndentingWriter writer) throws IOException {
+        writer.write(".restart local ");
+        registerFormatter.writeTo(writer, restartLocal.getRegister());
+
+        String name = restartLocal.getName();
+        String type = restartLocal.getType();
+        String signature = restartLocal.getSignature();
+        if (name != null || type != null || signature != null) {
+            writer.write("    # ");
+            LocalFormatter.writeLocal(writer, name, type, signature);
+        }
+        return true;
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/Debug/SetSourceFileMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Debug/SetSourceFileMethodItem.java
new file mode 100644
index 0000000..faccfdf
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Debug/SetSourceFileMethodItem.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors.Debug;
+
+import org.jf.dexlib2.iface.debug.SetSourceFile;
+import org.jf.util.IndentingWriter;
+import org.jf.util.StringUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.IOException;
+
+public class SetSourceFileMethodItem extends DebugMethodItem {
+    @Nullable private final String sourceFile;
+
+    public SetSourceFileMethodItem(int codeAddress, int sortOrder, @Nonnull SetSourceFile setSourceFile) {
+        super(codeAddress, sortOrder);
+        this.sourceFile = setSourceFile.getSourceFile();
+    }
+
+    @Override
+    public boolean writeTo(IndentingWriter writer) throws IOException {
+        writer.write(".source");
+
+        if (sourceFile != null) {
+            writer.write(" \"");
+            StringUtils.writeEscapedString(writer, sourceFile);
+            writer.write('"');
+        }
+        return true;
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/Debug/StartLocalMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Debug/StartLocalMethodItem.java
new file mode 100644
index 0000000..0cd2d2b
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Debug/StartLocalMethodItem.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors.Debug;
+
+import org.jf.baksmali.Adaptors.RegisterFormatter;
+import org.jf.dexlib2.iface.debug.StartLocal;
+import org.jf.util.IndentingWriter;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+
+public class StartLocalMethodItem extends DebugMethodItem {
+    @Nonnull private final StartLocal startLocal;
+    @Nonnull private final RegisterFormatter registerFormatter;
+
+    public StartLocalMethodItem(int codeAddress, int sortOrder, @Nonnull RegisterFormatter registerFormatter,
+                                @Nonnull StartLocal startLocal) {
+        super(codeAddress, sortOrder);
+        this.startLocal = startLocal;
+        this.registerFormatter = registerFormatter;
+    }
+
+    @Override
+    public boolean writeTo(IndentingWriter writer) throws IOException {
+        writer.write(".local ");
+        registerFormatter.writeTo(writer, startLocal.getRegister());
+
+        String name = startLocal.getName();
+        String type = startLocal.getType();
+        String signature = startLocal.getSignature();
+
+        if (name != null || type != null || signature != null) {
+            writer.write(", ");
+            LocalFormatter.writeLocal(writer, name, type, signature);
+        }
+        return true;
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/AnnotationEncodedValueAdaptor.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/AnnotationEncodedValueAdaptor.java
new file mode 100644
index 0000000..e8f12a2
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/AnnotationEncodedValueAdaptor.java
@@ -0,0 +1,65 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors.EncodedValue;
+
+import org.jf.dexlib2.iface.AnnotationElement;
+import org.jf.dexlib2.iface.value.AnnotationEncodedValue;
+import org.jf.util.IndentingWriter;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.IOException;
+import java.util.Collection;
+
+public abstract class AnnotationEncodedValueAdaptor {
+
+    public static void writeTo(@Nonnull IndentingWriter writer,
+                               @Nonnull AnnotationEncodedValue annotationEncodedValue,
+                               @Nullable String containingClass) throws IOException {
+        writer.write(".subannotation ");
+        writer.write(annotationEncodedValue.getType());
+        writer.write('\n');
+
+        writeElementsTo(writer, annotationEncodedValue.getElements(), containingClass);
+        writer.write(".end subannotation");
+    }
+
+    public static void writeElementsTo(@Nonnull IndentingWriter writer,
+                                       @Nonnull Collection<? extends AnnotationElement> annotationElements,
+                                       @Nullable String containingClass) throws IOException {
+        writer.indent(4);
+        for (AnnotationElement annotationElement: annotationElements) {
+            writer.write(annotationElement.getName());
+            writer.write(" = ");
+            EncodedValueAdaptor.writeTo(writer, annotationElement.getValue(), containingClass);
+            writer.write('\n');
+        }
+        writer.deindent(4);
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/ArrayEncodedValueAdaptor.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/ArrayEncodedValueAdaptor.java
new file mode 100644
index 0000000..eb079b3
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/ArrayEncodedValueAdaptor.java
@@ -0,0 +1,65 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors.EncodedValue;
+
+import org.jf.dexlib2.iface.value.ArrayEncodedValue;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.util.IndentingWriter;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.IOException;
+import java.util.Collection;
+
+public class ArrayEncodedValueAdaptor {
+    public static void writeTo(@Nonnull IndentingWriter writer,
+                               @Nonnull ArrayEncodedValue arrayEncodedValue,
+                               @Nullable String containingClass) throws IOException {
+        writer.write('{');
+        Collection<? extends EncodedValue> values = arrayEncodedValue.getValue();
+        if (values.size() == 0) {
+            writer.write('}');
+            return;
+        }
+
+        writer.write('\n');
+        writer.indent(4);
+        boolean first = true;
+        for (EncodedValue encodedValue: values) {
+            if (!first) {
+                writer.write(",\n");
+            }
+            first = false;
+
+            EncodedValueAdaptor.writeTo(writer, encodedValue, containingClass);
+        }
+        writer.deindent(4);
+        writer.write("\n}");
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/EncodedValueAdaptor.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/EncodedValueAdaptor.java
new file mode 100644
index 0000000..880c760
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/EncodedValueAdaptor.java
@@ -0,0 +1,124 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors.EncodedValue;
+
+import org.jf.baksmali.Adaptors.ReferenceFormatter;
+import org.jf.baksmali.Renderers.*;
+import org.jf.dexlib2.ReferenceType;
+import org.jf.dexlib2.ValueType;
+import org.jf.dexlib2.iface.value.*;
+import org.jf.dexlib2.util.ReferenceUtil;
+import org.jf.util.IndentingWriter;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.IOException;
+
+public abstract class EncodedValueAdaptor {
+    public static void writeTo(@Nonnull IndentingWriter writer, @Nonnull EncodedValue encodedValue,
+                               @Nullable String containingClass)
+            throws IOException {
+        switch (encodedValue.getValueType()) {
+            case ValueType.ANNOTATION:
+                AnnotationEncodedValueAdaptor.writeTo(writer, (AnnotationEncodedValue)encodedValue, containingClass);
+                return;
+            case ValueType.ARRAY:
+                ArrayEncodedValueAdaptor.writeTo(writer, (ArrayEncodedValue)encodedValue, containingClass);
+                return;
+            case ValueType.BOOLEAN:
+                BooleanRenderer.writeTo(writer, ((BooleanEncodedValue)encodedValue).getValue());
+                return;
+            case ValueType.BYTE:
+                ByteRenderer.writeTo(writer, ((ByteEncodedValue)encodedValue).getValue());
+                return;
+            case ValueType.CHAR:
+                CharRenderer.writeTo(writer, ((CharEncodedValue)encodedValue).getValue());
+                return;
+            case ValueType.DOUBLE:
+                DoubleRenderer.writeTo(writer, ((DoubleEncodedValue)encodedValue).getValue());
+                return;
+            case ValueType.ENUM:
+                EnumEncodedValue enumEncodedValue = (EnumEncodedValue)encodedValue;
+                boolean useImplicitReference = false;
+                if (enumEncodedValue.getValue().getDefiningClass().equals(containingClass)) {
+                    useImplicitReference = true;
+                }
+                writer.write(".enum ");
+                ReferenceUtil.writeFieldDescriptor(writer, enumEncodedValue.getValue(), useImplicitReference);
+                return;
+            case ValueType.FIELD:
+                FieldEncodedValue fieldEncodedValue = (FieldEncodedValue)encodedValue;
+                useImplicitReference = false;
+                if (fieldEncodedValue.getValue().getDefiningClass().equals(containingClass)) {
+                    useImplicitReference = true;
+                }
+                ReferenceUtil.writeFieldDescriptor(writer, fieldEncodedValue.getValue(), useImplicitReference);
+                return;
+            case ValueType.FLOAT:
+                FloatRenderer.writeTo(writer, ((FloatEncodedValue)encodedValue).getValue());
+                return;
+            case ValueType.INT:
+                IntegerRenderer.writeTo(writer, ((IntEncodedValue)encodedValue).getValue());
+                return;
+            case ValueType.LONG:
+                LongRenderer.writeTo(writer, ((LongEncodedValue)encodedValue).getValue());
+                return;
+            case ValueType.METHOD:
+                MethodEncodedValue methodEncodedValue = (MethodEncodedValue)encodedValue;
+                useImplicitReference = false;
+                if (methodEncodedValue.getValue().getDefiningClass().equals(containingClass)) {
+                    useImplicitReference = true;
+                }
+                ReferenceUtil.writeMethodDescriptor(writer, methodEncodedValue.getValue(), useImplicitReference);
+                return;
+            case ValueType.NULL:
+                writer.write("null");
+                return;
+            case ValueType.SHORT:
+                ShortRenderer.writeTo(writer, ((ShortEncodedValue)encodedValue).getValue());
+                return;
+            case ValueType.STRING:
+                ReferenceFormatter.writeStringReference(writer, ((StringEncodedValue)encodedValue).getValue());
+                return;
+            case ValueType.TYPE:
+                writer.write(((TypeEncodedValue)encodedValue).getValue());
+                return;
+            case ValueType.METHOD_TYPE:
+                ReferenceFormatter.writeReference(writer, ReferenceType.METHOD_PROTO,
+                        ((MethodTypeEncodedValue)encodedValue).getValue());
+                return;
+            case ValueType.METHOD_HANDLE:
+                ReferenceFormatter.writeReference(writer, ReferenceType.METHOD_HANDLE,
+                        ((MethodHandleEncodedValue)encodedValue).getValue());
+                return;
+            default:
+                throw new IllegalArgumentException("Unknown encoded value type: " + encodedValue.getValueType());
+        }
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/EndTryLabelMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/EndTryLabelMethodItem.java
new file mode 100644
index 0000000..2680704
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/EndTryLabelMethodItem.java
@@ -0,0 +1,51 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors;
+
+import org.jf.baksmali.BaksmaliOptions;
+
+import javax.annotation.Nonnull;
+
+public class EndTryLabelMethodItem extends LabelMethodItem {
+    private int endTryAddress;
+
+    public EndTryLabelMethodItem(@Nonnull BaksmaliOptions options, int codeAddress, int endTryAddress) {
+        super(options, codeAddress, "try_end_");
+        this.endTryAddress = endTryAddress;
+    }
+
+    public double getSortOrder() {
+        //sort after instruction, but before catch directive
+        return 101;
+    }
+
+    public int getLabelAddress() {
+        return endTryAddress;
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/FieldDefinition.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/FieldDefinition.java
new file mode 100644
index 0000000..8b5f920
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/FieldDefinition.java
@@ -0,0 +1,109 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors;
+
+import org.jf.baksmali.Adaptors.EncodedValue.EncodedValueAdaptor;
+import org.jf.baksmali.BaksmaliOptions;
+import org.jf.dexlib2.AccessFlags;
+import org.jf.dexlib2.HiddenApiRestriction;
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.iface.Field;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.dexlib2.util.EncodedValueUtils;
+import org.jf.util.IndentingWriter;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Set;
+
+public class FieldDefinition {
+    public static void writeTo(BaksmaliOptions options, IndentingWriter writer, Field field,
+                               boolean setInStaticConstructor) throws IOException {
+        EncodedValue initialValue = field.getInitialValue();
+        int accessFlags = field.getAccessFlags();
+
+        if (setInStaticConstructor &&
+                AccessFlags.STATIC.isSet(accessFlags) &&
+                AccessFlags.FINAL.isSet(accessFlags) &&
+                initialValue != null) {
+            if (!EncodedValueUtils.isDefaultValue(initialValue)) {
+                writer.write("# The value of this static final field might be set in the static constructor\n");
+            } else {
+                // don't write out the default initial value for static final fields that get set in the static
+                // constructor
+                initialValue = null;
+            }
+        }
+
+        writer.write(".field ");
+        writeAccessFlagsAndRestrictions(writer, field.getAccessFlags(), field.getHiddenApiRestrictions());
+        writer.write(field.getName());
+        writer.write(':');
+        writer.write(field.getType());
+        if (initialValue != null) {
+            writer.write(" = ");
+
+            String containingClass = null;
+            if (options.implicitReferences) {
+                containingClass = field.getDefiningClass();
+            }
+
+            EncodedValueAdaptor.writeTo(writer, initialValue, containingClass);
+        }
+
+        writer.write('\n');
+
+        Collection<? extends Annotation> annotations = field.getAnnotations();
+        if (annotations.size() > 0) {
+            writer.indent(4);
+
+            String containingClass = null;
+            if (options.implicitReferences) {
+                containingClass = field.getDefiningClass();
+            }
+
+            AnnotationFormatter.writeTo(writer, annotations, containingClass);
+            writer.deindent(4);
+            writer.write(".end field\n");
+        }
+    }
+
+    private static void writeAccessFlagsAndRestrictions(
+            IndentingWriter writer, int accessFlags, Set<HiddenApiRestriction> hiddenApiRestrictions)
+            throws IOException {
+        for (AccessFlags accessFlag: AccessFlags.getAccessFlagsForField(accessFlags)) {
+            writer.write(accessFlag.toString());
+            writer.write(' ');
+        }
+        for (HiddenApiRestriction hiddenApiRestriction : hiddenApiRestrictions) {
+            writer.write(hiddenApiRestriction.toString());
+            writer.write(' ');
+        }
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/ArrayDataMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/ArrayDataMethodItem.java
new file mode 100644
index 0000000..9c7b658
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/ArrayDataMethodItem.java
@@ -0,0 +1,81 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors.Format;
+
+import org.jf.baksmali.Adaptors.MethodDefinition;
+import org.jf.baksmali.Renderers.LongRenderer;
+import org.jf.dexlib2.iface.instruction.formats.ArrayPayload;
+import org.jf.util.IndentingWriter;
+
+import java.io.IOException;
+import java.util.List;
+
+public class ArrayDataMethodItem extends InstructionMethodItem<ArrayPayload> {
+    public ArrayDataMethodItem(MethodDefinition methodDef, int codeAddress, ArrayPayload instruction) {
+        super(methodDef, codeAddress, instruction);
+    }
+
+    public boolean writeTo(IndentingWriter writer) throws IOException {
+        int elementWidth = instruction.getElementWidth();
+
+        writer.write(".array-data ");
+        writer.printSignedIntAsDec(instruction.getElementWidth());
+        writer.write('\n');
+
+        writer.indent(4);
+
+        List<Number> elements = instruction.getArrayElements();
+
+        String suffix = "";
+        switch (elementWidth) {
+            case 1:
+                suffix = "t";
+                break;
+            case 2:
+                suffix = "s";
+                break;
+        }
+
+        for (Number number: elements) {
+            LongRenderer.writeSignedIntOrLongTo(writer, number.longValue());
+            writer.write(suffix);
+            if (elementWidth == 8) {
+                writeCommentIfLikelyDouble(writer, number.longValue());
+            } else if (elementWidth == 4) {
+                int value = number.intValue();
+                boolean isResourceId = writeCommentIfResourceId(writer, value);
+                if (!isResourceId) writeCommentIfLikelyFloat(writer, value);
+            }
+            writer.write("\n");
+        }
+        writer.deindent(4);
+        writer.write(".end array-data");
+        return true;
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/InstructionMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/InstructionMethodItem.java
new file mode 100644
index 0000000..e5ef926
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/InstructionMethodItem.java
@@ -0,0 +1,587 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors.Format;
+
+import org.jf.baksmali.Adaptors.MethodDefinition;
+import org.jf.baksmali.Adaptors.MethodDefinition.InvalidSwitchPayload;
+import org.jf.baksmali.Adaptors.MethodItem;
+import org.jf.baksmali.Adaptors.ReferenceFormatter;
+import org.jf.baksmali.BaksmaliOptions;
+import org.jf.baksmali.Renderers.LongRenderer;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.VerificationError;
+import org.jf.dexlib2.iface.instruction.*;
+import org.jf.dexlib2.iface.instruction.formats.Instruction20bc;
+import org.jf.dexlib2.iface.instruction.formats.Instruction31t;
+import org.jf.dexlib2.iface.instruction.formats.UnknownInstruction;
+import org.jf.dexlib2.iface.reference.CallSiteReference;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.dexlib2.util.ReferenceUtil;
+import org.jf.util.ExceptionWithContext;
+import org.jf.util.IndentingWriter;
+import org.jf.util.NumberUtils;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.util.Map;
+
+public class InstructionMethodItem<T extends Instruction> extends MethodItem {
+    @Nonnull protected final MethodDefinition methodDef;
+    @Nonnull protected final T instruction;
+
+    public InstructionMethodItem(@Nonnull MethodDefinition methodDef, int codeAddress, @Nonnull T instruction) {
+        super(codeAddress);
+        this.methodDef = methodDef;
+        this.instruction = instruction;
+    }
+
+    public double getSortOrder() {
+        //instructions should appear after everything except an "end try" label and .catch directive
+        return 100;
+    }
+
+    private boolean isAllowedOdex(@Nonnull Opcode opcode) {
+        BaksmaliOptions options = methodDef.classDef.options;
+        if (options.allowOdex) {
+            return true;
+        }
+
+        if (methodDef.classDef.options.apiLevel >= 14) {
+            return false;
+        }
+
+        return opcode.isVolatileFieldAccessor() || opcode == Opcode.THROW_VERIFICATION_ERROR;
+    }
+
+    private interface Writable {
+        void writeTo(IndentingWriter writer) throws IOException;
+    }
+
+    @Override
+    public boolean writeTo(IndentingWriter writer) throws IOException {
+        Opcode opcode = instruction.getOpcode();
+        String verificationErrorName = null;
+        Writable referenceWritable = null;
+        Writable referenceWritable2 = null;
+
+        boolean commentOutInstruction = false;
+
+        if (instruction instanceof Instruction20bc) {
+            int verificationError = ((Instruction20bc)instruction).getVerificationError();
+            verificationErrorName = VerificationError.getVerificationErrorName(verificationError);
+            if (verificationErrorName == null) {
+                writer.write("#was invalid verification error type: ");
+                writer.printSignedIntAsDec(verificationError);
+                writer.write("\n");
+                verificationErrorName = "generic-error";
+            }
+        }
+
+        if (instruction instanceof ReferenceInstruction) {
+            ReferenceInstruction referenceInstruction = (ReferenceInstruction)instruction;
+            final String classContext;
+            if (methodDef.classDef.options.implicitReferences) {
+                classContext = methodDef.method.getDefiningClass();
+            } else {
+                classContext = null;
+            }
+
+            Reference reference = referenceInstruction.getReference();
+
+            try {
+                reference.validateReference();
+
+                if (reference instanceof CallSiteReference) {
+                    referenceWritable = new Writable() {
+                        @Override
+                        public void writeTo(IndentingWriter indentingWriter) throws IOException {
+                            ReferenceFormatter.writeCallSiteReference(indentingWriter, (CallSiteReference)reference);
+                        }
+                    };
+                } else {
+                    referenceWritable = new Writable() {
+                        @Override
+                        public void writeTo(IndentingWriter indentingWriter) throws IOException {
+                            indentingWriter.write(ReferenceUtil.getReferenceString(reference, classContext));
+                        }
+                    };
+                }
+            } catch (Reference.InvalidReferenceException ex) {
+                commentOutInstruction = true;
+                writer.write("#");
+                writer.write(ex.getMessage());
+                writer.write("\n");
+                referenceWritable = indentingWriter -> {
+                    indentingWriter.write(ex.getInvalidReferenceRepresentation());
+                };
+            }
+
+            if (instruction instanceof DualReferenceInstruction) {
+                DualReferenceInstruction dualReferenceInstruction =
+                        (DualReferenceInstruction) instruction;
+                try {
+                    Reference reference2 = dualReferenceInstruction.getReference2();
+                    reference2.validateReference();
+
+                    referenceWritable2 = indentingWriter -> {
+                        indentingWriter.write(ReferenceUtil.getReferenceString(reference2, classContext));
+                    };
+                } catch (Reference.InvalidReferenceException ex) {
+                    commentOutInstruction = true;
+                    writer.write("#");
+                    writer.write(ex.getMessage());
+                    writer.write("\n");
+                    referenceWritable = indentingWriter -> {
+                        indentingWriter.write(ex.getInvalidReferenceRepresentation());
+                    };
+                }
+            }
+        }
+
+        if (instruction instanceof Instruction31t) {
+            boolean validPayload = true;
+
+            switch (instruction.getOpcode()) {
+                case PACKED_SWITCH:
+                    int baseAddress = methodDef.getPackedSwitchBaseAddress(
+                            this.codeAddress + ((Instruction31t)instruction).getCodeOffset());
+                    if (baseAddress == -1) {
+                        validPayload = false;
+                    }
+                    break;
+                case SPARSE_SWITCH:
+                    baseAddress = methodDef.getSparseSwitchBaseAddress(
+                            this.codeAddress + ((Instruction31t)instruction).getCodeOffset());
+                    if (baseAddress == -1) {
+                        validPayload = false;
+                    }
+                    break;
+                case FILL_ARRAY_DATA:
+                    try {
+                        methodDef.findPayloadOffset(this.codeAddress + ((Instruction31t)instruction).getCodeOffset(),
+                                Opcode.ARRAY_PAYLOAD);
+                    } catch (InvalidSwitchPayload ex) {
+                        validPayload = false;
+                    }
+                    break;
+                default:
+                    throw new ExceptionWithContext("Invalid 31t opcode: %s", instruction.getOpcode());
+            }
+
+            if (!validPayload) {
+                writer.write("#invalid payload reference\n");
+                commentOutInstruction = true;
+            }
+        }
+
+        if (opcode.odexOnly()) {
+            if (!isAllowedOdex(opcode)) {
+                writer.write("#disallowed odex opcode\n");
+                commentOutInstruction = true;
+            }
+        }
+
+        if (commentOutInstruction) {
+            writer.write("#");
+        }
+
+        switch (instruction.getOpcode().format) {
+            case Format10t:
+                writeOpcode(writer);
+                writer.write(' ');
+                writeTargetLabel(writer);
+                break;
+            case Format10x:
+                if (instruction instanceof UnknownInstruction) {
+                    writer.write("#unknown opcode: 0x");
+                    writer.printUnsignedLongAsHex(((UnknownInstruction)instruction).getOriginalOpcode());
+                    writer.write('\n');
+                }
+                writeOpcode(writer);
+                break;
+            case Format11n:
+                writeOpcode(writer);
+                writer.write(' ');
+                writeFirstRegister(writer);
+                writer.write(", ");
+                writeLiteral(writer);
+                break;
+            case Format11x:
+                writeOpcode(writer);
+                writer.write(' ');
+                writeFirstRegister(writer);
+                break;
+            case Format12x:
+                writeOpcode(writer);
+                writer.write(' ');
+                writeFirstRegister(writer);
+                writer.write(", ");
+                writeSecondRegister(writer);
+                break;
+            case Format20bc:
+                writeOpcode(writer);
+                writer.write(' ');
+                writer.write(verificationErrorName);
+                writer.write(", ");
+                referenceWritable.writeTo(writer);
+                break;
+            case Format20t:
+            case Format30t:
+                writeOpcode(writer);
+                writer.write(' ');
+                writeTargetLabel(writer);
+                break;
+            case Format21c:
+            case Format31c:
+                writeOpcode(writer);
+                writer.write(' ');
+                writeFirstRegister(writer);
+                writer.write(", ");
+                referenceWritable.writeTo(writer);
+                break;
+            case Format21ih:
+            case Format21lh:
+            case Format21s:
+            case Format31i:
+            case Format51l:
+                writeOpcode(writer);
+                writer.write(' ');
+                writeFirstRegister(writer);
+                writer.write(", ");
+                writeLiteral(writer);
+                if (instruction.getOpcode().setsWideRegister()) {
+                    writeCommentIfLikelyDouble(writer);
+                } else {
+                    boolean isResourceId = writeCommentIfResourceId(writer);
+                    if (!isResourceId) writeCommentIfLikelyFloat(writer);
+                }
+                break;
+            case Format21t:
+            case Format31t:
+                writeOpcode(writer);
+                writer.write(' ');
+                writeFirstRegister(writer);
+                writer.write(", ");
+                writeTargetLabel(writer);
+                break;
+            case Format22b:
+            case Format22s:
+                writeOpcode(writer);
+                writer.write(' ');
+                writeFirstRegister(writer);
+                writer.write(", ");
+                writeSecondRegister(writer);
+                writer.write(", ");
+                writeLiteral(writer);
+                break;
+            case Format22c:
+                writeOpcode(writer);
+                writer.write(' ');
+                writeFirstRegister(writer);
+                writer.write(", ");
+                writeSecondRegister(writer);
+                writer.write(", ");
+                referenceWritable.writeTo(writer);
+                break;
+            case Format22cs:
+                writeOpcode(writer);
+                writer.write(' ');
+                writeFirstRegister(writer);
+                writer.write(", ");
+                writeSecondRegister(writer);
+                writer.write(", ");
+                writeFieldOffset(writer);
+                break;
+            case Format22t:
+                writeOpcode(writer);
+                writer.write(' ');
+                writeFirstRegister(writer);
+                writer.write(", ");
+                writeSecondRegister(writer);
+                writer.write(", ");
+                writeTargetLabel(writer);
+                break;
+            case Format22x:
+            case Format32x:
+                writeOpcode(writer);
+                writer.write(' ');
+                writeFirstRegister(writer);
+                writer.write(", ");
+                writeSecondRegister(writer);
+                break;
+            case Format23x:
+                writeOpcode(writer);
+                writer.write(' ');
+                writeFirstRegister(writer);
+                writer.write(", ");
+                writeSecondRegister(writer);
+                writer.write(", ");
+                writeThirdRegister(writer);
+                break;
+            case Format35c:
+                writeOpcode(writer);
+                writer.write(' ');
+                writeInvokeRegisters(writer);
+                writer.write(", ");
+                referenceWritable.writeTo(writer);
+                break;
+            case Format35mi:
+                writeOpcode(writer);
+                writer.write(' ');
+                writeInvokeRegisters(writer);
+                writer.write(", ");
+                writeInlineIndex(writer);
+                break;
+            case Format35ms:
+                writeOpcode(writer);
+                writer.write(' ');
+                writeInvokeRegisters(writer);
+                writer.write(", ");
+                writeVtableIndex(writer);
+                break;
+            case Format3rc:
+                writeOpcode(writer);
+                writer.write(' ');
+                writeInvokeRangeRegisters(writer);
+                writer.write(", ");
+                referenceWritable.writeTo(writer);
+                break;
+            case Format3rmi:
+                writeOpcode(writer);
+                writer.write(' ');
+                writeInvokeRangeRegisters(writer);
+                writer.write(", ");
+                writeInlineIndex(writer);
+                break;
+            case Format3rms:
+                writeOpcode(writer);
+                writer.write(' ');
+                writeInvokeRangeRegisters(writer);
+                writer.write(", ");
+                writeVtableIndex(writer);
+                break;
+            case Format45cc:
+                writeOpcode(writer);
+                writer.write(' ');
+                writeInvokeRegisters(writer);
+                writer.write(", ");
+                referenceWritable.writeTo(writer);
+                writer.write(", ");
+                referenceWritable2.writeTo(writer);
+                break;
+            case Format4rcc:
+                writeOpcode(writer);
+                writer.write(' ');
+                writeInvokeRangeRegisters(writer);
+                writer.write(", ");
+                referenceWritable.writeTo(writer);
+                writer.write(", ");
+                referenceWritable2.writeTo(writer);
+                break;
+            default:
+                assert false;
+                return false;
+        }
+
+        if (commentOutInstruction) {
+            writer.write("\nnop");
+        }
+
+        return true;
+    }
+
+    protected void writeOpcode(IndentingWriter writer) throws IOException {
+        writer.write(instruction.getOpcode().name);
+    }
+
+    protected void writeTargetLabel(IndentingWriter writer) throws IOException {
+        //this method is overridden by OffsetInstructionMethodItem, and should only be called for the formats that
+        //have a target
+        throw new RuntimeException();
+    }
+
+    protected void writeRegister(IndentingWriter writer, int registerNumber) throws IOException {
+        methodDef.registerFormatter.writeTo(writer, registerNumber);
+    }
+
+    protected void writeFirstRegister(IndentingWriter writer) throws IOException {
+        writeRegister(writer, ((OneRegisterInstruction)instruction).getRegisterA());
+    }
+
+    protected void writeSecondRegister(IndentingWriter writer) throws IOException {
+        writeRegister(writer, ((TwoRegisterInstruction)instruction).getRegisterB());
+    }
+
+    protected void writeThirdRegister(IndentingWriter writer) throws IOException {
+        writeRegister(writer, ((ThreeRegisterInstruction) instruction).getRegisterC());
+    }
+
+    protected void writeInvokeRegisters(IndentingWriter writer) throws IOException {
+        FiveRegisterInstruction instruction = (FiveRegisterInstruction)this.instruction;
+        final int regCount = instruction.getRegisterCount();
+
+        writer.write('{');
+        switch (regCount) {
+            case 1:
+                writeRegister(writer, instruction.getRegisterC());
+                break;
+            case 2:
+                writeRegister(writer, instruction.getRegisterC());
+                writer.write(", ");
+                writeRegister(writer, instruction.getRegisterD());
+                break;
+            case 3:
+                writeRegister(writer, instruction.getRegisterC());
+                writer.write(", ");
+                writeRegister(writer, instruction.getRegisterD());
+                writer.write(", ");
+                writeRegister(writer, instruction.getRegisterE());
+                break;
+            case 4:
+                writeRegister(writer, instruction.getRegisterC());
+                writer.write(", ");
+                writeRegister(writer, instruction.getRegisterD());
+                writer.write(", ");
+                writeRegister(writer, instruction.getRegisterE());
+                writer.write(", ");
+                writeRegister(writer, instruction.getRegisterF());
+                break;
+            case 5:
+                writeRegister(writer, instruction.getRegisterC());
+                writer.write(", ");
+                writeRegister(writer, instruction.getRegisterD());
+                writer.write(", ");
+                writeRegister(writer, instruction.getRegisterE());
+                writer.write(", ");
+                writeRegister(writer, instruction.getRegisterF());
+                writer.write(", ");
+                writeRegister(writer, instruction.getRegisterG());
+                break;
+        }
+        writer.write('}');
+    }
+
+    protected void writeInvokeRangeRegisters(IndentingWriter writer) throws IOException {
+        RegisterRangeInstruction instruction = (RegisterRangeInstruction)this.instruction;
+
+        int regCount = instruction.getRegisterCount();
+        if (regCount == 0) {
+            writer.write("{}");
+        } else {
+            int startRegister = instruction.getStartRegister();
+            methodDef.registerFormatter.writeRegisterRange(writer, startRegister, startRegister+regCount-1);
+        }
+    }
+
+    protected void writeLiteral(IndentingWriter writer) throws IOException {
+        LongRenderer.writeSignedIntOrLongTo(writer, ((WideLiteralInstruction)instruction).getWideLiteral());
+    }
+
+    protected void writeCommentIfLikelyFloat(IndentingWriter writer) throws IOException {
+        writeCommentIfLikelyFloat(writer, ((NarrowLiteralInstruction)instruction).getNarrowLiteral());
+    }
+
+    protected void writeCommentIfLikelyFloat(IndentingWriter writer, int val) throws IOException {
+        if (NumberUtils.isLikelyFloat(val)) {
+            writer.write("    # ");
+            float fval = Float.intBitsToFloat(val);
+            if (fval == Float.POSITIVE_INFINITY)
+                writer.write("Float.POSITIVE_INFINITY");
+            else if (fval == Float.NEGATIVE_INFINITY)
+                writer.write("Float.NEGATIVE_INFINITY");
+            else if (Float.isNaN(fval))
+                writer.write("Float.NaN");
+            else if (fval == Float.MAX_VALUE)
+                writer.write("Float.MAX_VALUE");
+            else if (fval == (float)Math.PI)
+                writer.write("(float)Math.PI");
+            else if (fval == (float)Math.E)
+                writer.write("(float)Math.E");
+            else {
+                writer.write(Float.toString(fval));
+                writer.write('f');
+            }
+        }
+    }
+
+    protected void writeCommentIfLikelyDouble(IndentingWriter writer) throws IOException {
+        writeCommentIfLikelyDouble(writer, ((WideLiteralInstruction)instruction).getWideLiteral());
+    }
+
+    protected void writeCommentIfLikelyDouble(IndentingWriter writer, long val) throws IOException {
+        if (NumberUtils.isLikelyDouble(val)) {
+            writer.write("    # ");
+            double dval = Double.longBitsToDouble(val);
+            if (dval == Double.POSITIVE_INFINITY)
+                writer.write("Double.POSITIVE_INFINITY");
+            else if (dval == Double.NEGATIVE_INFINITY)
+                writer.write("Double.NEGATIVE_INFINITY");
+            else if (Double.isNaN(dval))
+                writer.write("Double.NaN");
+            else if (dval == Double.MAX_VALUE)
+                writer.write("Double.MAX_VALUE");
+            else if (dval == Math.PI)
+                writer.write("Math.PI");
+            else if (dval == Math.E)
+                writer.write("Math.E");
+            else
+                writer.write(Double.toString(dval));
+        }
+    }
+
+    protected boolean writeCommentIfResourceId(IndentingWriter writer) throws IOException {
+        return writeCommentIfResourceId(writer, ((NarrowLiteralInstruction)instruction).getNarrowLiteral());
+    }
+
+    protected boolean writeCommentIfResourceId(IndentingWriter writer, int val) throws IOException {
+        Map<Integer,String> resourceIds = methodDef.classDef.options.resourceIds;
+        String resource = resourceIds.get(Integer.valueOf(val));
+        if (resource != null) {
+            writer.write("    # ");
+            writer.write(resource);
+            return true;
+        }
+        return false;
+    }
+
+    protected void writeFieldOffset(IndentingWriter writer) throws IOException {
+        writer.write("field@0x");
+        writer.printUnsignedLongAsHex(((FieldOffsetInstruction)instruction).getFieldOffset());
+    }
+
+    protected void writeInlineIndex(IndentingWriter writer) throws IOException {
+        writer.write("inline@");
+        writer.printSignedIntAsDec(((InlineIndexInstruction)instruction).getInlineIndex());
+    }
+
+    protected void writeVtableIndex(IndentingWriter writer) throws IOException {
+        writer.write("vtable@");
+        writer.printSignedIntAsDec(((VtableIndexInstruction)instruction).getVtableIndex());
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/InstructionMethodItemFactory.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/InstructionMethodItemFactory.java
new file mode 100644
index 0000000..429cb69
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/InstructionMethodItemFactory.java
@@ -0,0 +1,67 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors.Format;
+
+import org.jf.baksmali.Adaptors.MethodDefinition;
+import org.jf.dexlib2.analysis.UnresolvedOdexInstruction;
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.dexlib2.iface.instruction.OffsetInstruction;
+import org.jf.dexlib2.iface.instruction.formats.ArrayPayload;
+import org.jf.dexlib2.iface.instruction.formats.PackedSwitchPayload;
+import org.jf.dexlib2.iface.instruction.formats.SparseSwitchPayload;
+
+public class InstructionMethodItemFactory {
+    private InstructionMethodItemFactory() {
+    }
+
+    public static InstructionMethodItem makeInstructionFormatMethodItem(
+            MethodDefinition methodDef, int codeAddress, Instruction instruction) {
+
+        if (instruction instanceof OffsetInstruction) {
+            return new OffsetInstructionFormatMethodItem(methodDef.classDef.options, methodDef, codeAddress,
+                    (OffsetInstruction)instruction);
+        }
+
+        if (instruction instanceof UnresolvedOdexInstruction) {
+            return new UnresolvedOdexInstructionMethodItem(methodDef, codeAddress,
+                    (UnresolvedOdexInstruction)instruction);
+        }
+
+        switch (instruction.getOpcode().format) {
+            case ArrayPayload:
+                return new ArrayDataMethodItem(methodDef, codeAddress, (ArrayPayload)instruction);
+            case PackedSwitchPayload:
+                return new PackedSwitchMethodItem(methodDef, codeAddress, (PackedSwitchPayload)instruction);
+            case SparseSwitchPayload:
+                return new SparseSwitchMethodItem(methodDef, codeAddress, (SparseSwitchPayload)instruction);
+            default:
+                return new InstructionMethodItem<Instruction>(methodDef, codeAddress, instruction);
+        }
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/OffsetInstructionFormatMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/OffsetInstructionFormatMethodItem.java
new file mode 100644
index 0000000..be76edf
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/OffsetInstructionFormatMethodItem.java
@@ -0,0 +1,85 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors.Format;
+
+import org.jf.baksmali.Adaptors.LabelMethodItem;
+import org.jf.baksmali.Adaptors.MethodDefinition;
+import org.jf.baksmali.BaksmaliOptions;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.OffsetInstruction;
+import org.jf.util.IndentingWriter;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+
+public class OffsetInstructionFormatMethodItem extends InstructionMethodItem<OffsetInstruction> {
+    protected LabelMethodItem label;
+
+    public OffsetInstructionFormatMethodItem(@Nonnull BaksmaliOptions options, @Nonnull MethodDefinition methodDef,
+                                             int codeAddress, OffsetInstruction instruction) {
+        super(methodDef, codeAddress, instruction);
+
+        label = new LabelMethodItem(options, codeAddress + instruction.getCodeOffset(), getLabelPrefix());
+        label = methodDef.getLabelCache().internLabel(label);
+    }
+
+    @Override
+    protected void writeTargetLabel(IndentingWriter writer) throws IOException {
+        label.writeTo(writer);
+    }
+
+    public LabelMethodItem getLabel() {
+        return label;
+    }
+
+    private String getLabelPrefix() {
+        Opcode opcode = instruction.getOpcode();
+        switch (opcode.format) {
+            case Format10t:
+            case Format20t:
+            case Format30t:
+                return "goto_";
+            case Format21t:
+            case Format22t:
+                return "cond_";
+            case Format31t:
+                if (opcode == Opcode.FILL_ARRAY_DATA) {
+                    return "array_";
+                }
+                if (opcode == Opcode.PACKED_SWITCH) {
+                    return "pswitch_data_";
+                }
+                // Opcode.SPARSE_SWITCH;
+                return "sswitch_data_";
+        }
+
+        assert false;
+        return null;
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/PackedSwitchMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/PackedSwitchMethodItem.java
new file mode 100644
index 0000000..30edfcd
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/PackedSwitchMethodItem.java
@@ -0,0 +1,130 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors.Format;
+
+import org.jf.baksmali.Adaptors.CommentingIndentingWriter;
+import org.jf.baksmali.Adaptors.LabelMethodItem;
+import org.jf.baksmali.Adaptors.MethodDefinition;
+import org.jf.dexlib2.iface.instruction.SwitchElement;
+import org.jf.dexlib2.iface.instruction.formats.PackedSwitchPayload;
+import org.jf.util.IndentingWriter;
+import org.jf.baksmali.Renderers.IntegerRenderer;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+public class PackedSwitchMethodItem extends InstructionMethodItem<PackedSwitchPayload> {
+    private final List<PackedSwitchTarget> targets;
+    private final int firstKey;
+
+    // Whether this sparse switch instruction should be commented out because it is never referenced
+    private boolean commentedOut;
+
+    public PackedSwitchMethodItem(MethodDefinition methodDef, int codeAddress, PackedSwitchPayload instruction) {
+        super(methodDef, codeAddress, instruction);
+
+        int baseCodeAddress = methodDef.getPackedSwitchBaseAddress(codeAddress);
+
+        targets = new ArrayList<PackedSwitchTarget>();
+
+        boolean first = true;
+        int firstKey = 0;
+        if (baseCodeAddress >= 0) {
+            for (SwitchElement switchElement: instruction.getSwitchElements()) {
+                if (first) {
+                    firstKey = switchElement.getKey();
+                    first = false;
+                }
+                LabelMethodItem label = methodDef.getLabelCache().internLabel(
+                        new LabelMethodItem(methodDef.classDef.options, baseCodeAddress + switchElement.getOffset(),
+                                "pswitch_"));
+                targets.add(new PackedSwitchLabelTarget(label));
+            }
+        } else {
+            commentedOut = true;
+            for (SwitchElement switchElement: instruction.getSwitchElements()) {
+                if (first) {
+                    firstKey = switchElement.getKey();
+                    first = false;
+                }
+                targets.add(new PackedSwitchOffsetTarget(switchElement.getOffset()));
+            }
+        }
+        this.firstKey = firstKey;
+    }
+
+    @Override
+    public boolean writeTo(IndentingWriter writer) throws IOException {
+        if (commentedOut) {
+            writer = new CommentingIndentingWriter(writer);
+        }
+        writer.write(".packed-switch ");
+        IntegerRenderer.writeTo(writer, firstKey);
+        writer.indent(4);
+        writer.write('\n');
+        int key = firstKey;
+        for (PackedSwitchTarget target: targets) {
+            target.writeTargetTo(writer);
+            writeCommentIfResourceId(writer, key);
+            writer.write('\n');
+            key++;
+        }
+        writer.deindent(4);
+        writer.write(".end packed-switch");
+        return true;
+    }
+
+    private static abstract class PackedSwitchTarget {
+        public abstract void writeTargetTo(IndentingWriter writer) throws IOException;
+    }
+
+    private static class PackedSwitchLabelTarget extends PackedSwitchTarget {
+        private final LabelMethodItem target;
+        public PackedSwitchLabelTarget(LabelMethodItem target) {
+            this.target = target;
+        }
+        public void writeTargetTo(IndentingWriter writer) throws IOException {
+            target.writeTo(writer);
+        }
+    }
+
+    private static class PackedSwitchOffsetTarget extends PackedSwitchTarget {
+        private final int target;
+        public PackedSwitchOffsetTarget(int target) {
+            this.target = target;
+        }
+        public void writeTargetTo(IndentingWriter writer) throws IOException {
+            if (target >= 0) {
+                writer.write('+');
+            }
+            writer.printSignedIntAsDec(target);
+        }
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/SparseSwitchMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/SparseSwitchMethodItem.java
new file mode 100644
index 0000000..68d7e92
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/SparseSwitchMethodItem.java
@@ -0,0 +1,126 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors.Format;
+
+import org.jf.baksmali.Adaptors.CommentingIndentingWriter;
+import org.jf.baksmali.Adaptors.LabelMethodItem;
+import org.jf.baksmali.Adaptors.MethodDefinition;
+import org.jf.dexlib2.iface.instruction.SwitchElement;
+import org.jf.dexlib2.iface.instruction.formats.SparseSwitchPayload;
+import org.jf.util.IndentingWriter;
+import org.jf.baksmali.Renderers.IntegerRenderer;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+public class SparseSwitchMethodItem extends InstructionMethodItem<SparseSwitchPayload> {
+    private final List<SparseSwitchTarget> targets;
+
+    // Whether this sparse switch instruction should be commented out because it is never referenced
+    private boolean commentedOut;
+
+    public SparseSwitchMethodItem(MethodDefinition methodDef, int codeAddress, SparseSwitchPayload instruction) {
+        super(methodDef, codeAddress, instruction);
+
+        int baseCodeAddress = methodDef.getSparseSwitchBaseAddress(codeAddress);
+
+        targets = new ArrayList<SparseSwitchTarget>();
+        if (baseCodeAddress >= 0) {
+            for (SwitchElement switchElement: instruction.getSwitchElements()) {
+                LabelMethodItem label = methodDef.getLabelCache().internLabel(
+                        new LabelMethodItem( methodDef.classDef.options, baseCodeAddress + switchElement.getOffset(),
+                                "sswitch_"));
+                targets.add(new SparseSwitchLabelTarget(switchElement.getKey(), label));
+            }
+        } else {
+            commentedOut = true;
+            //if we couldn't determine a base address, just use relative offsets rather than labels
+            for (SwitchElement switchElement: instruction.getSwitchElements()) {
+                targets.add(new SparseSwitchOffsetTarget(switchElement.getKey(), switchElement.getOffset()));
+            }
+        }
+    }
+
+    @Override
+    public boolean writeTo(IndentingWriter writer) throws IOException {
+        if (commentedOut) {
+            writer = new CommentingIndentingWriter(writer);
+        }
+
+        writer.write(".sparse-switch\n");
+        writer.indent(4);
+        for (SparseSwitchTarget target: targets) {
+            IntegerRenderer.writeTo(writer, target.getKey());
+            writer.write(" -> ");
+            target.writeTargetTo(writer);
+            writeCommentIfResourceId(writer, target.getKey());
+            writer.write('\n');
+        }
+        writer.deindent(4);
+        writer.write(".end sparse-switch");
+        return true;
+    }
+
+    private static abstract class SparseSwitchTarget {
+        private final int key;
+        public SparseSwitchTarget(int key) {
+            this.key = key;
+        }
+        public int getKey() { return key; }
+        public abstract void writeTargetTo(IndentingWriter writer) throws IOException;
+    }
+
+    private static class SparseSwitchLabelTarget extends SparseSwitchTarget {
+        private final LabelMethodItem target;
+        public SparseSwitchLabelTarget(int key, LabelMethodItem target) {
+            super(key);
+            this.target = target;
+        }
+
+        public void writeTargetTo(IndentingWriter writer) throws IOException {
+            target.writeTo(writer);
+        }
+    }
+
+    private static class SparseSwitchOffsetTarget extends SparseSwitchTarget {
+        private final int target;
+        public SparseSwitchOffsetTarget(int key, int target) {
+            super(key);
+            this.target = target;
+        }
+
+        public void writeTargetTo(IndentingWriter writer) throws IOException {
+            if (target >= 0) {
+                writer.write('+');
+            }
+            writer.printSignedIntAsDec(target);
+        }
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/UnresolvedOdexInstructionMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/UnresolvedOdexInstructionMethodItem.java
new file mode 100644
index 0000000..a776881
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/UnresolvedOdexInstructionMethodItem.java
@@ -0,0 +1,54 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors.Format;
+
+import org.jf.baksmali.Adaptors.MethodDefinition;
+import org.jf.dexlib2.analysis.UnresolvedOdexInstruction;
+import org.jf.util.IndentingWriter;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+
+public class UnresolvedOdexInstructionMethodItem extends InstructionMethodItem<UnresolvedOdexInstruction> {
+    public UnresolvedOdexInstructionMethodItem(@Nonnull MethodDefinition methodDef, int codeAddress,
+                                               @Nonnull UnresolvedOdexInstruction instruction) {
+        super(methodDef, codeAddress, instruction);
+    }
+
+    public boolean writeTo(IndentingWriter writer) throws IOException {
+        writeThrowTo(writer);
+        return true;
+    }
+
+    private void writeThrowTo(IndentingWriter writer) throws IOException {
+        writer.write("#Replaced unresolvable odex instruction with a throw\n");
+        writer.write("throw ");
+        writeRegister(writer, instruction.objectRegisterNum);
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/LabelMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/LabelMethodItem.java
new file mode 100644
index 0000000..268d643
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/LabelMethodItem.java
@@ -0,0 +1,102 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors;
+
+import org.jf.baksmali.BaksmaliOptions;
+import org.jf.util.IndentingWriter;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+
+public class LabelMethodItem extends MethodItem {
+    private final BaksmaliOptions options;
+    private final String labelPrefix;
+    private int labelSequence;
+
+    public LabelMethodItem(@Nonnull BaksmaliOptions options, int codeAddress, @Nonnull String labelPrefix) {
+        super(codeAddress);
+        this.options = options;
+        this.labelPrefix = labelPrefix;
+    }
+
+    public double getSortOrder() {
+        return 0;
+    }
+
+    public int compareTo(MethodItem methodItem) {
+        int result = super.compareTo(methodItem);
+
+        if (result == 0) {
+            if (methodItem instanceof LabelMethodItem) {
+                result = labelPrefix.compareTo(((LabelMethodItem)methodItem).labelPrefix);
+            }
+        }
+        return result;
+    }
+
+    public int hashCode() {
+        //force it to call equals when two labels are at the same address
+        return getCodeAddress();
+    }
+
+    public boolean equals(Object o) {
+        if (!(o instanceof LabelMethodItem)) {
+            return false;
+        }
+        return this.compareTo((MethodItem)o) == 0;
+    }
+
+
+    public boolean writeTo(IndentingWriter writer) throws IOException {
+        writer.write(':');
+        writer.write(labelPrefix);
+        if (options.sequentialLabels) {
+            writer.printUnsignedLongAsHex(labelSequence);
+        } else {
+            writer.printUnsignedLongAsHex(this.getLabelAddress());
+        }
+        return true;
+    }
+
+    public String getLabelPrefix() {
+        return labelPrefix;
+    }
+
+    public int getLabelAddress() {
+        return this.getCodeAddress();
+    }
+
+    public int getLabelSequence() {
+        return labelSequence;
+    }
+
+    public void setLabelSequence(int labelSequence) {
+        this.labelSequence = labelSequence;
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/MethodDefinition.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/MethodDefinition.java
new file mode 100644
index 0000000..8197ee1
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/MethodDefinition.java
@@ -0,0 +1,642 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import org.jf.baksmali.Adaptors.Debug.DebugMethodItem;
+import org.jf.baksmali.Adaptors.Format.InstructionMethodItemFactory;
+import org.jf.baksmali.BaksmaliOptions;
+import org.jf.dexlib2.*;
+import org.jf.dexlib2.analysis.AnalysisException;
+import org.jf.dexlib2.analysis.AnalyzedInstruction;
+import org.jf.dexlib2.analysis.MethodAnalyzer;
+import org.jf.dexlib2.iface.*;
+import org.jf.dexlib2.iface.debug.DebugItem;
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.dexlib2.iface.instruction.OffsetInstruction;
+import org.jf.dexlib2.iface.instruction.ReferenceInstruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction31t;
+import org.jf.dexlib2.iface.reference.MethodReference;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.dexlib2.immutable.instruction.ImmutableInstruction31t;
+import org.jf.dexlib2.util.InstructionOffsetMap;
+import org.jf.dexlib2.util.InstructionOffsetMap.InvalidInstructionOffset;
+import org.jf.dexlib2.util.ReferenceUtil;
+import org.jf.dexlib2.util.SyntheticAccessorResolver;
+import org.jf.dexlib2.util.SyntheticAccessorResolver.AccessedMember;
+import org.jf.dexlib2.util.TypeUtils;
+import org.jf.util.ExceptionWithContext;
+import org.jf.util.IndentingWriter;
+import org.jf.util.SparseIntArray;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.IOException;
+import java.util.*;
+
+public class MethodDefinition {
+    @Nonnull public final ClassDefinition classDef;
+    @Nonnull public final Method method;
+    @Nonnull public final MethodImplementation methodImpl;
+    @Nonnull public final ImmutableList<Instruction> instructions;
+    @Nonnull public final List<Instruction> effectiveInstructions;
+
+    @Nonnull public final ImmutableList<MethodParameter> methodParameters;
+    public RegisterFormatter registerFormatter;
+
+    @Nonnull private final LabelCache labelCache = new LabelCache();
+
+    @Nonnull private final SparseIntArray packedSwitchMap;
+    @Nonnull private final SparseIntArray sparseSwitchMap;
+    @Nonnull private final InstructionOffsetMap instructionOffsetMap;
+
+    public MethodDefinition(@Nonnull ClassDefinition classDef, @Nonnull Method method,
+                            @Nonnull MethodImplementation methodImpl) {
+        this.classDef = classDef;
+        this.method = method;
+        this.methodImpl = methodImpl;
+
+        try {
+            //TODO: what about try/catch blocks inside the dead code? those will need to be commented out too. ugh.
+
+            instructions = ImmutableList.copyOf(methodImpl.getInstructions());
+            methodParameters = ImmutableList.copyOf(method.getParameters());
+
+            effectiveInstructions = Lists.newArrayList(instructions);
+
+            packedSwitchMap = new SparseIntArray(0);
+            sparseSwitchMap = new SparseIntArray(0);
+            instructionOffsetMap = new InstructionOffsetMap(instructions);
+
+            int endOffset = instructionOffsetMap.getInstructionCodeOffset(instructions.size()-1) +
+                    instructions.get(instructions.size()-1).getCodeUnits();
+
+            for (int i=0; i<instructions.size(); i++) {
+                Instruction instruction = instructions.get(i);
+
+                Opcode opcode = instruction.getOpcode();
+                if (opcode == Opcode.PACKED_SWITCH) {
+                    boolean valid = true;
+                    int codeOffset = instructionOffsetMap.getInstructionCodeOffset(i);
+                    int targetOffset = codeOffset + ((OffsetInstruction)instruction).getCodeOffset();
+                    try {
+                        targetOffset = findPayloadOffset(targetOffset, Opcode.PACKED_SWITCH_PAYLOAD);
+                    } catch (InvalidSwitchPayload ex) {
+                        valid = false;
+                    }
+                    if (valid) {
+                        if (packedSwitchMap.get(targetOffset, -1) != -1) {
+                            Instruction payloadInstruction =
+                                    findSwitchPayload(targetOffset, Opcode.PACKED_SWITCH_PAYLOAD);
+                            targetOffset = endOffset;
+                            effectiveInstructions.set(i, new ImmutableInstruction31t(opcode,
+                                    ((Instruction31t)instruction).getRegisterA(), targetOffset-codeOffset));
+                            effectiveInstructions.add(payloadInstruction);
+                            endOffset += payloadInstruction.getCodeUnits();
+                        }
+                        packedSwitchMap.append(targetOffset, codeOffset);
+                    }
+                } else if (opcode == Opcode.SPARSE_SWITCH) {
+                    boolean valid = true;
+                    int codeOffset = instructionOffsetMap.getInstructionCodeOffset(i);
+                    int targetOffset = codeOffset + ((OffsetInstruction)instruction).getCodeOffset();
+                    try {
+                        targetOffset = findPayloadOffset(targetOffset, Opcode.SPARSE_SWITCH_PAYLOAD);
+                    } catch (InvalidSwitchPayload ex) {
+                        valid = false;
+                        // The offset to the payload instruction was invalid. Nothing to do, except that we won't
+                        // add this instruction to the map.
+                    }
+                    if (valid) {
+                        if (sparseSwitchMap.get(targetOffset, -1) != -1) {
+                            Instruction payloadInstruction =
+                                    findSwitchPayload(targetOffset, Opcode.SPARSE_SWITCH_PAYLOAD);
+                            targetOffset = endOffset;
+                            effectiveInstructions.set(i, new ImmutableInstruction31t(opcode,
+                                    ((Instruction31t)instruction).getRegisterA(), targetOffset-codeOffset));
+                            effectiveInstructions.add(payloadInstruction);
+                            endOffset += payloadInstruction.getCodeUnits();
+                        }
+                        sparseSwitchMap.append(targetOffset, codeOffset);
+                    }
+                }
+            }
+        } catch (Exception ex) {
+            String methodString;
+            try {
+                methodString = ReferenceUtil.getMethodDescriptor(method);
+            } catch (Exception ex2) {
+                throw ExceptionWithContext.withContext(ex, "Error while processing method");
+            }
+            throw ExceptionWithContext.withContext(ex, "Error while processing method %s", methodString);
+        }
+    }
+
+    public static void writeEmptyMethodTo(IndentingWriter writer, Method method,
+                                          BaksmaliOptions options) throws IOException {
+        writer.write(".method ");
+        writeAccessFlagsAndRestrictions(writer, method.getAccessFlags(), method.getHiddenApiRestrictions());
+        writer.write(method.getName());
+        writer.write("(");
+        ImmutableList<MethodParameter> methodParameters = ImmutableList.copyOf(method.getParameters());
+        for (MethodParameter parameter: methodParameters) {
+            writer.write(parameter.getType());
+        }
+        writer.write(")");
+        writer.write(method.getReturnType());
+        writer.write('\n');
+
+        writer.indent(4);
+        writeParameters(writer, method, methodParameters, options);
+
+        String containingClass = null;
+        if (options.implicitReferences) {
+            containingClass = method.getDefiningClass();
+        }
+        AnnotationFormatter.writeTo(writer, method.getAnnotations(), containingClass);
+
+        writer.deindent(4);
+        writer.write(".end method\n");
+    }
+
+    public void writeTo(IndentingWriter writer) throws IOException {
+        int parameterRegisterCount = 0;
+        if (!AccessFlags.STATIC.isSet(method.getAccessFlags())) {
+            parameterRegisterCount++;
+        }
+
+        writer.write(".method ");
+        writeAccessFlagsAndRestrictions(writer, method.getAccessFlags(), method.getHiddenApiRestrictions());
+        writer.write(method.getName());
+        writer.write("(");
+        for (MethodParameter parameter: methodParameters) {
+            String type = parameter.getType();
+            writer.write(type);
+            parameterRegisterCount++;
+            if (TypeUtils.isWideType(type)) {
+                parameterRegisterCount++;
+            }
+        }
+        writer.write(")");
+        writer.write(method.getReturnType());
+        writer.write('\n');
+
+        writer.indent(4);
+        if (classDef.options.localsDirective) {
+            writer.write(".locals ");
+            writer.printSignedIntAsDec(methodImpl.getRegisterCount() - parameterRegisterCount);
+        } else {
+            writer.write(".registers ");
+            writer.printSignedIntAsDec(methodImpl.getRegisterCount());
+        }
+        writer.write('\n');
+        writeParameters(writer, method, methodParameters, classDef.options);
+
+        if (registerFormatter == null) {
+            registerFormatter = new RegisterFormatter(classDef.options, methodImpl.getRegisterCount(),
+                    parameterRegisterCount);
+        }
+
+        String containingClass = null;
+        if (classDef.options.implicitReferences) {
+            containingClass = method.getDefiningClass();
+        }
+        AnnotationFormatter.writeTo(writer, method.getAnnotations(), containingClass);
+
+        writer.write('\n');
+
+        List<MethodItem> methodItems = getMethodItems();
+        for (MethodItem methodItem: methodItems) {
+            if (methodItem.writeTo(writer)) {
+                writer.write('\n');
+            }
+        }
+        writer.deindent(4);
+        writer.write(".end method\n");
+    }
+
+    public Instruction findSwitchPayload(int targetOffset, Opcode type) {
+        int targetIndex;
+        try {
+            targetIndex = instructionOffsetMap.getInstructionIndexAtCodeOffset(targetOffset);
+        } catch (InvalidInstructionOffset ex) {
+            throw new InvalidSwitchPayload(targetOffset);
+        }
+
+        //TODO: does dalvik let you pad with multiple nops?
+        //TODO: does dalvik let a switch instruction point to a non-payload instruction?
+
+        Instruction instruction = instructions.get(targetIndex);
+        if (instruction.getOpcode() != type) {
+            // maybe it's pointing to a NOP padding instruction. Look at the next instruction
+            if (instruction.getOpcode() == Opcode.NOP) {
+                targetIndex += 1;
+                if (targetIndex < instructions.size()) {
+                    instruction = instructions.get(targetIndex);
+                    if (instruction.getOpcode() == type) {
+                        return instruction;
+                    }
+                }
+            }
+            throw new InvalidSwitchPayload(targetOffset);
+        } else {
+            return instruction;
+        }
+    }
+
+    public int findPayloadOffset(int targetOffset, Opcode type) {
+        int targetIndex;
+        try {
+            targetIndex = instructionOffsetMap.getInstructionIndexAtCodeOffset(targetOffset);
+        } catch (InvalidInstructionOffset ex) {
+            throw new InvalidSwitchPayload(targetOffset);
+        }
+
+        //TODO: does dalvik let you pad with multiple nops?
+        //TODO: does dalvik let a switch instruction point to a non-payload instruction?
+
+        Instruction instruction = instructions.get(targetIndex);
+        if (instruction.getOpcode() != type) {
+            // maybe it's pointing to a NOP padding instruction. Look at the next instruction
+            if (instruction.getOpcode() == Opcode.NOP) {
+                targetIndex += 1;
+                if (targetIndex < instructions.size()) {
+                    instruction = instructions.get(targetIndex);
+                    if (instruction.getOpcode() == type) {
+                        return instructionOffsetMap.getInstructionCodeOffset(targetIndex);
+                    }
+                }
+            }
+            throw new InvalidSwitchPayload(targetOffset);
+        } else {
+            return targetOffset;
+        }
+    }
+
+    private static void writeAccessFlagsAndRestrictions(
+            IndentingWriter writer, int accessFlags, Set<HiddenApiRestriction> hiddenApiRestrictions)
+            throws IOException {
+        for (AccessFlags accessFlag: AccessFlags.getAccessFlagsForMethod(accessFlags)) {
+            writer.write(accessFlag.toString());
+            writer.write(' ');
+        }
+        for (HiddenApiRestriction hiddenApiRestriction : hiddenApiRestrictions) {
+            writer.write(hiddenApiRestriction.toString());
+            writer.write(' ');
+        }
+    }
+
+    private static void writeParameters(IndentingWriter writer, Method method,
+                                        List<? extends MethodParameter> parameters,
+                                        BaksmaliOptions options) throws IOException {
+        boolean isStatic = AccessFlags.STATIC.isSet(method.getAccessFlags());
+        int registerNumber = isStatic?0:1;
+        for (MethodParameter parameter: parameters) {
+            String parameterType = parameter.getType();
+            String parameterName = parameter.getName();
+            Collection<? extends Annotation> annotations = parameter.getAnnotations();
+            if ((options.debugInfo && parameterName != null) || annotations.size() != 0) {
+                writer.write(".param p");
+                writer.printSignedIntAsDec(registerNumber);
+
+                if (parameterName != null && options.debugInfo) {
+                    writer.write(", ");
+                    ReferenceFormatter.writeStringReference(writer, parameterName);
+                }
+                writer.write("    # ");
+                writer.write(parameterType);
+                writer.write("\n");
+                if (annotations.size() > 0) {
+                    writer.indent(4);
+
+                    String containingClass = null;
+                    if (options.implicitReferences) {
+                        containingClass = method.getDefiningClass();
+                    }
+                    AnnotationFormatter.writeTo(writer, annotations, containingClass);
+                    writer.deindent(4);
+                    writer.write(".end param\n");
+                }
+            }
+
+            registerNumber++;
+            if (TypeUtils.isWideType(parameterType)) {
+                registerNumber++;
+            }
+        }
+    }
+
+    @Nonnull public LabelCache getLabelCache() {
+        return labelCache;
+    }
+
+    public int getPackedSwitchBaseAddress(int packedSwitchPayloadCodeOffset) {
+        return packedSwitchMap.get(packedSwitchPayloadCodeOffset, -1);
+    }
+
+    public int getSparseSwitchBaseAddress(int sparseSwitchPayloadCodeOffset) {
+        return sparseSwitchMap.get(sparseSwitchPayloadCodeOffset, -1);
+    }
+
+    private List<MethodItem> getMethodItems() {
+        ArrayList<MethodItem> methodItems = new ArrayList<MethodItem>();
+
+        if ((classDef.options.registerInfo != 0) || (classDef.options.normalizeVirtualMethods) ||
+                (classDef.options.deodex && needsAnalyzed())) {
+            addAnalyzedInstructionMethodItems(methodItems);
+        } else {
+            addInstructionMethodItems(methodItems);
+        }
+
+        addTries(methodItems);
+        if (classDef.options.debugInfo) {
+            addDebugInfo(methodItems);
+        }
+
+        if (classDef.options.sequentialLabels) {
+            setLabelSequentialNumbers();
+        }
+
+        for (LabelMethodItem labelMethodItem: labelCache.getLabels()) {
+            methodItems.add(labelMethodItem);
+        }
+
+        Collections.sort(methodItems);
+
+        return methodItems;
+    }
+
+    private boolean needsAnalyzed() {
+        for (Instruction instruction: methodImpl.getInstructions()) {
+            if (instruction.getOpcode().odexOnly()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private void addInstructionMethodItems(List<MethodItem> methodItems) {
+        int currentCodeAddress = 0;
+
+        for (int i=0; i<effectiveInstructions.size(); i++) {
+            Instruction instruction = effectiveInstructions.get(i);
+
+            MethodItem methodItem = InstructionMethodItemFactory.makeInstructionFormatMethodItem(this,
+                    currentCodeAddress, instruction);
+
+            methodItems.add(methodItem);
+
+            if (i != effectiveInstructions.size() - 1) {
+                methodItems.add(new BlankMethodItem(currentCodeAddress));
+            }
+
+            if (classDef.options.codeOffsets) {
+                methodItems.add(new MethodItem(currentCodeAddress) {
+
+                    @Override
+                    public double getSortOrder() {
+                        return -1000;
+                    }
+
+                    @Override
+                    public boolean writeTo(IndentingWriter writer) throws IOException {
+                        writer.write("#@");
+                        writer.printUnsignedLongAsHex(codeAddress & 0xFFFFFFFFL);
+                        return true;
+                    }
+                });
+            }
+
+            if (classDef.options.accessorComments && classDef.options.syntheticAccessorResolver != null &&
+                    (instruction instanceof ReferenceInstruction)) {
+                Opcode opcode = instruction.getOpcode();
+
+                if (opcode.referenceType == ReferenceType.METHOD) {
+                    MethodReference methodReference =
+                            (MethodReference)((ReferenceInstruction)instruction).getReference();
+
+                    try {
+                        methodReference.validateReference();
+
+                        if (SyntheticAccessorResolver.looksLikeSyntheticAccessor(methodReference.getName())) {
+                            AccessedMember accessedMember =
+                                    classDef.options.syntheticAccessorResolver.getAccessedMember(methodReference);
+                            if (accessedMember != null) {
+                                methodItems.add(new SyntheticAccessCommentMethodItem(accessedMember, currentCodeAddress));
+                            }
+                        }
+                    } catch (Reference.InvalidReferenceException e) {
+                        // Just ignore for now. We'll deal with it when processing the instruction
+                    }
+                }
+            }
+
+            currentCodeAddress += instruction.getCodeUnits();
+        }
+    }
+
+    private void addAnalyzedInstructionMethodItems(List<MethodItem> methodItems) {
+        MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classDef.options.classPath, method,
+                classDef.options.inlineResolver, classDef.options.normalizeVirtualMethods);
+
+        AnalysisException analysisException = methodAnalyzer.getAnalysisException();
+        if (analysisException != null) {
+            // TODO: need to keep track of whether any errors occurred, so we can exit with a non-zero result
+            methodItems.add(new CommentMethodItem(
+                    String.format("AnalysisException: %s", analysisException.getMessage()),
+                    analysisException.codeAddress, Integer.MIN_VALUE));
+            analysisException.printStackTrace(System.err);
+        }
+
+        List<AnalyzedInstruction> instructions = methodAnalyzer.getAnalyzedInstructions();
+
+        int currentCodeAddress = 0;
+        for (int i=0; i<instructions.size(); i++) {
+            AnalyzedInstruction instruction = instructions.get(i);
+
+            MethodItem methodItem = InstructionMethodItemFactory.makeInstructionFormatMethodItem(
+                    this, currentCodeAddress, instruction.getInstruction());
+
+            methodItems.add(methodItem);
+
+            if (instruction.getInstruction().getOpcode().format == Format.UnresolvedOdexInstruction) {
+                methodItems.add(new CommentedOutMethodItem(
+                        InstructionMethodItemFactory.makeInstructionFormatMethodItem(
+                                this, currentCodeAddress, instruction.getOriginalInstruction())));
+            }
+
+            if (i != instructions.size() - 1) {
+                methodItems.add(new BlankMethodItem(currentCodeAddress));
+            }
+
+            if (classDef.options.codeOffsets) {
+                methodItems.add(new MethodItem(currentCodeAddress) {
+
+                    @Override
+                    public double getSortOrder() {
+                        return -1000;
+                    }
+
+                    @Override
+                    public boolean writeTo(IndentingWriter writer) throws IOException {
+                        writer.write("#@");
+                        writer.printUnsignedLongAsHex(codeAddress & 0xFFFFFFFFL);
+                        return true;
+                    }
+                });
+            }
+
+            if (classDef.options.registerInfo != 0 &&
+                    !instruction.getInstruction().getOpcode().format.isPayloadFormat) {
+                methodItems.add(
+                        new PreInstructionRegisterInfoMethodItem(classDef.options.registerInfo,
+                                methodAnalyzer, registerFormatter, instruction, currentCodeAddress));
+
+                methodItems.add(
+                        new PostInstructionRegisterInfoMethodItem(registerFormatter, instruction, currentCodeAddress));
+            }
+
+            currentCodeAddress += instruction.getInstruction().getCodeUnits();
+        }
+    }
+
+    private void addTries(List<MethodItem> methodItems) {
+        List<? extends TryBlock<? extends ExceptionHandler>> tryBlocks = methodImpl.getTryBlocks();
+        if (tryBlocks.size() == 0) {
+            return;
+        }
+
+        int lastInstructionAddress = instructionOffsetMap.getInstructionCodeOffset(instructions.size() - 1);
+        int codeSize = lastInstructionAddress + instructions.get(instructions.size() - 1).getCodeUnits();
+
+        for (TryBlock<? extends ExceptionHandler> tryBlock: tryBlocks) {
+            int startAddress = tryBlock.getStartCodeAddress();
+            int endAddress = startAddress + tryBlock.getCodeUnitCount();
+
+            if (startAddress >= codeSize) {
+                throw new RuntimeException(String.format("Try start offset %d is past the end of the code block.",
+                        startAddress));
+            }
+            // Note: not >=. endAddress == codeSize is valid, when the try covers the last instruction
+            if (endAddress > codeSize) {
+                throw new RuntimeException(String.format("Try end offset %d is past the end of the code block.",
+                        endAddress));
+            }
+
+            /**
+             * The end address points to the address immediately after the end of the last
+             * instruction that the try block covers. We want the .catch directive and end_try
+             * label to be associated with the last covered instruction, so we need to get
+             * the address for that instruction
+             */
+
+            int lastCoveredIndex = instructionOffsetMap.getInstructionIndexAtCodeOffset(endAddress - 1, false);
+            int lastCoveredAddress = instructionOffsetMap.getInstructionCodeOffset(lastCoveredIndex);
+
+            for (ExceptionHandler handler: tryBlock.getExceptionHandlers()) {
+                int handlerAddress = handler.getHandlerCodeAddress();
+                if (handlerAddress >= codeSize) {
+                    throw new ExceptionWithContext(
+                            "Exception handler offset %d is past the end of the code block.", handlerAddress);
+                }
+
+                //use the address from the last covered instruction
+                CatchMethodItem catchMethodItem = new CatchMethodItem(classDef.options, labelCache, lastCoveredAddress,
+                        handler.getExceptionType(), startAddress, endAddress, handlerAddress);
+                methodItems.add(catchMethodItem);
+            }
+        }
+    }
+
+    private void addDebugInfo(final List<MethodItem> methodItems) {
+        for (DebugItem debugItem: methodImpl.getDebugItems()) {
+            methodItems.add(DebugMethodItem.build(registerFormatter, debugItem));
+        }
+    }
+
+    private void setLabelSequentialNumbers() {
+        HashMap<String, Integer> nextLabelSequenceByType = new HashMap<String, Integer>();
+        ArrayList<LabelMethodItem> sortedLabels = new ArrayList<LabelMethodItem>(labelCache.getLabels());
+
+        //sort the labels by their location in the method
+        Collections.sort(sortedLabels);
+
+        for (LabelMethodItem labelMethodItem: sortedLabels) {
+            Integer labelSequence = nextLabelSequenceByType.get(labelMethodItem.getLabelPrefix());
+            if (labelSequence == null) {
+                labelSequence = 0;
+            }
+            labelMethodItem.setLabelSequence(labelSequence);
+            nextLabelSequenceByType.put(labelMethodItem.getLabelPrefix(), labelSequence + 1);
+        }
+    }
+
+    @Nullable
+    private String getContainingClassForImplicitReference() {
+        if (classDef.options.implicitReferences) {
+            return classDef.classDef.getType();
+        }
+        return null;
+    }
+
+    public static class LabelCache {
+        protected HashMap<LabelMethodItem, LabelMethodItem> labels = new HashMap<LabelMethodItem, LabelMethodItem>();
+
+        public LabelCache() {
+        }
+
+        public LabelMethodItem internLabel(LabelMethodItem labelMethodItem) {
+            LabelMethodItem internedLabelMethodItem = labels.get(labelMethodItem);
+            if (internedLabelMethodItem != null) {
+                return internedLabelMethodItem;
+            }
+            labels.put(labelMethodItem, labelMethodItem);
+            return labelMethodItem;
+        }
+
+
+        public Collection<LabelMethodItem> getLabels() {
+            return labels.values();
+        }
+    }
+
+    public static class InvalidSwitchPayload extends ExceptionWithContext {
+        private final int payloadOffset;
+
+        public InvalidSwitchPayload(int payloadOffset) {
+            super("No switch payload at offset: %d", payloadOffset);
+            this.payloadOffset = payloadOffset;
+        }
+
+        public int getPayloadOffset() {
+            return payloadOffset;
+        }
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/MethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/MethodItem.java
new file mode 100644
index 0000000..60358c5
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/MethodItem.java
@@ -0,0 +1,59 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors;
+
+import org.jf.util.IndentingWriter;
+
+import java.io.IOException;
+
+public abstract class MethodItem implements Comparable<MethodItem> {
+    protected final int codeAddress;
+
+    protected MethodItem(int codeAddress) {
+        this.codeAddress = codeAddress;
+    }
+
+    public int getCodeAddress() {
+        return codeAddress;
+    }
+
+    //return an arbitrary double that determines how this item will be sorted with others at the same address
+    public abstract double getSortOrder();
+
+    public int compareTo(MethodItem methodItem) {
+        int result = ((Integer) codeAddress).compareTo(methodItem.codeAddress);
+
+        if (result == 0){
+            return ((Double)getSortOrder()).compareTo(methodItem.getSortOrder());
+        }
+        return result;
+    }
+
+    public abstract boolean writeTo(IndentingWriter writer) throws IOException;
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/PostInstructionRegisterInfoMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/PostInstructionRegisterInfoMethodItem.java
new file mode 100644
index 0000000..62826b1
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/PostInstructionRegisterInfoMethodItem.java
@@ -0,0 +1,102 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors;
+
+import org.jf.baksmali.BaksmaliOptions;
+import org.jf.dexlib2.analysis.AnalyzedInstruction;
+import org.jf.dexlib2.analysis.RegisterType;
+import org.jf.util.IndentingWriter;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.util.BitSet;
+
+public class PostInstructionRegisterInfoMethodItem extends MethodItem {
+    @Nonnull private final RegisterFormatter registerFormatter;
+    @Nonnull private final AnalyzedInstruction analyzedInstruction;
+
+    public PostInstructionRegisterInfoMethodItem(@Nonnull RegisterFormatter registerFormatter,
+                                                 @Nonnull AnalyzedInstruction analyzedInstruction,
+                                                 int codeAddress) {
+        super(codeAddress);
+        this.registerFormatter = registerFormatter;
+        this.analyzedInstruction = analyzedInstruction;
+    }
+
+    @Override
+    public double getSortOrder() {
+        return 100.1;
+    }
+
+    @Override
+    public boolean writeTo(IndentingWriter writer) throws IOException {
+        int registerInfo = registerFormatter.options.registerInfo;
+        int registerCount = analyzedInstruction.getRegisterCount();
+        BitSet registers = new BitSet(registerCount);
+
+        if ((registerInfo & BaksmaliOptions.ALL) != 0) {
+            registers.set(0, registerCount);
+        } else {
+            if ((registerInfo & BaksmaliOptions.ALLPOST) != 0) {
+                registers.set(0, registerCount);
+            } else if ((registerInfo & BaksmaliOptions.DEST) != 0) {
+                addDestRegs(registers, registerCount);
+            }
+        }
+
+        return writeRegisterInfo(writer, registers);
+    }
+
+    private void addDestRegs(BitSet printPostRegister, int registerCount) {
+        for (int registerNum=0; registerNum<registerCount; registerNum++) {
+            if (!analyzedInstruction.getPreInstructionRegisterType(registerNum).equals(
+                    analyzedInstruction.getPostInstructionRegisterType(registerNum))) {
+                printPostRegister.set(registerNum);
+            }
+        }
+    }
+
+    private boolean writeRegisterInfo(IndentingWriter writer, BitSet registers) throws IOException {
+        int registerNum = registers.nextSetBit(0);
+        if (registerNum < 0) {
+            return false;
+        }
+
+        writer.write('#');
+        for (; registerNum >= 0; registerNum = registers.nextSetBit(registerNum + 1)) {
+            RegisterType registerType = analyzedInstruction.getPostInstructionRegisterType(registerNum);
+
+            registerFormatter.writeTo(writer, registerNum);
+            writer.write('=');
+            registerType.writeTo(writer);
+            writer.write(';');
+        }
+        return true;
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/PreInstructionRegisterInfoMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/PreInstructionRegisterInfoMethodItem.java
new file mode 100644
index 0000000..f934edd
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/PreInstructionRegisterInfoMethodItem.java
@@ -0,0 +1,244 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors;
+
+import org.jf.baksmali.BaksmaliOptions;
+import org.jf.dexlib2.analysis.AnalyzedInstruction;
+import org.jf.dexlib2.analysis.MethodAnalyzer;
+import org.jf.dexlib2.analysis.RegisterType;
+import org.jf.dexlib2.iface.instruction.*;
+import org.jf.util.IndentingWriter;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.util.BitSet;
+
+public class PreInstructionRegisterInfoMethodItem extends MethodItem {
+    private final int registerInfo;
+    @Nonnull private final MethodAnalyzer methodAnalyzer;
+    @Nonnull private final RegisterFormatter registerFormatter;
+    @Nonnull private final AnalyzedInstruction analyzedInstruction;
+
+    public PreInstructionRegisterInfoMethodItem(int registerInfo,
+                                                @Nonnull MethodAnalyzer methodAnalyzer,
+                                                @Nonnull RegisterFormatter registerFormatter,
+                                                @Nonnull AnalyzedInstruction analyzedInstruction,
+                                                int codeAddress) {
+        super(codeAddress);
+        this.registerInfo = registerInfo;
+        this.methodAnalyzer = methodAnalyzer;
+        this.registerFormatter = registerFormatter;
+        this.analyzedInstruction = analyzedInstruction;
+    }
+
+    @Override
+    public double getSortOrder() {
+        return 99.9;
+    }
+
+    @Override
+    public boolean writeTo(IndentingWriter writer) throws IOException {
+        int registerCount = analyzedInstruction.getRegisterCount();
+        BitSet registers = new BitSet(registerCount);
+        BitSet mergeRegisters = null;
+
+        if ((registerInfo & BaksmaliOptions.ALL) != 0) {
+            registers.set(0, registerCount);
+        } else {
+            if ((registerInfo & BaksmaliOptions.ALLPRE) != 0) {
+                registers.set(0, registerCount);
+            } else {
+                if ((registerInfo & BaksmaliOptions.ARGS) != 0) {
+                    addArgsRegs(registers);
+                }
+                if ((registerInfo & BaksmaliOptions.MERGE) != 0) {
+                    if (analyzedInstruction.isBeginningInstruction()) {
+                        addParamRegs(registers, registerCount);
+                    }
+                    mergeRegisters = new BitSet(registerCount);
+                    addMergeRegs(mergeRegisters, registerCount);
+                } else if ((registerInfo & BaksmaliOptions.FULLMERGE) != 0 &&
+                        (analyzedInstruction.isBeginningInstruction())) {
+                    addParamRegs(registers, registerCount);
+                }
+            }
+        }
+
+        if ((registerInfo & BaksmaliOptions.FULLMERGE) != 0) {
+            if (mergeRegisters == null) {
+                mergeRegisters = new BitSet(registerCount);
+                addMergeRegs(mergeRegisters, registerCount);
+            }
+            registers.or(mergeRegisters);
+        } else if (mergeRegisters != null) {
+            registers.or(mergeRegisters);
+            mergeRegisters = null;
+        }
+
+        return writeRegisterInfo(writer, registers, mergeRegisters);
+    }
+
+    private void addArgsRegs(BitSet registers) {
+        if (analyzedInstruction.getInstruction() instanceof RegisterRangeInstruction) {
+            RegisterRangeInstruction instruction = (RegisterRangeInstruction)analyzedInstruction.getInstruction();
+
+            registers.set(instruction.getStartRegister(),
+                    instruction.getStartRegister() + instruction.getRegisterCount());
+        } else if (analyzedInstruction.getInstruction() instanceof FiveRegisterInstruction) {
+            FiveRegisterInstruction instruction = (FiveRegisterInstruction)analyzedInstruction.getInstruction();
+            int regCount = instruction.getRegisterCount();
+            switch (regCount) {
+                case 5:
+                    registers.set(instruction.getRegisterG());
+                    //fall through
+                case 4:
+                    registers.set(instruction.getRegisterF());
+                    //fall through
+                case 3:
+                    registers.set(instruction.getRegisterE());
+                    //fall through
+                case 2:
+                    registers.set(instruction.getRegisterD());
+                    //fall through
+                case 1:
+                    registers.set(instruction.getRegisterC());
+            }
+        } else if (analyzedInstruction.getInstruction() instanceof ThreeRegisterInstruction) {
+            ThreeRegisterInstruction instruction = (ThreeRegisterInstruction)analyzedInstruction.getInstruction();
+            registers.set(instruction.getRegisterA());
+            registers.set(instruction.getRegisterB());
+            registers.set(instruction.getRegisterC());
+        } else if (analyzedInstruction.getInstruction() instanceof TwoRegisterInstruction) {
+            TwoRegisterInstruction instruction = (TwoRegisterInstruction)analyzedInstruction.getInstruction();
+            registers.set(instruction.getRegisterA());
+            registers.set(instruction.getRegisterB());
+        } else if (analyzedInstruction.getInstruction() instanceof OneRegisterInstruction) {
+            OneRegisterInstruction instruction = (OneRegisterInstruction)analyzedInstruction.getInstruction();
+            registers.set(instruction.getRegisterA());
+        }
+    }
+
+    private void addMergeRegs(BitSet registers, int registerCount) {
+        if (analyzedInstruction.getPredecessorCount() <= 1) {
+            //in the common case of an instruction that only has a single predecessor which is the previous
+            //instruction, the pre-instruction registers will always match the previous instruction's
+            //post-instruction registers
+            return;
+        }
+
+        for (int registerNum=0; registerNum<registerCount; registerNum++) {
+            RegisterType mergedRegisterType = analyzedInstruction.getPreInstructionRegisterType(registerNum);
+
+            for (AnalyzedInstruction predecessor: analyzedInstruction.getPredecessors()) {
+                RegisterType predecessorRegisterType = analyzedInstruction.getPredecessorRegisterType(
+                        predecessor, registerNum);
+                if (predecessorRegisterType.category != RegisterType.UNKNOWN &&
+                        !predecessorRegisterType.equals(mergedRegisterType)) {
+                    registers.set(registerNum);
+                }
+            }
+        }
+    }
+
+    private void addParamRegs(BitSet registers, int registerCount) {
+        int parameterRegisterCount = methodAnalyzer.getParamRegisterCount();
+        registers.set(registerCount-parameterRegisterCount, registerCount);
+    }
+
+    private void writeFullMerge(IndentingWriter writer, int registerNum) throws IOException {
+        registerFormatter.writeTo(writer, registerNum);
+        writer.write('=');
+        analyzedInstruction.getPreInstructionRegisterType(registerNum).writeTo(writer);
+        writer.write(":merge{");
+
+        boolean first = true;
+
+        for (AnalyzedInstruction predecessor: analyzedInstruction.getPredecessors()) {
+            RegisterType predecessorRegisterType = analyzedInstruction.getPredecessorRegisterType(
+                    predecessor, registerNum);
+
+            if (!first) {
+                writer.write(',');
+            }
+
+            if (predecessor.getInstructionIndex() == -1) {
+                //the fake "StartOfMethod" instruction
+                writer.write("Start:");
+            } else {
+                writer.write("0x");
+                writer.printUnsignedLongAsHex(methodAnalyzer.getInstructionAddress(predecessor));
+                writer.write(':');
+            }
+            predecessorRegisterType.writeTo(writer);
+
+            first = false;
+        }
+        writer.write('}');
+    }
+
+    private boolean writeRegisterInfo(IndentingWriter writer, BitSet registers,
+                                      BitSet fullMergeRegisters) throws IOException {
+        boolean firstRegister = true;
+        boolean previousWasFullMerge = false;
+        int registerNum = registers.nextSetBit(0);
+        if (registerNum < 0) {
+            return false;
+        }
+
+        writer.write('#');
+        for (; registerNum >= 0; registerNum = registers.nextSetBit(registerNum + 1)) {
+            boolean fullMerge = fullMergeRegisters!=null && fullMergeRegisters.get(registerNum);
+            if (fullMerge) {
+                if (!firstRegister) {
+                    writer.write('\n');
+                    writer.write('#');
+                }
+                writeFullMerge(writer, registerNum);
+                previousWasFullMerge = true;
+            } else {
+                if (previousWasFullMerge) {
+                    writer.write('\n');
+                    writer.write('#');
+                    previousWasFullMerge = false;
+                }
+
+                RegisterType registerType = analyzedInstruction.getPreInstructionRegisterType(registerNum);
+
+                registerFormatter.writeTo(writer, registerNum);
+                writer.write('=');
+
+                registerType.writeTo(writer);
+                writer.write(';');
+            }
+
+            firstRegister = false;
+        }
+        return true;
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/ReferenceFormatter.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/ReferenceFormatter.java
new file mode 100644
index 0000000..bfb71e8
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/ReferenceFormatter.java
@@ -0,0 +1,99 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors;
+
+import org.jf.baksmali.Adaptors.EncodedValue.EncodedValueAdaptor;
+import org.jf.dexlib2.MethodHandleType;
+import org.jf.dexlib2.ReferenceType;
+import org.jf.dexlib2.iface.reference.*;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.dexlib2.util.ReferenceUtil;
+import org.jf.util.IndentingWriter;
+import org.jf.util.StringUtils;
+
+import java.io.IOException;
+
+public class ReferenceFormatter {
+    public static void writeStringReference(IndentingWriter writer, String item) throws IOException {
+        writer.write('"');
+        StringUtils.writeEscapedString(writer, item);
+        writer.write('"');
+    }
+
+    public static void writeCallSiteReference(IndentingWriter writer, CallSiteReference callSite) throws IOException {
+        writer.write(callSite.getName());
+        writer.write('(');
+        writer.write('"');
+        StringUtils.writeEscapedString(writer, callSite.getMethodName());
+        writer.write("\", ");
+        writeReference(writer, ReferenceType.METHOD_PROTO, callSite.getMethodProto());
+
+        for (EncodedValue encodedValue : callSite.getExtraArguments()) {
+            writer.write(", ");
+            EncodedValueAdaptor.writeTo(writer, encodedValue, null);
+        }
+        writer.write(")@");
+        MethodHandleReference methodHandle = callSite.getMethodHandle();
+        if (methodHandle.getMethodHandleType() != MethodHandleType.INVOKE_STATIC) {
+            throw new IllegalArgumentException("The linker method handle for a call site must be of type invoke-static");
+        }
+        writeReference(writer, ReferenceType.METHOD, callSite.getMethodHandle().getMemberReference());
+    }
+
+    public static void writeReference(IndentingWriter writer, int referenceType,
+                                      Reference reference) throws IOException {
+        switch (referenceType) {
+            case ReferenceType.STRING:
+                writeStringReference(writer, ((StringReference)reference).getString());
+                return;
+            case ReferenceType.TYPE:
+                writer.write(((TypeReference)reference).getType());
+                return;
+            case ReferenceType.METHOD:
+                ReferenceUtil.writeMethodDescriptor(writer, (MethodReference)reference);
+                return;
+            case ReferenceType.FIELD:
+                ReferenceUtil.writeFieldDescriptor(writer, (FieldReference)reference);
+                return;
+            case ReferenceType.METHOD_PROTO:
+                ReferenceUtil.writeMethodProtoDescriptor(writer, (MethodProtoReference)reference);
+                return;
+            case ReferenceType.METHOD_HANDLE:
+                ReferenceUtil.writeMethodHandle(writer, (MethodHandleReference)reference);
+                return;
+            case ReferenceType.CALL_SITE:
+                // We can't use ReferenceUtil.writeCallSite here, because it doesn't write encoded values out in the
+                // exact format we need here.
+                writeCallSiteReference(writer, (CallSiteReference)reference);
+                return;
+            default:
+                throw new IllegalStateException("Unknown reference type");
+        }
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/RegisterFormatter.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/RegisterFormatter.java
new file mode 100644
index 0000000..3d72f46
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/RegisterFormatter.java
@@ -0,0 +1,99 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors;
+
+import org.jf.baksmali.BaksmaliOptions;
+import org.jf.util.IndentingWriter;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+
+/**
+ * This class contains the logic used for formatting registers
+ */
+public class RegisterFormatter {
+    @Nonnull public final BaksmaliOptions options;
+    public final int registerCount;
+    public final int parameterRegisterCount;
+
+    public RegisterFormatter(@Nonnull BaksmaliOptions options, int registerCount, int parameterRegisterCount) {
+        this.options = options;
+        this.registerCount = registerCount;
+        this.parameterRegisterCount = parameterRegisterCount;
+    }
+
+    /**
+     * Write out the register range value used by Format3rc. If baksmali.noParameterRegisters is true, it will always
+     * output the registers in the v<n> format. But if false, then it will check if *both* registers are parameter
+     * registers, and if so, use the p<n> format for both. If only the last register is a parameter register, it will
+     * use the v<n> format for both, otherwise it would be confusing to have something like {v20 .. p1}
+     * @param writer the <code>IndentingWriter</code> to write to
+     * @param startRegister the first register in the range
+     * @param lastRegister the last register in the range
+     */
+    public void writeRegisterRange(IndentingWriter writer, int startRegister, int lastRegister) throws IOException {
+        if (options.parameterRegisters) {
+            assert startRegister <= lastRegister;
+
+            if (startRegister >= registerCount - parameterRegisterCount) {
+                writer.write("{p");
+                writer.printSignedIntAsDec(startRegister - (registerCount - parameterRegisterCount));
+                writer.write(" .. p");
+                writer.printSignedIntAsDec(lastRegister - (registerCount - parameterRegisterCount));
+                writer.write('}');
+                return;
+            }
+        }
+        writer.write("{v");
+        writer.printSignedIntAsDec(startRegister);
+        writer.write(" .. v");
+        writer.printSignedIntAsDec(lastRegister);
+        writer.write('}');
+    }
+
+    /**
+     * Writes a register with the appropriate format. If baksmali.noParameterRegisters is true, then it will always
+     * output a register in the v<n> format. If false, then it determines if the register is a parameter register,
+     * and if so, formats it in the p<n> format instead.
+     *
+     * @param writer the <code>IndentingWriter</code> to write to
+     * @param register the register number
+     */
+    public void writeTo(IndentingWriter writer, int register) throws IOException {
+        if (options.parameterRegisters) {
+            if (register >= registerCount - parameterRegisterCount) {
+                writer.write('p');
+                writer.printSignedIntAsDec((register - (registerCount - parameterRegisterCount)));
+                return;
+            }
+        }
+        writer.write('v');
+        writer.printSignedIntAsDec(register);
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/SyntheticAccessCommentMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/SyntheticAccessCommentMethodItem.java
new file mode 100644
index 0000000..ef0abb7
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/SyntheticAccessCommentMethodItem.java
@@ -0,0 +1,121 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2011 Ben Gruver
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Adaptors;
+
+import org.jf.dexlib2.ReferenceType;
+import org.jf.dexlib2.util.SyntheticAccessorResolver;
+import org.jf.util.ExceptionWithContext;
+import org.jf.util.IndentingWriter;
+
+import java.io.IOException;
+
+public class SyntheticAccessCommentMethodItem extends MethodItem {
+    private final SyntheticAccessorResolver.AccessedMember accessedMember;
+
+    public SyntheticAccessCommentMethodItem(SyntheticAccessorResolver.AccessedMember accessedMember, int codeAddress) {
+        super(codeAddress);
+        this.accessedMember = accessedMember;
+    }
+
+    public double getSortOrder() {
+        //just before the pre-instruction register information, if any
+        return 99.8;
+    }
+
+    public boolean writeTo(IndentingWriter writer) throws IOException {
+        writer.write("# ");
+        switch (accessedMember.accessedMemberType) {
+            case SyntheticAccessorResolver.METHOD:
+                writer.write("invokes: ");
+                break;
+            case SyntheticAccessorResolver.GETTER:
+                writer.write("getter for: ");
+                break;
+            case SyntheticAccessorResolver.SETTER:
+                writer.write("setter for: ");
+                break;
+            case SyntheticAccessorResolver.PREFIX_INCREMENT:
+                writer.write("++operator for: ");
+                break;
+            case SyntheticAccessorResolver.POSTFIX_INCREMENT:
+                writer.write("operator++ for: ");
+                break;
+            case SyntheticAccessorResolver.PREFIX_DECREMENT:
+                writer.write("--operator for: ");
+                break;
+            case SyntheticAccessorResolver.POSTFIX_DECREMENT:
+                writer.write("operator-- for: ");
+                break;
+            case SyntheticAccessorResolver.ADD_ASSIGNMENT:
+                writer.write("+= operator for: ");
+                break;
+            case SyntheticAccessorResolver.SUB_ASSIGNMENT:
+                writer.write("-= operator for: ");
+                break;
+            case SyntheticAccessorResolver.MUL_ASSIGNMENT:
+                writer.write("*= operator for: ");
+                break;
+            case SyntheticAccessorResolver.DIV_ASSIGNMENT:
+                writer.write("/= operator for: ");
+                break;
+            case SyntheticAccessorResolver.REM_ASSIGNMENT:
+                writer.write("%= operator for: ");
+                break;
+            case SyntheticAccessorResolver.AND_ASSIGNMENT:
+                writer.write("&= operator for: ");
+                break;
+            case SyntheticAccessorResolver.OR_ASSIGNMENT:
+                writer.write("|= operator for: ");
+                break;
+            case SyntheticAccessorResolver.XOR_ASSIGNMENT:
+                writer.write("^= operator for: ");
+                break;
+            case SyntheticAccessorResolver.SHL_ASSIGNMENT:
+                writer.write("<<= operator for: ");
+                break;
+            case SyntheticAccessorResolver.SHR_ASSIGNMENT:
+                writer.write(">>= operator for: ");
+                break;
+            case SyntheticAccessorResolver.USHR_ASSIGNMENT:
+                writer.write(">>>= operator for: ");
+                break;
+            default:
+                throw new ExceptionWithContext("Unknown access type: %d", accessedMember.accessedMemberType);
+        }
+
+        int referenceType;
+        if (accessedMember.accessedMemberType == SyntheticAccessorResolver.METHOD) {
+            referenceType = ReferenceType.METHOD;
+        } else {
+            referenceType = ReferenceType.FIELD;
+        }
+        ReferenceFormatter.writeReference(writer, referenceType, accessedMember.accessedMember);
+        return true;
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/AnalysisArguments.java b/baksmali/src/main/java/org/jf/baksmali/AnalysisArguments.java
new file mode 100644
index 0000000..d1e1684
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/AnalysisArguments.java
@@ -0,0 +1,148 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.Parameter;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import org.jf.dexlib2.VersionMap;
+import org.jf.dexlib2.analysis.ClassPath;
+import org.jf.dexlib2.analysis.ClassPathResolver;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.OatFile;
+import org.jf.dexlib2.iface.MultiDexContainer;
+import org.jf.util.jcommander.ColonParameterSplitter;
+import org.jf.util.jcommander.ExtendedParameter;
+
+import javax.annotation.Nonnull;
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+import static org.jf.dexlib2.analysis.ClassPath.NOT_SPECIFIED;
+
+public class AnalysisArguments {
+    @Parameter(names = {"-b", "--bootclasspath", "--bcp"},
+            description = "A colon separated list of the files to include in the bootclasspath when analyzing the " +
+                    "dex file. If not specified, baksmali will attempt to choose an " +
+                    "appropriate default. When analyzing oat files, this can simply be the path to the device's " +
+                    "boot.oat file. A single empty string can be used to specify that an empty bootclasspath should " +
+                    "be used. (e.g. --bootclasspath \"\") See baksmali help classpath for more information.",
+            splitter = ColonParameterSplitter.class)
+    @ExtendedParameter(argumentNames = "classpath")
+    public List<String> bootClassPath = null;
+
+    @Parameter(names = {"-c", "--classpath", "--cp"},
+            description = "A colon separated list of additional files to include in the classpath when analyzing the " +
+                    "dex file. These will be added to the classpath after any bootclasspath entries.",
+            splitter = ColonParameterSplitter.class)
+    @ExtendedParameter(argumentNames = "classpath")
+    public List<String> classPath = Lists.newArrayList();
+
+    @Parameter(names = {"-d", "--classpath-dir", "--cpd", "--dir"},
+            description = "A directory to search for classpath files. This option can be used multiple times to " +
+                    "specify multiple directories to search. They will be searched in the order they are provided.")
+    @ExtendedParameter(argumentNames = "dir")
+    public List<String> classPathDirectories = null;
+
+    public static class CheckPackagePrivateArgument {
+        @Parameter(names = {"--check-package-private-access", "--package-private", "--checkpp", "--pp"},
+                description = "Use the package-private access check when calculating vtable indexes. This is enabled " +
+                        "by default for oat files. For odex files, this is only needed for odexes from 4.2.0. It " +
+                        "was reverted in 4.2.1.")
+        public boolean checkPackagePrivateAccess = false;
+    }
+
+    @Nonnull
+    public ClassPath loadClassPathForDexFile(@Nonnull File dexFileDir,
+                                             @Nonnull MultiDexContainer.DexEntry<? extends DexBackedDexFile> dexEntry,
+                                             boolean checkPackagePrivateAccess) throws IOException {
+        return loadClassPathForDexFile(dexFileDir, dexEntry, checkPackagePrivateAccess, NOT_SPECIFIED);
+    }
+
+    @Nonnull
+    public ClassPath loadClassPathForDexFile(@Nonnull File dexFileDir,
+                                             @Nonnull MultiDexContainer.DexEntry<? extends DexBackedDexFile> dexEntry,
+                                             boolean checkPackagePrivateAccess, int oatVersion)
+            throws IOException {
+        ClassPathResolver resolver;
+
+        MultiDexContainer<? extends DexBackedDexFile> container = dexEntry.getContainer();
+
+        if (oatVersion == NOT_SPECIFIED) {
+            if (container instanceof OatFile) {
+                checkPackagePrivateAccess = true;
+                oatVersion = ((OatFile) container).getOatVersion();
+            } else {
+                oatVersion = VersionMap.mapApiToArtVersion(dexEntry.getDexFile().getOpcodes().api);
+            }
+        } else {
+            // this should always be true for ART
+            checkPackagePrivateAccess = true;
+        }
+
+        if (classPathDirectories == null || classPathDirectories.size() == 0) {
+            classPathDirectories = Lists.newArrayList(dexFileDir.getPath());
+        }
+
+        List<String> filteredClassPathDirectories = Lists.newArrayList();
+        if (classPathDirectories != null) {
+            for (String dir: classPathDirectories) {
+                File file = new File(dir);
+                if (!file.exists()) {
+                    System.err.println(String.format("Warning: directory %s does not exist. Ignoring.", dir));
+                } else if (!file.isDirectory()) {
+                    System.err.println(String.format("Warning: %s is not a directory. Ignoring.", dir));
+                } else {
+                    filteredClassPathDirectories.add(dir);
+                }
+            }
+        }
+
+        if (bootClassPath == null) {
+            // TODO: we should be able to get the api from the Opcodes object associated with the dexFile..
+            // except that the oat version -> api mapping doesn't fully work yet
+            resolver = new ClassPathResolver(filteredClassPathDirectories, classPath, dexEntry);
+        }  else if (bootClassPath.size() == 1 && bootClassPath.get(0).length() == 0) {
+            // --bootclasspath "" is a special case, denoting that no bootclasspath should be used
+            resolver = new ClassPathResolver(
+                    ImmutableList.<String>of(), ImmutableList.<String>of(), classPath, dexEntry);
+        } else {
+            resolver = new ClassPathResolver(filteredClassPathDirectories, bootClassPath, classPath, dexEntry);
+        }
+
+        if (oatVersion == 0 && container instanceof OatFile) {
+            oatVersion = ((OatFile) container).getOatVersion();
+        }
+        return new ClassPath(resolver.getResolvedClassProviders(), checkPackagePrivateAccess, oatVersion);
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Baksmali.java b/baksmali/src/main/java/org/jf/baksmali/Baksmali.java
new file mode 100644
index 0000000..1c0231b
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Baksmali.java
@@ -0,0 +1,173 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Ordering;
+import org.jf.baksmali.Adaptors.ClassDefinition;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.DexFile;
+import org.jf.util.ClassFileNameHandler;
+import org.jf.util.IndentingWriter;
+
+import javax.annotation.Nullable;
+import java.io.*;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.*;
+
+public class Baksmali {
+    public static boolean disassembleDexFile(DexFile dexFile, File outputDir, int jobs, final BaksmaliOptions options) {
+        return disassembleDexFile(dexFile, outputDir, jobs, options, null);
+    }
+
+    public static boolean disassembleDexFile(DexFile dexFile, File outputDir, int jobs, final BaksmaliOptions options,
+                                             @Nullable List<String> classes) {
+
+        //sort the classes, so that if we're on a case-insensitive file system and need to handle classes with file
+        //name collisions, then we'll use the same name for each class, if the dex file goes through multiple
+        //baksmali/smali cycles for some reason. If a class with a colliding name is added or removed, the filenames
+        //may still change of course
+        List<? extends ClassDef> classDefs = Ordering.natural().sortedCopy(dexFile.getClasses());
+
+        final ClassFileNameHandler fileNameHandler = new ClassFileNameHandler(outputDir, ".smali");
+
+        ExecutorService executor = Executors.newFixedThreadPool(jobs);
+        List<Future<Boolean>> tasks = Lists.newArrayList();
+
+        Set<String> classSet = null;
+        if (classes != null) {
+            classSet = new HashSet<String>(classes);
+        }
+
+        for (final ClassDef classDef: classDefs) {
+            if (classSet != null && !classSet.contains(classDef.getType())) {
+                continue;
+            }
+            tasks.add(executor.submit(new Callable<Boolean>() {
+                @Override public Boolean call() throws Exception {
+                    return disassembleClass(classDef, fileNameHandler, options);
+                }
+            }));
+        }
+
+        boolean errorOccurred = false;
+        try {
+            for (Future<Boolean> task: tasks) {
+                while(true) {
+                    try {
+                        if (!task.get()) {
+                            errorOccurred = true;
+                        }
+                    } catch (InterruptedException ex) {
+                        continue;
+                    } catch (ExecutionException ex) {
+                        throw new RuntimeException(ex);
+                    }
+                    break;
+                }
+            }
+        } finally {
+            executor.shutdown();
+        }
+        return !errorOccurred;
+    }
+
+    private static boolean disassembleClass(ClassDef classDef, ClassFileNameHandler fileNameHandler,
+                                            BaksmaliOptions options) {
+        /**
+         * The path for the disassembly file is based on the package name
+         * The class descriptor will look something like:
+         * Ljava/lang/Object;
+         * Where the there is leading 'L' and a trailing ';', and the parts of the
+         * package name are separated by '/'
+         */
+        String classDescriptor = classDef.getType();
+
+        //validate that the descriptor is formatted like we expect
+        if (classDescriptor.charAt(0) != 'L' ||
+                classDescriptor.charAt(classDescriptor.length()-1) != ';') {
+            System.err.println("Unrecognized class descriptor - " + classDescriptor + " - skipping class");
+            return false;
+        }
+
+        File smaliFile = fileNameHandler.getUniqueFilenameForClass(classDescriptor);
+
+        //create and initialize the top level string template
+        ClassDefinition classDefinition = new ClassDefinition(options, classDef);
+
+        //write the disassembly
+        Writer writer = null;
+        try
+        {
+            File smaliParent = smaliFile.getParentFile();
+            if (!smaliParent.exists()) {
+                if (!smaliParent.mkdirs()) {
+                    // check again, it's likely it was created in a different thread
+                    if (!smaliParent.exists()) {
+                        System.err.println("Unable to create directory " + smaliParent.toString() + " - skipping class");
+                        return false;
+                    }
+                }
+            }
+
+            if (!smaliFile.exists()){
+                if (!smaliFile.createNewFile()) {
+                    System.err.println("Unable to create file " + smaliFile.toString() + " - skipping class");
+                    return false;
+                }
+            }
+
+            BufferedWriter bufWriter = new BufferedWriter(new OutputStreamWriter(
+                    new FileOutputStream(smaliFile), "UTF8"));
+
+            writer = new IndentingWriter(bufWriter);
+            classDefinition.writeTo((IndentingWriter)writer);
+        } catch (Exception ex) {
+            System.err.println("\n\nError occurred while disassembling class " + classDescriptor.replace('/', '.') + " - skipping class");
+            ex.printStackTrace();
+            // noinspection ResultOfMethodCallIgnored
+            smaliFile.delete();
+            return false;
+        }
+        finally
+        {
+            if (writer != null) {
+                try {
+                    writer.close();
+                } catch (Throwable ex) {
+                    System.err.println("\n\nError occurred while closing file " + smaliFile.toString());
+                    ex.printStackTrace();
+                }
+            }
+        }
+        return true;
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/BaksmaliOptions.java b/baksmali/src/main/java/org/jf/baksmali/BaksmaliOptions.java
new file mode 100644
index 0000000..7ad5124
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/BaksmaliOptions.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import org.jf.dexlib2.analysis.ClassPath;
+import org.jf.dexlib2.analysis.InlineMethodResolver;
+import org.jf.dexlib2.util.SyntheticAccessorResolver;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+public class BaksmaliOptions {
+    public int apiLevel = 15;
+
+    public boolean parameterRegisters = true;
+    public boolean localsDirective = false;
+    public boolean sequentialLabels = false;
+    public boolean debugInfo = true;
+    public boolean codeOffsets = false;
+    public boolean accessorComments = true;
+    public boolean allowOdex = false;
+    public boolean deodex = false;
+    public boolean implicitReferences = false;
+    public boolean normalizeVirtualMethods = false;
+
+    // register info values
+    public static final int ALL = 1;
+    public static final int ALLPRE = 2;
+    public static final int ALLPOST = 4;
+    public static final int ARGS = 8;
+    public static final int DEST = 16;
+    public static final int MERGE = 32;
+    public static final int FULLMERGE = 64;
+
+    public int registerInfo = 0;
+
+    public Map<Integer,String> resourceIds = new HashMap<Integer,String>();
+    public InlineMethodResolver inlineResolver = null;
+    public ClassPath classPath = null;
+    public SyntheticAccessorResolver syntheticAccessorResolver = null;
+
+    /**
+     * Load the resource ids from a set of public.xml files.
+     *
+     * @param resourceFiles A map of resource prefixes -> public.xml files
+     */
+    public void loadResourceIds(Map<String, File> resourceFiles) throws SAXException, IOException {
+        for (Map.Entry<String, File> entry: resourceFiles.entrySet()) {
+            try {
+                SAXParser saxp = SAXParserFactory.newInstance().newSAXParser();
+                final String prefix = entry.getKey();
+                saxp.parse(entry.getValue(), new DefaultHandler() {
+                    @Override
+                    public void startElement(String uri, String localName, String qName,
+                                             Attributes attr) throws SAXException {
+                        if (qName.equals("public")) {
+                            String resourceType = attr.getValue("type");
+                            String resourceName = attr.getValue("name").replace('.', '_');
+                            Integer resourceId = Integer.decode(attr.getValue("id"));
+                            String qualifiedResourceName =
+                                    String.format("%s.%s.%s", prefix, resourceType, resourceName);
+                            resourceIds.put(resourceId, qualifiedResourceName);
+                        }
+                    }
+                });
+            } catch (ParserConfigurationException ex) {
+                throw new RuntimeException(ex);
+            }
+        }
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/DeodexCommand.java b/baksmali/src/main/java/org/jf/baksmali/DeodexCommand.java
new file mode 100644
index 0000000..3ded479
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/DeodexCommand.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+import com.beust.jcommander.ParametersDelegate;
+import org.jf.baksmali.AnalysisArguments.CheckPackagePrivateArgument;
+import org.jf.dexlib2.analysis.CustomInlineMethodResolver;
+import org.jf.dexlib2.analysis.InlineMethodResolver;
+import org.jf.dexlib2.dexbacked.DexBackedOdexFile;
+import org.jf.util.jcommander.ExtendedParameter;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import javax.annotation.Nonnull;
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+@Parameters(commandDescription = "Deodexes an odex/oat file")
+@ExtendedParameters(
+        commandName = "deodex",
+        commandAliases = { "de", "x" })
+public class DeodexCommand extends DisassembleCommand {
+
+    @ParametersDelegate
+    protected CheckPackagePrivateArgument checkPackagePrivateArgument = new CheckPackagePrivateArgument();
+
+    @Parameter(names = {"--inline-table", "--inline", "--it"},
+            description = "Specify a file containing a custom inline method table to use. See the " +
+                    "\"deodexerant\" tool in the smali github repository to dump the inline method table from a " +
+                    "device that uses dalvik.")
+    @ExtendedParameter(argumentNames = "file")
+    private String inlineTable;
+
+    public DeodexCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors);
+    }
+
+    @Override protected BaksmaliOptions getOptions() {
+        BaksmaliOptions options = super.getOptions();
+
+        options.deodex = true;
+
+        if (dexFile instanceof DexBackedOdexFile) {
+            if (inlineTable == null) {
+                options.inlineResolver = InlineMethodResolver.createInlineMethodResolver(
+                        ((DexBackedOdexFile)dexFile).getOdexVersion());
+            } else {
+                File inlineTableFile = new File(inlineTable);
+                if (!inlineTableFile.exists()) {
+                    System.err.println(String.format("Could not find file: %s", inlineTable));
+                    System.exit(-1);
+                }
+                try {
+                    options.inlineResolver = new CustomInlineMethodResolver(options.classPath, inlineTableFile);
+                } catch (IOException ex) {
+                    System.err.println(String.format("Error while reading file: %s", inlineTableFile));
+                    ex.printStackTrace(System.err);
+                    System.exit(-1);
+                }
+            }
+        }
+
+        return options;
+    }
+
+    @Override protected boolean shouldCheckPackagePrivateAccess() {
+        return checkPackagePrivateArgument.checkPackagePrivateAccess;
+    }
+
+    @Override protected boolean needsClassPath() {
+        return true;
+    }
+
+    @Override protected boolean showDeodexWarning() {
+        return false;
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/DexInputCommand.java b/baksmali/src/main/java/org/jf/baksmali/DexInputCommand.java
new file mode 100644
index 0000000..4904e89
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/DexInputCommand.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+import org.jf.dexlib2.DexFileFactory;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.MultiDexContainer;
+import org.jf.util.jcommander.Command;
+import org.jf.util.jcommander.ExtendedParameter;
+
+import javax.annotation.Nonnull;
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * This class implements common functionality for commands that need to load a dex file based on
+ * command line input
+ */
+public abstract class DexInputCommand extends Command {
+
+    @Parameter(names = {"-a", "--api"},
+            description = "The numeric api level of the file being disassembled.")
+    @ExtendedParameter(argumentNames = "api")
+    public int apiLevel = -1;
+
+    @Parameter(description = "A dex/apk/oat/odex file. For apk or oat files that contain multiple dex " +
+            "files, you can specify the specific entry to use as if the apk/oat file was a directory. " +
+            "e.g. \"app.apk/classes2.dex\". For more information, see \"baksmali help input\".")
+    @ExtendedParameter(argumentNames = "file")
+    protected List<String> inputList = Lists.newArrayList();
+
+    protected File inputFile;
+    protected String inputEntry;
+    protected MultiDexContainer.DexEntry<? extends DexBackedDexFile> dexEntry;
+    protected DexBackedDexFile dexFile;
+
+    public DexInputCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors);
+    }
+
+    /**
+     * Parses a dex file input from the user and loads the given dex file.
+     *
+     * In some cases, the input file can contain multiple dex files. If this is the case, you can refer to a specific
+     * dex file with a slash, followed by the entry name, optionally in quotes.
+     *
+     * If the entry name is enclosed in quotes, then it will strip the first and last quote and look for an entry with
+     * exactly that name. Otherwise, it will perform a partial filename match against the entry to find any candidates.
+     * If there is a single matching candidate, it will be used. Otherwise, an error will be generated.
+     *
+     * For example, to refer to the "/system/framework/framework.jar:classes2.dex" entry within the
+     * "framework/arm/framework.oat" oat file, you could use any of:
+     *
+     * framework/arm/framework.oat/"/system/framework/framework.jar:classes2.dex"
+     * framework/arm/framework.oat/system/framework/framework.jar:classes2.dex
+     * framework/arm/framework.oat/framework/framework.jar:classes2.dex
+     * framework/arm/framework.oat/framework.jar:classes2.dex
+     * framework/arm/framework.oat/classes2.dex
+     *
+     * The last option is the easiest, but only works if the oat file doesn't contain another entry with the
+     * "classes2.dex" name. e.g. "/system/framework/blah.jar:classes2.dex"
+     *
+     * It's technically possible (although unlikely) for an oat file to contain 2 entries like:
+     * /system/framework/framework.jar:classes2.dex
+     * system/framework/framework.jar:classes2.dex
+     *
+     * In this case, the "framework/arm/framework.oat/system/framework/framework.jar:classes2.dex" syntax will generate
+     * an error because both entries match the partial entry name. Instead, you could use the following for the
+     * first and second entry respectively:
+     *
+     * framework/arm/framework.oat/"/system/framework/framework.jar:classes2.dex"
+     * framework/arm/framework.oat/"system/framework/framework.jar:classes2.dex"
+     *
+     * @param input The name of a dex, apk, odex or oat file/entry.
+     */
+    protected void loadDexFile(@Nonnull String input) {
+        File file = new File(input);
+
+        while (file != null && !file.exists()) {
+            file = file.getParentFile();
+        }
+
+        if (file == null || !file.exists() || file.isDirectory()) {
+            System.err.println("Can't find file: " + input);
+            System.exit(1);
+        }
+
+        inputFile = file;
+
+        String dexEntryName = null;
+        if (file.getPath().length() < input.length()) {
+            dexEntryName = input.substring(file.getPath().length() + 1);
+        }
+
+        Opcodes opcodes = null;
+        if (apiLevel != -1) {
+            opcodes = Opcodes.forApi(apiLevel);
+        }
+
+        if (!Strings.isNullOrEmpty(dexEntryName)) {
+            boolean exactMatch = false;
+            if (dexEntryName.length() > 2 && dexEntryName.charAt(0) == '"' && dexEntryName.charAt(dexEntryName.length() - 1) == '"') {
+                dexEntryName = dexEntryName.substring(1, dexEntryName.length() - 1);
+                exactMatch = true;
+            }
+
+            inputEntry = dexEntryName;
+
+            try {
+                dexEntry = DexFileFactory.loadDexEntry(file, dexEntryName, exactMatch, opcodes);
+                dexFile = dexEntry.getDexFile();
+            } catch (IOException ex) {
+                throw new RuntimeException(ex);
+            }
+        } else {
+            try {
+                MultiDexContainer<? extends DexBackedDexFile> container =
+                        DexFileFactory.loadDexContainer(file, opcodes);
+
+                if (container.getDexEntryNames().size() == 1) {
+                    dexEntry = container.getEntry(container.getDexEntryNames().get(0));
+                    assert dexEntry != null;
+                    dexFile = dexEntry.getDexFile();
+                } else if (container.getDexEntryNames().size() > 1) {
+                    dexEntry = container.getEntry("classes.dex");
+                    if (dexEntry == null) {
+                        dexEntry = container.getEntry(container.getDexEntryNames().get(0));
+                    }
+                    assert dexEntry != null;
+                    dexFile = dexEntry.getDexFile();
+                } else {
+                    throw new RuntimeException(String.format("\"%s\" has no dex files", input));
+                }
+            } catch (IOException ex) {
+                throw new RuntimeException(ex);
+            }
+        }
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/DisassembleCommand.java b/baksmali/src/main/java/org/jf/baksmali/DisassembleCommand.java
new file mode 100644
index 0000000..368fa72
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/DisassembleCommand.java
@@ -0,0 +1,297 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+import com.beust.jcommander.ParametersDelegate;
+import com.beust.jcommander.validators.PositiveInteger;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import org.jf.dexlib2.util.SyntheticAccessorResolver;
+import org.jf.util.ConsoleUtil;
+import org.jf.util.StringWrapper;
+import org.jf.util.jcommander.ExtendedParameter;
+import org.jf.util.jcommander.ExtendedParameters;
+import org.xml.sax.SAXException;
+
+import javax.annotation.Nonnull;
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+@Parameters(commandDescription = "Disassembles a dex file.")
+@ExtendedParameters(
+        commandName = "disassemble",
+        commandAliases = { "dis", "d" })
+public class DisassembleCommand extends DexInputCommand {
+
+    @Parameter(names = {"-h", "-?", "--help"}, help = true,
+            description = "Show usage information for this command.")
+    private boolean help;
+
+    @ParametersDelegate
+    protected AnalysisArguments analysisArguments = new AnalysisArguments();
+
+    @Parameter(names = {"--debug-info", "--di"}, arity = 1,
+            description = "Whether to include debug information in the output (.local, .param, .line, etc.). True " +
+                    "by default, use --debug-info=false to disable.")
+    @ExtendedParameter(argumentNames = "boolean")
+    private boolean debugInfo = true;
+
+    @Parameter(names = {"--code-offsets", "--offsets", "--off"},
+            description = "Add a comment before each instruction with it's code offset within the method.")
+    private boolean codeOffsets = false;
+
+    @Parameter(names = {"--resolve-resources", "--rr"}, arity = 2,
+            description = "This will attempt to find any resource id references within the bytecode and add a " +
+                    "comment with the name of the resource being referenced. The parameter accepts 2 values:" +
+                    "an arbitrary resource prefix and the path to a public.xml file. For example: " +
+                    "--resolve-resources android.R framework/res/values/public.xml. This option can be specified " +
+                    "multiple times to provide resources from multiple packages.")
+    @ExtendedParameter(argumentNames = {"resource prefix", "public.xml file"})
+    private List<String> resourceIdFiles = Lists.newArrayList();
+
+    @Parameter(names = {"-j", "--jobs"},
+            description = "The number of threads to use. Defaults to the number of cores available.",
+            validateWith = PositiveInteger.class)
+    @ExtendedParameter(argumentNames = "n")
+    private int jobs = Runtime.getRuntime().availableProcessors();
+
+    @Parameter(names = {"-l", "--use-locals"},
+            description = "When disassembling, output the .locals directive with the number of non-parameter " +
+                    "registers instead of the .registers directive with the total number of registers.")
+    private boolean localsDirective = false;
+
+    @Parameter(names = {"--accessor-comments", "--ac"}, arity = 1,
+            description = "Generate helper comments for synthetic accessors. True by default, use " +
+                    "--accessor-comments=false to disable.")
+    @ExtendedParameter(argumentNames = "boolean")
+    private boolean accessorComments = true;
+
+    @Parameter(names = {"--normalize-virtual-methods", "--norm", "--nvm"},
+            description = "Normalize virtual method references to use the base class where the method is " +
+                    "originally declared.")
+    private boolean normalizeVirtualMethods = false;
+
+    @Parameter(names = {"-o", "--output"},
+            description = "The directory to write the disassembled files to.")
+    @ExtendedParameter(argumentNames = "dir")
+    private String outputDir = "out";
+
+    @Parameter(names = {"--parameter-registers", "--preg", "--pr"}, arity = 1,
+            description = "Use the pNN syntax for registers that refer to a method parameter on method entry. True " +
+                    "by default, use --parameter-registers=false to disable.")
+    @ExtendedParameter(argumentNames = "boolean")
+    private boolean parameterRegisters = true;
+
+    @Parameter(names = {"-r", "--register-info"},
+            description = "Add comments before/after each instruction with information about register types. " +
+                    "The value is a comma-separated list of any of ALL, ALLPRE, ALLPOST, ARGS, DEST, MERGE and " +
+                    "FULLMERGE. See \"baksmali help register-info\" for more information.")
+    @ExtendedParameter(argumentNames = "register info specifier")
+    private List<String> registerInfoTypes = Lists.newArrayList();
+
+    @Parameter(names = {"--sequential-labels", "--seq", "--sl"},
+            description = "Create label names using a sequential numbering scheme per label type, rather than " +
+                    "using the bytecode address.")
+    private boolean sequentialLabels = false;
+
+    @Parameter(names = {"--implicit-references", "--implicit", "--ir"},
+            description = "Use implicit method and field references (without the class name) for methods and " +
+                    "fields from the current class.")
+    private boolean implicitReferences = false;
+
+    @Parameter(names = "--allow-odex-opcodes",
+            description = "Allows odex opcodes to be disassembled, even if the result won't be able to be reassembled.")
+    private boolean allowOdex = false;
+
+    @Parameter(names = "--classes",
+            description = "A comma separated list of classes. Only disassemble these classes")
+    @ExtendedParameter(argumentNames = "classes")
+    private List<String> classes = null;
+
+    public DisassembleCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors);
+    }
+
+    public void run() {
+        if (help || inputList == null || inputList.isEmpty()) {
+            usage();
+            return;
+        }
+
+        if (inputList.size() > 1) {
+            System.err.println("Too many files specified");
+            usage();
+            return;
+        }
+
+        String input = inputList.get(0);
+        loadDexFile(input);
+
+        if (showDeodexWarning() && dexFile.supportsOptimizedOpcodes()) {
+            StringWrapper.printWrappedString(System.err,
+                    "Warning: You are disassembling an odex/oat file without deodexing it. You won't be able to " +
+                            "re-assemble the results unless you deodex it. See \"baksmali help deodex\"",
+                    ConsoleUtil.getConsoleWidth());
+        }
+
+        File outputDirectoryFile = new File(outputDir);
+        if (!outputDirectoryFile.exists()) {
+            if (!outputDirectoryFile.mkdirs()) {
+                System.err.println("Can't create the output directory " + outputDir);
+                System.exit(-1);
+            }
+        }
+
+        if (analysisArguments.classPathDirectories == null || analysisArguments.classPathDirectories.isEmpty()) {
+            analysisArguments.classPathDirectories = Lists.newArrayList(inputFile.getAbsoluteFile().getParent());
+        }
+
+        if (!Baksmali.disassembleDexFile(dexFile, outputDirectoryFile, jobs, getOptions(), classes)) {
+            System.exit(-1);
+        }
+    }
+
+    protected boolean needsClassPath() {
+        return !registerInfoTypes.isEmpty() || normalizeVirtualMethods;
+    }
+
+    protected boolean shouldCheckPackagePrivateAccess() {
+        return false;
+    }
+
+    protected boolean showDeodexWarning() {
+        return true;
+    }
+
+    protected BaksmaliOptions getOptions() {
+        if (dexFile == null) {
+            throw new IllegalStateException("You must call loadDexFile first");
+        }
+
+        final BaksmaliOptions options = new BaksmaliOptions();
+
+        if (needsClassPath()) {
+            try {
+                options.classPath = analysisArguments.loadClassPathForDexFile(
+                        inputFile.getAbsoluteFile().getParentFile(), dexEntry, shouldCheckPackagePrivateAccess());
+            } catch (Exception ex) {
+                System.err.println("\n\nError occurred while loading class path files. Aborting.");
+                ex.printStackTrace(System.err);
+                System.exit(-1);
+            }
+        }
+
+        if (!resourceIdFiles.isEmpty()) {
+            Map<String, File> resourceFiles = Maps.newHashMap();
+
+            assert (resourceIdFiles.size() % 2) == 0;
+            for (int i=0; i<resourceIdFiles.size(); i+=2) {
+                String resourcePrefix = resourceIdFiles.get(i);
+                String publicXml = resourceIdFiles.get(i+1);
+
+                File publicXmlFile = new File(publicXml);
+
+                if (!publicXmlFile.exists()) {
+                    System.err.println(String.format("Can't find file: %s", publicXmlFile));
+                    System.exit(-1);
+                }
+
+                resourceFiles.put(resourcePrefix, publicXmlFile);
+            }
+
+            try {
+                options.loadResourceIds(resourceFiles);
+            } catch (IOException ex) {
+                System.err.println("Error while loading resource files:");
+                ex.printStackTrace(System.err);
+                System.exit(-1);
+            } catch (SAXException ex) {
+                System.err.println("Error while loading resource files:");
+                ex.printStackTrace(System.err);
+                System.exit(-1);
+            }
+        }
+
+        options.parameterRegisters = parameterRegisters;
+        options.localsDirective = localsDirective;
+        options.sequentialLabels = sequentialLabels;
+        options.debugInfo = debugInfo;
+        options.codeOffsets = codeOffsets;
+        options.accessorComments = accessorComments;
+        options.implicitReferences = implicitReferences;
+        options.normalizeVirtualMethods = normalizeVirtualMethods;
+
+        options.registerInfo = 0;
+
+        for (String registerInfoType: registerInfoTypes) {
+            if (registerInfoType.equalsIgnoreCase("ALL")) {
+                options.registerInfo  |= BaksmaliOptions.ALL;
+            } else if (registerInfoType.equalsIgnoreCase("ALLPRE")) {
+                options.registerInfo  |= BaksmaliOptions.ALLPRE;
+            } else if (registerInfoType.equalsIgnoreCase("ALLPOST")) {
+                options.registerInfo  |= BaksmaliOptions.ALLPOST;
+            } else if (registerInfoType.equalsIgnoreCase("ARGS")) {
+                options.registerInfo  |= BaksmaliOptions.ARGS;
+            } else if (registerInfoType.equalsIgnoreCase("DEST")) {
+                options.registerInfo  |= BaksmaliOptions.DEST;
+            } else if (registerInfoType.equalsIgnoreCase("MERGE")) {
+                options.registerInfo  |= BaksmaliOptions.MERGE;
+            } else if (registerInfoType.equalsIgnoreCase("FULLMERGE")) {
+                options.registerInfo  |= BaksmaliOptions.FULLMERGE;
+            } else {
+                System.err.println(String.format("Invalid register info type: %s", registerInfoType));
+                usage();
+                System.exit(-1);
+            }
+
+            if ((options.registerInfo & BaksmaliOptions.FULLMERGE) != 0) {
+                options.registerInfo &= ~BaksmaliOptions.MERGE;
+            }
+        }
+
+        if (accessorComments) {
+            options.syntheticAccessorResolver = new SyntheticAccessorResolver(dexFile.getOpcodes(),
+                    dexFile.getClasses());
+        }
+
+        if (allowOdex) {
+            options.allowOdex = true;
+        }
+
+        return options;
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/DumpCommand.java b/baksmali/src/main/java/org/jf/baksmali/DumpCommand.java
new file mode 100644
index 0000000..101bc41
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/DumpCommand.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.raw.util.DexAnnotator;
+import org.jf.util.ConsoleUtil;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import javax.annotation.Nonnull;
+import java.io.*;
+import java.util.List;
+
+@Parameters(commandDescription = "Prints an annotated hex dump for the given dex file")
+@ExtendedParameters(
+        commandName = "dump",
+        commandAliases = "du")
+public class DumpCommand extends DexInputCommand {
+
+    @Parameter(names = {"-h", "-?", "--help"}, help = true,
+            description = "Show usage information for this command.")
+    private boolean help;
+
+    public DumpCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors);
+    }
+
+    public void run() {
+        if (help || inputList == null || inputList.isEmpty()) {
+            usage();
+            return;
+        }
+
+        if (inputList.size() > 1) {
+            System.err.println("Too many files specified");
+            usage();
+            return;
+        }
+
+        String input = inputList.get(0);
+        loadDexFile(input);
+
+        try {
+            dump(dexFile, System.out);
+        } catch (IOException ex) {
+            System.err.println("There was an error while dumping the dex file");
+            ex.printStackTrace(System.err);
+        }
+    }
+
+    /**
+     * Writes an annotated hex dump of the given dex file to output.
+     *
+     * @param dexFile The dex file to dump
+     * @param output An OutputStream to write the annotated hex dump to. The caller is responsible for closing this
+     *               when needed.
+     *
+     * @throws IOException
+     */
+    public static void dump(@Nonnull DexBackedDexFile dexFile, @Nonnull OutputStream output)
+            throws IOException {
+        Writer writer = new BufferedWriter(new OutputStreamWriter(output));
+
+        try {
+            int consoleWidth = ConsoleUtil.getConsoleWidth();
+            if (consoleWidth <= 0) {
+                consoleWidth = 120;
+            }
+
+            DexAnnotator annotator = new DexAnnotator(dexFile, consoleWidth);
+            annotator.writeAnnotations(writer);
+        } finally {
+            writer.close();
+        }
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/HelpCommand.java b/baksmali/src/main/java/org/jf/baksmali/HelpCommand.java
new file mode 100644
index 0000000..149ac63
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/HelpCommand.java
@@ -0,0 +1,204 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+import com.google.common.collect.Lists;
+import org.jf.util.ConsoleUtil;
+import org.jf.util.StringWrapper;
+import org.jf.util.jcommander.*;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+@Parameters(commandDescription = "Shows usage information")
+@ExtendedParameters(
+        commandName = "help",
+        commandAliases = "h")
+public class HelpCommand extends Command {
+
+    public HelpCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors);
+    }
+
+    @Parameter(description = "If specified, show the detailed usage information for the given commands")
+    @ExtendedParameter(argumentNames = "commands")
+    private List<String> commands = Lists.newArrayList();
+
+    public void run() {
+        JCommander parentJc = commandAncestors.get(commandAncestors.size() - 1);
+
+        if (commands == null || commands.isEmpty()) {
+            System.out.println(new HelpFormatter()
+                    .width(ConsoleUtil.getConsoleWidth())
+                    .format(commandAncestors));
+        } else {
+            boolean printedHelp = false;
+            for (String cmd : commands) {
+                if (cmd.equals("register-info")) {
+                    printedHelp = true;
+                    String registerInfoHelp = "The --register-info parameter will cause baksmali to generate " +
+                            "comments before and after every instruction containing register type " +
+                            "information about some subset of registers. This parameter accepts a comma-separated list" +
+                            "of values specifying which registers and how much information to include.\n" +
+                            "    ALL: all pre- and post-instruction registers\n" +
+                            "    ALLPRE: all pre-instruction registers\n" +
+                            "    ALLPOST: all post-instruction registers\n" +
+                            "    ARGS: any pre-instruction registers used as arguments to the instruction\n" +
+                            "    DEST: the post-instruction register used as the output of the instruction\n" +
+                            "    MERGE: any pre-instruction register that has been merged from multiple " +
+                            "incoming code paths\n" +
+                            "    FULLMERGE: an extended version of MERGE that also includes a list of all " +
+                            "the register types from incoming code paths that were merged";
+
+                    Iterable<String> lines = StringWrapper.wrapStringOnBreaks(registerInfoHelp,
+                            ConsoleUtil.getConsoleWidth());
+                    for (String line : lines) {
+                        System.out.println(line);
+                    }
+                } else if (cmd.equals("input")) {
+                    printedHelp = true;
+                    String registerInfoHelp = "Apks and oat files can contain multiple dex files. In order to " +
+                            "specify a particular dex file, the basic syntax is to treat the apk/oat file as a " +
+                            "directory. For example, to load the \"classes2.dex\" entry from \"app.apk\", you can " +
+                            "use \"app.apk/classes2.dex\".\n" +
+                            "\n" +
+                            "For ease of use, you can also specify a partial path to the dex file to load. For " +
+                            "example, to load a entry named \"/system/framework/framework.jar:classes2.dex\" from " +
+                            "\"framework.oat\", you can use any of the following:\n" +
+                            "\"framework.oat/classes2.dex\"\n" +
+                            "\"framework.oat/framework.jar:classes2.dex\"\n" +
+                            "\"framework.oat/framework/framework.jar:classes2.dex\"\n" +
+                            "\"framework.oat/system/framework/framework.jar:classes2.dex\"\n" +
+                            "\n" +
+                            "In some rare cases, an oat file could have entries that can't be differentiated with " +
+                            "the above syntax. For example \"/blah/blah.dex\" and \"blah/blah.dex\". In this case, " +
+                            "the \"blah.oat/blah/blah.dex\" would match both entries and generate an error. To get " +
+                            "around this, you can add double quotes around the entry name to specify an exact entry " +
+                            "name. E.g. blah.oat/\"/blah/blah.dex\" or blah.oat/\"blah/blah.dex\" respectively.";
+
+                    Iterable<String> lines = StringWrapper.wrapStringOnBreaks(registerInfoHelp,
+                            ConsoleUtil.getConsoleWidth());
+                    for (String line : lines) {
+                        System.out.println(line);
+                    }
+                } else if (cmd.equals("classpath")) {
+                    printedHelp = true;
+                    String registerInfoHelp = "When deodexing odex/oat files or when using the --register-info " +
+                            "option, baksmali needs to load all classes from the framework files on the device " +
+                            "in order to fully understand the class hierarchy. There are several options that " +
+                            "control how baksmali finds and loads the classpath entries.\n" +
+                            "\n"+
+                            "L+ devices (ART):\n" +
+                            "When deodexing or disassembling a file from an L+ device using ART, you generally " +
+                            "just need to specify the path to the boot.oat file via the --bootclasspath/-b " +
+                            "parameter. On pre-N devices, the boot.oat file is self-contained and no other files are " +
+                            "needed. In N, boot.oat was split into multiple files. In this case, the other " +
+                            "files should be in the same directory as the boot.oat file, but you still only need to " +
+                            "specify the boot.oat file in the --bootclasspath/-b option. The other files will be " +
+                            "automatically loaded from the same directory.\n" +
+                            "\n" +
+                            "Pre-L devices (dalvik):\n" +
+                            "When deodexing odex files from a pre-L device using dalvik, you " +
+                            "generally just need to specify the path to a directory containing the framework files " +
+                            "from the device via the --classpath-dir/-d option. odex files contain a list of " +
+                            "framework files they depend on and baksmali will search for these dependencies in the " +
+                            "directory that you specify.\n" +
+                            "\n" +
+                            "Dex files don't contain a list of dependencies like odex files, so when disassembling a " +
+                            "dex file using the --register-info option, and using the framework files from a " +
+                            "pre-L device, baksmali will attempt to use a reasonable default list of classpath files " +
+                            "based on the api level set via the -a option. If this default list is incorrect, you " +
+                            "can override the classpath using the --bootclasspath/-b option. This option accepts a " +
+                            "colon separated list of classpath entries. Each entry can be specified in a few " +
+                            "different ways.\n" +
+                            " - A simple filename like \"framework.jar\"\n" +
+                            " - A device path like \"/system/framework/framework.jar\"\n" +
+                            " - A local relative or absolute path like \"/tmp/framework/framework.jar\"\n" +
+                            "When using the first or second formats, you should also specify the directory " +
+                            "containing the framework files via the --classpath-dir/-d option. When using the third " +
+                            "format, this option is not needed.\n" +
+                            "It's worth noting that the second format matches the format used by Android for the " +
+                            "BOOTCLASSPATH environment variable, so you can simply grab the value of that variable " +
+                            "from the device and use it as-is.\n" +
+                            "\n" +
+                            "Examples:\n" +
+                            "  For an M device:\n" +
+                            "    adb pull /system/framework/arm/boot.oat /tmp/boot.oat\n" +
+                            "    baksmali deodex blah.oat -b /tmp/boot.oat\n" +
+                            "  For an N+ device:\n" +
+                            "    adb pull /system/framework/arm /tmp/framework\n" +
+                            "    baksmali deodex blah.oat -b /tmp/framework/boot.oat\n" +
+                            "  For a pre-L device:\n" +
+                            "    adb pull /system/framework /tmp/framework\n" +
+                            "    baksmali deodex blah.odex -d /tmp/framework\n" +
+                            "  Using the BOOTCLASSPATH on a pre-L device:\n" +
+                            "    adb pull /system/framework /tmp/framework\n" +
+                            "    export BOOTCLASSPATH=`adb shell \"echo \\\\$BOOTCLASPATH\"`\n" +
+                            "    baksmali disassemble --register-info ARGS,DEST blah.apk -b $BOOTCLASSPATH -d " +
+                            "/tmp/framework";
+
+                    Iterable<String> lines = StringWrapper.wrapStringOnBreaks(registerInfoHelp,
+                            ConsoleUtil.getConsoleWidth());
+                    for (String line : lines) {
+                        System.out.println(line);
+                    }
+                } else {
+                    JCommander command = ExtendedCommands.getSubcommand(parentJc, cmd);
+                    if (command == null) {
+                        System.err.println("No such command: " + cmd);
+                    } else {
+                        printedHelp = true;
+                        System.out.println(new HelpFormatter()
+                                .width(ConsoleUtil.getConsoleWidth())
+                                .format(((Command)command.getObjects().get(0)).getCommandHierarchy()));
+                    }
+                }
+            }
+            if (!printedHelp) {
+                System.out.println(new HelpFormatter()
+                        .width(ConsoleUtil.getConsoleWidth())
+                        .format(commandAncestors));
+            }
+        }
+    }
+
+    @Parameters(hidden =  true)
+    @ExtendedParameters(commandName = "hlep")
+    public static class HlepCommand extends HelpCommand {
+        public HlepCommand(@Nonnull List<JCommander> commandAncestors) {
+            super(commandAncestors);
+        }
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/ListClassesCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListClassesCommand.java
new file mode 100644
index 0000000..fb172bd
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/ListClassesCommand.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+@Parameters(commandDescription = "Lists the classes in a dex file.")
+@ExtendedParameters(
+        commandName = "classes",
+        commandAliases = { "class", "c" })
+public class ListClassesCommand extends DexInputCommand {
+
+    @Parameter(names = {"-h", "-?", "--help"}, help = true,
+            description = "Show usage information")
+    private boolean help;
+
+    public ListClassesCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors);
+    }
+
+    @Override public void run() {
+        if (help || inputList == null || inputList.isEmpty()) {
+            usage();
+            return;
+        }
+
+        if (inputList.size() > 1) {
+            System.err.println("Too many files specified");
+            usage();
+            return;
+        }
+
+        String input = inputList.get(0);
+        loadDexFile(input);
+
+        for (ClassDef classDef: dexFile.getClasses()) {
+            System.out.println(classDef.getType());
+        }
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/ListCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListCommand.java
new file mode 100644
index 0000000..9547620
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/ListCommand.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+import org.jf.baksmali.ListHelpCommand.ListHlepCommand;
+import org.jf.util.jcommander.Command;
+import org.jf.util.jcommander.ExtendedCommands;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+@Parameters(commandDescription = "Lists various objects in a dex file.")
+@ExtendedParameters(
+        commandName = "list",
+        commandAliases = "l")
+public class ListCommand extends Command {
+
+    @Parameter(names = {"-h", "-?", "--help"}, help = true,
+            description = "Show usage information")
+    private boolean help;
+
+    public ListCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors);
+    }
+
+    @Override protected void setupCommand(JCommander jc) {
+        List<JCommander> hierarchy = getCommandHierarchy();
+
+        ExtendedCommands.addExtendedCommand(jc, new ListStringsCommand(hierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new ListMethodsCommand(hierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new ListFieldsCommand(hierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new ListTypesCommand(hierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new ListClassesCommand(hierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new ListDexCommand(hierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new ListVtablesCommand(hierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new ListFieldOffsetsCommand(hierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new ListDependenciesCommand(hierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new ListHelpCommand(hierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new ListHlepCommand(hierarchy));
+    }
+
+    @Override public void run() {
+        JCommander jc = getJCommander();
+        if (help || jc.getParsedCommand() == null) {
+            usage();
+            return;
+        }
+
+        Command command = (Command)jc.getCommands().get(jc.getParsedCommand()).getObjects().get(0);
+        command.run();
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/ListDependenciesCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListDependenciesCommand.java
new file mode 100644
index 0000000..636a87c
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/ListDependenciesCommand.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+import com.google.common.collect.Lists;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.DexBackedOdexFile;
+import org.jf.dexlib2.dexbacked.OatFile;
+import org.jf.util.jcommander.Command;
+import org.jf.util.jcommander.ExtendedParameter;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import javax.annotation.Nonnull;
+import java.io.*;
+import java.util.List;
+
+@Parameters(commandDescription = "Lists the stored dependencies in an odex/oat file.")
+@ExtendedParameters(
+        commandName = "dependencies",
+        commandAliases = { "deps", "dep" })
+public class ListDependenciesCommand extends Command {
+
+    @Parameter(names = {"-h", "-?", "--help"}, help = true,
+            description = "Show usage information")
+    private boolean help;
+
+    @Parameter(description = "An oat/odex file")
+    @ExtendedParameter(argumentNames = "file")
+    private List<String> inputList = Lists.newArrayList();
+
+    public ListDependenciesCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors);
+    }
+
+    @Override public void run() {
+        if (help || inputList == null || inputList.isEmpty()) {
+            usage();
+            return;
+        }
+
+        if (inputList.size() > 1) {
+            System.err.println("Too many files specified");
+            usage();
+            return;
+        }
+
+        String input = inputList.get(0);
+        InputStream inputStream = null;
+        try {
+            inputStream = new BufferedInputStream(new FileInputStream(input));
+        } catch (FileNotFoundException ex) {
+            System.err.println("Could not find file: " + input);
+            System.exit(-1);
+        }
+
+        try {
+            OatFile oatFile = OatFile.fromInputStream(inputStream);
+            for (String entry: oatFile.getBootClassPath()) {
+                System.out.println(entry);
+            }
+            return;
+        } catch (OatFile.NotAnOatFileException ex) {
+            // ignore
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+
+        try {
+            DexBackedOdexFile odexFile = DexBackedOdexFile.fromInputStream(Opcodes.getDefault(), inputStream);
+            for (String entry: odexFile.getDependencies()) {
+                System.out.println(entry);
+            }
+            return;
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        } catch (DexBackedOdexFile.NotAnOdexFile ex) {
+            // handled below
+        } catch (DexBackedDexFile.NotADexFile ex) {
+            // handled below
+        }
+
+        System.err.println(input + " is not an odex or oat file.");
+        System.exit(-1);
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/ListDexCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListDexCommand.java
new file mode 100644
index 0000000..d5862eb
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/ListDexCommand.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+import com.google.common.collect.Lists;
+import org.jf.dexlib2.DexFileFactory;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.MultiDexContainer;
+import org.jf.util.jcommander.Command;
+import org.jf.util.jcommander.ExtendedParameter;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import javax.annotation.Nonnull;
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+@Parameters(commandDescription = "Lists the dex files in an apk/oat file.")
+@ExtendedParameters(
+        commandName = "dex",
+        commandAliases = "d")
+public class ListDexCommand extends Command {
+
+    @Parameter(names = {"-h", "-?", "--help"}, help = true,
+            description = "Show usage information")
+    private boolean help;
+
+    @Parameter(description = "An apk or oat file.")
+    @ExtendedParameter(argumentNames = "file")
+    private List<String> inputList = Lists.newArrayList();
+
+    public ListDexCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors);
+    }
+
+    @Override public void run() {
+        if (help || inputList == null || inputList.isEmpty()) {
+            usage();
+            return;
+        }
+
+        if (inputList.size() > 1) {
+            System.err.println("Too many files specified");
+            usage();
+            return;
+        }
+
+        String input = inputList.get(0);
+        File file = new File(input);
+
+        if (!file.exists()) {
+            System.err.println(String.format("Could not find the file: %s", input));
+            System.exit(-1);
+        }
+
+        List<String> entries;
+        try {
+            MultiDexContainer<? extends DexBackedDexFile> container =
+                    DexFileFactory.loadDexContainer(file, Opcodes.getDefault());
+            entries = container.getDexEntryNames();
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+
+        for (String entry: entries) {
+            System.out.println(entry);
+        }
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/ListFieldOffsetsCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListFieldOffsetsCommand.java
new file mode 100644
index 0000000..41f9fe8
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/ListFieldOffsetsCommand.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+import com.beust.jcommander.ParametersDelegate;
+import org.jf.dexlib2.analysis.ClassProto;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.reference.FieldReference;
+import org.jf.util.SparseArray;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.util.List;
+
+@Parameters(commandDescription = "Lists the instance field offsets for classes in a dex file.")
+@ExtendedParameters(
+        commandName = "fieldoffsets",
+        commandAliases = { "fieldoffset", "fo" })
+public class ListFieldOffsetsCommand extends DexInputCommand {
+
+    @Parameter(names = {"-h", "-?", "--help"}, help = true,
+            description = "Show usage information")
+    private boolean help;
+
+    @ParametersDelegate
+    private AnalysisArguments analysisArguments = new AnalysisArguments();
+
+    public ListFieldOffsetsCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors);
+    }
+
+    @Override public void run() {
+        if (help || inputList == null || inputList.isEmpty()) {
+            usage();
+            return;
+        }
+
+        if (inputList.size() > 1) {
+            System.err.println("Too many files specified");
+            usage();
+            return;
+        }
+
+        String input = inputList.get(0);
+        loadDexFile(input);
+        BaksmaliOptions options = getOptions();
+
+        try {
+            for (ClassDef classDef: dexFile.getClasses()) {
+                ClassProto classProto = (ClassProto) options.classPath.getClass(classDef);
+                SparseArray<FieldReference> fields = classProto.getInstanceFields();
+                String className = "Class "  + classDef.getType() + " : " + fields.size() + " instance fields\n";
+                System.out.write(className.getBytes());
+                for (int i=0;i<fields.size();i++) {
+                    String field = fields.keyAt(i) + ":" + fields.valueAt(i).getType() + " " + fields.valueAt(i).getName() + "\n";
+                    System.out.write(field.getBytes());
+                }
+                System.out.write("\n".getBytes());
+            }
+            System.out.close();
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    @Nonnull
+    private BaksmaliOptions getOptions() {
+        if (dexFile == null) {
+            throw new IllegalStateException("You must call loadDexFile first");
+        }
+
+        final BaksmaliOptions options = new BaksmaliOptions();
+
+        options.apiLevel = apiLevel;
+
+        try {
+            options.classPath = analysisArguments.loadClassPathForDexFile(
+                    inputFile.getAbsoluteFile().getParentFile(), dexEntry, false);
+        } catch (Exception ex) {
+            System.err.println("Error occurred while loading class path files.");
+            ex.printStackTrace(System.err);
+            System.exit(-1);
+        }
+
+        return options;
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/ListFieldsCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListFieldsCommand.java
new file mode 100644
index 0000000..c4d090d
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/ListFieldsCommand.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameters;
+import org.jf.dexlib2.ReferenceType;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+@Parameters(commandDescription = "Lists the fields in a dex file's field table.")
+@ExtendedParameters(
+        commandName = "fields",
+        commandAliases = { "field", "f" })
+public class ListFieldsCommand extends ListReferencesCommand {
+    public ListFieldsCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors, ReferenceType.FIELD);
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/ListHelpCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListHelpCommand.java
new file mode 100644
index 0000000..2e64286
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/ListHelpCommand.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+import com.google.common.collect.Iterables;
+import org.jf.util.ConsoleUtil;
+import org.jf.util.jcommander.*;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+@Parameters(commandDescription = "Shows usage information")
+@ExtendedParameters(
+        commandName = "help",
+        commandAliases = "h")
+public class ListHelpCommand extends Command {
+
+    @Parameter(description = "If specified, show the detailed usage information for the given commands")
+    @ExtendedParameter(argumentNames = "commands")
+    private List<String> commands;
+
+    public ListHelpCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors);
+    }
+
+    public void run() {
+        if (commands == null || commands.isEmpty()) {
+            System.out.println(new HelpFormatter()
+                    .width(ConsoleUtil.getConsoleWidth())
+                    .format(commandAncestors));
+        } else {
+            boolean printedHelp = false;
+            JCommander parentJc = Iterables.getLast(commandAncestors);
+            for (String cmd : commands) {
+                JCommander command = ExtendedCommands.getSubcommand(parentJc, cmd);
+                if (command == null) {
+                    System.err.println("No such command: " + cmd);
+                } else {
+                    printedHelp = true;
+                    System.out.println(new HelpFormatter()
+                            .width(ConsoleUtil.getConsoleWidth())
+                            .format(((Command)command.getObjects().get(0)).getCommandHierarchy()));
+                }
+            }
+            if (!printedHelp) {
+                System.out.println(new HelpFormatter()
+                        .width(ConsoleUtil.getConsoleWidth())
+                        .format(commandAncestors));
+            }
+        }
+    }
+
+    @Parameters(hidden =  true)
+    @ExtendedParameters(commandName = "hlep")
+    public static class ListHlepCommand extends ListHelpCommand {
+        public ListHlepCommand(@Nonnull List<JCommander> commandAncestors) {
+            super(commandAncestors);
+        }
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/ListMethodsCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListMethodsCommand.java
new file mode 100644
index 0000000..603e764
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/ListMethodsCommand.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameters;
+import org.jf.dexlib2.ReferenceType;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+@Parameters(commandDescription = "Lists the methods in a dex file's method table.")
+@ExtendedParameters(
+        commandName = "methods",
+        commandAliases = { "method", "m" })
+public class ListMethodsCommand extends ListReferencesCommand {
+    public ListMethodsCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors, ReferenceType.METHOD);
+    }
+}
\ No newline at end of file
diff --git a/baksmali/src/main/java/org/jf/baksmali/ListReferencesCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListReferencesCommand.java
new file mode 100644
index 0000000..da9c3e3
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/ListReferencesCommand.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.dexlib2.util.ReferenceUtil;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+public abstract class ListReferencesCommand extends DexInputCommand {
+
+    private final int referenceType;
+
+    @Parameter(names = {"-h", "-?", "--help"}, help = true,
+            description = "Show usage information")
+    private boolean help;
+
+    public ListReferencesCommand(@Nonnull List<JCommander> commandAncestors, int referenceType) {
+        super(commandAncestors);
+        this.referenceType = referenceType;
+    }
+
+    @Override public void run() {
+        if (help || inputList == null || inputList.isEmpty()) {
+            usage();
+            return;
+        }
+
+        if (inputList.size() > 1) {
+            System.err.println("Too many files specified");
+            usage();
+            return;
+        }
+
+        String input = inputList.get(0);
+        loadDexFile(input);
+
+        for (Reference reference: dexFile.getReferences(referenceType)) {
+            System.out.println(ReferenceUtil.getReferenceString(reference));
+        }
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/ListStringsCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListStringsCommand.java
new file mode 100644
index 0000000..8694f91
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/ListStringsCommand.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameters;
+import org.jf.dexlib2.ReferenceType;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+@Parameters(commandDescription = "Lists the strings in a dex file's string table.")
+@ExtendedParameters(
+        commandName = "strings",
+        commandAliases = { "string", "str", "s" })
+public class ListStringsCommand extends ListReferencesCommand {
+    public ListStringsCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors, ReferenceType.STRING);
+    }
+}
\ No newline at end of file
diff --git a/baksmali/src/main/java/org/jf/baksmali/ListTypesCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListTypesCommand.java
new file mode 100644
index 0000000..fbff2f2
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/ListTypesCommand.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameters;
+import org.jf.dexlib2.ReferenceType;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+@Parameters(commandDescription = "Lists the type ids in a dex file's type table.")
+@ExtendedParameters(
+        commandName = "types",
+        commandAliases = { "type", "t" })
+public class ListTypesCommand extends ListReferencesCommand {
+    public ListTypesCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors, ReferenceType.TYPE);
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/ListVtablesCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListVtablesCommand.java
new file mode 100644
index 0000000..84928d2
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/ListVtablesCommand.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+import com.beust.jcommander.ParametersDelegate;
+import org.jf.baksmali.AnalysisArguments.CheckPackagePrivateArgument;
+import org.jf.dexlib2.AccessFlags;
+import org.jf.dexlib2.analysis.ClassProto;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.Method;
+import org.jf.util.jcommander.ExtendedParameter;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.util.List;
+
+@Parameters(commandDescription = "Lists the virtual method tables for classes in a dex file.")
+@ExtendedParameters(
+        commandName = "vtables",
+        commandAliases = { "vtable", "v" })
+public class ListVtablesCommand extends DexInputCommand {
+
+    @Parameter(names = {"-h", "-?", "--help"}, help = true,
+            description = "Show usage information")
+    private boolean help;
+
+    @ParametersDelegate
+    private AnalysisArguments analysisArguments = new AnalysisArguments();
+
+    @ParametersDelegate
+    private CheckPackagePrivateArgument checkPackagePrivateArgument = new CheckPackagePrivateArgument();
+
+    @Parameter(names = "--classes",
+            description = "A comma separated list of classes. Only print the vtable for these classes")
+    @ExtendedParameter(argumentNames = "classes")
+    private List<String> classes = null;
+
+    @Parameter(names = "--override-oat-version",
+            description = "Uses a classpath for the given oat version, regardless of the actual oat version. This " +
+                    "can be used, e.g. to list vtables from a dex file, as if they were in an oat file of the given " +
+                    "version.")
+    private int oatVersion = 0;
+
+    public ListVtablesCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors);
+    }
+
+    @Override public void run() {
+        if (help || inputList == null || inputList.isEmpty()) {
+            usage();
+            return;
+        }
+
+        if (inputList.size() > 1) {
+            System.err.println("Too many files specified");
+            usage();
+            return;
+        }
+
+        String input = inputList.get(0);
+        loadDexFile(input);
+
+        BaksmaliOptions options = getOptions();
+        if (options == null) {
+            return;
+        }
+
+        try {
+            if (classes != null && !classes.isEmpty()) {
+                for (String cls: classes) {
+                    listClassVtable((ClassProto)options.classPath.getClass(cls));
+                }
+                return;
+            }
+
+            for (ClassDef classDef : dexFile.getClasses()) {
+                if (!AccessFlags.INTERFACE.isSet(classDef.getAccessFlags())) {
+                    listClassVtable((ClassProto)options.classPath.getClass(classDef));
+                }
+            }
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    private void listClassVtable(ClassProto classProto) throws IOException {
+        List<Method> methods = classProto.getVtable();
+        String className = "Class " + classProto.getType() + " extends " + classProto.getSuperclass() +
+                " : " + methods.size() + " methods\n";
+        System.out.write(className.getBytes());
+        for (int i = 0; i < methods.size(); i++) {
+            Method method = methods.get(i);
+
+            String methodString = i + ":" + method.getDefiningClass() + "->" + method.getName() + "(";
+            for (CharSequence parameter : method.getParameterTypes()) {
+                methodString += parameter;
+            }
+            methodString += ")" + method.getReturnType() + "\n";
+            System.out.write(methodString.getBytes());
+        }
+        System.out.write("\n".getBytes());
+    }
+
+    protected BaksmaliOptions getOptions() {
+        if (dexFile == null) {
+            throw new IllegalStateException("You must call loadDexFile first");
+        }
+
+        final BaksmaliOptions options = new BaksmaliOptions();
+
+        options.apiLevel = apiLevel;
+
+        try {
+            options.classPath = analysisArguments.loadClassPathForDexFile(inputFile.getAbsoluteFile().getParentFile(),
+                    dexEntry, checkPackagePrivateArgument.checkPackagePrivateAccess, oatVersion);
+        } catch (Exception ex) {
+            System.err.println("Error occurred while loading class path files.");
+            ex.printStackTrace(System.err);
+            return null;
+        }
+
+        return options;
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Main.java b/baksmali/src/main/java/org/jf/baksmali/Main.java
new file mode 100644
index 0000000..66d9b4f
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Main.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.google.common.collect.Lists;
+import org.jf.baksmali.HelpCommand.HlepCommand;
+import org.jf.util.jcommander.Command;
+import org.jf.util.jcommander.ExtendedCommands;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Properties;
+
+@ExtendedParameters(
+        includeParametersInUsage = true,
+        commandName = "baksmali",
+        postfixDescription = "See baksmali help <command> for more information about a specific command")
+public class Main extends Command {
+    public static final String VERSION = loadVersion();
+
+    @Parameter(names = {"--help", "-h", "-?"}, help = true,
+            description = "Show usage information")
+    private boolean help;
+
+    @Parameter(names = {"--version", "-v"}, help = true,
+            description = "Print the version of baksmali and then exit")
+    public boolean version;
+
+    private JCommander jc;
+
+    public Main() {
+        super(Lists.<JCommander>newArrayList());
+    }
+
+    @Override public void run() {
+    }
+
+    @Override protected JCommander getJCommander() {
+        return jc;
+    }
+
+    public static void main(String[] args) {
+        Main main = new Main();
+
+        JCommander jc = new JCommander(main);
+        main.jc = jc;
+        jc.setProgramName("baksmali");
+        List<JCommander> commandHierarchy = main.getCommandHierarchy();
+
+        ExtendedCommands.addExtendedCommand(jc, new DisassembleCommand(commandHierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new DeodexCommand(commandHierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new DumpCommand(commandHierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new HelpCommand(commandHierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new HlepCommand(commandHierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new ListCommand(commandHierarchy));
+
+        jc.parse(args);
+
+        if (main.version) {
+            version();
+        }
+
+        if (jc.getParsedCommand() == null || main.help) {
+            main.usage();
+            return;
+        }
+
+        Command command = (Command)jc.getCommands().get(jc.getParsedCommand()).getObjects().get(0);
+        command.run();
+    }
+
+    protected static void version() {
+        System.out.println("baksmali " + VERSION + " (http://smali.org)");
+        System.out.println("Copyright (C) 2010 Ben Gruver (JesusFreke@JesusFreke.com)");
+        System.out.println("BSD license (http://www.opensource.org/licenses/bsd-license.php)");
+        System.exit(0);
+    }
+
+    private static String loadVersion() {
+        InputStream propertiesStream = Baksmali.class.getClassLoader().getResourceAsStream("baksmali.properties");
+        String version = "[unknown version]";
+        if (propertiesStream != null) {
+            Properties properties = new Properties();
+            try {
+                properties.load(propertiesStream);
+                version = properties.getProperty("application.version");
+            } catch (IOException ex) {
+                // ignore
+            }
+        }
+        return version;
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Renderers/BooleanRenderer.java b/baksmali/src/main/java/org/jf/baksmali/Renderers/BooleanRenderer.java
new file mode 100644
index 0000000..f181bb4
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Renderers/BooleanRenderer.java
@@ -0,0 +1,43 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Renderers;
+
+import org.jf.util.IndentingWriter;
+
+import java.io.IOException;
+
+public class BooleanRenderer {
+    public static void writeTo(IndentingWriter writer, boolean val) throws IOException {
+        if (val) {
+            writer.write("true");
+        } else {
+            writer.write("false");
+        }
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Renderers/ByteRenderer.java b/baksmali/src/main/java/org/jf/baksmali/Renderers/ByteRenderer.java
new file mode 100644
index 0000000..9c060fd
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Renderers/ByteRenderer.java
@@ -0,0 +1,53 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Renderers;
+
+import org.jf.util.IndentingWriter;
+
+import java.io.IOException;
+
+public class ByteRenderer  {
+    public static void writeTo(IndentingWriter writer, byte val) throws IOException {
+        if (val<0) {
+            writer.write("-0x");
+            writer.printUnsignedLongAsHex(-val);
+            writer.write('t');
+        } else {
+            writer.write("0x");
+            writer.printUnsignedLongAsHex(val);
+            writer.write('t');
+        }
+    }
+
+    public static void writeUnsignedTo(IndentingWriter writer, byte val) throws IOException {
+        writer.write("0x");
+        writer.printUnsignedLongAsHex(val & 0xFF);
+        writer.write('t');
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Renderers/CharRenderer.java b/baksmali/src/main/java/org/jf/baksmali/Renderers/CharRenderer.java
new file mode 100644
index 0000000..daf7634
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Renderers/CharRenderer.java
@@ -0,0 +1,42 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Renderers;
+
+import org.jf.util.IndentingWriter;
+import org.jf.util.StringUtils;
+
+import java.io.IOException;
+
+public class CharRenderer {
+    public static void writeTo(IndentingWriter writer, char val) throws IOException {
+        writer.write('\'');
+        StringUtils.writeEscapedChar(writer, val);
+        writer.write('\'');
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Renderers/DoubleRenderer.java b/baksmali/src/main/java/org/jf/baksmali/Renderers/DoubleRenderer.java
new file mode 100644
index 0000000..03fff64
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Renderers/DoubleRenderer.java
@@ -0,0 +1,39 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Renderers;
+
+import org.jf.util.IndentingWriter;
+
+import java.io.IOException;
+
+public class DoubleRenderer {
+    public static void writeTo(IndentingWriter writer, double val) throws IOException {
+        writer.write(Double.toString(val));
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Renderers/FloatRenderer.java b/baksmali/src/main/java/org/jf/baksmali/Renderers/FloatRenderer.java
new file mode 100644
index 0000000..a1de2b9
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Renderers/FloatRenderer.java
@@ -0,0 +1,40 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Renderers;
+
+import org.jf.util.IndentingWriter;
+
+import java.io.IOException;
+
+public class FloatRenderer {
+    public static void writeTo(IndentingWriter writer, float val) throws IOException {
+        writer.write(Float.toString(val));
+        writer.write('f');
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Renderers/IntegerRenderer.java b/baksmali/src/main/java/org/jf/baksmali/Renderers/IntegerRenderer.java
new file mode 100644
index 0000000..22beaac
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Renderers/IntegerRenderer.java
@@ -0,0 +1,50 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Renderers;
+
+import org.jf.util.IndentingWriter;
+
+import java.io.IOException;
+
+public class IntegerRenderer {
+    public static void writeTo(IndentingWriter writer, int val) throws IOException {
+        if (val<0) {
+            writer.write("-0x");
+            writer.printUnsignedLongAsHex(-((long) val));
+        } else {
+            writer.write("0x");
+            writer.printUnsignedLongAsHex(val);
+        }
+    }
+
+    public static void writeUnsignedTo(IndentingWriter writer, int val) throws IOException {
+        writer.write("0x");
+        writer.printUnsignedLongAsHex(val & 0xFFFFFFFFL);
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Renderers/LongRenderer.java b/baksmali/src/main/java/org/jf/baksmali/Renderers/LongRenderer.java
new file mode 100644
index 0000000..83076e4
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Renderers/LongRenderer.java
@@ -0,0 +1,63 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Renderers;
+
+import org.jf.util.IndentingWriter;
+
+import java.io.IOException;
+
+public class LongRenderer {
+    public static void writeTo(IndentingWriter writer, long val) throws IOException {
+        if (val<0) {
+            writer.write("-0x");
+            writer.printUnsignedLongAsHex(-val);
+            writer.write('L');
+        } else {
+            writer.write("0x");
+            writer.printUnsignedLongAsHex(val);
+            writer.write('L');
+        }
+    }
+
+    public static void writeSignedIntOrLongTo(IndentingWriter writer, long val) throws IOException {
+        if (val<0) {
+            writer.write("-0x");
+            writer.printUnsignedLongAsHex(-val);
+            if (val < Integer.MIN_VALUE) {
+                writer.write('L');
+            }
+        } else {
+            writer.write("0x");
+            writer.printUnsignedLongAsHex(val);
+            if (val > Integer.MAX_VALUE) {
+                writer.write('L');
+            }
+        }
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Renderers/ShortRenderer.java b/baksmali/src/main/java/org/jf/baksmali/Renderers/ShortRenderer.java
new file mode 100644
index 0000000..3385c6b
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Renderers/ShortRenderer.java
@@ -0,0 +1,47 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali.Renderers;
+
+import org.jf.util.IndentingWriter;
+
+import java.io.IOException;
+
+public class ShortRenderer {
+    public static void writeTo(IndentingWriter writer, short val) throws IOException {
+        if (val < 0) {
+            writer.write("-0x");
+            writer.printUnsignedLongAsHex(-val);
+            writer.write('s');
+        } else {
+            writer.write("0x");
+            writer.printUnsignedLongAsHex(val);
+            writer.write('s');
+        }
+    }
+}
diff --git a/baksmali/src/main/resources/baksmali.properties b/baksmali/src/main/resources/baksmali.properties
new file mode 100644
index 0000000..df22408
--- /dev/null
+++ b/baksmali/src/main/resources/baksmali.properties
@@ -0,0 +1 @@
+application.version=${version}
\ No newline at end of file
diff --git a/baksmali/src/test/java/org/jf/baksmali/AnalysisTest.java b/baksmali/src/test/java/org/jf/baksmali/AnalysisTest.java
new file mode 100644
index 0000000..80a54b7
--- /dev/null
+++ b/baksmali/src/test/java/org/jf/baksmali/AnalysisTest.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.google.common.base.Charsets;
+import com.google.common.io.Resources;
+import junit.framework.Assert;
+import org.jf.baksmali.Adaptors.ClassDefinition;
+import org.jf.dexlib2.DexFileFactory;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.analysis.ClassPath;
+import org.jf.dexlib2.analysis.ClassProvider;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.DexFile;
+import org.jf.util.IndentingWriter;
+import org.junit.Test;
+
+import javax.annotation.Nonnull;
+import java.io.File;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+
+public class AnalysisTest {
+
+    @Test
+    public void ConstructorTest() throws IOException, URISyntaxException {
+        runTest("ConstructorTest", true);
+    }
+
+    @Test
+    public void RegisterEqualityOnMergeTest() throws IOException, URISyntaxException {
+        runTest("RegisterEqualityOnMergeTest", true);
+    }
+
+    @Test
+    public void UninitRefIdentityTest() throws IOException, URISyntaxException {
+        runTest("UninitRefIdentityTest", true);
+    }
+
+    @Test
+    public void InstanceOfTest() throws IOException, URISyntaxException {
+        runTest("InstanceOfTest", true, true);
+    }
+
+    @Test
+    public void MultipleStartInstructionsTest() throws IOException, URISyntaxException {
+        runTest("MultipleStartInstructionsTest", true);
+    }
+
+    @Test
+    public void DuplicateTest() throws IOException, URISyntaxException {
+        runTest("DuplicateTest", false);
+    }
+
+    @Test
+    public void LocalTest() throws IOException, URISyntaxException {
+        runTest("LocalTest", false);
+    }
+
+    public void runTest(String test, boolean registerInfo) throws IOException, URISyntaxException {
+        runTest(test, registerInfo, false);
+    }
+
+    public void runTest(String test, boolean registerInfo, boolean isArt) throws IOException, URISyntaxException {
+        String dexFilePath = String.format("%s%sclasses.dex", test, File.separatorChar);
+
+        DexFile dexFile = DexFileFactory.loadDexFile(findResource(dexFilePath), Opcodes.getDefault());
+
+        BaksmaliOptions options = new BaksmaliOptions();
+        if (registerInfo) {
+            options.registerInfo = BaksmaliOptions.ALL | BaksmaliOptions.FULLMERGE;
+            if (isArt) {
+                options.classPath = new ClassPath(new ArrayList<ClassProvider>(), true, 56);
+            } else {
+                options.classPath = new ClassPath();
+            }
+        }
+        options.implicitReferences = false;
+
+        for (ClassDef classDef: dexFile.getClasses()) {
+            StringWriter stringWriter = new StringWriter();
+            IndentingWriter writer = new IndentingWriter(stringWriter);
+            ClassDefinition classDefinition = new ClassDefinition(options, classDef);
+            classDefinition.writeTo(writer);
+            writer.close();
+
+            String className = classDef.getType();
+            String smaliPath = String.format("%s%s%s.smali", test, File.separatorChar,
+                    className.substring(1, className.length() - 1));
+            String smaliContents = readResource(smaliPath);
+
+            Assert.assertEquals(BaksmaliTestUtils.normalizeWhitespace(smaliContents),
+                    BaksmaliTestUtils.normalizeWhitespace((stringWriter.toString())));
+        }
+    }
+
+    @Nonnull
+    private File findResource(String resource) throws URISyntaxException {
+        URL resUrl = Resources.getResource(resource);
+        return new File(resUrl.toURI());
+    }
+
+    @Nonnull
+    private String readResource(String resource) throws URISyntaxException, IOException {
+        URL url = Resources.getResource(resource);
+        return Resources.toString(url, Charsets.UTF_8);
+    }
+}
diff --git a/baksmali/src/test/java/org/jf/baksmali/BaksmaliTestUtils.java b/baksmali/src/test/java/org/jf/baksmali/BaksmaliTestUtils.java
new file mode 100644
index 0000000..e6406fb
--- /dev/null
+++ b/baksmali/src/test/java/org/jf/baksmali/BaksmaliTestUtils.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.google.common.io.ByteStreams;
+import junit.framework.Assert;
+import org.antlr.runtime.RecognitionException;
+import org.jf.baksmali.Adaptors.ClassDefinition;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.smali.SmaliTestUtils;
+import org.jf.util.IndentingWriter;
+import org.junit.Test;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringWriter;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class BaksmaliTestUtils {
+
+    private static String newline = System.getProperty("line.separator");
+
+    public static void assertSmaliCompiledEquals(String source, String expected,
+                                                 BaksmaliOptions options, boolean stripComments) throws IOException,
+            RecognitionException {
+        ClassDef classDef = SmaliTestUtils.compileSmali(source, options.apiLevel);
+
+        // Remove unnecessary whitespace and optionally strip all comments from smali file
+        String normalizedActual = getNormalizedSmali(classDef, options, stripComments);
+        String normalizedExpected = normalizeSmali(expected, stripComments);
+
+        // Assert that normalized strings are now equal
+        Assert.assertEquals(normalizedExpected, normalizedActual);
+    }
+
+    public static void assertSmaliCompiledEquals(String source, String expected,
+            BaksmaliOptions options) throws IOException, RecognitionException {
+        assertSmaliCompiledEquals(source, expected, options, false);
+    }
+
+    public static void assertSmaliCompiledEquals(String source, String expected)
+            throws IOException, RecognitionException {
+        BaksmaliOptions options = new BaksmaliOptions();
+        assertSmaliCompiledEquals(source, expected, options);
+    }
+
+    @Nonnull
+    public static String normalizeSmali(@Nonnull String smaliText, boolean stripComments) {
+        if (stripComments) {
+            smaliText = stripComments(smaliText);
+        }
+        return normalizeWhitespace(smaliText);
+    }
+
+    @Nonnull
+    public static String getNormalizedSmali(@Nonnull ClassDef classDef, @Nonnull BaksmaliOptions options,
+                                            boolean stripComments)
+            throws IOException {
+        StringWriter stringWriter = new StringWriter();
+        IndentingWriter writer = new IndentingWriter(stringWriter);
+        ClassDefinition classDefinition = new ClassDefinition(options, classDef);
+        classDefinition.writeTo(writer);
+        writer.close();
+        return normalizeSmali(stringWriter.toString(), stripComments);
+    }
+
+    @Nonnull
+    public static byte[] readResourceBytesFully(@Nonnull String fileName) throws IOException {
+        InputStream smaliStream = RoundtripTest.class.getClassLoader().
+                getResourceAsStream(fileName);
+        if (smaliStream == null) {
+            org.junit.Assert.fail("Could not load " + fileName);
+        }
+
+        return ByteStreams.toByteArray(smaliStream);
+    }
+
+    @Nonnull
+    public static String readResourceFully(@Nonnull String fileName) throws IOException {
+        return readResourceFully(fileName, "UTF-8");
+    }
+
+    @Nonnull
+    public static String readResourceFully(@Nonnull String fileName, @Nonnull String encoding)
+            throws IOException {
+        return new String(readResourceBytesFully(fileName), encoding);
+    }
+
+    @Nonnull
+    public static String normalizeNewlines(@Nonnull String source) {
+        return normalizeNewlines(source, newline);
+    }
+
+    @Nonnull
+    public static String normalizeNewlines(@Nonnull String source, String newlineValue) {
+        return source.replace("\r", "").replace("\n", newlineValue);
+    }
+
+    @Nonnull
+    public static String normalizeWhitespace(@Nonnull String source) {
+        // Go to native system new lines so that ^/$ work correctly
+        source = normalizeNewlines(source);
+
+        // Remove all suffix/prefix whitespace
+        Pattern pattern = Pattern.compile("((^[ \t]+)|([ \t]+$))", Pattern.MULTILINE);
+        Matcher matcher = pattern.matcher(source);
+        source = matcher.replaceAll("");
+
+        // Remove all empty lines
+        Pattern pattern2 = Pattern.compile("^\r?\n?", Pattern.MULTILINE);
+        Matcher matcher2 = pattern2.matcher(source);
+        source = matcher2.replaceAll("");
+
+        // Remove a trailing new line, if present
+        Pattern pattern3 = Pattern.compile("\r?\n?$");
+        Matcher matcher3 = pattern3.matcher(source);
+        source = matcher3.replaceAll("");
+
+        // Go back to unix-style \n newlines
+        source = normalizeNewlines(source, "\n");
+        return source;
+    }
+
+    @Nonnull
+    public static String stripComments(@Nonnull String source) {
+        Pattern pattern = Pattern.compile("#(.*)");
+        Matcher matcher = pattern.matcher(source);
+        return matcher.replaceAll("");
+    }
+
+    @Test
+    public void testStripComments() {
+        Assert.assertEquals("", stripComments("#world"));
+        Assert.assertEquals("hello", stripComments("hello#world"));
+        Assert.assertEquals("multi\nline", stripComments("multi#hello world\nline#world"));
+    }
+
+    @Test
+    public void testNormalizeWhitespace() {
+        Assert.assertEquals("", normalizeWhitespace(" "));
+        Assert.assertEquals("hello", normalizeWhitespace("hello "));
+        Assert.assertEquals("hello", normalizeWhitespace(" hello"));
+        Assert.assertEquals("hello", normalizeWhitespace(" hello "));
+        Assert.assertEquals("hello\nworld", normalizeWhitespace("hello \n \n world"));
+    }
+}
diff --git a/baksmali/src/test/java/org/jf/baksmali/DexTest.java b/baksmali/src/test/java/org/jf/baksmali/DexTest.java
new file mode 100644
index 0000000..f9f5562
--- /dev/null
+++ b/baksmali/src/test/java/org/jf/baksmali/DexTest.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.junit.Assert;
+
+import javax.annotation.Nonnull;
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * A base test class for performing a test using a dex file as input
+ */
+/**
+ * A base test class for performing a disassembly on a dex file and verifying the results
+ *
+ * The test accepts a single-class dex file as input. By default, the input dex file should be a resource at
+ * [testDir]/[testName]Input.dex
+ */
+public abstract class DexTest {
+    protected final String testDir;
+
+    protected DexTest(@Nonnull String testDir) {
+        this.testDir = testDir;
+    }
+
+    protected DexTest() {
+        this.testDir = this.getClass().getSimpleName();
+    }
+
+    @Nonnull
+    protected String getInputFilename(@Nonnull String testName) {
+        return String.format("%s%s%sInput.dex", testDir, File.separatorChar, testName);
+    }
+
+    @Nonnull
+    protected DexBackedDexFile getInputDexFile(@Nonnull String testName, @Nonnull BaksmaliOptions options) {
+        try {
+            // Load file from resources as a stream
+            byte[] inputBytes = BaksmaliTestUtils.readResourceBytesFully(getInputFilename(testName));
+            return new DexBackedDexFile(Opcodes.forApi(options.apiLevel), inputBytes);
+        } catch (IOException ex) {
+            Assert.fail();
+        }
+        return null;
+    }
+}
diff --git a/baksmali/src/test/java/org/jf/baksmali/DisassemblyTest.java b/baksmali/src/test/java/org/jf/baksmali/DisassemblyTest.java
new file mode 100644
index 0000000..f8ebe91
--- /dev/null
+++ b/baksmali/src/test/java/org/jf/baksmali/DisassemblyTest.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.google.common.collect.Iterables;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.ClassDef;
+import org.junit.Assert;
+
+import javax.annotation.Nonnull;
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * A base test class for performing a disassembly on a dex file and verifying the results
+ *
+ * The test accepts a single-class dex file as input, disassembles it, and  verifies that
+ * the result equals a known-good output smali file.
+ *
+ * By default, the input and output files should be resources at [testDir]/[testName]Input.dex
+ * and [testDir]/[testName]Output.smali respectively
+ */
+public class DisassemblyTest extends DexTest {
+
+    @Nonnull
+    protected String getOutputFilename(@Nonnull String testName) {
+        return String.format("%s%s%sOutput.smali", testDir, File.separatorChar, testName);
+    }
+
+    protected void runTest(@Nonnull String testName) {
+        runTest(testName, new BaksmaliOptions());
+    }
+
+    protected void runTest(@Nonnull String testName, @Nonnull BaksmaliOptions options) {
+        try {
+            DexBackedDexFile inputDex = getInputDexFile(testName, options);
+            Assert.assertEquals(1, inputDex.getClassSection().size());
+            ClassDef inputClass = Iterables.getFirst(inputDex.getClasses(), null);
+            Assert.assertNotNull(inputClass);
+            String input = BaksmaliTestUtils.getNormalizedSmali(inputClass, options, true);
+
+            String output = BaksmaliTestUtils.readResourceFully(getOutputFilename(testName));
+            output = BaksmaliTestUtils.normalizeSmali(output, true);
+
+            // Run smali, baksmali, and then compare strings are equal (minus comments/whitespace)
+            Assert.assertEquals(output, input);
+        } catch (IOException ex) {
+            Assert.fail();
+        }
+    }
+}
diff --git a/baksmali/src/test/java/org/jf/baksmali/FieldGapOrderTest.java b/baksmali/src/test/java/org/jf/baksmali/FieldGapOrderTest.java
new file mode 100644
index 0000000..ad2aad5
--- /dev/null
+++ b/baksmali/src/test/java/org/jf/baksmali/FieldGapOrderTest.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.google.common.collect.Lists;
+import org.jf.dexlib2.analysis.ClassPath;
+import org.jf.dexlib2.analysis.ClassProto;
+import org.jf.dexlib2.analysis.DexClassProvider;
+import org.jf.dexlib2.iface.DexFile;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class FieldGapOrderTest extends DexTest {
+    @Test
+    public void testOldOrder() {
+        DexFile dexFile = getInputDexFile("FieldGapOrder", new BaksmaliOptions());
+        Assert.assertEquals(3, dexFile.getClasses().size());
+
+        ClassPath classPath = new ClassPath(Lists.newArrayList(new DexClassProvider(dexFile)), false, 66);
+        ClassProto classProto = (ClassProto)classPath.getClass("LGapOrder;");
+        Assert.assertEquals("r1", classProto.getFieldByOffset(12).getName());
+        Assert.assertEquals("r2", classProto.getFieldByOffset(16).getName());
+        Assert.assertEquals("d", classProto.getFieldByOffset(24).getName());
+        Assert.assertEquals("s", classProto.getFieldByOffset(36).getName());
+        Assert.assertEquals("i", classProto.getFieldByOffset(32).getName());
+    }
+
+    @Test
+    public void testNewOrder() {
+        DexFile dexFile = getInputDexFile("FieldGapOrder", new BaksmaliOptions());
+        Assert.assertEquals(3, dexFile.getClasses().size());
+
+        ClassPath classPath = new ClassPath(Lists.newArrayList(new DexClassProvider(dexFile)), false, 67);
+        ClassProto classProto = (ClassProto)classPath.getClass("LGapOrder;");
+        Assert.assertEquals("s", classProto.getFieldByOffset(10).getName());
+        Assert.assertEquals("r1", classProto.getFieldByOffset(12).getName());
+        Assert.assertEquals("r2", classProto.getFieldByOffset(16).getName());
+        Assert.assertEquals("i", classProto.getFieldByOffset(20).getName());
+        Assert.assertEquals("d", classProto.getFieldByOffset(24).getName());
+    }
+}
diff --git a/baksmali/src/test/java/org/jf/baksmali/HiddenApiRestrictionsRoundtripTest.java b/baksmali/src/test/java/org/jf/baksmali/HiddenApiRestrictionsRoundtripTest.java
new file mode 100644
index 0000000..a6ed181
--- /dev/null
+++ b/baksmali/src/test/java/org/jf/baksmali/HiddenApiRestrictionsRoundtripTest.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import org.junit.Test;
+
+public class HiddenApiRestrictionsRoundtripTest extends RoundtripTest {
+    @Test
+    public void testHiddenApiRestrictions() {
+        BaksmaliOptions options = new BaksmaliOptions();
+        options.apiLevel = 29;
+        runTest("HiddenApiRestrictions", options);
+    }
+}
diff --git a/baksmali/src/test/java/org/jf/baksmali/HiddenApiRestrictionsTest.java b/baksmali/src/test/java/org/jf/baksmali/HiddenApiRestrictionsTest.java
new file mode 100644
index 0000000..2b4726c
--- /dev/null
+++ b/baksmali/src/test/java/org/jf/baksmali/HiddenApiRestrictionsTest.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2020, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import org.antlr.runtime.RecognitionException;
+import org.jf.dexlib2.dexbacked.DexBackedClassDef;
+import org.jf.dexlib2.dexbacked.raw.ItemType;
+import org.jf.smali.SmaliTestUtils;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.IOException;
+
+public class HiddenApiRestrictionsTest {
+
+    @Test
+    public void testNoHiddenApiRestrictions() throws IOException, RecognitionException {
+        String source = "" +
+                ".class public LHelloWorld;\n" +
+                ".super Ljava/lang/Object;\n" +
+                ".method public static main([Ljava/lang/String;)V\n" +
+                "    .registers 1\n" +
+                "    return-void\n" +
+                ".end method";
+
+        DexBackedClassDef classDef = SmaliTestUtils.compileSmali(source, 29);
+
+        Assert.assertNull(classDef.dexFile.getMapItemForSection(ItemType.HIDDENAPI_CLASS_DATA_ITEM));
+    }
+
+    @Test
+    public void testWithHiddenApiRestrictions() throws IOException, RecognitionException {
+        String source = "" +
+                ".class public LHelloWorld;\n" +
+                ".super Ljava/lang/Object;\n" +
+                ".method public whitelist static main([Ljava/lang/String;)V\n" +
+                "    .registers 1\n" +
+                "    return-void\n" +
+                ".end method";
+
+        DexBackedClassDef classDef = SmaliTestUtils.compileSmali(source, 29);
+
+        Assert.assertNotNull(classDef.dexFile.getMapItemForSection(ItemType.HIDDENAPI_CLASS_DATA_ITEM));
+    }
+
+    @Test
+    public void testWithHiddenApiRestrictionsWithLowerApi() throws IOException, RecognitionException {
+        String source = "" +
+                ".class public LHelloWorld;\n" +
+                ".super Ljava/lang/Object;\n" +
+                ".method public whitelist static main([Ljava/lang/String;)V\n" +
+                "    .registers 1\n" +
+                "    return-void\n" +
+                ".end method";
+
+        try {
+            SmaliTestUtils.compileSmali(source, 28);
+            Assert.fail();
+        } catch (RuntimeException ex) {
+            // expected exception
+        }
+    }
+}
diff --git a/baksmali/src/test/java/org/jf/baksmali/IdenticalRoundtripTest.java b/baksmali/src/test/java/org/jf/baksmali/IdenticalRoundtripTest.java
new file mode 100644
index 0000000..e636ee1
--- /dev/null
+++ b/baksmali/src/test/java/org/jf/baksmali/IdenticalRoundtripTest.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import javax.annotation.Nonnull;
+import java.io.File;
+
+/**
+ * A base test class for performing a roundtrip assembly/disassembly where the input and output
+ * should be identical.
+ *
+ * By default, the input/output file should be a resource at [testDir]/[testName].smali
+ */
+public abstract class IdenticalRoundtripTest extends RoundtripTest {
+
+    public IdenticalRoundtripTest(@Nonnull String testDir) {
+        super(testDir);
+    }
+
+    public IdenticalRoundtripTest() {
+    }
+
+    @Nonnull @Override protected String getInputFilename(@Nonnull String testName) {
+        return String.format("%s%s%s.smali", testDir, File.separatorChar, testName);
+    }
+
+    @Nonnull @Override protected String getOutputFilename(@Nonnull String testName) {
+        return getInputFilename(testName);
+    }
+}
diff --git a/baksmali/src/test/java/org/jf/baksmali/ImplicitReferenceTest.java b/baksmali/src/test/java/org/jf/baksmali/ImplicitReferenceTest.java
new file mode 100644
index 0000000..962a6be
--- /dev/null
+++ b/baksmali/src/test/java/org/jf/baksmali/ImplicitReferenceTest.java
@@ -0,0 +1,260 @@
+/*
+ * Copyright 2014, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import org.antlr.runtime.RecognitionException;
+import org.junit.Test;
+
+import java.io.IOException;
+
+public class ImplicitReferenceTest {
+    @Test
+    public void testImplicitMethodReferences() throws IOException, RecognitionException {
+        String source = "" +
+                ".class public LHelloWorld;\n" +
+                ".super Ljava/lang/Object;\n" +
+                ".method public static main([Ljava/lang/String;)V\n" +
+                "    .registers 1\n" +
+                "    invoke-static {p0}, LHelloWorld;->toString()V\n" +
+                "    invoke-static {p0}, LHelloWorld;->V()V\n" +
+                "    invoke-static {p0}, LHelloWorld;->I()V\n" +
+                "    return-void\n" +
+                ".end method";
+
+        String expected = "" +
+                ".class public LHelloWorld;\n" +
+                ".super Ljava/lang/Object;\n" +
+                "# direct methods\n" +
+                ".method public static main([Ljava/lang/String;)V\n" +
+                ".registers 1\n" +
+                "invoke-static {p0}, toString()V\n" +
+                "invoke-static {p0}, V()V\n" +
+                "invoke-static {p0}, I()V\n" +
+                "return-void\n" +
+                ".end method\n";
+
+        BaksmaliOptions options = new BaksmaliOptions();
+        options.implicitReferences = true;
+
+        BaksmaliTestUtils.assertSmaliCompiledEquals(source, expected, options);
+    }
+
+    @Test
+    public void testExplicitMethodReferences() throws IOException, RecognitionException {
+        String source = "" +
+                ".class public LHelloWorld;\n" +
+                ".super Ljava/lang/Object;\n" +
+                ".method public static main([Ljava/lang/String;)V\n" +
+                "    .registers 1\n" +
+                "    invoke-static {p0}, LHelloWorld;->toString()V\n" +
+                "    invoke-static {p0}, LHelloWorld;->V()V\n" +
+                "    invoke-static {p0}, LHelloWorld;->I()V\n" +
+                "    return-void\n" +
+                ".end method";
+
+        String expected = "" +
+                ".class public LHelloWorld;\n" +
+                ".super Ljava/lang/Object;\n" +
+                "# direct methods\n" +
+                ".method public static main([Ljava/lang/String;)V\n" +
+                "    .registers 1\n" +
+                "    invoke-static {p0}, LHelloWorld;->toString()V\n" +
+                "    invoke-static {p0}, LHelloWorld;->V()V\n" +
+                "    invoke-static {p0}, LHelloWorld;->I()V\n" +
+                "    return-void\n" +
+                ".end method\n";
+
+        BaksmaliOptions options = new BaksmaliOptions();
+        options.implicitReferences = false;
+
+        BaksmaliTestUtils.assertSmaliCompiledEquals(source, expected, options);
+    }
+
+    @Test
+    public void testImplicitMethodLiterals() throws IOException, RecognitionException {
+        String source = "" +
+                ".class public LHelloWorld;\n" +
+                ".super Ljava/lang/Object;\n" +
+                ".field public static field1:Ljava/lang/reflect/Method; = LHelloWorld;->toString()V\n" +
+                ".field public static field2:Ljava/lang/reflect/Method; = LHelloWorld;->V()V\n" +
+                ".field public static field3:Ljava/lang/reflect/Method; = LHelloWorld;->I()V\n" +
+                ".field public static field4:Ljava/lang/Class; = I";
+
+        String expected = "" +
+                ".class public LHelloWorld;\n" +
+                ".super Ljava/lang/Object;\n" +
+                "# static fields\n" +
+                ".field public static field1:Ljava/lang/reflect/Method; = toString()V\n" +
+                ".field public static field2:Ljava/lang/reflect/Method; = V()V\n" +
+                ".field public static field3:Ljava/lang/reflect/Method; = I()V\n" +
+                ".field public static field4:Ljava/lang/Class; = I\n";
+
+        BaksmaliOptions options = new BaksmaliOptions();
+        options.implicitReferences = true;
+
+        BaksmaliTestUtils.assertSmaliCompiledEquals(source, expected, options);
+    }
+
+    @Test
+    public void testExplicitMethodLiterals() throws IOException, RecognitionException {
+        String source = "" +
+                ".class public LHelloWorld;\n" +
+                ".super Ljava/lang/Object;\n" +
+                ".field public static field1:Ljava/lang/reflect/Method; = LHelloWorld;->toString()V\n" +
+                ".field public static field2:Ljava/lang/reflect/Method; = LHelloWorld;->V()V\n" +
+                ".field public static field3:Ljava/lang/reflect/Method; = LHelloWorld;->I()V\n" +
+                ".field public static field4:Ljava/lang/Class; = I";
+
+        String expected = "" +
+                ".class public LHelloWorld;\n" +
+                ".super Ljava/lang/Object;\n" +
+                "# static fields\n" +
+                ".field public static field1:Ljava/lang/reflect/Method; = LHelloWorld;->toString()V\n" +
+                ".field public static field2:Ljava/lang/reflect/Method; = LHelloWorld;->V()V\n" +
+                ".field public static field3:Ljava/lang/reflect/Method; = LHelloWorld;->I()V\n" +
+                ".field public static field4:Ljava/lang/Class; = I\n";
+
+        BaksmaliOptions options = new BaksmaliOptions();
+        options.implicitReferences = false;
+
+        BaksmaliTestUtils.assertSmaliCompiledEquals(source, expected, options);
+    }
+
+    @Test
+    public void testImplicitFieldReferences() throws IOException, RecognitionException {
+        String source = "" +
+                ".class public LHelloWorld;\n" +
+                ".super Ljava/lang/Object;\n" +
+                ".method public static main([Ljava/lang/String;)V\n" +
+                "    .registers 1\n" +
+                "    sget v0, LHelloWorld;->someField:I\n" +
+                "    sget v0, LHelloWorld;->I:I\n" +
+                "    sget v0, LHelloWorld;->V:I\n" +
+                "    return-void\n" +
+                ".end method";
+
+        String expected = "" +
+                ".class public LHelloWorld;\n" +
+                ".super Ljava/lang/Object;\n" +
+                "# direct methods\n" +
+                ".method public static main([Ljava/lang/String;)V\n" +
+                "    .registers 1\n" +
+                "    sget p0, someField:I\n" +
+                "    sget p0, I:I\n" +
+                "    sget p0, V:I\n" +
+                "    return-void\n" +
+                ".end method\n";
+
+        BaksmaliOptions options = new BaksmaliOptions();
+        options.implicitReferences = true;
+
+        BaksmaliTestUtils.assertSmaliCompiledEquals(source, expected, options);
+    }
+
+    @Test
+    public void testExplicitFieldReferences() throws IOException, RecognitionException {
+        String source = "" +
+                ".class public LHelloWorld;\n" +
+                ".super Ljava/lang/Object;\n" +
+                ".method public static main([Ljava/lang/String;)V\n" +
+                "    .registers 1\n" +
+                "    sget v0, LHelloWorld;->someField:I\n" +
+                "    sget v0, LHelloWorld;->I:I\n" +
+                "    sget v0, LHelloWorld;->V:I\n" +
+                "    return-void\n" +
+                ".end method";
+
+        String expected = "" +
+                ".class public LHelloWorld;\n" +
+                ".super Ljava/lang/Object;\n" +
+                "# direct methods\n" +
+                ".method public static main([Ljava/lang/String;)V\n" +
+                "    .registers 1\n" +
+                "    sget p0, LHelloWorld;->someField:I\n" +
+                "    sget p0, LHelloWorld;->I:I\n" +
+                "    sget p0, LHelloWorld;->V:I\n" +
+                "    return-void\n" +
+                ".end method\n";
+
+        BaksmaliOptions options = new BaksmaliOptions();
+        options.implicitReferences = false;
+
+        BaksmaliTestUtils.assertSmaliCompiledEquals(source, expected, options);
+    }
+
+    @Test
+    public void testImplicitFieldLiterals() throws IOException, RecognitionException {
+        String source = "" +
+                ".class public LHelloWorld;\n" +
+                ".super Ljava/lang/Object;\n" +
+                ".field public static field1:Ljava/lang/reflect/Field; = LHelloWorld;->someField:I\n" +
+                ".field public static field2:Ljava/lang/reflect/Field; = LHelloWorld;->V:I\n" +
+                ".field public static field3:Ljava/lang/reflect/Field; = LHelloWorld;->I:I";
+
+        String expected = "" +
+                ".class public LHelloWorld;\n" +
+                ".super Ljava/lang/Object;\n" +
+                "# static fields\n" +
+                ".field public static field1:Ljava/lang/reflect/Field; = someField:I\n" +
+                ".field public static field2:Ljava/lang/reflect/Field; = V:I\n" +
+                ".field public static field3:Ljava/lang/reflect/Field; = I:I\n";
+
+        BaksmaliOptions options = new BaksmaliOptions();
+        options.implicitReferences = true;
+
+        BaksmaliTestUtils.assertSmaliCompiledEquals(source, expected, options);
+    }
+
+    @Test
+    public void testExplicitFieldLiterals() throws IOException, RecognitionException {
+        String source = "" +
+                ".class public LHelloWorld;\n" +
+                ".super Ljava/lang/Object;\n" +
+                ".field public static field1:Ljava/lang/reflect/Field; = LHelloWorld;->someField:I\n" +
+                ".field public static field2:Ljava/lang/reflect/Field; = LHelloWorld;->V:I\n" +
+                ".field public static field3:Ljava/lang/reflect/Field; = LHelloWorld;->I:I";
+
+        String expected = "" +
+                ".class public LHelloWorld;\n" +
+                ".super Ljava/lang/Object;\n" +
+                "# static fields\n" +
+                ".field public static field1:Ljava/lang/reflect/Field; = LHelloWorld;->someField:I\n" +
+                ".field public static field2:Ljava/lang/reflect/Field; = LHelloWorld;->V:I\n" +
+                ".field public static field3:Ljava/lang/reflect/Field; = LHelloWorld;->I:I\n";
+
+        BaksmaliOptions options = new BaksmaliOptions();
+        options.implicitReferences = false;
+
+        BaksmaliTestUtils.assertSmaliCompiledEquals(source, expected, options);
+    }
+
+}
diff --git a/baksmali/src/test/java/org/jf/baksmali/InstructionMethodItemTest.java b/baksmali/src/test/java/org/jf/baksmali/InstructionMethodItemTest.java
new file mode 100644
index 0000000..20a3803
--- /dev/null
+++ b/baksmali/src/test/java/org/jf/baksmali/InstructionMethodItemTest.java
@@ -0,0 +1,281 @@
+/*
+ * Copyright 2019, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import org.jf.baksmali.Adaptors.ClassDefinition;
+import org.jf.baksmali.Adaptors.Format.InstructionMethodItem;
+import org.jf.baksmali.Adaptors.MethodDefinition;
+import org.jf.baksmali.Adaptors.RegisterFormatter;
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.HiddenApiRestriction;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.ReferenceType;
+import org.jf.dexlib2.base.reference.BaseMethodReference;
+import org.jf.dexlib2.base.reference.BaseStringReference;
+import org.jf.dexlib2.base.reference.BaseTypeReference;
+import org.jf.dexlib2.iface.*;
+import org.jf.dexlib2.iface.debug.DebugItem;
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction21c;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.util.IndentingWriter;
+import org.junit.Assert;
+import org.junit.Test;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.List;
+import java.util.Set;
+
+public class InstructionMethodItemTest {
+
+    @Test
+    public void testInvalidReference() throws IOException {
+
+        Instruction21c instruction = new Instruction21c() {
+            @Override
+            public int getRegisterA() {
+                return 0;
+            }
+
+            @Nonnull
+            @Override
+            public Reference getReference() {
+                return new BaseStringReference() {
+                    @Override
+                    public void validateReference() throws InvalidReferenceException {
+                        throw new InvalidReferenceException("blahblahblah");
+                    }
+
+                    @Nonnull
+                    @Override
+                    public String getString() {
+                        throw new RuntimeException("invalid reference");
+                    }
+                };
+            }
+
+            @Override
+            public int getReferenceType() {
+                return ReferenceType.STRING;
+            }
+
+            @Override
+            public Opcode getOpcode() {
+                return Opcode.CONST_STRING;
+            }
+
+            @Override
+            public int getCodeUnits() {
+                return Format.Format21c.size / 2;
+            }
+        };
+
+
+        MethodImplementation methodImplementation = new MethodImplementation() {
+            @Override
+            public int getRegisterCount() {
+                return 1;
+            }
+
+            @Nonnull
+            @Override
+            public Iterable<? extends Instruction> getInstructions() {
+                return ImmutableList.of(instruction);
+            }
+
+            @Nonnull
+            @Override
+            public List<? extends TryBlock<? extends ExceptionHandler>> getTryBlocks() {
+                return ImmutableList.of();
+            }
+
+            @Nonnull
+            @Override
+            public Iterable<? extends DebugItem> getDebugItems() {
+                return ImmutableList.of();
+            }
+        };
+
+        Method method = new TestMethod(methodImplementation);
+
+        ClassDefinition classDefinition = new ClassDefinition(
+                new BaksmaliOptions(), new TestClassDef());
+
+        MethodDefinition methodDefinition = new MethodDefinition(classDefinition, method, methodImplementation);
+        methodDefinition.registerFormatter = new RegisterFormatter(new BaksmaliOptions(), 1, 0);
+
+        InstructionMethodItem methodItem = new InstructionMethodItem<Instruction21c>(methodDefinition, 0, instruction);
+
+        StringWriter stringWriter = new StringWriter();
+        IndentingWriter indentingWriter = new IndentingWriter(stringWriter);
+        methodItem.writeTo(indentingWriter);
+
+        Assert.assertEquals("#Invalid reference\n#const-string v0, blahblahblah\nnop", stringWriter.toString());
+    }
+
+    private static class TestMethod extends BaseMethodReference implements Method {
+        private final MethodImplementation methodImplementation;
+
+        public TestMethod(MethodImplementation methodImplementation) {
+            this.methodImplementation = methodImplementation;
+        }
+
+        @Nonnull
+        @Override
+        public List<? extends MethodParameter> getParameters() {
+            return ImmutableList.of();
+        }
+
+        @Override
+        public int getAccessFlags() {
+            return 0;
+        }
+
+        @Nonnull
+        @Override
+        public Set<? extends Annotation> getAnnotations() {
+            return ImmutableSet.of();
+        }
+
+        @Nullable
+        @Override
+        public MethodImplementation getImplementation() {
+            return methodImplementation;
+        }
+
+        @Nonnull
+        @Override
+        public String getDefiningClass() {
+            return "Ltest;";
+        }
+
+        @Nonnull
+        @Override
+        public String getName() {
+            return "test";
+        }
+
+        @Nonnull
+        @Override
+        public List<? extends CharSequence> getParameterTypes() {
+            return ImmutableList.of();
+        }
+
+        @Nonnull
+        @Override
+        public String getReturnType() {
+            return "V";
+        }
+
+        @Nonnull @Override public Set<HiddenApiRestriction> getHiddenApiRestrictions() {
+            return ImmutableSet.of();
+        }
+    }
+
+    private static class TestClassDef extends BaseTypeReference implements ClassDef {
+        @Override
+        public int getAccessFlags() {
+            return 0;
+        }
+
+        @Nullable
+        @Override
+        public String getSuperclass() {
+            return "Ljava/lang/Object;";
+        }
+
+        @Nonnull
+        @Override
+        public List<String> getInterfaces() {
+            return ImmutableList.of();
+        }
+
+        @Nullable
+        @Override
+        public String getSourceFile() {
+            return null;
+        }
+
+        @Nonnull
+        @Override
+        public Set<? extends Annotation> getAnnotations() {
+            return ImmutableSet.of();
+        }
+
+        @Nonnull
+        @Override
+        public Iterable<? extends Field> getStaticFields() {
+            return ImmutableList.of();
+        }
+
+        @Nonnull
+        @Override
+        public Iterable<? extends Field> getInstanceFields() {
+            return ImmutableList.of();
+        }
+
+        @Nonnull
+        @Override
+        public Iterable<? extends Field> getFields() {
+            return ImmutableList.of();
+        }
+
+        @Nonnull
+        @Override
+        public Iterable<? extends Method> getDirectMethods() {
+            return ImmutableList.of();
+        }
+
+        @Nonnull
+        @Override
+        public Iterable<? extends Method> getVirtualMethods() {
+            return ImmutableList.of();
+        }
+
+        @Nonnull
+        @Override
+        public Iterable<? extends Method> getMethods() {
+            return ImmutableList.of();
+        }
+
+        @Nonnull
+        @Override
+        public String getType() {
+            return "Ltest;";
+        }
+    }
+}
diff --git a/baksmali/src/test/java/org/jf/baksmali/InstructionRoundtripTest.java b/baksmali/src/test/java/org/jf/baksmali/InstructionRoundtripTest.java
new file mode 100644
index 0000000..780631b
--- /dev/null
+++ b/baksmali/src/test/java/org/jf/baksmali/InstructionRoundtripTest.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import org.junit.Test;
+
+public class InstructionRoundtripTest extends IdenticalRoundtripTest {
+    @Test
+    public void testConstMethodHandle() {
+        BaksmaliOptions options = new BaksmaliOptions();
+        options.apiLevel = 28;
+        runTest("ConstMethodHandle", options);
+    }
+
+    @Test
+    public void testConstMethodType() {
+        BaksmaliOptions options = new BaksmaliOptions();
+        options.apiLevel = 28;
+        runTest("ConstMethodType", options);
+    }
+}
diff --git a/baksmali/src/test/java/org/jf/baksmali/InterfaceOrderTest.java b/baksmali/src/test/java/org/jf/baksmali/InterfaceOrderTest.java
new file mode 100644
index 0000000..f1ade1e
--- /dev/null
+++ b/baksmali/src/test/java/org/jf/baksmali/InterfaceOrderTest.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import org.junit.Test;
+
+public class InterfaceOrderTest extends IdenticalRoundtripTest {
+    @Test
+    public void testInterfaceOrder() {
+        runTest("InterfaceOrder", new BaksmaliOptions());
+    }
+}
diff --git a/baksmali/src/test/java/org/jf/baksmali/InvokeCustomTest.java b/baksmali/src/test/java/org/jf/baksmali/InvokeCustomTest.java
new file mode 100644
index 0000000..35f1482
--- /dev/null
+++ b/baksmali/src/test/java/org/jf/baksmali/InvokeCustomTest.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import org.junit.Test;
+
+public class InvokeCustomTest extends IdenticalRoundtripTest {
+    @Test
+    public void testInvokeCustom() {
+        BaksmaliOptions options = new BaksmaliOptions();
+        options.apiLevel = 26;
+        runTest("InvokeCustom", options);
+    }
+}
diff --git a/baksmali/src/test/java/org/jf/baksmali/LargeLocalTest.java b/baksmali/src/test/java/org/jf/baksmali/LargeLocalTest.java
new file mode 100644
index 0000000..28def63
--- /dev/null
+++ b/baksmali/src/test/java/org/jf/baksmali/LargeLocalTest.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import org.junit.Test;
+
+/**
+ * Test for a bug related to debug items that refer to a register that's outside the expected range for a method
+ */
+public class LargeLocalTest extends IdenticalRoundtripTest {
+    @Test
+    public void testLargeEndLocal() {
+        runTest("LargeEndLocal");
+    }
+
+    @Test
+    public void testLargeRestartLocal() {
+        runTest("LargeRestartLocal");
+    }
+
+    @Test
+    public void testLargeStartLocal() {
+        runTest("LargeStartLocal");
+    }
+}
diff --git a/baksmali/src/test/java/org/jf/baksmali/ManyRegistersTest.java b/baksmali/src/test/java/org/jf/baksmali/ManyRegistersTest.java
new file mode 100644
index 0000000..5a26716
--- /dev/null
+++ b/baksmali/src/test/java/org/jf/baksmali/ManyRegistersTest.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import org.junit.Test;
+
+public class ManyRegistersTest extends IdenticalRoundtripTest {
+
+    @Test
+    public void testManyRegisters() {
+        runTest("ManyRegisters");
+    }
+}
diff --git a/baksmali/src/test/java/org/jf/baksmali/MultiSwitchTest.java b/baksmali/src/test/java/org/jf/baksmali/MultiSwitchTest.java
new file mode 100644
index 0000000..cb29402
--- /dev/null
+++ b/baksmali/src/test/java/org/jf/baksmali/MultiSwitchTest.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import org.junit.Test;
+
+public class MultiSwitchTest extends DisassemblyTest {
+
+    @Test
+    public void testMultiSwitch() {
+        runTest("MultiSwitch");
+    }
+}
diff --git a/baksmali/src/test/java/org/jf/baksmali/ParamListMethodNameTest.java b/baksmali/src/test/java/org/jf/baksmali/ParamListMethodNameTest.java
new file mode 100644
index 0000000..42f7239
--- /dev/null
+++ b/baksmali/src/test/java/org/jf/baksmali/ParamListMethodNameTest.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import org.junit.Test;
+
+public class ParamListMethodNameTest extends IdenticalRoundtripTest {
+
+    @Test
+    public void testParamListMethodName() {
+        runTest("ParamListMethodName");
+    }
+}
diff --git a/baksmali/src/test/java/org/jf/baksmali/RoundtripTest.java b/baksmali/src/test/java/org/jf/baksmali/RoundtripTest.java
new file mode 100644
index 0000000..81e98a3
--- /dev/null
+++ b/baksmali/src/test/java/org/jf/baksmali/RoundtripTest.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import org.antlr.runtime.RecognitionException;
+import org.junit.Assert;
+
+import javax.annotation.Nonnull;
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * A base test class for performing a roundtrip assembly/disassembly
+ *
+ * The test accepts a smali file as input, performs a smali -> dex -> smali roundtrip, and
+ * verifies that the result equals a known-good output smali file.
+ *
+ * By default, the input and output files should be resources at [testDir]/[testName]Input.smali
+ * and [testDir]/[testName]Output.smali respectively
+ */
+public abstract class RoundtripTest {
+    protected final String testDir;
+
+    protected RoundtripTest(@Nonnull String testDir) {
+        this.testDir = testDir;
+    }
+
+    protected RoundtripTest() {
+        this.testDir = this.getClass().getSimpleName();
+    }
+
+    @Nonnull
+    protected String getInputFilename(@Nonnull String testName) {
+        return String.format("%s%s%sInput.smali", testDir, File.separatorChar, testName);
+    }
+
+    @Nonnull
+    protected String getOutputFilename(@Nonnull String testName) {
+        return String.format("%s%s%sOutput.smali", testDir, File.separatorChar, testName);
+    }
+
+    protected void runTest(@Nonnull String testName) {
+        runTest(testName, new BaksmaliOptions());
+    }
+
+    protected void runTest(@Nonnull String testName, @Nonnull BaksmaliOptions options) {
+        try {
+            // Load file from resources as a stream
+            String inputFilename = getInputFilename(testName);
+            String input = BaksmaliTestUtils.readResourceFully(getInputFilename(testName));
+            String output;
+            if (getOutputFilename(testName).equals(inputFilename)) {
+                output = input;
+            } else {
+                output = BaksmaliTestUtils.readResourceFully(getOutputFilename(testName));
+            }
+
+            // Run smali, baksmali, and then compare strings are equal (minus comments/whitespace)
+            BaksmaliTestUtils.assertSmaliCompiledEquals(input, output, options, true);
+        } catch (IOException ex) {
+            Assert.fail();
+        } catch (RecognitionException ex) {
+            Assert.fail();
+        }
+    }
+}
diff --git a/baksmali/src/test/java/org/jf/baksmali/SwitchTest.java b/baksmali/src/test/java/org/jf/baksmali/SwitchTest.java
new file mode 100644
index 0000000..48b64b2
--- /dev/null
+++ b/baksmali/src/test/java/org/jf/baksmali/SwitchTest.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import org.junit.Test;
+
+public class SwitchTest extends RoundtripTest {
+    @Test
+    public void testUnorderedSparseSwitch() {
+        runTest("UnorderedSparseSwitch");
+    }
+}
diff --git a/baksmali/src/test/java/org/jf/baksmali/ZeroArrayPayloadWidthTest.java b/baksmali/src/test/java/org/jf/baksmali/ZeroArrayPayloadWidthTest.java
new file mode 100644
index 0000000..b4e93f4
--- /dev/null
+++ b/baksmali/src/test/java/org/jf/baksmali/ZeroArrayPayloadWidthTest.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2019, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import org.junit.Test;
+
+public class ZeroArrayPayloadWidthTest extends DisassemblyTest {
+
+    @Test
+    public void testZeroArrayPayloadWidthTest() {
+        // This test uses a manually modified dex file with an array-payload instruction that has an element size of 0,
+        // and an element count that doesn't fit in an unsigned int.
+        runTest("ZeroArrayPayloadWidthTest");
+    }
+}
diff --git a/baksmali/src/test/resources/ConstructorTest/ConstructorTest.smali b/baksmali/src/test/resources/ConstructorTest/ConstructorTest.smali
new file mode 100644
index 0000000..88e2eb8
--- /dev/null
+++ b/baksmali/src/test/resources/ConstructorTest/ConstructorTest.smali
@@ -0,0 +1,16 @@
+.class public LConstructorTest;
+.super Ljava/lang/Object;
+
+
+# direct methods
+.method public constructor <init>()V
+    .registers 4
+
+    #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(UninitThis,LConstructorTest;);
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(Reference,LConstructorTest;);
+
+    #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(Reference,LConstructorTest;);
+    return-void
+    #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(Reference,LConstructorTest;);
+.end method
diff --git a/baksmali/src/test/resources/ConstructorTest/ConstructorTest2.smali b/baksmali/src/test/resources/ConstructorTest/ConstructorTest2.smali
new file mode 100644
index 0000000..a376b25
--- /dev/null
+++ b/baksmali/src/test/resources/ConstructorTest/ConstructorTest2.smali
@@ -0,0 +1,25 @@
+.class public LConstructorTest2;
+.super Ljava/lang/Object;
+
+
+# direct methods
+.method public constructor <init>()V
+    .registers 4
+
+    #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(UninitThis,LConstructorTest2;);
+    if-eqz p0, :cond_3
+    #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(UninitThis,LConstructorTest2;);
+
+    #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(UninitThis,LConstructorTest2;);
+    nop
+    #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(UninitThis,LConstructorTest2;);
+
+    :cond_3
+    #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(UninitThis,LConstructorTest2;);
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(Reference,LConstructorTest2;);
+
+    #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(Reference,LConstructorTest2;);
+    return-void
+    #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(Reference,LConstructorTest2;);
+.end method
diff --git a/baksmali/src/test/resources/ConstructorTest/classes.dex b/baksmali/src/test/resources/ConstructorTest/classes.dex
new file mode 100644
index 0000000..ef6e6d9
Binary files /dev/null and b/baksmali/src/test/resources/ConstructorTest/classes.dex differ
diff --git a/baksmali/src/test/resources/DuplicateTest/DuplicateDirectMethods.smali b/baksmali/src/test/resources/DuplicateTest/DuplicateDirectMethods.smali
new file mode 100644
index 0000000..fd43b02
--- /dev/null
+++ b/baksmali/src/test/resources/DuplicateTest/DuplicateDirectMethods.smali
@@ -0,0 +1,29 @@
+.class public LDuplicateDirectMethods;
+.super Ljava/lang/Object;
+
+
+# direct methods
+.method private alah()V
+    .registers 1
+
+    return-void
+.end method
+
+.method private blah()V
+    .registers 1
+
+    return-void
+.end method
+
+# duplicate method ignored
+# .method private blah()V
+#     .registers 1
+
+#     return-void
+# .end method
+
+.method private clah()V
+    .registers 1
+
+    return-void
+.end method
diff --git a/baksmali/src/test/resources/DuplicateTest/DuplicateDirectVirtualMethods.smali b/baksmali/src/test/resources/DuplicateTest/DuplicateDirectVirtualMethods.smali
new file mode 100644
index 0000000..5286573
--- /dev/null
+++ b/baksmali/src/test/resources/DuplicateTest/DuplicateDirectVirtualMethods.smali
@@ -0,0 +1,46 @@
+.class public LDuplicateDirectVirtualMethods;
+.super Ljava/lang/Object;
+
+
+# direct methods
+.method private blah()V
+    .registers 1
+
+    return-void
+.end method
+
+# duplicate method ignored
+# .method private blah()V
+#     .registers 1
+
+#     return-void
+# .end method
+
+
+# virtual methods
+.method public alah()V
+    .registers 1
+
+    return-void
+.end method
+
+# There is both a direct and virtual method with this signature.
+# You will need to rename one of these methods, including all references.
+.method public blah()V
+    .registers 1
+
+    return-void
+.end method
+
+# duplicate method ignored
+# .method public blah()V
+#     .registers 1
+
+#     return-void
+# .end method
+
+.method public clah()V
+    .registers 1
+
+    return-void
+.end method
diff --git a/baksmali/src/test/resources/DuplicateTest/DuplicateInstanceFields.smali b/baksmali/src/test/resources/DuplicateTest/DuplicateInstanceFields.smali
new file mode 100644
index 0000000..6efe9cf
--- /dev/null
+++ b/baksmali/src/test/resources/DuplicateTest/DuplicateInstanceFields.smali
@@ -0,0 +1,13 @@
+.class public LDuplicateInstanceFields;
+.super Ljava/lang/Object;
+
+
+# instance fields
+.field public alah:I
+
+.field public blah:I
+
+# duplicate field ignored
+# .field public blah:I
+
+.field public clah:I
diff --git a/baksmali/src/test/resources/DuplicateTest/DuplicateStaticFields.smali b/baksmali/src/test/resources/DuplicateTest/DuplicateStaticFields.smali
new file mode 100644
index 0000000..b71fbdf
--- /dev/null
+++ b/baksmali/src/test/resources/DuplicateTest/DuplicateStaticFields.smali
@@ -0,0 +1,13 @@
+.class public LDuplicateStaticFields;
+.super Ljava/lang/Object;
+
+
+# static fields
+.field public static alah:I
+
+.field public static blah:I
+
+# duplicate field ignored
+# .field public static blah:I
+
+.field public static clah:I
diff --git a/baksmali/src/test/resources/DuplicateTest/DuplicateStaticInstanceFields.smali b/baksmali/src/test/resources/DuplicateTest/DuplicateStaticInstanceFields.smali
new file mode 100644
index 0000000..9a066b8
--- /dev/null
+++ b/baksmali/src/test/resources/DuplicateTest/DuplicateStaticInstanceFields.smali
@@ -0,0 +1,22 @@
+.class public LDuplicateStaticInstanceFields;
+.super Ljava/lang/Object;
+
+
+# static fields
+.field public static blah:I
+
+# duplicate field ignored
+# .field public static blah:I
+
+
+# instance fields
+.field public alah:I
+
+# There is both a static and instance field with this signature.
+# You will need to rename one of these fields, including all references.
+.field public blah:I
+
+# duplicate field ignored
+# .field public blah:I
+
+.field public clah:I
diff --git a/baksmali/src/test/resources/DuplicateTest/DuplicateVirtualMethods.smali b/baksmali/src/test/resources/DuplicateTest/DuplicateVirtualMethods.smali
new file mode 100644
index 0000000..3c08002
--- /dev/null
+++ b/baksmali/src/test/resources/DuplicateTest/DuplicateVirtualMethods.smali
@@ -0,0 +1,29 @@
+.class public LDuplicateVirtualMethods;
+.super Ljava/lang/Object;
+
+
+# virtual methods
+.method public alah()V
+    .registers 1
+
+    return-void
+.end method
+
+.method public blah()V
+    .registers 1
+
+    return-void
+.end method
+
+# duplicate method ignored
+# .method public blah()V
+#     .registers 1
+
+#     return-void
+# .end method
+
+.method public clah()V
+    .registers 1
+
+    return-void
+.end method
diff --git a/baksmali/src/test/resources/DuplicateTest/classes.dex b/baksmali/src/test/resources/DuplicateTest/classes.dex
new file mode 100644
index 0000000..6876944
Binary files /dev/null and b/baksmali/src/test/resources/DuplicateTest/classes.dex differ
diff --git a/baksmali/src/test/resources/DuplicateTest/src/DuplicateDirectMethods.smali b/baksmali/src/test/resources/DuplicateTest/src/DuplicateDirectMethods.smali
new file mode 100644
index 0000000..efb7abb
--- /dev/null
+++ b/baksmali/src/test/resources/DuplicateTest/src/DuplicateDirectMethods.smali
@@ -0,0 +1,22 @@
+.class public LDuplicateDirectMethods;
+.super Ljava/lang/Object;
+
+.method private alah()V
+    .registers 1
+    return-void
+.end method
+
+.method private blah()V
+    .registers 1
+    return-void
+.end method
+
+.method private blah()V
+    .registers 1
+    return-void
+.end method
+
+.method private clah()V
+    .registers 1
+    return-void
+.end method
\ No newline at end of file
diff --git a/baksmali/src/test/resources/DuplicateTest/src/DuplicateDirectVirtualMethods.smali b/baksmali/src/test/resources/DuplicateTest/src/DuplicateDirectVirtualMethods.smali
new file mode 100644
index 0000000..09d97b5
--- /dev/null
+++ b/baksmali/src/test/resources/DuplicateTest/src/DuplicateDirectVirtualMethods.smali
@@ -0,0 +1,32 @@
+.class public LDuplicateDirectVirtualMethods;
+.super Ljava/lang/Object;
+
+.method public alah()V
+    .registers 1
+    return-void
+.end method
+
+.method private blah()V
+    .registers 1
+    return-void
+.end method
+
+.method private blah()V
+    .registers 1
+    return-void
+.end method
+
+.method public blah()V
+    .registers 1
+    return-void
+.end method
+
+.method public blah()V
+    .registers 1
+    return-void
+.end method
+
+.method public clah()V
+    .registers 1
+    return-void
+.end method
\ No newline at end of file
diff --git a/baksmali/src/test/resources/DuplicateTest/src/DuplicateInstanceFields.smali b/baksmali/src/test/resources/DuplicateTest/src/DuplicateInstanceFields.smali
new file mode 100644
index 0000000..1b92cd7
--- /dev/null
+++ b/baksmali/src/test/resources/DuplicateTest/src/DuplicateInstanceFields.smali
@@ -0,0 +1,9 @@
+.class public LDuplicateInstanceFields;
+.super Ljava/lang/Object;
+
+.field public alah:I
+
+.field public blah:I
+.field public blah:I
+
+.field public clah:I
\ No newline at end of file
diff --git a/baksmali/src/test/resources/DuplicateTest/src/DuplicateStaticFields.smali b/baksmali/src/test/resources/DuplicateTest/src/DuplicateStaticFields.smali
new file mode 100644
index 0000000..3c01ba9
--- /dev/null
+++ b/baksmali/src/test/resources/DuplicateTest/src/DuplicateStaticFields.smali
@@ -0,0 +1,9 @@
+.class public LDuplicateStaticFields;
+.super Ljava/lang/Object;
+
+.field public static alah:I
+
+.field public static blah:I
+.field public static blah:I
+
+.field public static clah:I
\ No newline at end of file
diff --git a/baksmali/src/test/resources/DuplicateTest/src/DuplicateStaticInstanceFields.smali b/baksmali/src/test/resources/DuplicateTest/src/DuplicateStaticInstanceFields.smali
new file mode 100644
index 0000000..30a1fe6
--- /dev/null
+++ b/baksmali/src/test/resources/DuplicateTest/src/DuplicateStaticInstanceFields.smali
@@ -0,0 +1,11 @@
+.class public LDuplicateStaticInstanceFields;
+.super Ljava/lang/Object;
+
+.field public alah:I
+
+.field public blah:I
+.field public blah:I
+.field static public blah:I
+.field static public blah:I
+
+.field public clah:I
\ No newline at end of file
diff --git a/baksmali/src/test/resources/DuplicateTest/src/DuplicateVirtualMethods.smali b/baksmali/src/test/resources/DuplicateTest/src/DuplicateVirtualMethods.smali
new file mode 100644
index 0000000..3a6368e
--- /dev/null
+++ b/baksmali/src/test/resources/DuplicateTest/src/DuplicateVirtualMethods.smali
@@ -0,0 +1,22 @@
+.class public LDuplicateVirtualMethods;
+.super Ljava/lang/Object;
+
+.method public alah()V
+    .registers 1
+    return-void
+.end method
+
+.method public blah()V
+    .registers 1
+    return-void
+.end method
+
+.method public blah()V
+    .registers 1
+    return-void
+.end method
+
+.method public clah()V
+    .registers 1
+    return-void
+.end method
\ No newline at end of file
diff --git a/baksmali/src/test/resources/DuplicateTest/src/README b/baksmali/src/test/resources/DuplicateTest/src/README
new file mode 100644
index 0000000..fae5c5a
--- /dev/null
+++ b/baksmali/src/test/resources/DuplicateTest/src/README
@@ -0,0 +1,3 @@
+The test dex file was produced from these smali files, using
+an old version of smali that doesn't check for field/method
+duplicates
\ No newline at end of file
diff --git a/baksmali/src/test/resources/FieldGapOrderTest/FieldGapOrderInput.dex b/baksmali/src/test/resources/FieldGapOrderTest/FieldGapOrderInput.dex
new file mode 100644
index 0000000..4e59351
Binary files /dev/null and b/baksmali/src/test/resources/FieldGapOrderTest/FieldGapOrderInput.dex differ
diff --git a/baksmali/src/test/resources/HiddenApiRestrictionsRoundtripTest/HiddenApiRestrictionsInput.smali b/baksmali/src/test/resources/HiddenApiRestrictionsRoundtripTest/HiddenApiRestrictionsInput.smali
new file mode 100644
index 0000000..d07e541
--- /dev/null
+++ b/baksmali/src/test/resources/HiddenApiRestrictionsRoundtripTest/HiddenApiRestrictionsInput.smali
@@ -0,0 +1,30 @@
+.class public LHiddenApiRestrictions;
+.super Ljava/lang/Object;
+
+
+.field public static whitelist staticField:I
+
+.field public core-platform-api domainSpecificFlagTest:I
+
+.field public blacklist instanceField:I
+
+.method public blacklist virtualMethod()V
+    .registers 1
+    return-void
+.end method
+
+.method private greylist-max-o directMethod()V
+    .registers 1
+    return-void
+.end method
+
+.method private core-platform-api corePlatformApiTest()V
+    .registers 1
+    return-void
+.end method
+
+.method greylist-max-q private core-platform-api corePlatformApiAndHiddenApiTest()V
+    .registers 1
+    return-void
+.end method
+
diff --git a/baksmali/src/test/resources/HiddenApiRestrictionsRoundtripTest/HiddenApiRestrictionsOutput.smali b/baksmali/src/test/resources/HiddenApiRestrictionsRoundtripTest/HiddenApiRestrictionsOutput.smali
new file mode 100644
index 0000000..d2bc1b3
--- /dev/null
+++ b/baksmali/src/test/resources/HiddenApiRestrictionsRoundtripTest/HiddenApiRestrictionsOutput.smali
@@ -0,0 +1,40 @@
+.class public LHiddenApiRestrictions;
+.super Ljava/lang/Object;
+
+
+# static fields
+.field public static whitelist staticField:I
+
+
+# instance fields
+.field public whitelist core-platform-api domainSpecificFlagTest:I
+
+.field public blacklist instanceField:I
+
+
+# direct methods
+.method private greylist-max-q core-platform-api corePlatformApiAndHiddenApiTest()V
+    .registers 1
+
+    return-void
+.end method
+
+.method private whitelist core-platform-api corePlatformApiTest()V
+    .registers 1
+
+    return-void
+.end method
+
+.method private greylist-max-o directMethod()V
+    .registers 1
+
+    return-void
+.end method
+
+
+# virtual methods
+.method public blacklist virtualMethod()V
+    .registers 1
+
+    return-void
+.end method
diff --git a/baksmali/src/test/resources/InstanceOfTest/InstanceOfTest.smali b/baksmali/src/test/resources/InstanceOfTest/InstanceOfTest.smali
new file mode 100644
index 0000000..8e3337a
--- /dev/null
+++ b/baksmali/src/test/resources/InstanceOfTest/InstanceOfTest.smali
@@ -0,0 +1,118 @@
+.class public LInstanceOfTest;
+.super Ljava/lang/Object;
+
+
+# virtual methods
+.method public testInstanceOfEqz(Ljava/lang/Object;)I
+    .registers 3
+
+    #v0=(Uninit);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;);
+    instance-of v0, p1, Ljava/lang/String;
+    #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;);
+
+    #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;);
+    if-eqz v0, :cond_9
+    #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Unknown);
+
+    #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;);
+    invoke-virtual {p1}, Ljava/lang/String;->length()I
+    #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;);
+
+    #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;);
+    move-result v0
+    #v0=(Integer);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;);
+
+    #v0=(Integer);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;);
+    return v0
+    #v0=(Integer);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;);
+
+    :cond_9
+    #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;);
+    const v0, -0x1
+    #v0=(Byte);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;);
+
+    #v0=(Byte);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;);
+    return v0
+    #v0=(Byte);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;);
+.end method
+
+.method public testInstanceOfNez(Ljava/lang/Object;)I
+    .registers 3
+
+    #v0=(Uninit);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;);
+    instance-of v0, p1, Ljava/lang/String;
+    #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;);
+
+    #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;);
+    if-nez v0, :cond_8
+    #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Unknown);
+
+    #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;);
+    const v0, -0x1
+    #v0=(Byte);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;);
+
+    #v0=(Byte);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;);
+    return v0
+    #v0=(Byte);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;);
+
+    :cond_8
+    #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;);
+    invoke-virtual {p1}, Ljava/lang/String;->length()I
+    #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;);
+
+    #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;);
+    move-result v0
+    #v0=(Integer);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;);
+
+    #v0=(Integer);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;);
+    return v0
+    #v0=(Integer);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;);
+.end method
+
+.method public testRegisterAlias(Ljava/lang/Object;)I
+    .registers 4
+
+    #v0=(Uninit);v1=(Uninit);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;);
+    move-object p0, p1
+    #v0=(Uninit);v1=(Uninit);p0=(Reference,Ljava/lang/Object;);p1=(Reference,Ljava/lang/Object;);
+
+    #v0=(Uninit);v1=(Uninit);p0=(Reference,Ljava/lang/Object;);p1=(Reference,Ljava/lang/Object;);
+    instance-of v0, p0, Ljava/lang/String;
+    #v0=(Boolean);v1=(Uninit);p0=(Reference,Ljava/lang/Object;);p1=(Reference,Ljava/lang/Object;);
+
+    #v0=(Boolean);v1=(Uninit);p0=(Reference,Ljava/lang/Object;);p1=(Reference,Ljava/lang/Object;);
+    if-eqz v0, :cond_f
+    #v0=(Boolean);v1=(Uninit);p0=(Unknown);p1=(Unknown);
+
+    :cond_5
+    #v0=(Integer):merge{0x3:(Boolean),0xc:(Integer)}
+    #v1=(Conflicted):merge{0x3:(Uninit),0xc:(Null)}
+    #p0=(Reference,Ljava/lang/String;);p1=(Reference,Ljava/lang/String;);
+    invoke-virtual {p1}, Ljava/lang/String;->length()I
+    #v0=(Integer);v1=(Conflicted);p0=(Reference,Ljava/lang/String;);p1=(Reference,Ljava/lang/String;);
+
+    #v0=(Integer);v1=(Conflicted);p0=(Reference,Ljava/lang/String;);p1=(Reference,Ljava/lang/String;);
+    move-result v0
+    #v0=(Integer);v1=(Conflicted);p0=(Reference,Ljava/lang/String;);p1=(Reference,Ljava/lang/String;);
+
+    #v0=(Integer);v1=(Conflicted);p0=(Reference,Ljava/lang/String;);p1=(Reference,Ljava/lang/String;);
+    const v1, 0x0
+    #v0=(Integer);v1=(Null);p0=(Reference,Ljava/lang/String;);p1=(Reference,Ljava/lang/String;);
+
+    #v0=(Integer);v1=(Null);p0=(Reference,Ljava/lang/String;);p1=(Reference,Ljava/lang/String;);
+    if-le v0, v1, :cond_5
+    #v0=(Integer);v1=(Null);p0=(Reference,Ljava/lang/String;);p1=(Reference,Ljava/lang/String;);
+
+    #v0=(Integer);v1=(Null);p0=(Reference,Ljava/lang/String;);p1=(Reference,Ljava/lang/String;);
+    return v0
+    #v0=(Integer);v1=(Null);p0=(Reference,Ljava/lang/String;);p1=(Reference,Ljava/lang/String;);
+
+    :cond_f
+    #v0=(Boolean);v1=(Uninit);p0=(Reference,Ljava/lang/Object;);p1=(Reference,Ljava/lang/Object;);
+    const v0, -0x1
+    #v0=(Byte);v1=(Uninit);p0=(Reference,Ljava/lang/Object;);p1=(Reference,Ljava/lang/Object;);
+
+    #v0=(Byte);v1=(Uninit);p0=(Reference,Ljava/lang/Object;);p1=(Reference,Ljava/lang/Object;);
+    return v0
+    #v0=(Byte);v1=(Uninit);p0=(Reference,Ljava/lang/Object;);p1=(Reference,Ljava/lang/Object;);
+.end method
diff --git a/baksmali/src/test/resources/InstanceOfTest/classes.dex b/baksmali/src/test/resources/InstanceOfTest/classes.dex
new file mode 100644
index 0000000..571bdb8
Binary files /dev/null and b/baksmali/src/test/resources/InstanceOfTest/classes.dex differ
diff --git a/baksmali/src/test/resources/InstructionRoundtripTest/ConstMethodHandle.smali b/baksmali/src/test/resources/InstructionRoundtripTest/ConstMethodHandle.smali
new file mode 100644
index 0000000..2d87184
--- /dev/null
+++ b/baksmali/src/test/resources/InstructionRoundtripTest/ConstMethodHandle.smali
@@ -0,0 +1,30 @@
+.class LConstMethodHandle;
+.super Ljava/lang/Object;
+
+
+# static fields
+.field public static staticField:Ljava/lang/Object;
+
+
+# instance fields
+.field public instanceField:Ljava/lang/Object;
+
+
+# direct methods
+.method public static constMethodHandle()V
+    .registers 15
+
+    const-method-handle v0, invoke-static@Ljava/lang/Integer;->toString(I)Ljava/lang/String;
+
+    const-method-handle v0, invoke-instance@Ljava/lang/Integer;->toString()Ljava/lang/String;
+
+    const-method-handle v0, static-put@LConstMethodHandle;->instanceField:Ljava/lang/Object;
+
+    const-method-handle v0, static-put@LConstMethodHandle;->instanceField:Ljava/lang/Object;
+
+    const-method-handle v0, static-put@LConstMethodHandle;->staticField:Ljava/lang/Object;
+
+    const-method-handle v0, static-put@LConstMethodHandle;->staticField:Ljava/lang/Object;
+
+    return-void
+.end method
diff --git a/baksmali/src/test/resources/InstructionRoundtripTest/ConstMethodType.smali b/baksmali/src/test/resources/InstructionRoundtripTest/ConstMethodType.smali
new file mode 100644
index 0000000..17f2889
--- /dev/null
+++ b/baksmali/src/test/resources/InstructionRoundtripTest/ConstMethodType.smali
@@ -0,0 +1,24 @@
+.class LConstMethodType;
+.super Ljava/lang/Object;
+
+
+# static fields
+.field public static staticField:Ljava/lang/Object;
+
+
+# instance fields
+.field public instanceField:Ljava/lang/Object;
+
+
+# direct methods
+.method public static constMethodHandle()V
+    .registers 15
+
+    const-method-type v0, ()V
+
+    const-method-type v0, (II)I
+
+    const-method-type v0, (Ljava/lang/String;)Ljava/lang/String;
+
+    return-void
+.end method
diff --git a/baksmali/src/test/resources/InterfaceOrderTest/InterfaceOrder.smali b/baksmali/src/test/resources/InterfaceOrderTest/InterfaceOrder.smali
new file mode 100644
index 0000000..b4745cb
--- /dev/null
+++ b/baksmali/src/test/resources/InterfaceOrderTest/InterfaceOrder.smali
@@ -0,0 +1,37 @@
+.class public LInterfaceOrder;
+.super Ljava/lang/Object;
+
+# Note how these two interfaces are not in alphabetical order
+.implements Ljava/io/Serializable;
+.implements Ljava/util/EventListener;
+.implements Ljava/lang/Runnable;
+.implements Ljava/io/Flushable;
+.implements Ljava/lang/Clonable;
+.implements Ljava/util/Observer;
+.implements Ljava/io/Closeable;
+
+# direct methods
+.method public constructor <init>()V
+    .registers 1
+    return-void
+.end method
+
+.method public close()V
+    .registers 1
+    return-void
+.end method
+
+.method public flush()V
+    .registers 1
+    return-void
+.end method
+
+.method public run()V
+    .registers 1
+    return-void
+.end method
+
+.method public update(Ljava/util/Observable;Ljava/lang/Object;)V
+    .registers 3
+    return-void
+.end method
diff --git a/baksmali/src/test/resources/InvokeCustomTest/InvokeCustom.smali b/baksmali/src/test/resources/InvokeCustomTest/InvokeCustom.smali
new file mode 100644
index 0000000..632acb0
--- /dev/null
+++ b/baksmali/src/test/resources/InvokeCustomTest/InvokeCustom.smali
@@ -0,0 +1,44 @@
+.class LInvokeCustom;
+.super Ljava/lang/Object;
+
+
+# direct methods
+.method public static invokeCustom([Ljava/lang/String;)V
+    .registers 15
+
+    new-instance v0, LCustom;
+
+    invoke-direct {v0}, LCustom;-><init>()V
+
+    const-string v1, "Arg to doSomething"
+
+    invoke-custom {v0, v1}, call_site_1("doSomething", (LCustom;Ljava/lang/String;)Ljava/lang/String;, "just testing")@LBootstrapLinker;->normalLink(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;)Ljava/lang/invoke/CallSite;
+
+    move-result-object v2
+
+    sget-object v3, Ljava/lang/System;->out:Ljava/io/PrintStream;
+
+    const-string v4, "got back - "
+
+    invoke-virtual {v3, v4}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V
+
+    invoke-virtual {v3, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
+
+    invoke-custom {v0, v1}, call_site_0("doSomething", (LCustom;Ljava/lang/String;)Ljava/lang/String;, "just testing")@LBootstrapLinker;->backwardsLink(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;)Ljava/lang/invoke/CallSite;
+
+    move-result-object v2
+
+    sget-object v3, Ljava/lang/System;->out:Ljava/io/PrintStream;
+
+    const-string v4, "got back - "
+
+    invoke-virtual {v3, v4}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V
+
+    invoke-virtual {v3, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
+.end method
+
+.method public static invokeCustomWithMethodHandleArgument([Ljava/lang/String;)V
+    .registers 15
+
+    invoke-custom {v0, v1}, call_site_2("doSomething", (LCustom;Ljava/lang/String;)Ljava/lang/String;, invoke-static@Lnonsense;->somemethod()V)@LBootstrapLinker;->normalLink(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite;
+.end method
diff --git a/baksmali/src/test/resources/LargeLocalTest/LargeEndLocal.smali b/baksmali/src/test/resources/LargeLocalTest/LargeEndLocal.smali
new file mode 100644
index 0000000..8c7e72c
--- /dev/null
+++ b/baksmali/src/test/resources/LargeLocalTest/LargeEndLocal.smali
@@ -0,0 +1,11 @@
+.class LLargeRestartLocal;
+.super Ljava/lang/Object;
+
+
+# virtual methods
+.method public static main([Ljava/lang/String;)V
+    .registers 2
+
+    .end local p99
+    return-void
+.end method
diff --git a/baksmali/src/test/resources/LargeLocalTest/LargeRestartLocal.smali b/baksmali/src/test/resources/LargeLocalTest/LargeRestartLocal.smali
new file mode 100644
index 0000000..41c60d0
--- /dev/null
+++ b/baksmali/src/test/resources/LargeLocalTest/LargeRestartLocal.smali
@@ -0,0 +1,11 @@
+.class LLargeEndLocal;
+.super Ljava/lang/Object;
+
+
+# virtual methods
+.method public static main([Ljava/lang/String;)V
+    .registers 2
+
+    .restart local p99
+    return-void
+.end method
diff --git a/baksmali/src/test/resources/LargeLocalTest/LargeStartLocal.smali b/baksmali/src/test/resources/LargeLocalTest/LargeStartLocal.smali
new file mode 100644
index 0000000..b811844
--- /dev/null
+++ b/baksmali/src/test/resources/LargeLocalTest/LargeStartLocal.smali
@@ -0,0 +1,11 @@
+.class LLargeStartLocal;
+.super Ljava/lang/Object;
+
+
+# virtual methods
+.method public static main([Ljava/lang/String;)V
+    .registers 2
+
+    .local p99, "blah":I
+    return-void
+.end method
diff --git a/baksmali/src/test/resources/LocalTest/LocalTest.smali b/baksmali/src/test/resources/LocalTest/LocalTest.smali
new file mode 100644
index 0000000..fe6d1ad
--- /dev/null
+++ b/baksmali/src/test/resources/LocalTest/LocalTest.smali
@@ -0,0 +1,31 @@
+.class public LLocalTest;
+.super Ljava/lang/Object;
+
+
+# direct methods
+.method public static method1()V
+    .registers 10
+
+    .local v0, "blah! This local name has some spaces, a colon, even a \nnewline!":I, "some sig info:\nblah."
+    .local v1, "blah! This local name has some spaces, a colon, even a \nnewline!":V, "some sig info:\nblah."
+    .local v2, "blah! This local name has some spaces, a colon, even a \nnewline!":I
+    .local v3, "blah! This local name has some spaces, a colon, even a \nnewline!":V
+    .local v4, null:I, "some sig info:\nblah."
+    .local v5, null:V, "some sig info:\nblah."
+    .local v6, null:I
+    .local v7
+    .local v8
+    .local v9
+    return-void
+.end method
+
+.method public static method2(IJLjava/lang/String;)V
+    .registers 10
+    .param p0, "blah! This local name has some spaces, a colon, even a \nnewline!"    # I
+    .param p1    # J
+        .annotation runtime LAnnotationWithValues;
+        .end annotation
+    .end param
+
+    return-void
+.end method
diff --git a/baksmali/src/test/resources/LocalTest/classes.dex b/baksmali/src/test/resources/LocalTest/classes.dex
new file mode 100644
index 0000000..5b6f026
Binary files /dev/null and b/baksmali/src/test/resources/LocalTest/classes.dex differ
diff --git a/baksmali/src/test/resources/ManyRegistersTest/ManyRegisters.smali b/baksmali/src/test/resources/ManyRegistersTest/ManyRegisters.smali
new file mode 100644
index 0000000..7f7c7bb
--- /dev/null
+++ b/baksmali/src/test/resources/ManyRegistersTest/ManyRegisters.smali
@@ -0,0 +1,7 @@
+.class LManyRegisters;
+.super Ljava/lang/Object;
+
+.method public manyRegisters()V
+    .registers 65535
+    return-void
+.end method
\ No newline at end of file
diff --git a/baksmali/src/test/resources/MultiSwitchTest/MultiSwitchInput.dex b/baksmali/src/test/resources/MultiSwitchTest/MultiSwitchInput.dex
new file mode 100644
index 0000000..6ef3d34
Binary files /dev/null and b/baksmali/src/test/resources/MultiSwitchTest/MultiSwitchInput.dex differ
diff --git a/baksmali/src/test/resources/MultiSwitchTest/MultiSwitchInput.smali b/baksmali/src/test/resources/MultiSwitchTest/MultiSwitchInput.smali
new file mode 100644
index 0000000..b4fd27d
--- /dev/null
+++ b/baksmali/src/test/resources/MultiSwitchTest/MultiSwitchInput.smali
@@ -0,0 +1,72 @@
+.class public LMultiSwitch;
+.super Ljava/lang/Object;
+.source "Format31t.smali"
+
+.method public multi-packed-switch()V
+    .registers 1
+    const p0, 0xc
+    packed-switch p0, :pswitch_data_12
+    goto :goto_b
+    :pswitch_7
+    return-void
+    :pswitch_8
+    return-void
+    :pswitch_9
+    return-void
+    :pswitch_a
+    return-void
+    :goto_b
+    packed-switch p0, :pswitch_data_12
+        nop
+    return-void
+    :pswitch_f
+    return-void
+    :pswitch_10
+    return-void
+    :pswitch_11
+    return-void
+    :pswitch_12
+    :pswitch_data_12
+    .packed-switch 0xa
+    :pswitch_7
+    :pswitch_8
+    :pswitch_9
+    :pswitch_a
+    .end packed-switch
+
+.end method
+
+.method public multi-sparse-switch()V
+    .registers 1
+    const p0, 0xd
+    sparse-switch p0, :sswitch_data_12
+    goto :goto_b
+    :sswitch_7
+    return-void
+    :sswitch_8
+    return-void
+    :sswitch_9
+    return-void
+    :sswitch_a
+    return-void
+    :goto_b
+    sparse-switch p0, :sswitch_data_12
+    nop
+    return-void
+    :sswitch_f
+    return-void
+    :sswitch_10
+    return-void
+    :sswitch_11
+    return-void
+
+    :sswitch_12
+
+    :sswitch_data_12
+    .sparse-switch
+        0xa -> :sswitch_7
+        0xf -> :sswitch_9
+        0x14 -> :sswitch_8
+        0x63 -> :sswitch_a
+    .end sparse-switch
+.end method
\ No newline at end of file
diff --git a/baksmali/src/test/resources/MultiSwitchTest/MultiSwitchOutput.smali b/baksmali/src/test/resources/MultiSwitchTest/MultiSwitchOutput.smali
new file mode 100644
index 0000000..f3aeeed
--- /dev/null
+++ b/baksmali/src/test/resources/MultiSwitchTest/MultiSwitchOutput.smali
@@ -0,0 +1,119 @@
+.class public LMultiSwitch;
+.super Ljava/lang/Object;
+.source "Format31t.smali"
+
+
+# virtual methods
+.method public multi-packed-switch()V
+    .registers 1
+
+    const p0, 0xc
+
+    packed-switch p0, :pswitch_data_14
+
+    goto :goto_b
+
+    :pswitch_7
+    return-void
+
+    :pswitch_8
+    return-void
+
+    :pswitch_9
+    return-void
+
+    :pswitch_a
+    return-void
+
+    :goto_b
+    packed-switch p0, :pswitch_data_20
+
+    nop
+
+    :pswitch_f
+    return-void
+
+    :pswitch_10
+    return-void
+
+    :pswitch_11
+    return-void
+
+    :pswitch_12
+    return-void
+
+    nop
+
+    :pswitch_data_14
+    .packed-switch 0xa
+        :pswitch_7
+        :pswitch_8
+        :pswitch_9
+        :pswitch_a
+    .end packed-switch
+
+    :pswitch_data_20
+    .packed-switch 0xa
+        :pswitch_f
+        :pswitch_10
+        :pswitch_11
+        :pswitch_12
+    .end packed-switch
+.end method
+
+.method public multi-sparse-switch()V
+    .registers 1
+
+    const p0, 0xd
+
+    sparse-switch p0, :sswitch_data_14
+
+    goto :goto_b
+
+    :sswitch_7
+    return-void
+
+    :sswitch_8
+    return-void
+
+    :sswitch_9
+    return-void
+
+    :sswitch_a
+    return-void
+
+    :goto_b
+    sparse-switch p0, :sswitch_data_26
+
+    nop
+
+    :sswitch_f
+    return-void
+
+    :sswitch_10
+    return-void
+
+    :sswitch_11
+    return-void
+
+    :sswitch_12
+    return-void
+
+    nop
+
+    :sswitch_data_14
+    .sparse-switch
+        0xa -> :sswitch_7
+        0xf -> :sswitch_9
+        0x14 -> :sswitch_8
+        0x63 -> :sswitch_a
+    .end sparse-switch
+
+    :sswitch_data_26
+    .sparse-switch
+        0xa -> :sswitch_f
+        0xf -> :sswitch_11
+        0x14 -> :sswitch_10
+        0x63 -> :sswitch_12
+    .end sparse-switch
+.end method
diff --git a/baksmali/src/test/resources/MultipleStartInstructionsTest/MultipleStartInstructionsTest.smali b/baksmali/src/test/resources/MultipleStartInstructionsTest/MultipleStartInstructionsTest.smali
new file mode 100644
index 0000000..e329e6c
--- /dev/null
+++ b/baksmali/src/test/resources/MultipleStartInstructionsTest/MultipleStartInstructionsTest.smali
@@ -0,0 +1,46 @@
+.class public LMultipleStartInstructionsTest;
+.super Ljava/lang/Object;
+
+
+# direct methods
+.method public constructor <init>(Ljava/lang/String;)V
+    .registers 4
+
+    :try_start_0
+    #v0=(Uninit);v1=(Uninit);p0=(UninitThis,LMultipleStartInstructionsTest;);p1=(Reference,Ljava/lang/String;);
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    #v0=(Uninit);v1=(Uninit);p0=(Reference,LMultipleStartInstructionsTest;);p1=(Reference,Ljava/lang/String;);
+
+    #v0=(Uninit);v1=(Uninit);p0=(Reference,LMultipleStartInstructionsTest;);p1=(Reference,Ljava/lang/String;);
+    const-string v0, "blah"
+    #v0=(Reference,Ljava/lang/String;);v1=(Uninit);p0=(Reference,LMultipleStartInstructionsTest;);p1=(Reference,Ljava/lang/String;);
+
+    #v0=(Reference,Ljava/lang/String;);v1=(Uninit);p0=(Reference,LMultipleStartInstructionsTest;);p1=(Reference,Ljava/lang/String;);
+    return-void
+    #v0=(Reference,Ljava/lang/String;);v1=(Uninit);p0=(Reference,LMultipleStartInstructionsTest;);p1=(Reference,Ljava/lang/String;);
+    :try_end_6
+    .catchall {:try_start_0 .. :try_end_6} :catchall_6
+
+    :catchall_6
+    :try_start_6
+    #v0=(Uninit);v1=(Uninit);
+    #p0=(Conflicted):merge{Start:(UninitThis,LMultipleStartInstructionsTest;),0x0:(Reference,LMultipleStartInstructionsTest;)}
+    #p1=(Reference,Ljava/lang/String;);
+    invoke-static {}, LMultipleStartInstructionsTest;->blah()V
+    #v0=(Uninit);v1=(Uninit);p0=(Conflicted);p1=(Reference,Ljava/lang/String;);
+    :try_end_9
+    .catchall {:try_start_6 .. :try_end_9} :catchall_9
+
+    :catchall_9
+    #v0=(Uninit);v1=(Uninit);
+    #p0=(Conflicted):merge{Start:(UninitThis,LMultipleStartInstructionsTest;),0x0:(Reference,LMultipleStartInstructionsTest;),0x6:(Conflicted)}
+    #p1=(Reference,Ljava/lang/String;);
+    return-void
+    #v0=(Uninit);v1=(Uninit);p0=(Conflicted);p1=(Reference,Ljava/lang/String;);
+.end method
+
+.method public static blah()V
+    .registers 0
+
+    return-void
+.end method
diff --git a/baksmali/src/test/resources/MultipleStartInstructionsTest/classes.dex b/baksmali/src/test/resources/MultipleStartInstructionsTest/classes.dex
new file mode 100644
index 0000000..f6876c2
Binary files /dev/null and b/baksmali/src/test/resources/MultipleStartInstructionsTest/classes.dex differ
diff --git a/baksmali/src/test/resources/ParamListMethodNameTest/ParamListMethodName.smali b/baksmali/src/test/resources/ParamListMethodNameTest/ParamListMethodName.smali
new file mode 100644
index 0000000..8571715
--- /dev/null
+++ b/baksmali/src/test/resources/ParamListMethodNameTest/ParamListMethodName.smali
@@ -0,0 +1,5 @@
+.class Lblah;
+.super Ljava/lang/Object;
+
+.method public abstract II()V
+.end method
\ No newline at end of file
diff --git a/baksmali/src/test/resources/RegisterEqualityOnMergeTest/RegisterEqualityOnMerge.smali b/baksmali/src/test/resources/RegisterEqualityOnMergeTest/RegisterEqualityOnMerge.smali
new file mode 100644
index 0000000..b2b9b52
--- /dev/null
+++ b/baksmali/src/test/resources/RegisterEqualityOnMergeTest/RegisterEqualityOnMerge.smali
@@ -0,0 +1,37 @@
+.class public LRegisterEqualityOnMerge;
+.super Ljava/lang/Object;
+
+
+# direct methods
+.method public constructor <init>()V
+    .registers 4
+
+    #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(UninitThis,LRegisterEqualityOnMerge;);
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;);
+
+    #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;);
+    invoke-virtual {p0}, Ljava/lang/Object;->toString()Ljava/lang/String;
+    #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;);
+
+    #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;);
+    move-result-object v0
+    #v0=(Reference,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;);
+
+    #v0=(Reference,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;);
+    if-eqz v0, :cond_d
+    #v0=(Reference,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;);
+
+    #v0=(Reference,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;);
+    invoke-virtual {p0}, Ljava/lang/Object;->toString()Ljava/lang/String;
+    #v0=(Reference,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;);
+
+    #v0=(Reference,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;);
+    move-result-object v0
+    #v0=(Reference,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;);
+
+    :cond_d
+    #v0=(Reference,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;);
+    return-void
+    #v0=(Reference,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LRegisterEqualityOnMerge;);
+.end method
diff --git a/baksmali/src/test/resources/RegisterEqualityOnMergeTest/classes.dex b/baksmali/src/test/resources/RegisterEqualityOnMergeTest/classes.dex
new file mode 100644
index 0000000..424fc20
Binary files /dev/null and b/baksmali/src/test/resources/RegisterEqualityOnMergeTest/classes.dex differ
diff --git a/baksmali/src/test/resources/SwitchTest/UnorderedSparseSwitchInput.smali b/baksmali/src/test/resources/SwitchTest/UnorderedSparseSwitchInput.smali
new file mode 100644
index 0000000..6e3d23d
--- /dev/null
+++ b/baksmali/src/test/resources/SwitchTest/UnorderedSparseSwitchInput.smali
@@ -0,0 +1,35 @@
+.class public LUnorderedSparseSwitch;
+.super Ljava/lang/Object;
+
+.method public static test_sparse-switch()V
+    .registers 1
+
+    const v0, 13
+
+    sparse-switch v0, :SparseSwitch
+
+:Label10
+    return-void
+
+:Label20
+    return-void
+
+:Label15
+    return-void
+
+:Label13
+    return-void
+
+:Label99
+    return-void
+
+# Note: unordered keys
+:SparseSwitch
+    .sparse-switch
+        10 -> :Label10
+        20 -> :Label20
+        15 -> :Label15
+        99 -> :Label99
+        13 -> :Label13
+    .end sparse-switch
+.end method
\ No newline at end of file
diff --git a/baksmali/src/test/resources/SwitchTest/UnorderedSparseSwitchOutput.smali b/baksmali/src/test/resources/SwitchTest/UnorderedSparseSwitchOutput.smali
new file mode 100644
index 0000000..c4c455b
--- /dev/null
+++ b/baksmali/src/test/resources/SwitchTest/UnorderedSparseSwitchOutput.smali
@@ -0,0 +1,28 @@
+.class public LUnorderedSparseSwitch;
+.super Ljava/lang/Object;
+.method public static test_sparse-switch()V
+.registers 1
+const v0, 0xd
+sparse-switch v0, :sswitch_data_c
+:sswitch_6
+return-void
+:sswitch_7
+return-void
+:sswitch_8
+return-void
+:sswitch_9
+return-void
+:sswitch_a
+return-void
+nop
+
+# Note: ordered keys
+:sswitch_data_c
+.sparse-switch
+0xa -> :sswitch_6
+0xd -> :sswitch_9
+0xf -> :sswitch_8
+0x14 -> :sswitch_7
+0x63 -> :sswitch_a
+.end sparse-switch
+.end method
\ No newline at end of file
diff --git a/baksmali/src/test/resources/UninitRefIdentityTest/UninitRefIdentityTest.smali b/baksmali/src/test/resources/UninitRefIdentityTest/UninitRefIdentityTest.smali
new file mode 100644
index 0000000..1970d3b
--- /dev/null
+++ b/baksmali/src/test/resources/UninitRefIdentityTest/UninitRefIdentityTest.smali
@@ -0,0 +1,110 @@
+.class public LUninitRefIdentityTest;
+.super Ljava/lang/Object;
+
+
+# direct methods
+.method public constructor <init>()V
+    .registers 4
+
+    #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(UninitThis,LUninitRefIdentityTest;);
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(Reference,LUninitRefIdentityTest;);
+
+    #v0=(Uninit);v1=(Uninit);v2=(Uninit);p0=(Reference,LUninitRefIdentityTest;);
+    new-instance v0, Ljava/lang/String;
+    #v0=(UninitRef,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LUninitRefIdentityTest;);
+
+    #v0=(UninitRef,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LUninitRefIdentityTest;);
+    if-eqz v0, :cond_9
+    #v0=(UninitRef,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LUninitRefIdentityTest;);
+
+    #v0=(UninitRef,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LUninitRefIdentityTest;);
+    new-instance v0, Ljava/lang/String;
+    #v0=(UninitRef,Ljava/lang/String;);v1=(Uninit);v2=(Uninit);p0=(Reference,LUninitRefIdentityTest;);
+
+    :cond_9
+    #v0=(Conflicted):merge{0x5:(UninitRef,Ljava/lang/String;),0x7:(UninitRef,Ljava/lang/String;)}
+    #v1=(Uninit);v2=(Uninit);p0=(Reference,LUninitRefIdentityTest;);
+    invoke-direct {v0}, Ljava/lang/String;-><init>()V
+    #v0=(Conflicted);v1=(Uninit);v2=(Uninit);p0=(Reference,LUninitRefIdentityTest;);
+
+    #v0=(Conflicted);v1=(Uninit);v2=(Uninit);p0=(Reference,LUninitRefIdentityTest;);
+    return-void
+    #v0=(Conflicted);v1=(Uninit);v2=(Uninit);p0=(Reference,LUninitRefIdentityTest;);
+.end method
+
+.method public constructor <init>(I)V
+    .registers 2
+
+    #p0=(UninitThis,LUninitRefIdentityTest;);p1=(Integer);
+    move-object p1, p0
+    #p0=(UninitThis,LUninitRefIdentityTest;);p1=(UninitThis,LUninitRefIdentityTest;);
+
+    #p0=(UninitThis,LUninitRefIdentityTest;);p1=(UninitThis,LUninitRefIdentityTest;);
+    invoke-direct {p1}, Ljava/lang/Object;-><init>()V
+    #p0=(Reference,LUninitRefIdentityTest;);p1=(Reference,LUninitRefIdentityTest;);
+
+    :cond_4
+    #p0=(Reference,LUninitRefIdentityTest;);
+    #p1=(Reference,LUninitRefIdentityTest;):merge{0x1:(Reference,LUninitRefIdentityTest;),0x7:(Null)}
+    const p1, 0x0
+    #p0=(Reference,LUninitRefIdentityTest;);p1=(Null);
+
+    #p0=(Reference,LUninitRefIdentityTest;);p1=(Null);
+    if-nez p1, :cond_4
+    #p0=(Reference,LUninitRefIdentityTest;);p1=(Null);
+
+    #p0=(Reference,LUninitRefIdentityTest;);p1=(Null);
+    return-void
+    #p0=(Reference,LUninitRefIdentityTest;);p1=(Null);
+.end method
+
+.method public constructor <init>(Ljava/lang/String;)V
+    .registers 2
+
+    #p0=(UninitThis,LUninitRefIdentityTest;);p1=(Reference,Ljava/lang/String;);
+    move-object p1, p0
+    #p0=(UninitThis,LUninitRefIdentityTest;);p1=(UninitThis,LUninitRefIdentityTest;);
+
+    #p0=(UninitThis,LUninitRefIdentityTest;);p1=(UninitThis,LUninitRefIdentityTest;);
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    #p0=(Reference,LUninitRefIdentityTest;);p1=(Reference,LUninitRefIdentityTest;);
+
+    #p0=(Reference,LUninitRefIdentityTest;);p1=(Reference,LUninitRefIdentityTest;);
+    return-void
+    #p0=(Reference,LUninitRefIdentityTest;);p1=(Reference,LUninitRefIdentityTest;);
+.end method
+
+
+# virtual methods
+.method public overlappingInits()V
+    .registers 3
+
+    #v0=(Uninit);v1=(Uninit);p0=(Reference,LUninitRefIdentityTest;);
+    new-instance v0, Ljava/lang/String;
+    #v0=(UninitRef,Ljava/lang/String;);v1=(Uninit);p0=(Reference,LUninitRefIdentityTest;);
+
+    #v0=(UninitRef,Ljava/lang/String;);v1=(Uninit);p0=(Reference,LUninitRefIdentityTest;);
+    new-instance v1, Ljava/lang/String;
+    #v0=(UninitRef,Ljava/lang/String;);v1=(UninitRef,Ljava/lang/String;);p0=(Reference,LUninitRefIdentityTest;);
+
+    #v0=(UninitRef,Ljava/lang/String;);v1=(UninitRef,Ljava/lang/String;);p0=(Reference,LUninitRefIdentityTest;);
+    new-instance p0, Ljava/lang/String;
+    #v0=(UninitRef,Ljava/lang/String;);v1=(UninitRef,Ljava/lang/String;);p0=(UninitRef,Ljava/lang/String;);
+
+    #v0=(UninitRef,Ljava/lang/String;);v1=(UninitRef,Ljava/lang/String;);p0=(UninitRef,Ljava/lang/String;);
+    invoke-direct {p0}, Ljava/lang/String;-><init>()V
+    #v0=(UninitRef,Ljava/lang/String;);v1=(UninitRef,Ljava/lang/String;);p0=(Reference,Ljava/lang/String;);
+
+    #v0=(UninitRef,Ljava/lang/String;);v1=(UninitRef,Ljava/lang/String;);p0=(Reference,Ljava/lang/String;);
+    invoke-direct {v1}, Ljava/lang/String;-><init>()V
+    #v0=(UninitRef,Ljava/lang/String;);v1=(Reference,Ljava/lang/String;);p0=(Reference,Ljava/lang/String;);
+
+    #v0=(UninitRef,Ljava/lang/String;);v1=(Reference,Ljava/lang/String;);p0=(Reference,Ljava/lang/String;);
+    invoke-direct {v0}, Ljava/lang/String;-><init>()V
+    #v0=(Reference,Ljava/lang/String;);v1=(Reference,Ljava/lang/String;);p0=(Reference,Ljava/lang/String;);
+
+    #v0=(Reference,Ljava/lang/String;);v1=(Reference,Ljava/lang/String;);p0=(Reference,Ljava/lang/String;);
+    return-void
+    #v0=(Reference,Ljava/lang/String;);v1=(Reference,Ljava/lang/String;);p0=(Reference,Ljava/lang/String;);
+.end method
diff --git a/baksmali/src/test/resources/UninitRefIdentityTest/classes.dex b/baksmali/src/test/resources/UninitRefIdentityTest/classes.dex
new file mode 100644
index 0000000..0f0caab
Binary files /dev/null and b/baksmali/src/test/resources/UninitRefIdentityTest/classes.dex differ
diff --git a/baksmali/src/test/resources/ZeroArrayPayloadWidthTest/ZeroArrayPayloadWidthTestInput.dex b/baksmali/src/test/resources/ZeroArrayPayloadWidthTest/ZeroArrayPayloadWidthTestInput.dex
new file mode 100644
index 0000000..37b2942
Binary files /dev/null and b/baksmali/src/test/resources/ZeroArrayPayloadWidthTest/ZeroArrayPayloadWidthTestInput.dex differ
diff --git a/baksmali/src/test/resources/ZeroArrayPayloadWidthTest/ZeroArrayPayloadWidthTestOutput.smali b/baksmali/src/test/resources/ZeroArrayPayloadWidthTest/ZeroArrayPayloadWidthTestOutput.smali
new file mode 100644
index 0000000..6172dec
--- /dev/null
+++ b/baksmali/src/test/resources/ZeroArrayPayloadWidthTest/ZeroArrayPayloadWidthTestOutput.smali
@@ -0,0 +1,15 @@
+.class public LZeroArrayPayloadWidthTest;
+.super Ljava/lang/Object;
+
+
+# virtual methods
+.method public zeroWidth()V
+    .registers 3
+
+    return-void
+
+    nop
+
+    .array-data 1
+    .end array-data
+.end method
diff --git a/baksmali/src/test/smali/baksmali_test_class.smali b/baksmali/src/test/smali/baksmali_test_class.smali
new file mode 100644
index 0000000..903baf4
--- /dev/null
+++ b/baksmali/src/test/smali/baksmali_test_class.smali
@@ -0,0 +1,218 @@
+.class public Lbaksmali/test/class;
+.super Ljava/lang/Object;
+
+.source "baksmali_test_class.smali"
+
+.implements Lsome/interface;
+.implements Lsome/other/interface;
+
+
+.annotation build Lsome/annotation;
+    value1 = "test"
+    value2 = .subannotation Lsome/annotation;
+        value1 = "test2"
+        value2 = Lsome/enum;
+    .end subannotation
+.end annotation
+
+.annotation system Lsome/annotation;
+.end annotation
+
+
+
+.field public static aStaticFieldWithoutAnInitializer:I
+
+.field public static longStaticField:J = 0x300000000L
+.field public static longNegStaticField:J = -0x300000000L
+
+.field public static intStaticField:I = 0x70000000
+.field public static intNegStaticField:I = -500
+
+.field public static shortStaticField:S = 500s
+.field public static shortNegStaticField:S = -500s
+
+.field public static byteStaticField:B = 123t
+.field public static byteNegStaticField:B = 0xAAt
+
+.field public static floatStaticField:F = 3.1415926f
+
+.field public static doubleStaticField:D = 3.141592653589793
+
+.field public static charStaticField:C = 'a'
+.field public static charEscapedStaticField:C = '\n'
+
+.field public static boolTrueStaticField:Z = true
+.field public static boolFalseStaticField:Z = false
+
+.field public static typeStaticField:Ljava/lang/Class; = Lbaksmali/test/class;
+
+.field public static stringStaticField:Ljava/lang/String; = "test"
+.field public static stringEscapedStaticField:Ljava/lang/String; = "test\ntest"
+
+
+.field public static fieldStaticField:Ljava/lang/reflect/Field; = Lbaksmali/test/class;->fieldStaticField:Ljava/lang/reflect/Field;
+
+.field public static methodStaticField:Ljava/lang/reflect/Method; = Lbaksmali/test/class;->teshMethod(ILjava/lang/String;)Ljava/lang/String;
+
+.field public static arrayStaticField:[I = {1, 2, 3, {1, 2, 3, 4}}
+
+.field public static enumStaticField:Lsome/enum; = .enum Lsome/enum;->someEnumValue:Lsome/enum;
+
+.field public static annotationStaticField:Lsome/annotation; = .subannotation Lsome/annotation;
+    value1 = "test"
+    value2 = .subannotation Lsome/annotation;
+        value1 = "test2"
+        value2 = Lsome/enum;
+    .end subannotation
+.end subannotation
+
+.field public static staticFieldWithAnnotation:I
+    .annotation runtime La/field/annotation;
+        this = "is"
+        a = "test"
+    .end annotation
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+.end field
+
+.field public instanceField:Ljava/lang/String;
+
+
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public testMethod(ILjava/lang/String;)Ljava/lang/String;
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+    .annotation system Lyet/another/annotation;
+        somevalue = 1234
+        anothervalue = 3.14159
+    .end annotation
+
+    const-string v0, "testing\n123"
+
+    goto switch:
+
+    sget v0, Lbaksmali/test/class;->staticField:I
+
+    switch:
+    packed-switch v0, pswitch:
+
+    try_start:
+    const/4 v0, 7
+    const v0, 10
+    nop
+    try_end:
+    .catch Ljava/lang/Exception; {try_start: .. try_end:} handler:
+    .catchall {try_start: .. try_end:} handler2:
+
+    handler:
+
+    Label10:
+    Label11:
+    Label12:
+    Label13:
+    return-object v0
+
+
+
+    .array-data 4
+        1 2 3 4 5 6 200
+    .end array-data
+
+    pswitch:
+    .packed-switch 10
+        Label10:
+        Label11:
+        Label12:
+        Label13:
+    .end packed-switch
+
+    handler2:
+
+    return-void
+
+.end method
+
+.method public abstract testMethod2()V
+    .annotation runtime Lsome/annotation;
+        subannotation = .subannotation Lsome/other/annotation;
+            value = "value"
+        .end subannotation
+    .end annotation
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+.end method
+
+
+.method public tryTest()V
+    .registers 1
+
+    handler:
+    nop
+
+
+    try_start:
+    const/4 v0, 7
+    const v0, 10
+    nop
+    try_end:
+    .catch Ljava/lang/Exception; {try_start: .. try_end:} handler:
+.end method
+
+
+.method public debugTest(IIIII)V
+    .registers 10
+
+    .parameter "Blah"
+    .parameter
+    .parameter "BlahWithAnnotations"
+        .annotation runtime Lsome/annotation;
+            something = "some value"
+            somethingelse = 1234
+        .end annotation
+        .annotation runtime La/second/annotation;
+        .end annotation
+    .end parameter
+    .parameter
+        .annotation runtime Lsome/annotation;
+            something = "some value"
+            somethingelse = 1234
+        .end annotation
+    .end parameter
+    .parameter "LastParam"
+
+    .prologue
+
+    nop
+    nop
+
+    .source "somefile.java"
+    .line 101
+
+    nop
+
+
+    .line 50
+
+    .local v0, aNumber:I
+    const v0, 1234
+    .end local v0
+
+    .source "someotherfile.java"
+    .line 900
+
+    const-string v0, "1234"
+
+    .restart local v0
+    const v0, 6789
+    .end local v0
+
+    .epilogue
+
+.end method
\ No newline at end of file
diff --git a/baksmali/src/test/smali/deodex_test1/main.smali b/baksmali/src/test/smali/deodex_test1/main.smali
new file mode 100644
index 0000000..db88b46
--- /dev/null
+++ b/baksmali/src/test/smali/deodex_test1/main.smali
@@ -0,0 +1,70 @@
+.class public Lmain;
+
+.super Ljava/lang/Object;
+
+.method public static main([Ljava/lang/String;)V
+    .registers 3
+
+    :here4
+    const v0, 0
+
+    :here3
+
+    new-instance v2, Lsuperclass;
+    invoke-direct {v2}, Lsuperclass;-><init>()V
+
+    if-eqz v0, :here
+
+
+    #this is the unresolvable instruction. v0 is always null,
+    #and this will always throw an exception. It should be
+    #replaced with throw v0.
+    invoke-virtual {v0}, Lrandomclass;->getSuperclass()Lsuperclass;
+    move-result-object v1
+
+
+    if-eqz v0, :here
+
+    #this would normally be deodexable, except that it follows
+    #the above un-deodexeable instruction, which prevents the
+    #propagation of any register information. It can never be
+    #reached, and should be replaced with throw v2
+    invoke-virtual {v2}, Lsuperclass;->somemethod()V
+
+    #another odexed instruction that uses the result of the
+    #first unresolveable odex instruction. This should
+    #be replaced with throw v1
+    invoke-virtual {v1}, Lsuperclass;->somemethod()V
+
+    :here
+
+    #and we're back to the non-dead code
+    invoke-virtual {v2}, Lsuperclass;->somemethod()V
+
+    if-nez v0, :here3
+
+    return-void
+.end method
+
+.method public static FirstInstructionTest(Lrandomclass;)V
+    .registers 1
+
+    :try_start
+        invoke-virtual/range {p0}, Lrandomclass;->getSuperclass()Lsuperclass;
+        return-void
+    :try_end
+    .catch Ljava/lang/Exception; {:try_start .. :try_end} :handler
+    :handler
+        :inner_try_start
+            #this tests that the parameter register types are correctly propagated to the exception handlers, in the
+            #case that the first instruction of the method can throw an exception and is in a try black
+            invoke-virtual/range {p0}, Lrandomclass;->getSuperclass()Lsuperclass;
+            return-void
+        :inner_try_end
+        .catch Ljava/lang/Exception; {:inner_try_start .. :inner_try_end} :inner_handler
+        :inner_handler
+            #this additionally tests that the register types are propagated recursively, in the case that the first
+            #instruction in the exception handler can also throw an exception, and is covered by a try block
+            invoke-virtual/range {p0}, Lrandomclass;->getSuperclass()Lsuperclass;
+            return-void
+.end method
\ No newline at end of file
diff --git a/baksmali/src/test/smali/deodex_test1/randomclass.smali b/baksmali/src/test/smali/deodex_test1/randomclass.smali
new file mode 100644
index 0000000..3c02f13
--- /dev/null
+++ b/baksmali/src/test/smali/deodex_test1/randomclass.smali
@@ -0,0 +1,18 @@
+.class public Lrandomclass;
+
+.super Ljava/lang/Object;
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public getSuperclass()Lsuperclass;
+   .registers 2
+
+    new-instance v0, Lsuperclass;
+    invoke-direct {v0}, Lsuperclass;-><init>()V
+
+    return-object v0
+.end method
\ No newline at end of file
diff --git a/baksmali/src/test/smali/deodex_test1/subclass.smali b/baksmali/src/test/smali/deodex_test1/subclass.smali
new file mode 100644
index 0000000..9ffa4de
--- /dev/null
+++ b/baksmali/src/test/smali/deodex_test1/subclass.smali
@@ -0,0 +1,21 @@
+.class public Lsubclass;
+
+.super Lsuperclass;
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Lsuperclass;-><init>()V
+    return-void
+.end method
+
+.method public somemethod()V
+   .registers 2
+
+    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
+
+    const-string	v1, "subclass.somemethod"
+
+    invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
+
+    return-void
+.end method
\ No newline at end of file
diff --git a/baksmali/src/test/smali/deodex_test1/superclass.smali b/baksmali/src/test/smali/deodex_test1/superclass.smali
new file mode 100644
index 0000000..2149103
--- /dev/null
+++ b/baksmali/src/test/smali/deodex_test1/superclass.smali
@@ -0,0 +1,21 @@
+.class public Lsuperclass;
+
+.super Ljava/lang/Object;
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public somemethod()V
+   .registers 2
+
+    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
+
+    const-string	v1, "superclass.somemethod"
+
+    invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
+
+    return-void
+.end method
\ No newline at end of file
diff --git a/baksmali/src/test/smali/deodex_test2/app_classes/main.smali b/baksmali/src/test/smali/deodex_test2/app_classes/main.smali
new file mode 100644
index 0000000..505312c
--- /dev/null
+++ b/baksmali/src/test/smali/deodex_test2/app_classes/main.smali
@@ -0,0 +1,41 @@
+.class public Lmain;
+
+.super Ljava/lang/Object;
+
+.method public static main([Ljava/lang/String;)V
+    .registers 6
+
+    const v2, 0
+
+
+    const v3, 1
+    const v4, 0
+    new-array v1, v3, [Lsubclass1;
+    new-instance v0, Lsubclass1;
+    invoke-direct {v0}, Lsubclass1;-><init>()V
+    aput-object v0, v1, v4
+
+    goto :here2
+
+    :here
+    const v2, 1
+
+    :here2
+
+    #this is tricky, because it has to merge two array types, [Lsubclass1; and [Lsubclass2
+    #which should result in [Lsuperclass;. However, this dex file won't have a reference
+    #to [Lsuperclass;
+    aget-object v5, v1, v4
+
+    invoke-virtual {v5}, Lsupersuperclass;->somemethod()V
+
+
+    new-array v1, v3, [Lsubclass2;
+    new-instance v0, Lsubclass2;
+    invoke-direct {v0}, Lsubclass2;-><init>()V
+    aput-object v0, v1, v4
+
+    if-eqz v2, :here
+
+    return-void
+.end method
\ No newline at end of file
diff --git a/baksmali/src/test/smali/deodex_test2/bootclass_classes/randomclass.smali b/baksmali/src/test/smali/deodex_test2/bootclass_classes/randomclass.smali
new file mode 100644
index 0000000..3c02f13
--- /dev/null
+++ b/baksmali/src/test/smali/deodex_test2/bootclass_classes/randomclass.smali
@@ -0,0 +1,18 @@
+.class public Lrandomclass;
+
+.super Ljava/lang/Object;
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public getSuperclass()Lsuperclass;
+   .registers 2
+
+    new-instance v0, Lsuperclass;
+    invoke-direct {v0}, Lsuperclass;-><init>()V
+
+    return-object v0
+.end method
\ No newline at end of file
diff --git a/baksmali/src/test/smali/deodex_test2/bootclass_classes/subclass1.smali b/baksmali/src/test/smali/deodex_test2/bootclass_classes/subclass1.smali
new file mode 100644
index 0000000..d7b840f
--- /dev/null
+++ b/baksmali/src/test/smali/deodex_test2/bootclass_classes/subclass1.smali
@@ -0,0 +1,21 @@
+.class public Lsubclass1;
+
+.super Lsuperclass;
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Lsuperclass;-><init>()V
+    return-void
+.end method
+
+.method public somemethod()V
+   .registers 2
+
+    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
+
+    const-string	v1, "subclass1.somemethod"
+
+    invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
+
+    return-void
+.end method
\ No newline at end of file
diff --git a/baksmali/src/test/smali/deodex_test2/bootclass_classes/subclass2.smali b/baksmali/src/test/smali/deodex_test2/bootclass_classes/subclass2.smali
new file mode 100644
index 0000000..605cccb
--- /dev/null
+++ b/baksmali/src/test/smali/deodex_test2/bootclass_classes/subclass2.smali
@@ -0,0 +1,21 @@
+.class public Lsubclass2;
+
+.super Lsuperclass;
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Lsuperclass;-><init>()V
+    return-void
+.end method
+
+.method public somemethod()V
+   .registers 2
+
+    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
+
+    const-string	v1, "subclass2.somemethod"
+
+    invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
+
+    return-void
+.end method
\ No newline at end of file
diff --git a/baksmali/src/test/smali/deodex_test2/bootclass_classes/superclass.smali b/baksmali/src/test/smali/deodex_test2/bootclass_classes/superclass.smali
new file mode 100644
index 0000000..e44a17a
--- /dev/null
+++ b/baksmali/src/test/smali/deodex_test2/bootclass_classes/superclass.smali
@@ -0,0 +1,21 @@
+.class public Lsuperclass;
+
+.super Lsupersuperclass;
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Lsupersuperclass;-><init>()V
+    return-void
+.end method
+
+.method public somemethod()V
+   .registers 2
+
+    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
+
+    const-string	v1, "superclass.somemethod"
+
+    invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
+
+    return-void
+.end method
\ No newline at end of file
diff --git a/baksmali/src/test/smali/deodex_test2/bootclass_classes/supersuperclass.smali b/baksmali/src/test/smali/deodex_test2/bootclass_classes/supersuperclass.smali
new file mode 100644
index 0000000..9621e14
--- /dev/null
+++ b/baksmali/src/test/smali/deodex_test2/bootclass_classes/supersuperclass.smali
@@ -0,0 +1,21 @@
+.class public Lsupersuperclass;
+
+.super Ljava/lang/Object;
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public somemethod()V
+   .registers 2
+
+    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
+
+    const-string	v1, "supersuperclass.somemethod"
+
+    invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
+
+    return-void
+.end method
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..850c4e1
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,191 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+apply plugin: 'idea'
+
+version = '2.4.0'
+def jcommanderVersion = ''
+
+if (!('release' in gradle.startParameter.taskNames)) {
+    // we compile against 1.48 normally, to match what's in AOSP, but switch to a newer version
+    // for release, because it has some fixes required when running on Android
+    jcommanderVersion = 'com.beust:jcommander:1.48'
+
+    def versionSuffix
+    try {
+        def git = org.eclipse.jgit.api.Git.open(file('.'))
+        def head = git.getRepository().getRef('HEAD')
+        versionSuffix = head.getObjectId().abbreviate(8).name()
+
+        if (!git.status().call().clean) {
+            versionSuffix += '-dirty'
+        }
+    } catch (Exception) {
+        // In case we can't get the commit for some reason,
+        // just use -dev
+        versionSuffix = 'dev'
+    }
+
+    version += "-${versionSuffix}"
+} else {
+    jcommanderVersion = 'com.beust:jcommander:1.64'
+}
+
+// Note: please don't use this. This is strictly for the official releases
+// that are posted on, e.g. the bitbucket download page.
+task release() {
+}
+
+task(install).doLast {
+    println "Installing version: ${version}"
+}
+
+// The projects that get pushed to maven
+def maven_release_projects = ['smali', 'baksmali', 'dexlib2', 'util']
+
+subprojects {
+    apply plugin: 'java'
+    apply plugin: 'idea'
+
+    if (JavaVersion.current().isJava8Compatible()) {
+        allprojects {
+            tasks.withType(Javadoc) {
+                options.addStringOption('Xdoclint:none', '-quiet')
+            }
+        }
+    }
+
+    version = parent.version
+
+    ext {
+        depends = [
+                guava: 'com.google.guava:guava:27.1-android',
+                findbugs: 'com.google.code.findbugs:jsr305:1.3.9',
+                junit: 'junit:junit:4.12',
+                mockito: 'org.mockito:mockito-core:1.10.19',
+                antlr_runtime: 'org.antlr:antlr-runtime:3.5.2',
+                antlr: 'org.antlr:antlr:3.5.2',
+                stringtemplate: 'org.antlr:stringtemplate:3.2.1',
+                jflex_plugin: 'org.xbib.gradle.plugin:gradle-plugin-jflex:1.1.0',
+                proguard_gradle: 'net.sf.proguard:proguard-gradle:5.2.1',
+                dx: 'com.google.android.tools:dx:1.7',
+                gson: 'com.google.code.gson:gson:2.3.1',
+                jcommander: jcommanderVersion
+        ]
+    }
+
+    repositories {
+        mavenCentral()
+    }
+
+    if (project.name in maven_release_projects) {
+        apply plugin: 'maven'
+        apply plugin: 'signing'
+
+        group = 'org.smali'
+
+        task javadocJar(type: Jar, dependsOn: javadoc) {
+            classifier = 'javadoc'
+            from 'build/docs/javadoc'
+        }
+
+        task sourcesJar(type: Jar) {
+            classifier = 'sources'
+            from sourceSets.main.allJava
+        }
+
+        artifacts {
+            archives javadocJar
+            archives sourcesJar
+        }
+
+        signing {
+            required { gradle.taskGraph.hasTask('uploadArchives') }
+            sign configurations.archives
+        }
+
+        uploadArchives {
+            repositories.mavenDeployer {
+                configuration = configurations.archives
+
+                beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
+
+                if (rootProject.hasProperty('sonatypeUsername') && rootProject.hasProperty('sonatypePassword')) {
+                    repository(url: 'https://oss.sonatype.org/service/local/staging/deploy/maven2/') {
+                        authentication(userName: sonatypeUsername, password: sonatypePassword)
+                    }
+                }
+
+                pom.artifactId = project.name
+
+                pom.project {
+                    name project.name
+                    url 'http://smali.org'
+                    packaging 'jar'
+                    licenses {
+                        license {
+                            name 'The BSD 3-Clause License'
+                            url 'http://opensource.org/licenses/BSD-3-Clause'
+                            distribution 'repo'
+                        }
+                    }
+                    scm {
+                        connection 'scm:git:git://github.com/JesusFreke/smali.git'
+                        developerConnection 'scm:git:git@github.com:JesusFreke/smali.git'
+                    }
+                    developers {
+                        developer {
+                            id 'jesusfreke'
+                            name 'Ben Gruver'
+                            email 'jesusfreke@jesusfreke.com'
+                        }
+                    }
+                }
+            }
+        }
+
+        tasks.getByPath(':release').dependsOn(uploadArchives)
+    }
+}
+
+buildscript {
+    repositories {
+        mavenCentral()
+    }
+    dependencies {
+        classpath 'org.eclipse.jgit:org.eclipse.jgit:2.0.0.201206130900-r'
+    }
+}
+
+wrapper {
+    gradleVersion = '5.1'
+    distributionType = Wrapper.DistributionType.ALL
+}
diff --git a/deodexerant/Android.mk b/deodexerant/Android.mk
new file mode 100644
index 0000000..46a9dba
--- /dev/null
+++ b/deodexerant/Android.mk
@@ -0,0 +1,44 @@
+# Copyright 2011, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#    * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#    * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#    * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := deodexerant
+
+LOCAL_SRC_FILES:= deodexerant.c
+
+LOCAL_SHARED_LIBRARIES := libdl
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_LDFLAGS := -Wl,--hash-style=sysv
+
+include $(BUILD_EXECUTABLE)
diff --git a/deodexerant/README b/deodexerant/README
new file mode 100644
index 0000000..0589e05
--- /dev/null
+++ b/deodexerant/README
@@ -0,0 +1,26 @@
+usage:
+adb push deodexerant /data/local
+adb shell chmod +x /data/local/deodexerant
+adb shell /data/local/deodexerant > inline.txt
+
+deodexerant is a binary that runs on a device and dumps out dalvik's inline
+method table.
+
+This can be used in cases where a particular built of dalvik has a non-standard
+inline method table for whatever reason. The output from this tool is intended
+to be used with the -T option for baksmali
+
+deodexerant is intended to be build within the AOSP build system. Assuming
+you have $MYDROID set to the root of the AOSP source tree, and $SMALI
+set to the root of the smali source tree,
+
+1. mkdir -p $MYDROID/external/deodexerant
+2. cp -r $SMALI/deodexerant $MYDROID/dalvik/deodexerant
+3. cd $MYDROID
+3. source build/envsetup.sh
+4. lunch generic-eng
+5. make deodexerant
+
+If all goes well, you should now have a deodexerant binary at:
+
+$MYDROID/out/target/product/generic/system/bin/deodexerant
diff --git a/deodexerant/deodexerant.c b/deodexerant/deodexerant.c
new file mode 100644
index 0000000..1cadee9
--- /dev/null
+++ b/deodexerant/deodexerant.c
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2011, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <stdio.h>
+#include <dlfcn.h>
+
+typedef struct InlineOperation {
+    void *          func;
+    const char*     classDescriptor;
+    const char*     methodName;
+    const char*     methodSignature;
+} InlineOperation;
+
+typedef const InlineOperation* (*dvmGetInlineOpsTablePtr)();
+typedef int (*dvmGetInlineOpsTableLengthPtr)();
+
+void main(int argc, char **argv) {
+	int i;
+
+	void *libdvm = dlopen("libdvm.so", RTLD_LAZY);
+
+	if (libdvm == NULL) {
+		printf("Failed to load libdvm: %s\n", dlerror());
+		return;
+	}
+
+	dvmGetInlineOpsTablePtr dvmGetInlineOpsTable = dlsym(libdvm, "dvmGetInlineOpsTable");
+
+	if (dvmGetInlineOpsTable == NULL) {
+		// clear the error, and retry with the c++ mangled name
+		dlerror();
+		dvmGetInlineOpsTable = dlsym(libdvm, "_Z20dvmGetInlineOpsTablev");
+	}
+
+	if (dvmGetInlineOpsTable == NULL) {
+		printf("Failed to load dvmGetInlineOpsTable: %s\n", dlerror());
+		dlclose(libdvm);
+		return;
+	}
+
+	dvmGetInlineOpsTableLengthPtr dvmGetInlineOpsTableLength = dlsym(libdvm, "dvmGetInlineOpsTableLength");
+
+	if (dvmGetInlineOpsTableLength == NULL) {
+		// clear the error, and retry with the c++ mangled name
+		dlerror();
+		dvmGetInlineOpsTableLength = dlsym(libdvm, "_Z26dvmGetInlineOpsTableLengthv");
+	}
+
+	if (dvmGetInlineOpsTableLength == NULL) {
+		printf("Failed to load dvmGetInlineOpsTableLength: %s\n", dlerror());
+		dlclose(libdvm);
+		return;
+	}
+
+	const InlineOperation *inlineTable = dvmGetInlineOpsTable();
+	int length = dvmGetInlineOpsTableLength();
+
+	for (i=0; i<length; i++) {
+		InlineOperation *item = &inlineTable[i];
+
+		printf("%s->%s%s\n", item->classDescriptor, item->methodName, item->methodSignature);
+	}
+
+	dlclose(libdvm);
+	return;
+}
\ No newline at end of file
diff --git a/dexlib2/OatVersions-README.md b/dexlib2/OatVersions-README.md
new file mode 100644
index 0000000..87ad6a4
--- /dev/null
+++ b/dexlib2/OatVersions-README.md
@@ -0,0 +1,7 @@
+When assessing art changes for impact to baksmali/dexlib2's deodexing functionality, there are a
+few key structures to keep an eye on.
+
+- The oat version is stored in runtime/oat.h
+- The OatHeader structure in runtime/oat.h
+- The OatDexFile structure, as it is written in OatWriter::OatDexFile::Write in
+  compiler/oat_writer.cc (later moved to dex2oat/linker/oat_writer.cc)
\ No newline at end of file
diff --git a/dexlib2/OatVersions.txt b/dexlib2/OatVersions.txt
new file mode 100644
index 0000000..2a505d9
--- /dev/null
+++ b/dexlib2/OatVersions.txt
@@ -0,0 +1,171 @@
+7642cfc90fc9c3ebfd8e3b5041915705c93b5cf0 - 56
+ - first version with all stability fixes needed for deodexing
+14691c5e786e8c2c5734f687e4c96217340771be - 57
+1558b577907b613864e98f05862543557263e864 - 58
+f3251d12dfa387493dbde4c4148a633802f5f7e3 - 59
+706cae36209932f258b2fe2e396f31d2dd7d585e - 58 (revert of f3251d12)
+d7cbf8a6629942e7bd315ffae7e1c77b082f3e11 - 60
+ - return-void-barrier -> return-void-no-barrier
+1412dfa4adcd511902e510fa0c948b168ab5840c - 61 (re-commit of f3251d12)
+9d6bf69ad3012a9d843268fdd5325b6719b6d5f2 - 62
+- classpath list was added
+0de1133ba600f299b3d67938f650720d9f859eb2 - 63
+07785bb98dc8bbe192970e0f4c2cafd338a8dc68 - 64
+fa2c054b28d4b540c1b3651401a7a091282a015f - 65
+7070ccd8b6439477eafeea7ed3736645d78e003f - 64 (revert of fa2c054b)
+7bf2b4f1d08050f80782217febac55c8cfc5e4ef - 65 (re-commit of fa2c054b)
+0b71357fb52be9bb06d35396a3042b4381b01041 - 66
+fab6788358dfb64e5c370611ddbbbffab0ed0553 - 67
+- Change in FieldGap priority queue ordering
+1aee900d5a0b3a8d78725a7551356bda0d8554e1 - 68
+54b62480636ae846d705fc180c7bd6cd08ec1e42 - 69
+6e2d5747d00697a25251d25dd33b953e54709507 - 68 (revert of 54b62480)
+0747466fca310eedea5fc49e37d54f240a0b3c0f - 69 (re-commit of 54b62480)
+501fd635a557645ab05f893c56e1f358e21bab82 - 70
+99170c636dfae4908b102347cfe9f92bad1881cc - 71
+3cfa4d05afa76e19ca99ec964b535a15c73683f0 - 72
+- default methods
+d9786b0e5be23ea0258405165098b4216579209c - 73
+- fast class lookup table
+a4f1220c1518074db18ca1044e9201492975750b - 74
+625a64aad13905d8a2454bf3cc0e874487b110d5 - 75
+- bootclasspath list was added
+- class offsets moved out to a separate table
+919f5536182890d2e03f59b961acf8f7c836ff61 - 74 (revert of 625a64aa)
+9bdf108885a27ba05fae8501725649574d7c491b - 75 (re-commit of 625a64aa)
+a62d2f04a6ecf804f8a78e722a6ca8ccb2dfa931 - 76
+845e5064580bd37ad5014f7aa0d078be7265464d - 75 (revert of a62d2f04)
+29d38e77c553c6cf71fc4dafe2d22b4e3f814872 - 76 (re-commit of 845e5064)
+d1537b569b6cd18297c5e02d13cdd588c4366c51 - 77
+61b28a17d9b6e8e998103646e98e4a9772e11927 - 78
+9d07e3d128ccfa0ef7670feadd424a825e447d1d - 79
+952e1e3710158982941fc70326e9fddc3021235d - 80
+013e3f33495dcc31dba19c9de128d23ed441d7d3 - 81
+87f3fcbd0db352157fc59148e94647ef21b73bce - 82
+02b75806a80f8b75c3d6ba2ff97c995117630f36 - 83
+4359e61927866c254bc2d701e3ea4c48de10b79c - 84
+d549c28cfbddba945cb88857bcca3dce1414fb29 - 85
+952dbb19cd094b8bfb01dbb33e0878db429e499a - 86
+239d6eaff0cbb5c4c0139f7053a012758799f186 - 87 - introduction of vdex files
+77d9dd75d5d4a22ad1235f9a08d2cfbf2f0ae6fa - 89
+af1e2990cd1406a0fb7cba1d2e208208e950e413 - 90
+9fd8c60cdff7b28a89bb97fd90ae9d0f37cf8f8b - 91
+6beced4c017826f7c449f12fac7fa42403657f2b - 92
+58c3f6a0d15a4340c0a11ab7fbc8c4b990c64b77 - 93
+5923b5238091d9cd65f988fc059deb4fbb2e7f08 - 94
+2b615ba29c4dfcf54aaf44955f2eac60f5080b2e - 95
+f7aaacd97881c6924b8212c7f8fe4a4c8721ef53 - 94 (revert of 2b615ba)
+0d3998b5ff619364acf47bec0b541e7a49bd6fe7 - 95 (re-commit of 2b615ba)
+ac141397dc29189ad2b2df41f8d4312246beec60 - 96
+1998cd02603197f2acdc0734397a6d48b2f59b80 - 97
+e71b35446985835363a4508646cf7b1121bd95a3 - 98
+39cee66a8ddf0254626c9591662cf87e4a1cedc4 - 99
+cc99df230feb46ba717252f002d0cc2da6828421 - 100
+fee255039e30c1c3dfc70c426c3d176221c3cdf9 - 99 (revert of cc99df23)
+e761bccf9f0d884cc4d4ec104568cef968296492 - 100 (re-commit of cc99df23)
+8d91ac31ccb92557e434d89ffade3372466e1af5 - 101
+fd3161acfbe82c54ef49958f0ccc62511f224f91 - 102
+a2f526f889be06f96ea59624c9dfb1223b3839f3 - 103
+b048cb74b742b03eb6dd5f1d6dd49e559f730b36 - 104
+12f1b99775bbf7dd82d0a897587ab6ed0e75ee22 - 105
+ec7862283dd49f5a58d0ac45960ce27c2f7671b8 - 106
+45aa598cd1773f5eb1705dec13bea059238e054d - 107
+d16363a93053de0f32252c7897d839a46aff14ae - 108
+1a20b6801f2432a42b906f0de01e7e9586526aec - 109
+575d3e60c68b5cf481b615dde4a16283507b19ed - 110
+85c0f2ac03417f5125bc2ff1dab8109859c67d5c - 111
+5812e20ff7cbc8efa0b8d7486ada2f58840a6ad5 - 111
+b7ea3799c15b0090bb690e18ac1b5b0fddbdeee8 - 112
+    - version bump for missing bump in commits
+    - 3228908337fdfe851223f8ae374538de25cb5ad1
+    - 5812e20ff7cbc8efa0b8d7486ada2f58840a6ad5
+d776ff08e07494327716f0d2ea1a774b2ebfbca9 - 113
+bfb80d25eaeb7a604d5dd25a370e3869e96a33ab - 114
+1aea3510b8dd0c512cec61c91c5ef1f1e5d53d64 - 115
+6374c58f2ea403b3a05fb27376110fe4d0fc8e3f - 114 (revert of 1aea3510)
+0b66d6174bf1f6023f9d36dda8538490b79c2e9f - 113 (revert of bfb80d25)
+8d6768d47b66a688d35399d524ad5a5450e9d9d4 - 114 (i don't even)
+f44d36c8423f81cbb5e9f55d8813e26ffa1a7f3b - 115 (115 again. heck if I know what's going on)
+cbcedbf9382bc773713cd3552ed96f417bf1daeb - 116
+051071718085ce807a2e7c55278a8d723e238e86 - 116
+1595815c2a914a78df7dfb6f0082f47d4e82bb36 - 117
+f4f2daafb38c9c07ea74044a0fb89a2a19288b7a - 118
+6bc7774426cc0b6bbab5566fa62b3c509455e583 - 119
+88d329a698ba186aeb1f1ef8794355512ada84a9 - 120
+612ff540cd3329935351f05923358cf29b9c9b44 - 121
+c83dd7bfde2171c879efb92a31a363505385ffb9 - 122
+eee1c0ec2b08a6be642b329dc2fe885391127da3 - 123
+f977691961b5a49a074a535fcb29a5ad4a318974 - 124
+2665bc8159698429f20a08f814e63c434910d608 - 124
+88abba2b0cb0151d89e16da3e64025878dc2f142 - 125
+99cdddaf8e5bc6b31d0eb375755ec4071a9fb527 - 125
+c137cb03a90b9fd5a7d0ec7dd9b250db82ca88ef - 126
+0eb882bfc5d260e8014c26adfda11602065aa5d8 - 127
+    - The oat_dex_files_offset field is added to OatHeader
+    - The method_bss_mapping field is added to OatDexFile
+7b0648aa7cb4b7a58e73bf353e031dfe4553d9d7 - 128
+0cb172874481f736c6b7c491dd621166cc25561b - 129
+a308a327884920cbb1e3e62964c4b5a01c29af8c - 130 (changed kMultiDexSeparator from ':' to '!')
+4147fcc43c2ee019a06e55384985e3eaf82dcb8c - 131
+75c5ed6e75f70002db5fa7c609137c04dd2bdf40 - 132
+    - The dex_layout_sections field is added to OatDexFile
+0f3c7003e08a42a4ed8c9f8dfffb1bee1118de59 - 133
+6cfbdbc359ec5414d3e49f70d28f8c0e65b98d63 - 134
+f3c52b42a035902245d00a619fed0275afb063d2 - 135
+    - Add type_bss_mapping_ and string_bss_mapping_ fields to OatDexFile
+2c64a837e62c2839521c89060b5bb0dcb237ddda - 136
+dc682aa9d0eae1a851af059434adb6f6cf8f06f8 - 137
+4d17987da58d9411adbed1a18203d76d6119612d - 138
+    - introduced the concept of an uncompressed dex file: one that is not stored
+       in the oat/vdex file, but rather is left in the apk.
+b066d43b1d9184899aff32b1f243d092611ad9c6 - 139
+e47f60c482648172334aaca59e6c1ab7a3d42610 - 140
+dcd117e04b0831e4539544c38c524799114f3e66 - 141
+18259d7fb7164a5e029df4f883b3a79ccc2403e8 - 142
+dbaa5c7ba8935cf87ceb40a4054f9842929e9a51 - 143
+052f8ca1776ed7deb4f036498edd69eb6a1b942f - 144
+4b59d107f91601c4e0095d7a9db40970d4ed6956 - 145
+71ec1cc0665cdb9d39f4fd284d68962020417a53 - 146
+ea341d2830298b666d7c6faf369d2fc3fe94fef8 - 147
+    - Inline TypeLookupTable in OatDexFile
+4c8e12e66968929b36fac6a2237ca4b04160161e - 148
+50fac06c51864f293c61ff9d0983b82698cf6dac - 149
+f6ba5b316b51d0fb9f91cb51a42e51dfeee62ee4 - 150
+a38e6cf2aaf4fd3d92b05c0a7a146fb5525ea72d - 151
+afc97bca07c85d4c3b46801c557edd12d681fc96 - 152
+d109e30eab8ba25f8d89be2a83d9036e2d541af2 - 153
+2c76257e4bfcd6f522b0cd3487ba7d9900043243 - 154
+6ee06e97cef5ee92944deaeba0da4d10c4c33a2a - 155
+8808756b8fba036a9c73a45c800a56be09872364 - 156
+b73323c50d10d3850d2d8719a481f4f430fc51ce - 157
+8cd54547cec8a4537db5682c2da8be22843b1310 - 158
+3aaaa21055ab73562b8da7968ac4fa5fe9d44695 - 159
+a9f303c089aa2b2fc82d97201352945678ef54ae - 160
+a2d29a3a772f17014197e829aa8cb41026f88f05 - 161
+e0669326c0282b5b645aba75160425eef9d57617 - 162
+    - Removes image_patch_delta_ and image_file_location_oat_delta_begin_ fields in oat header
+776f3f7bfa33e0449e4e2c5535bae1babfdbaf83 - 163
+c10a0c60ca388ea5f45c11dd86ca0af11191015a - 164
+    - changed adler32_checksum_ to oat_checksum_ in oat header
+    - changed image_file_location_oat_checksum_ to boot_image_checksum_ in oat header
+    - no net size change
+91f1032505cfaec3aef51fc0a3085b213813f0ed - 165
+0ace5633680af8864b76b4f45d63b3407e4dcdf5 - 166
+    - removes the boot_image_checksum_ field in oat header
+e1412dacbf1d2a809bd1fca658cc8cb8f61f8ee6 - 167
+    - note: this commit was reverted and this version number was not re-used
+131f23a4c2c34b689c07e6efd05cea74190f0113 - 168
+    - note: this commit was reverted and this version number was not re-used
+e35ac04a1a9a22b1c4386b27f3a30cd840aa17b1 - 169
+    - note: this commit was reverted and this version number was not re-used
+98fb083a30e9b37685f943e2923e65e60e0a0971 - 170
+    - Removes the interpreter_to_interpreter_bridge_offset_ field in oat header
+    - Removes the interpreter_to_compiled_code_bridge_offset_ field in oat header
+e42a4b95eed312e6f7019645f4c66b2d77254433 - 171
+697c47a7ffd4489c4bc4edc229c8123309526286 - 172
+6c4ec5c1555aaeddd254750c15554a3c47bfc722 - 173
+02820f424714e711bbd4cb4b04a109416eb0c8b8 - 174
+f5c5eb30fc71e0c305d678bd3c1c995a5c36d508 - 175
+2191069047034ad891ea15f60a217246edc38d53 - 176
+e2a3aa988630b3c2952ac44943f03dde60454195 - 177
+a59af8aeaad8fe7d68d8f8de63eab9cf85b6ab31 - 178
diff --git a/dexlib2/VdexVersions.txt b/dexlib2/VdexVersions.txt
new file mode 100644
index 0000000..727ccfc
--- /dev/null
+++ b/dexlib2/VdexVersions.txt
@@ -0,0 +1,42 @@
+7b49e6cade09bc65b3b5f22d45fc9d0a7184e4f2 - 0
+    - introduction of vdex files
+5d5a36bddbc008cd52a3207aa2b31177c47f9a49 - 0
+    - verifier deps
+4acefd33064d37b41ca55c3c9355345a20e5f9c2 - 0
+    - quickening info
+f54e5df37cb42d9a83fc54b375da5ef335d604a9 - 1
+    - dex file count + dex location checksum
+7498105ec7497bae2ba9f1a697da9efa0c979654 - 2
+    - verify profile
+3eba863e41d531340392d9ec64e17963ac898d81 - 3
+97fa9928c07d3e0ee631235e9619fb0f8949ed7a - 4
+6e54f78c7c1e01c1a91a458c6e51cca1c7d13ad4 - 5
+71fa64f4a1cf113b0d2ec00d05a168de07302032 - 6
+    - TODO: separate update from previous commit - need to check previous commits
+de4b08ff24c330d5b36b5c4dc8664ed4848eeca6 - 7
+b02ba93fb8089ae70229c4e3e90478cb4a9e4668 - 8
+ba118827465d12177f3996e50133960087b1c916 - 9
+bf755fefbfcfbb2677a519c12efe7890f3879854 - 10
+b4c6acbf281c1cf960444e35bcac254a1f77c3ed - 11
+    - changed layout of post-dex data in the vdex file.
+    - shouldn't have any impact on deodexing
+210531f8775c89feb90d430cd5b6026b4cf8ef89 - 13
+    - adds offset to QuickeningInfo structure before each dex file
+    - version 12 was a previous commit of this, which was reverted and recommited
+8892c6bd9235e7ae697039c901aaeea1597a7473 - 14
+8740c66cbfbeb3b7f306279c843650c3b18f2dca - 15
+    - Adds CompactDex code item
+c3a22aa19bbe35ff8447460b29e07d42937a39de - 16
+    - Add shared separate data section for compact dex
+8e9a5e82fe4f1beb6daddefb7b55226573f406be - 17
+    - unclear why version bumped? Due to previous commit that mistakenly didn't bump?
+20b2ce459f681f8c41bf0f5df31a24d4eb781f50 - 18
+    - unclear why version bumped? Due to previous commit that mistakenly didn't bump?
+3a29355967f29999ba81b5772ec66d3ddee9ce3e - 19, 1
+    - added separate version for dex section
+3a29355967f29999ba81b5772ec66d3ddee9ce3e - 19, 2
+    - Add owned section for CompactDex
+feb228244619237d110d8817865d7647f37b9b4f - 20, 2
+    - Improve `verified`, add `redefined` class status in VerifierDeps
+35a3f6a09931ee631a0377ee3ca98a7fb1f4f61d - 21, 2
+    - Add bootclasspath checksums
\ No newline at end of file
diff --git a/dexlib2/accessorTestGenerator/build.gradle b/dexlib2/accessorTestGenerator/build.gradle
new file mode 100644
index 0000000..e50bdc0
--- /dev/null
+++ b/dexlib2/accessorTestGenerator/build.gradle
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+dependencies {
+    compile project(':util')
+    compile 'com.google.code.findbugs:jsr305:1.3.9'
+    compile 'com.google.guava:guava:13.0.1'
+    compile 'org.antlr:ST4:4.0.7'
+
+    testCompile 'junit:junit:4.6'
+}
\ No newline at end of file
diff --git a/dexlib2/accessorTestGenerator/src/main/java/org/jf/dexlib2/AccessorTestGenerator.java b/dexlib2/accessorTestGenerator/src/main/java/org/jf/dexlib2/AccessorTestGenerator.java
new file mode 100644
index 0000000..6540b3d
--- /dev/null
+++ b/dexlib2/accessorTestGenerator/src/main/java/org/jf/dexlib2/AccessorTestGenerator.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2;
+
+import org.stringtemplate.v4.*;
+
+import java.io.*;
+import java.net.URL;
+
+public class AccessorTestGenerator {
+    private static class UnaryOperation {
+        public final String name;
+        public UnaryOperation(String name) {
+            this.name = name;
+        }
+    }
+
+    private static class BinaryOperation {
+        public final String name;
+        public final String[] inputTypes;
+        public BinaryOperation(String name, String[] inputTypes) {
+            this.name = name;
+            this.inputTypes = inputTypes;
+        }
+    }
+
+    private static class TypeDef {
+        public final String name;
+        public final UnaryOperation[] unaryOperations;
+        public final BinaryOperation[] binaryOperations;
+        public TypeDef(String name, UnaryOperation[] unaryOperations, BinaryOperation[] binaryOperations) {
+            this.name = name;
+            this.unaryOperations = unaryOperations;
+            this.binaryOperations = binaryOperations;
+        }
+    }
+
+    private static final UnaryOperation[] unaryOperations = new UnaryOperation[] {
+            new UnaryOperation("preinc"),
+            new UnaryOperation("postinc"),
+            new UnaryOperation("predec"),
+            new UnaryOperation("postdec")
+    };
+
+    private static final String[] booleanInputs = new String[] {"boolean"};
+    private static final String[] integralInputs = new String[] {"int", "long"};
+    private static final String[] allInputs = new String[] {"int", "float", "long", "double"};
+
+    private static final BinaryOperation[] booleanOperations = new BinaryOperation[] {
+            new BinaryOperation("and", booleanInputs),
+            new BinaryOperation("or", booleanInputs),
+            new BinaryOperation("xor", booleanInputs),
+    };
+
+    private static final BinaryOperation[] floatOperations = new BinaryOperation[] {
+            new BinaryOperation("add", allInputs),
+            new BinaryOperation("sub", allInputs),
+            new BinaryOperation("mul", allInputs),
+            new BinaryOperation("div", allInputs),
+            new BinaryOperation("rem", allInputs),
+    };
+
+    private static final BinaryOperation[] integralOperations = new BinaryOperation[] {
+            new BinaryOperation("add", allInputs),
+            new BinaryOperation("sub", allInputs),
+            new BinaryOperation("mul", allInputs),
+            new BinaryOperation("div", allInputs),
+            new BinaryOperation("rem", allInputs),
+            new BinaryOperation("and", integralInputs),
+            new BinaryOperation("or", integralInputs),
+            new BinaryOperation("xor", integralInputs),
+            new BinaryOperation("shl", integralInputs),
+            new BinaryOperation("shr", integralInputs),
+            new BinaryOperation("ushr", integralInputs),
+    };
+
+    private static final TypeDef[] types = new TypeDef[] {
+            new TypeDef("boolean", new UnaryOperation[0], booleanOperations),
+            new TypeDef("byte", unaryOperations, integralOperations),
+            new TypeDef("char", unaryOperations, integralOperations),
+            new TypeDef("short", unaryOperations, integralOperations),
+            new TypeDef("int", unaryOperations, integralOperations),
+            new TypeDef("long", unaryOperations, integralOperations),
+            new TypeDef("float", unaryOperations, floatOperations),
+            new TypeDef("double", unaryOperations, floatOperations),
+    };
+
+
+    public static void main(String[] args) throws IOException {
+        if (args.length != 1) {
+            System.err.println("Usage: java org.jf.dexlib2.AccessorTestGenerator <output_file>");
+        }
+
+        URL stgUrl = AccessorTestGenerator.class.getClassLoader().getResource("AccessorTest.stg");
+        STGroupFile stg = new STGroupFile(stgUrl, "utf-8", '<', '>');
+        ST fileSt = stg.getInstanceOf("file");
+        fileSt.add("types", types);
+
+        PrintWriter w = null;
+        try {
+            w = new PrintWriter(new BufferedWriter(new FileWriter(args[0])));
+            w.print(fileSt.render());
+        } finally {
+            if (w != null) {
+                w.close();
+            }
+        }
+    }
+}
+
+
+
diff --git a/dexlib2/accessorTestGenerator/src/main/resources/AccessorTest.stg b/dexlib2/accessorTestGenerator/src/main/resources/AccessorTest.stg
new file mode 100644
index 0000000..5c76eec
--- /dev/null
+++ b/dexlib2/accessorTestGenerator/src/main/resources/AccessorTest.stg
@@ -0,0 +1,86 @@
+decl(type, name, value) ::= "<type> <name><init(value)>;"
+init(v) ::= "<if(v)> = <v><endif>"
+
+field_decl(type) ::= "private <type.name> <type.name>_val;"
+
+preinc_template(type) ::=  "++<type.name>_val;"
+postinc_template(type) ::= "<type.name>_val++;"
+predec_template(type) ::= "--<type.name>_val;"
+postdec_template(type) ::= "<type.name>_val--;"
+add_template(type) ::= "<type.name>_val += val;"
+sub_template(type) ::= "<type.name>_val -= val;"
+mul_template(type) ::= "<type.name>_val *= val;"
+div_template(type) ::= "<type.name>_val /= val;"
+rem_template(type) ::= "<type.name>_val %= val;"
+and_template(type) ::= "<type.name>_val &= val;"
+or_template(type) ::= "<type.name>_val |= val;"
+xor_template(type) ::= "<type.name>_val ^= val;"
+shl_template(type) ::= "<type.name>_val \<\<= val;"
+shr_template(type) ::= "<type.name>_val >>= val;"
+ushr_template(type) ::= "<type.name>_val >>>= val;"
+
+operation_template_name(operation) ::= "<operation.name>_template"
+
+binary_method(input, type, binary_operation) ::= <<
+public void <type.name>_<binary_operation.name>(<input> val) {
+    <(operation_template_name(binary_operation))(type)>
+}
+>>
+
+binary_methods(binary_operation, type) ::= <<
+<binary_operation.inputTypes:binary_method(type, binary_operation);separator="\n\n">
+>>
+
+unary_method(unary_operation, type) ::= <<
+public void <type.name>_<unary_operation.name>() {
+    <(operation_template_name(unary_operation))(type)>
+}
+>>
+
+type_methods(type) ::= <<
+<[type.unaryOperations:unary_method(type), type.binaryOperations:binary_methods(type)];separator="\n\n">
+>>
+
+
+file(types) ::= <<
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2;
+
+public class AccessorTypes {
+    <types:field_decl();separator="\n">
+
+    private class Accessors {
+        <types:type_methods();separator="\n\n">
+    }
+}
+>>
diff --git a/dexlib2/build.gradle b/dexlib2/build.gradle
new file mode 100644
index 0000000..b6a7490
--- /dev/null
+++ b/dexlib2/build.gradle
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+ext.testAccessorOutputDir = file("${buildDir}/generated-src/accessorTest/java")
+ext.testAccessorOutputFile = file("${testAccessorOutputDir}/org/jf/dexlib2/AccessorTypes.java")
+
+sourceSets {
+    accessorTest {
+        java {
+            srcDir testAccessorOutputDir
+        }
+    }
+}
+
+configurations {
+    accessorTestGenerator
+    dx
+}
+
+dependencies {
+    compile depends.findbugs
+    compile depends.guava
+
+    testCompile depends.junit
+    testCompile depends.mockito
+
+    accessorTestGenerator project('accessorTestGenerator')
+
+    dx depends.dx
+}
+
+// You must manually execute this task to regenerate SyntheticAccessorFSM.java, after modifying the ragel file
+// e.g. ./gradlew ragel
+task ragel(type:Exec) {
+    workingDir = 'src/main/ragel'
+
+    commandLine 'ragel', '-J', '-o', file('src/main/java/org/jf/dexlib2/util/SyntheticAccessorFSM.java'),
+            'SyntheticAccessorFSM.rl'
+}
+
+task generateAccessorTestSource(type: JavaExec) {
+    file(testAccessorOutputFile.parent).mkdirs()
+    outputs.dir file(testAccessorOutputDir)
+
+    classpath = configurations.accessorTestGenerator
+    main = 'org.jf.dexlib2.AccessorTestGenerator'
+    args testAccessorOutputFile
+}
+compileAccessorTestJava.dependsOn(generateAccessorTestSource)
+
+// You must manually execute this task to regenerate src/test/resources/accessorTest.dex
+task generateAccessorTestDex(type: JavaExec, dependsOn: compileAccessorTestJava) {
+    def outputDex = file('src/test/resources/accessorTest.dex')
+    file(outputDex.parent).mkdirs()
+
+    inputs.dir(project.sourceSets.accessorTest.output.classesDirs)
+    outputs.file outputDex
+
+    main 'com.android.dx.command.Main'
+    classpath = configurations.dx
+
+    args '--dex'
+    args '--no-strict'
+    args "--output=${outputDex}"
+    args sourceSets.accessorTest.output.classesDirs
+}
+
+uploadArchives {
+    repositories.mavenDeployer {
+        pom.project {
+            description 'dexlib2 is a library for reading/modifying/writing Android dex files'
+            scm {
+                url 'https://github.com/JesusFreke/smali/tree/master/dexlib2'
+            }
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/AccessFlags.java b/dexlib2/src/main/java/org/jf/dexlib2/AccessFlags.java
new file mode 100644
index 0000000..d3cf74c
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/AccessFlags.java
@@ -0,0 +1,185 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2;
+
+import java.util.HashMap;
+
+public enum AccessFlags
+{
+    PUBLIC(0x1, "public", true, true, true),
+    PRIVATE(0x2, "private", true, true, true),
+    PROTECTED(0x4, "protected", true, true, true),
+    STATIC(0x8, "static", true, true, true),
+    FINAL(0x10, "final", true, true, true),
+    SYNCHRONIZED(0x20, "synchronized", false, true, false),
+    VOLATILE(0x40, "volatile", false, false, true),
+    BRIDGE(0x40, "bridge", false, true, false),
+    TRANSIENT(0x80, "transient", false, false, true),
+    VARARGS(0x80, "varargs", false, true, false),
+    NATIVE(0x100, "native", false, true, false),
+    INTERFACE(0x200, "interface", true, false, false),
+    ABSTRACT(0x400, "abstract", true, true, false),
+    STRICTFP(0x800, "strictfp", false, true, false),
+    SYNTHETIC(0x1000, "synthetic", true, true, true),
+    ANNOTATION(0x2000, "annotation", true, false, false),
+    ENUM(0x4000, "enum", true, false, true),
+    CONSTRUCTOR(0x10000, "constructor", false, true, false),
+    DECLARED_SYNCHRONIZED(0x20000, "declared-synchronized", false, true, false);
+
+    private int value;
+    private String accessFlagName;
+    private boolean validForClass;
+    private boolean validForMethod;
+    private boolean validForField;
+
+    //cache the array of all AccessFlags, because .values() allocates a new array for every call
+    private final static AccessFlags[] allFlags;
+
+    private static HashMap<String, AccessFlags> accessFlagsByName;
+
+    static {
+        allFlags = AccessFlags.values();
+
+        accessFlagsByName = new HashMap<String, AccessFlags>();
+        for (AccessFlags accessFlag: allFlags) {
+            accessFlagsByName.put(accessFlag.accessFlagName, accessFlag);
+        }
+    }
+
+    private AccessFlags(int value, String accessFlagName, boolean validForClass, boolean validForMethod,
+                        boolean validForField) {
+        this.value = value;
+        this.accessFlagName = accessFlagName;
+        this.validForClass = validForClass;
+        this.validForMethod = validForMethod;
+        this.validForField = validForField;
+    }
+
+    public boolean isSet(int accessFlags) {
+        return (this.value & accessFlags) != 0;
+    }
+
+    public static AccessFlags[] getAccessFlagsForClass(int accessFlagValue) {
+        int size = 0;
+        for (AccessFlags accessFlag: allFlags) {
+            if (accessFlag.validForClass && (accessFlagValue & accessFlag.value) != 0) {
+                size++;
+            }
+        }
+
+        AccessFlags[] accessFlags = new AccessFlags[size];
+        int accessFlagsPosition = 0;
+        for (AccessFlags accessFlag: allFlags) {
+            if (accessFlag.validForClass && (accessFlagValue & accessFlag.value) != 0) {
+                accessFlags[accessFlagsPosition++] = accessFlag;
+            }
+        }
+        return accessFlags;
+    }
+
+    private static String formatAccessFlags(AccessFlags[] accessFlags) {
+        int size = 0;
+        for (AccessFlags accessFlag: accessFlags) {
+            size += accessFlag.toString().length() + 1;
+        }
+
+        StringBuilder sb = new StringBuilder(size);
+        for (AccessFlags accessFlag: accessFlags) {
+            sb.append(accessFlag.toString());
+            sb.append(" ");
+        }
+        if (accessFlags.length > 0) {
+            sb.delete(sb.length() - 1, sb.length());
+        }
+        return sb.toString();
+    }
+
+    public static String formatAccessFlagsForClass(int accessFlagValue) {
+        return formatAccessFlags(getAccessFlagsForClass(accessFlagValue));
+    }
+
+    public static AccessFlags[] getAccessFlagsForMethod(int accessFlagValue) {
+        int size = 0;
+        for (AccessFlags accessFlag: allFlags) {
+            if (accessFlag.validForMethod && (accessFlagValue & accessFlag.value) != 0) {
+                size++;
+            }
+        }
+
+        AccessFlags[] accessFlags = new AccessFlags[size];
+        int accessFlagsPosition = 0;
+        for (AccessFlags accessFlag: allFlags) {
+            if (accessFlag.validForMethod && (accessFlagValue & accessFlag.value) != 0) {
+                accessFlags[accessFlagsPosition++] = accessFlag;
+            }
+        }
+        return accessFlags;
+    }
+
+    public static String formatAccessFlagsForMethod(int accessFlagValue) {
+        return formatAccessFlags(getAccessFlagsForMethod(accessFlagValue));
+    }
+
+    public static AccessFlags[] getAccessFlagsForField(int accessFlagValue) {
+        int size = 0;
+        for (AccessFlags accessFlag: allFlags) {
+            if (accessFlag.validForField && (accessFlagValue & accessFlag.value) != 0) {
+                size++;
+            }
+        }
+
+        AccessFlags[] accessFlags = new AccessFlags[size];
+        int accessFlagsPosition = 0;
+        for (AccessFlags accessFlag: allFlags) {
+            if (accessFlag.validForField && (accessFlagValue & accessFlag.value) != 0) {
+                accessFlags[accessFlagsPosition++] = accessFlag;
+            }
+        }
+        return accessFlags;
+    }
+
+    public static String formatAccessFlagsForField(int accessFlagValue) {
+        return formatAccessFlags(getAccessFlagsForField(accessFlagValue));
+    }
+
+    public static AccessFlags getAccessFlag(String accessFlag) {
+        return accessFlagsByName.get(accessFlag);
+    }
+
+    public int getValue() {
+        return value;
+    }
+
+    public String toString() {
+        return accessFlagName;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/AnnotationVisibility.java b/dexlib2/src/main/java/org/jf/dexlib2/AnnotationVisibility.java
new file mode 100644
index 0000000..06c4677
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/AnnotationVisibility.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2;
+
+import org.jf.util.ExceptionWithContext;
+
+public final class AnnotationVisibility {
+    public static final int BUILD = 0;
+    public static final int RUNTIME = 1;
+    public static final int SYSTEM = 2;
+
+    private static String[] NAMES = new String[] {"build", "runtime", "system"};
+
+    public static String getVisibility(int visibility) {
+        if (visibility < 0 || visibility >= NAMES.length) {
+            throw new ExceptionWithContext("Invalid annotation visibility %d", visibility);
+        }
+        return NAMES[visibility];
+    }
+
+    public static int getVisibility(String visibility) {
+        visibility = visibility.toLowerCase();
+        if (visibility.equals("build")) {
+            return BUILD;
+        }
+        if (visibility.equals("runtime")) {
+            return RUNTIME;
+        }
+        if (visibility.equals("system")) {
+            return SYSTEM;
+        }
+        throw new ExceptionWithContext("Invalid annotation visibility: %s", visibility);
+    }
+
+    private AnnotationVisibility() {}
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/DebugItemType.java b/dexlib2/src/main/java/org/jf/dexlib2/DebugItemType.java
new file mode 100644
index 0000000..7f4d887
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/DebugItemType.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2;
+
+public final class DebugItemType {
+    // The debug items that directly correspond with one of the dexlib2.iface.debug interfaces
+    public static final int START_LOCAL = 0x03;
+    public static final int END_LOCAL = 0x05;
+    public static final int RESTART_LOCAL = 0x06;
+    public static final int PROLOGUE_END = 0x07;
+    public static final int EPILOGUE_BEGIN = 0x08;
+    public static final int SET_SOURCE_FILE = 0x09;
+    public static final int LINE_NUMBER = 0x0a;
+
+    // Other items, which are typically handled internally
+    public static final int END_SEQUENCE = 0x00;
+    public static final int ADVANCE_PC = 0x01;
+    public static final int ADVANCE_LINE = 0x02;
+    public static final int START_LOCAL_EXTENDED = 0x04;
+
+    private DebugItemType() {}
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/DexFileFactory.java b/dexlib2/src/main/java/org/jf/dexlib2/DexFileFactory.java
new file mode 100644
index 0000000..4841fde
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/DexFileFactory.java
@@ -0,0 +1,535 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import com.google.common.io.ByteStreams;
+import com.google.common.io.Files;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile.NotADexFile;
+import org.jf.dexlib2.dexbacked.DexBackedOdexFile;
+import org.jf.dexlib2.dexbacked.OatFile;
+import org.jf.dexlib2.dexbacked.OatFile.NotAnOatFileException;
+import org.jf.dexlib2.dexbacked.OatFile.VdexProvider;
+import org.jf.dexlib2.dexbacked.ZipDexContainer;
+import org.jf.dexlib2.dexbacked.ZipDexContainer.NotAZipFileException;
+import org.jf.dexlib2.iface.DexFile;
+import org.jf.dexlib2.iface.MultiDexContainer;
+import org.jf.dexlib2.writer.pool.DexPool;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.*;
+import java.util.List;
+
+public final class DexFileFactory {
+
+    @Nonnull
+    public static DexBackedDexFile loadDexFile(@Nonnull String path, @Nullable Opcodes opcodes) throws IOException {
+        return loadDexFile(new File(path), opcodes);
+    }
+
+    /**
+     * Loads a dex/apk/odex/oat file.
+     *
+     * For oat files with multiple dex files, the first will be opened. For zip/apk files, the "classes.dex" entry
+     * will be opened.
+     *
+     * @param file The file to open
+     * @param opcodes The set of opcodes to use
+     * @return A DexBackedDexFile for the given file
+     *
+     * @throws UnsupportedOatVersionException If file refers to an unsupported oat file
+     * @throws DexFileNotFoundException If file does not exist, if file is a zip file but does not have a "classes.dex"
+     * entry, or if file is an oat file that has no dex entries.
+     * @throws UnsupportedFileTypeException If file is not a valid dex/zip/odex/oat file, or if the "classes.dex" entry
+     * in a zip file is not a valid dex file
+     */
+    @Nonnull
+    public static DexBackedDexFile loadDexFile(@Nonnull File file, @Nullable Opcodes opcodes) throws IOException {
+        if (!file.exists()) {
+            throw new DexFileNotFoundException("%s does not exist", file.getName());
+        }
+
+        try {
+            ZipDexContainer container = new ZipDexContainer(file, opcodes);
+            return new DexEntryFinder(file.getPath(), container).findEntry("classes.dex", true).getDexFile();
+        } catch (NotAZipFileException ex) {
+            // eat it and continue
+        }
+
+        InputStream inputStream = new BufferedInputStream(new FileInputStream(file));
+        try {
+            try {
+                return DexBackedDexFile.fromInputStream(opcodes, inputStream);
+            } catch (DexBackedDexFile.NotADexFile ex) {
+                // just eat it
+            }
+
+            try {
+                return DexBackedOdexFile.fromInputStream(opcodes, inputStream);
+            } catch (DexBackedOdexFile.NotAnOdexFile ex) {
+                // just eat it
+            }
+
+            // Note: DexBackedDexFile.fromInputStream and DexBackedOdexFile.fromInputStream will reset inputStream
+            // back to the same position, if they fails
+
+            OatFile oatFile = null;
+            try {
+                oatFile = OatFile.fromInputStream(inputStream, new FilenameVdexProvider(file));
+            } catch (NotAnOatFileException ex) {
+                // just eat it
+            }
+
+            if (oatFile != null) {
+                if (oatFile.isSupportedVersion() == OatFile.UNSUPPORTED) {
+                    throw new UnsupportedOatVersionException(oatFile);
+                }
+
+                List<DexBackedDexFile> oatDexFiles = oatFile.getDexFiles();
+
+                if (oatDexFiles.size() == 0) {
+                    throw new DexFileNotFoundException("Oat file %s contains no dex files", file.getName());
+                }
+
+                return oatDexFiles.get(0);
+            }
+        } finally {
+            inputStream.close();
+        }
+
+        throw new UnsupportedFileTypeException("%s is not an apk, dex, odex or oat file.", file.getPath());
+    }
+
+    /**
+     * Loads a dex entry from a container format (zip/oat)
+     *
+     * This has two modes of operation, depending on the exactMatch parameter. When exactMatch is true, it will only
+     * load an entry whose name exactly matches that provided by the dexEntry parameter.
+     *
+     * When exactMatch is false, then it will search for any entry that dexEntry is a path suffix of. "path suffix"
+     * meaning all the path components in dexEntry must fully match the corresponding path components in the entry name,
+     * but some path components at the beginning of entry name can be missing.
+     *
+     * For example, if an oat file contains a "/system/framework/framework.jar:classes2.dex" entry, then the following
+     * will match (not an exhaustive list):
+     *
+     * "/system/framework/framework.jar:classes2.dex"
+     * "system/framework/framework.jar:classes2.dex"
+     * "framework/framework.jar:classes2.dex"
+     * "framework.jar:classes2.dex"
+     * "classes2.dex"
+     *
+     * Note that partial path components specifically don't match. So something like "work/framework.jar:classes2.dex"
+     * would not match.
+     *
+     * If dexEntry contains an initial slash, it will be ignored for purposes of this suffix match -- but not when
+     * performing an exact match.
+     *
+     * If multiple entries match the given dexEntry, a MultipleMatchingDexEntriesException will be thrown
+     *
+     * @param file The container file. This must be either a zip (apk) file or an oat file.
+     * @param dexEntry The name of the entry to load. This can either be the exact entry name, if exactMatch is true,
+     *                 or it can be a path suffix.
+     * @param exactMatch If true, dexE
+     * @param opcodes The set of opcodes to use
+     * @return A DexBackedDexFile for the given entry
+     *
+     * @throws UnsupportedOatVersionException If file refers to an unsupported oat file
+     * @throws DexFileNotFoundException If the file does not exist, or if no matching entry could be found
+     * @throws UnsupportedFileTypeException If file is not a valid zip/oat file, or if the matching entry is not a
+     * valid dex file
+     * @throws MultipleMatchingDexEntriesException If multiple entries match the given dexEntry
+     */
+    public static MultiDexContainer.DexEntry<? extends DexBackedDexFile> loadDexEntry(
+            @Nonnull File file,
+            @Nonnull String dexEntry,
+            boolean exactMatch,
+            @Nullable Opcodes opcodes) throws IOException {
+        if (!file.exists()) {
+            throw new DexFileNotFoundException("Container file %s does not exist", file.getName());
+        }
+
+        try {
+            ZipDexContainer container = new ZipDexContainer(file, opcodes);
+            return new DexEntryFinder(file.getPath(), container).findEntry(dexEntry, exactMatch);
+        } catch (NotAZipFileException ex) {
+            // eat it and continue
+        }
+
+        InputStream inputStream = new BufferedInputStream(new FileInputStream(file));
+        try {
+            OatFile oatFile = null;
+            try {
+                oatFile = OatFile.fromInputStream(inputStream, new FilenameVdexProvider(file));
+            } catch (NotAnOatFileException ex) {
+                // just eat it
+            }
+
+            if (oatFile != null) {
+                if (oatFile.isSupportedVersion() == OatFile.UNSUPPORTED) {
+                    throw new UnsupportedOatVersionException(oatFile);
+                }
+
+                List<? extends DexFile> oatDexFiles = oatFile.getDexFiles();
+
+                if (oatDexFiles.size() == 0) {
+                    throw new DexFileNotFoundException("Oat file %s contains no dex files", file.getName());
+                }
+
+                return new DexEntryFinder(file.getPath(), oatFile).findEntry(dexEntry, exactMatch);
+            }
+        } finally {
+            inputStream.close();
+        }
+
+        throw new UnsupportedFileTypeException("%s is not an apk or oat file.", file.getPath());
+    }
+
+    /**
+     * Loads a file containing 1 or more dex files
+     *
+     * If the given file is a dex or odex file, it will return a MultiDexContainer containing that single entry.
+     * Otherwise, for an oat or zip file, it will return an OatFile or ZipDexContainer respectively.
+     *
+     * @param file The file to open
+     * @param opcodes The set of opcodes to use
+     * @return A MultiDexContainer
+     * @throws DexFileNotFoundException If the given file does not exist
+     * @throws UnsupportedFileTypeException If the given file is not a valid dex/zip/odex/oat file
+     */
+    public static MultiDexContainer<? extends DexBackedDexFile> loadDexContainer(
+            @Nonnull File file, @Nullable final Opcodes opcodes) throws IOException {
+        if (!file.exists()) {
+            throw new DexFileNotFoundException("%s does not exist", file.getName());
+        }
+
+        ZipDexContainer zipDexContainer = new ZipDexContainer(file, opcodes);
+        if (zipDexContainer.isZipFile()) {
+            return zipDexContainer;
+        }
+
+        InputStream inputStream = new BufferedInputStream(new FileInputStream(file));
+        try {
+            try {
+                DexBackedDexFile dexFile = DexBackedDexFile.fromInputStream(opcodes, inputStream);
+                return new SingletonMultiDexContainer(file.getPath(), dexFile);
+            } catch (DexBackedDexFile.NotADexFile ex) {
+                // just eat it
+            }
+
+            try {
+                DexBackedOdexFile odexFile = DexBackedOdexFile.fromInputStream(opcodes, inputStream);
+                return new SingletonMultiDexContainer(file.getPath(), odexFile);
+            } catch (DexBackedOdexFile.NotAnOdexFile ex) {
+                // just eat it
+            }
+
+            // Note: DexBackedDexFile.fromInputStream and DexBackedOdexFile.fromInputStream will reset inputStream
+            // back to the same position, if they fails
+
+            OatFile oatFile = null;
+            try {
+                oatFile = OatFile.fromInputStream(inputStream, new FilenameVdexProvider(file));
+            } catch (NotAnOatFileException ex) {
+                // just eat it
+            }
+
+            if (oatFile != null) {
+                // TODO: we should support loading earlier oat files, just not deodexing them
+                if (oatFile.isSupportedVersion() == OatFile.UNSUPPORTED) {
+                    throw new UnsupportedOatVersionException(oatFile);
+                }
+                return oatFile;
+            }
+        } finally {
+            inputStream.close();
+        }
+
+        throw new UnsupportedFileTypeException("%s is not an apk, dex, odex or oat file.", file.getPath());
+    }
+
+    /**
+     * Writes a DexFile out to disk
+     *
+     * @param path The path to write the dex file to
+     * @param dexFile a DexFile to write
+     */
+    public static void writeDexFile(@Nonnull String path, @Nonnull DexFile dexFile) throws IOException {
+        DexPool.writeTo(path, dexFile);
+    }
+
+    private DexFileFactory() {}
+
+    public static class DexFileNotFoundException extends ExceptionWithContext {
+        public DexFileNotFoundException(@Nullable String message, Object... formatArgs) {
+            super(message, formatArgs);
+        }
+
+        public DexFileNotFoundException(Throwable cause, @Nullable String message, Object... formatArgs) {
+            super(cause, message, formatArgs);
+        }
+    }
+
+    public static class UnsupportedOatVersionException extends ExceptionWithContext {
+        @Nonnull public final OatFile oatFile;
+
+        public UnsupportedOatVersionException(@Nonnull OatFile oatFile) {
+            super("Unsupported oat version: %d", oatFile.getOatVersion());
+            this.oatFile = oatFile;
+        }
+    }
+
+    public static class MultipleMatchingDexEntriesException extends ExceptionWithContext {
+        public MultipleMatchingDexEntriesException(@Nonnull String message, Object... formatArgs) {
+            super(String.format(message, formatArgs));
+        }
+    }
+
+    public static class UnsupportedFileTypeException extends ExceptionWithContext {
+        public UnsupportedFileTypeException(@Nonnull String message, Object... formatArgs) {
+            super(String.format(message, formatArgs));
+        }
+    }
+
+    /**
+     * Matches two entries fully, ignoring any initial slash, if any
+     */
+    private static boolean fullEntryMatch(@Nonnull String entry, @Nonnull String targetEntry) {
+        if (entry.equals(targetEntry)) {
+            return true;
+        }
+
+        if (entry.charAt(0) == '/') {
+            entry = entry.substring(1);
+        }
+
+        if (targetEntry.charAt(0) == '/') {
+            targetEntry = targetEntry.substring(1);
+        }
+
+        return entry.equals(targetEntry);
+    }
+
+    /**
+     * Performs a partial match against entry and targetEntry.
+     *
+     * This is considered a partial match if targetEntry is a suffix of entry, and if the suffix starts
+     * on a path "part" (ignoring the initial separator, if any). '/' and ':' and '!' are considered separators for
+     * this.
+     *
+     * So entry="/blah/blah/something.dex" and targetEntry="lah/something.dex" shouldn't match, but
+     * both targetEntry="blah/something.dex" and "/blah/something.dex" should match.
+     */
+    private static boolean partialEntryMatch(String entry, String targetEntry) {
+        if (entry.equals(targetEntry)) {
+            return true;
+        }
+
+        if (!entry.endsWith(targetEntry)) {
+            return false;
+        }
+
+        // Make sure the first matching part is a full entry. We don't want to match "/blah/blah/something.dex" with
+        // "lah/something.dex", but both "/blah/something.dex" and "blah/something.dex" should match
+        char precedingChar = entry.charAt(entry.length() - targetEntry.length() - 1);
+        char firstTargetChar = targetEntry.charAt(0);
+        // This is a device path, so we should always use the linux separator '/', rather than the current platform's
+        // separator
+        return firstTargetChar == ':' || firstTargetChar == '/' || firstTargetChar == '!' ||
+                precedingChar == ':' || precedingChar == '/' || precedingChar == '!';
+    }
+
+    protected static class DexEntryFinder {
+        private final String filename;
+        private final MultiDexContainer<? extends DexBackedDexFile> dexContainer;
+
+        public DexEntryFinder(@Nonnull String filename,
+                              @Nonnull MultiDexContainer<? extends DexBackedDexFile> dexContainer) {
+            this.filename = filename;
+            this.dexContainer = dexContainer;
+        }
+
+        @Nonnull
+        public MultiDexContainer.DexEntry<? extends DexBackedDexFile> findEntry(
+                @Nonnull String targetEntry, boolean exactMatch) throws IOException {
+            if (exactMatch) {
+                try {
+                    MultiDexContainer.DexEntry<? extends DexBackedDexFile> entry = dexContainer.getEntry(targetEntry);
+                    if (entry == null) {
+                        throw new DexFileNotFoundException("Could not find entry %s in %s.", targetEntry, filename);
+                    }
+                    return entry;
+                } catch (NotADexFile ex) {
+                    throw new UnsupportedFileTypeException("Entry %s in %s is not a dex file", targetEntry, filename);
+                }
+            }
+
+            // find all full and partial matches
+            List<String> fullMatches = Lists.newArrayList();
+            List<MultiDexContainer.DexEntry<? extends DexBackedDexFile>> fullEntries = Lists.newArrayList();
+            List<String> partialMatches = Lists.newArrayList();
+            List<MultiDexContainer.DexEntry<? extends DexBackedDexFile>> partialEntries = Lists.newArrayList();
+            for (String entry: dexContainer.getDexEntryNames()) {
+                if (fullEntryMatch(entry, targetEntry)) {
+                    // We want to grab all full matches, regardless of whether they're actually a dex file.
+                    fullMatches.add(entry);
+                    MultiDexContainer.DexEntry<? extends DexBackedDexFile> dexEntry = dexContainer.getEntry(entry);
+                    assert dexEntry != null;
+                    fullEntries.add(dexEntry);
+                } else if (partialEntryMatch(entry, targetEntry)) {
+                    partialMatches.add(entry);
+                    MultiDexContainer.DexEntry<? extends DexBackedDexFile> dexEntry = dexContainer.getEntry(entry);
+                    assert dexEntry != null;
+                    partialEntries.add(dexEntry);
+                }
+            }
+
+            // full matches always take priority
+            if (fullEntries.size() == 1) {
+                try {
+                    MultiDexContainer.DexEntry<? extends DexBackedDexFile> dexEntry = fullEntries.get(0);
+                    assert dexEntry != null;
+                    return dexEntry;
+                } catch (NotADexFile ex) {
+                    throw new UnsupportedFileTypeException("Entry %s in %s is not a dex file",
+                            fullMatches.get(0), filename);
+                }
+            }
+            if (fullEntries.size() > 1) {
+                // This should be quite rare. This would only happen if an oat file has two entries that differ
+                // only by an initial path separator. e.g. "/blah/blah.dex" and "blah/blah.dex"
+                throw new MultipleMatchingDexEntriesException(String.format(
+                        "Multiple entries in %s match %s: %s", filename, targetEntry,
+                        Joiner.on(", ").join(fullMatches)));
+            }
+
+            if (partialEntries.size() == 0) {
+                throw new DexFileNotFoundException("Could not find a dex entry in %s matching %s",
+                        filename, targetEntry);
+            }
+            if (partialEntries.size() > 1) {
+                throw new MultipleMatchingDexEntriesException(String.format(
+                        "Multiple dex entries in %s match %s: %s", filename, targetEntry,
+                        Joiner.on(", ").join(partialMatches)));
+            }
+            return partialEntries.get(0);
+        }
+    }
+
+    private static class SingletonMultiDexContainer implements MultiDexContainer<DexBackedDexFile> {
+        private final String entryName;
+        private final DexBackedDexFile dexFile;
+
+        public SingletonMultiDexContainer(@Nonnull String entryName, @Nonnull DexBackedDexFile dexFile) {
+            this.entryName = entryName;
+            this.dexFile = dexFile;
+        }
+
+        @Nonnull @Override public List<String> getDexEntryNames() {
+            return ImmutableList.of(entryName);
+        }
+
+        @Nullable @Override public DexEntry<DexBackedDexFile> getEntry(@Nonnull String entryName) {
+            if (entryName.equals(this.entryName)) {
+                return new DexEntry<DexBackedDexFile>() {
+                    @Nonnull
+                    @Override
+                    public String getEntryName() {
+                        return entryName;
+                    }
+
+                    @Nonnull
+                    @Override
+                    public DexBackedDexFile getDexFile() {
+                        return dexFile;
+                    }
+
+                    @Nonnull
+                    @Override
+                    public MultiDexContainer<? extends DexBackedDexFile> getContainer() {
+                        return SingletonMultiDexContainer.this;
+                    }
+                };
+            }
+            return null;
+        }
+    }
+
+    public static class FilenameVdexProvider implements VdexProvider {
+        private final File vdexFile;
+
+        @Nullable
+        private byte[] buf = null;
+        private boolean loadedVdex = false;
+
+        public FilenameVdexProvider(File oatFile) {
+            File oatParent = oatFile.getAbsoluteFile().getParentFile();
+            String baseName = Files.getNameWithoutExtension(oatFile.getAbsolutePath());
+            vdexFile = new File(oatParent, baseName + ".vdex");
+        }
+
+        @Nullable @Override public byte[] getVdex() {
+            if (!loadedVdex) {
+                File candidateFile = vdexFile;
+
+                if (!candidateFile.exists()) {
+                    // On api 28, for framework files, the vdex file in the architecture-specific directory is just a
+                    // symlink to a common vdex file in the framework directory. When loop-mounting a system image, that
+                    // symlink won't resolve because it uses an absolute path. As a workaround, we'll just search upward
+                    // one directory to see if it's there.
+                    File parentDirectory = candidateFile.getParentFile().getParentFile();
+                    if (parentDirectory != null) {
+                        candidateFile = new File(parentDirectory, vdexFile.getName());
+                    }
+                }
+
+                if (candidateFile.exists()) {
+                    try {
+                        buf = ByteStreams.toByteArray(new FileInputStream(candidateFile));
+                    } catch (FileNotFoundException e) {
+                        buf = null;
+                    } catch (IOException ex) {
+                        throw new RuntimeException(ex);
+                    }
+                }
+                loadedVdex = true;
+            }
+
+            return buf;
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/Format.java b/dexlib2/src/main/java/org/jf/dexlib2/Format.java
new file mode 100644
index 0000000..fd90a6d
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/Format.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2;
+
+public enum Format {
+    Format10t(2),
+    Format10x(2),
+    Format11n(2),
+    Format11x(2),
+    Format12x(2),
+    Format20bc(4),
+    Format20t(4),
+    Format21c(4),
+    Format21ih(4),
+    Format21lh(4),
+    Format21s(4),
+    Format21t(4),
+    Format22b(4),
+    Format22c(4),
+    Format22cs(4),
+    Format22s(4),
+    Format22t(4),
+    Format22x(4),
+    Format23x(4),
+    Format30t(6),
+    Format31c(6),
+    Format31i(6),
+    Format31t(6),
+    Format32x(6),
+    Format35c(6),
+    Format35mi(6),
+    Format35ms(6),
+    Format3rc(6),
+    Format3rmi(6),
+    Format3rms(6),
+    Format45cc(8),
+    Format4rcc(8),
+    Format51l(10),
+    ArrayPayload(-1, true),
+    PackedSwitchPayload(-1, true),
+    SparseSwitchPayload(-1, true),
+    UnresolvedOdexInstruction(-1);
+
+    public final int size;
+    public final boolean isPayloadFormat;
+
+    private Format(int size) {
+        this(size, false);
+    }
+
+    private Format(int size, boolean isPayloadFormat) {
+        this.size = size;
+        this.isPayloadFormat = isPayloadFormat;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/HiddenApiRestriction.java b/dexlib2/src/main/java/org/jf/dexlib2/HiddenApiRestriction.java
new file mode 100644
index 0000000..46880e1
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/HiddenApiRestriction.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright 2020, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2;
+
+import com.google.common.collect.ImmutableSet;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringJoiner;
+
+public enum HiddenApiRestriction {
+    WHITELIST(0, "whitelist", false),
+    GREYLIST(1, "greylist", false),
+    BLACKLIST(2, "blacklist", false),
+    GREYLIST_MAX_O(3, "greylist-max-o", false),
+    GREYLIST_MAX_P(4, "greylist-max-p", false),
+    GREYLIST_MAX_Q(5, "greylist-max-q", false),
+    CORE_PLATFORM_API(8, "core-platform-api", true);
+
+    private static final HiddenApiRestriction[] hiddenApiFlags = new HiddenApiRestriction[] {
+            WHITELIST,
+            GREYLIST,
+            BLACKLIST,
+            GREYLIST_MAX_O,
+            GREYLIST_MAX_P,
+            GREYLIST_MAX_Q
+    };
+
+    private static final HiddenApiRestriction[] domainSpecificApiFlags = new HiddenApiRestriction[] {
+            CORE_PLATFORM_API
+    };
+
+    private static final Map<String, HiddenApiRestriction> hiddenApiRestrictionsByName;
+
+    static {
+        hiddenApiRestrictionsByName = new HashMap<>();
+        for (HiddenApiRestriction hiddenApiRestriction : HiddenApiRestriction.values()) {
+            hiddenApiRestrictionsByName.put(hiddenApiRestriction.toString(), hiddenApiRestriction);
+        }
+    }
+
+    private static final int HIDDENAPI_FLAG_MASK = 0x7;
+
+    private final int value;
+    private final String name;
+    private final boolean isDomainSpecificApiFlag;
+
+    HiddenApiRestriction(int value, String name, boolean isDomainSpecificApiFlag) {
+        this.value = value;
+        this.name = name;
+        this.isDomainSpecificApiFlag = isDomainSpecificApiFlag;
+    }
+
+    public String toString() {
+        return name;
+    }
+
+    public int getValue() {
+        return value;
+    }
+
+    public boolean isSet(int value) {
+        if (isDomainSpecificApiFlag) {
+            return (value & ~HIDDENAPI_FLAG_MASK) == this.value;
+        } else {
+            return (value & HIDDENAPI_FLAG_MASK) == this.value;
+        }
+    }
+
+    public boolean isDomainSpecificApiFlag() {
+        return isDomainSpecificApiFlag;
+    }
+
+    public static Set<HiddenApiRestriction> getAllFlags(int value) {
+        HiddenApiRestriction normalRestriction = hiddenApiFlags[value & HIDDENAPI_FLAG_MASK];
+
+        int domainSpecificPart = (value & ~HIDDENAPI_FLAG_MASK);
+        if (domainSpecificPart == 0) {
+            return ImmutableSet.of(normalRestriction);
+        }
+        return ImmutableSet.of(normalRestriction, domainSpecificApiFlags[(domainSpecificPart >> 3) - 1]);
+    }
+
+    public static String formatHiddenRestrictions(int value) {
+        StringJoiner joiner = new StringJoiner("|");
+        for (HiddenApiRestriction hiddenApiRestriction : getAllFlags(value)) {
+            joiner.add(hiddenApiRestriction.toString());
+        }
+        return joiner.toString();
+    }
+
+    public static int combineFlags(Iterable<HiddenApiRestriction> flags) {
+        boolean gotHiddenApiFlag = false;
+        boolean gotDomainSpecificApiFlag = false;
+
+        int value = 0;
+
+        for (HiddenApiRestriction flag : flags) {
+            if (flag.isDomainSpecificApiFlag) {
+                if (gotDomainSpecificApiFlag) {
+                    throw new IllegalArgumentException(
+                            "Cannot combine multiple flags for domain-specific api restrictions");
+                }
+                gotDomainSpecificApiFlag = true;
+                value += flag.value;
+            } else {
+                if (gotHiddenApiFlag) {
+                    throw new IllegalArgumentException(
+                            "Cannot combine multiple flags for hidden api restrictions");
+                }
+                gotHiddenApiFlag = true;
+                value += flag.value;
+            }
+        }
+
+        return value;
+    }
+
+    public static HiddenApiRestriction forName(String name) {
+        return hiddenApiRestrictionsByName.get(name);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/MethodHandleType.java b/dexlib2/src/main/java/org/jf/dexlib2/MethodHandleType.java
new file mode 100644
index 0000000..11ee010
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/MethodHandleType.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2;
+
+import com.google.common.collect.BiMap;
+import com.google.common.collect.ImmutableBiMap;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+
+public class MethodHandleType {
+    public static final int STATIC_PUT = 0;
+    public static final int STATIC_GET = 1;
+    public static final int INSTANCE_PUT = 2;
+    public static final int INSTANCE_GET = 3;
+    public static final int INVOKE_STATIC = 4;
+    public static final int INVOKE_INSTANCE = 5;
+    public static final int INVOKE_CONSTRUCTOR = 6;
+    public static final int INVOKE_DIRECT = 7;
+    public static final int INVOKE_INTERFACE = 8;
+
+    private static final BiMap<Integer, String> methodHandleTypeNames = new ImmutableBiMap.Builder<Integer, String>()
+            .put(STATIC_PUT, "static-put")
+            .put(STATIC_GET, "static-get")
+            .put(INSTANCE_PUT, "instance-put")
+            .put(INSTANCE_GET, "instance-get")
+            .put(INVOKE_STATIC, "invoke-static")
+            .put(INVOKE_INSTANCE, "invoke-instance")
+            .put(INVOKE_CONSTRUCTOR, "invoke-constructor")
+            .put(INVOKE_DIRECT, "invoke-direct")
+            .put(INVOKE_INTERFACE, "invoke-interface")
+            .build();
+
+    @Nonnull public static String toString(int methodHandleType) {
+        String val = methodHandleTypeNames.get(methodHandleType);
+        if (val == null) {
+            throw new InvalidMethodHandleTypeException(methodHandleType);
+        }
+        return val;
+    }
+
+    public static int getMethodHandleType(String methodHandleType) {
+        Integer ret = methodHandleTypeNames.inverse().get(methodHandleType);
+        if (ret == null) {
+            throw new ExceptionWithContext("Invalid method handle type: %s", methodHandleType);
+        }
+        return ret;
+    }
+
+    public static class InvalidMethodHandleTypeException extends ExceptionWithContext {
+        private final int methodHandleType;
+
+        public InvalidMethodHandleTypeException(int methodHandleType) {
+            super("Invalid method handle type: %d", methodHandleType);
+            this.methodHandleType = methodHandleType;
+        }
+
+        public InvalidMethodHandleTypeException(int methodHandleType, String message, Object... formatArgs) {
+            super(message, formatArgs);
+            this.methodHandleType = methodHandleType;
+        }
+
+        public int getMethodHandleType() {
+            return methodHandleType;
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/Opcode.java b/dexlib2/src/main/java/org/jf/dexlib2/Opcode.java
new file mode 100644
index 0000000..5d0eeae
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/Opcode.java
@@ -0,0 +1,494 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2;
+
+import com.google.common.collect.ImmutableRangeMap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Range;
+import com.google.common.collect.RangeMap;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+public enum Opcode
+{
+    NOP(0x00, "nop", ReferenceType.NONE, Format.Format10x, Opcode.CAN_CONTINUE),
+    MOVE(0x01, "move", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    MOVE_FROM16(0x02, "move/from16", ReferenceType.NONE, Format.Format22x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    MOVE_16(0x03, "move/16", ReferenceType.NONE, Format.Format32x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    MOVE_WIDE(0x04, "move-wide", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    MOVE_WIDE_FROM16(0x05, "move-wide/from16", ReferenceType.NONE, Format.Format22x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    MOVE_WIDE_16(0x06, "move-wide/16", ReferenceType.NONE, Format.Format32x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    MOVE_OBJECT(0x07, "move-object", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    MOVE_OBJECT_FROM16(0x08, "move-object/from16", ReferenceType.NONE, Format.Format22x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    MOVE_OBJECT_16(0x09, "move-object/16", ReferenceType.NONE, Format.Format32x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    MOVE_RESULT(0x0a, "move-result", ReferenceType.NONE, Format.Format11x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    MOVE_RESULT_WIDE(0x0b, "move-result-wide", ReferenceType.NONE, Format.Format11x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    MOVE_RESULT_OBJECT(0x0c, "move-result-object", ReferenceType.NONE, Format.Format11x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    MOVE_EXCEPTION(0x0d, "move-exception", ReferenceType.NONE, Format.Format11x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    RETURN_VOID(0x0e, "return-void", ReferenceType.NONE, Format.Format10x),
+    RETURN(0x0f, "return", ReferenceType.NONE, Format.Format11x),
+    RETURN_WIDE(0x10, "return-wide", ReferenceType.NONE, Format.Format11x),
+    RETURN_OBJECT(0x11, "return-object", ReferenceType.NONE, Format.Format11x),
+    CONST_4(0x12, "const/4", ReferenceType.NONE, Format.Format11n, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    CONST_16(0x13, "const/16", ReferenceType.NONE, Format.Format21s, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    CONST(0x14, "const", ReferenceType.NONE, Format.Format31i, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    CONST_HIGH16(0x15, "const/high16", ReferenceType.NONE, Format.Format21ih, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    CONST_WIDE_16(0x16, "const-wide/16", ReferenceType.NONE, Format.Format21s, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    CONST_WIDE_32(0x17, "const-wide/32", ReferenceType.NONE, Format.Format31i, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    CONST_WIDE(0x18, "const-wide", ReferenceType.NONE, Format.Format51l, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    CONST_WIDE_HIGH16(0x19, "const-wide/high16", ReferenceType.NONE, Format.Format21lh, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    CONST_STRING(0x1a, "const-string", ReferenceType.STRING, Format.Format21c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    CONST_STRING_JUMBO(0x1b, "const-string/jumbo", ReferenceType.STRING, Format.Format31c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    CONST_CLASS(0x1c, "const-class", ReferenceType.TYPE, Format.Format21c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    MONITOR_ENTER(0x1d, "monitor-enter", ReferenceType.NONE, Format.Format11x, Opcode.CAN_THROW | Opcode.CAN_CONTINUE),
+    MONITOR_EXIT(0x1e, "monitor-exit", ReferenceType.NONE, Format.Format11x, Opcode.CAN_THROW | Opcode.CAN_CONTINUE),
+    CHECK_CAST(0x1f, "check-cast", ReferenceType.TYPE, Format.Format21c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    INSTANCE_OF(0x20, "instance-of", ReferenceType.TYPE, Format.Format22c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    ARRAY_LENGTH(0x21, "array-length", ReferenceType.NONE, Format.Format12x, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    NEW_INSTANCE(0x22, "new-instance", ReferenceType.TYPE, Format.Format21c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    NEW_ARRAY(0x23, "new-array", ReferenceType.TYPE, Format.Format22c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    FILLED_NEW_ARRAY(0x24, "filled-new-array", ReferenceType.TYPE, Format.Format35c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_RESULT),
+    FILLED_NEW_ARRAY_RANGE(0x25, "filled-new-array/range", ReferenceType.TYPE, Format.Format3rc, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_RESULT),
+    FILL_ARRAY_DATA(0x26, "fill-array-data", ReferenceType.NONE, Format.Format31t, Opcode.CAN_CONTINUE),
+    THROW(0x27, "throw", ReferenceType.NONE, Format.Format11x, Opcode.CAN_THROW),
+    GOTO(0x28, "goto", ReferenceType.NONE, Format.Format10t),
+    GOTO_16(0x29, "goto/16", ReferenceType.NONE, Format.Format20t),
+    GOTO_32(0x2a, "goto/32", ReferenceType.NONE, Format.Format30t),
+    PACKED_SWITCH(0x2b, "packed-switch", ReferenceType.NONE, Format.Format31t, Opcode.CAN_CONTINUE),
+    SPARSE_SWITCH(0x2c, "sparse-switch", ReferenceType.NONE, Format.Format31t, Opcode.CAN_CONTINUE),
+    CMPL_FLOAT(0x2d, "cmpl-float", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    CMPG_FLOAT(0x2e, "cmpg-float", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    CMPL_DOUBLE(0x2f, "cmpl-double", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    CMPG_DOUBLE(0x30, "cmpg-double", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    CMP_LONG(0x31, "cmp-long", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    IF_EQ(0x32, "if-eq", ReferenceType.NONE, Format.Format22t, Opcode.CAN_CONTINUE),
+    IF_NE(0x33, "if-ne", ReferenceType.NONE, Format.Format22t, Opcode.CAN_CONTINUE),
+    IF_LT(0x34, "if-lt", ReferenceType.NONE, Format.Format22t, Opcode.CAN_CONTINUE),
+    IF_GE(0x35, "if-ge", ReferenceType.NONE, Format.Format22t, Opcode.CAN_CONTINUE),
+    IF_GT(0x36, "if-gt", ReferenceType.NONE, Format.Format22t, Opcode.CAN_CONTINUE),
+    IF_LE(0x37, "if-le", ReferenceType.NONE, Format.Format22t, Opcode.CAN_CONTINUE),
+    IF_EQZ(0x38, "if-eqz", ReferenceType.NONE, Format.Format21t, Opcode.CAN_CONTINUE),
+    IF_NEZ(0x39, "if-nez", ReferenceType.NONE, Format.Format21t, Opcode.CAN_CONTINUE),
+    IF_LTZ(0x3a, "if-ltz", ReferenceType.NONE, Format.Format21t, Opcode.CAN_CONTINUE),
+    IF_GEZ(0x3b, "if-gez", ReferenceType.NONE, Format.Format21t, Opcode.CAN_CONTINUE),
+    IF_GTZ(0x3c, "if-gtz", ReferenceType.NONE, Format.Format21t, Opcode.CAN_CONTINUE),
+    IF_LEZ(0x3d, "if-lez", ReferenceType.NONE, Format.Format21t, Opcode.CAN_CONTINUE),
+    AGET(0x44, "aget", ReferenceType.NONE, Format.Format23x, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    AGET_WIDE(0x45, "aget-wide", ReferenceType.NONE, Format.Format23x, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    AGET_OBJECT(0x46, "aget-object", ReferenceType.NONE, Format.Format23x, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    AGET_BOOLEAN(0x47, "aget-boolean", ReferenceType.NONE, Format.Format23x, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    AGET_BYTE(0x48, "aget-byte", ReferenceType.NONE, Format.Format23x, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    AGET_CHAR(0x49, "aget-char", ReferenceType.NONE, Format.Format23x, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    AGET_SHORT(0x4a, "aget-short", ReferenceType.NONE, Format.Format23x, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    APUT(0x4b, "aput", ReferenceType.NONE, Format.Format23x, Opcode.CAN_THROW | Opcode.CAN_CONTINUE),
+    APUT_WIDE(0x4c, "aput-wide", ReferenceType.NONE, Format.Format23x, Opcode.CAN_THROW | Opcode.CAN_CONTINUE),
+    APUT_OBJECT(0x4d, "aput-object", ReferenceType.NONE, Format.Format23x, Opcode.CAN_THROW | Opcode.CAN_CONTINUE),
+    APUT_BOOLEAN(0x4e, "aput-boolean", ReferenceType.NONE, Format.Format23x, Opcode.CAN_THROW | Opcode.CAN_CONTINUE),
+    APUT_BYTE(0x4f, "aput-byte", ReferenceType.NONE, Format.Format23x, Opcode.CAN_THROW | Opcode.CAN_CONTINUE),
+    APUT_CHAR(0x50, "aput-char", ReferenceType.NONE, Format.Format23x, Opcode.CAN_THROW | Opcode.CAN_CONTINUE),
+    APUT_SHORT(0x51, "aput-short", ReferenceType.NONE, Format.Format23x, Opcode.CAN_THROW | Opcode.CAN_CONTINUE),
+    IGET(0x52, "iget", ReferenceType.FIELD, Format.Format22c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    IGET_WIDE(0x53, "iget-wide", ReferenceType.FIELD, Format.Format22c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    IGET_OBJECT(0x54, "iget-object", ReferenceType.FIELD, Format.Format22c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    IGET_BOOLEAN(0x55, "iget-boolean", ReferenceType.FIELD, Format.Format22c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    IGET_BYTE(0x56, "iget-byte", ReferenceType.FIELD, Format.Format22c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    IGET_CHAR(0x57, "iget-char", ReferenceType.FIELD, Format.Format22c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    IGET_SHORT(0x58, "iget-short", ReferenceType.FIELD, Format.Format22c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    IPUT(0x59, "iput", ReferenceType.FIELD, Format.Format22c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE),
+    IPUT_WIDE(0x5a, "iput-wide", ReferenceType.FIELD, Format.Format22c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE),
+    IPUT_OBJECT(0x5b, "iput-object", ReferenceType.FIELD, Format.Format22c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE),
+    IPUT_BOOLEAN(0x5c, "iput-boolean", ReferenceType.FIELD, Format.Format22c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE),
+    IPUT_BYTE(0x5d, "iput-byte", ReferenceType.FIELD, Format.Format22c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE),
+    IPUT_CHAR(0x5e, "iput-char", ReferenceType.FIELD, Format.Format22c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE),
+    IPUT_SHORT(0x5f, "iput-short", ReferenceType.FIELD, Format.Format22c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE),
+    SGET(0x60, "sget", ReferenceType.FIELD, Format.Format21c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.STATIC_FIELD_ACCESSOR),
+    SGET_WIDE(0x61, "sget-wide", ReferenceType.FIELD, Format.Format21c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER | Opcode.STATIC_FIELD_ACCESSOR),
+    SGET_OBJECT(0x62, "sget-object", ReferenceType.FIELD, Format.Format21c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.STATIC_FIELD_ACCESSOR),
+    SGET_BOOLEAN(0x63, "sget-boolean", ReferenceType.FIELD, Format.Format21c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.STATIC_FIELD_ACCESSOR),
+    SGET_BYTE(0x64, "sget-byte", ReferenceType.FIELD, Format.Format21c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.STATIC_FIELD_ACCESSOR),
+    SGET_CHAR(0x65, "sget-char", ReferenceType.FIELD, Format.Format21c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.STATIC_FIELD_ACCESSOR),
+    SGET_SHORT(0x66, "sget-short", ReferenceType.FIELD, Format.Format21c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.STATIC_FIELD_ACCESSOR),
+    SPUT(0x67, "sput", ReferenceType.FIELD, Format.Format21c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.STATIC_FIELD_ACCESSOR),
+    SPUT_WIDE(0x68, "sput-wide", ReferenceType.FIELD, Format.Format21c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.STATIC_FIELD_ACCESSOR),
+    SPUT_OBJECT(0x69, "sput-object", ReferenceType.FIELD, Format.Format21c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.STATIC_FIELD_ACCESSOR),
+    SPUT_BOOLEAN(0x6a, "sput-boolean", ReferenceType.FIELD, Format.Format21c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.STATIC_FIELD_ACCESSOR),
+    SPUT_BYTE(0x6b, "sput-byte", ReferenceType.FIELD, Format.Format21c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.STATIC_FIELD_ACCESSOR),
+    SPUT_CHAR(0x6c, "sput-char", ReferenceType.FIELD, Format.Format21c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.STATIC_FIELD_ACCESSOR),
+    SPUT_SHORT(0x6d, "sput-short", ReferenceType.FIELD, Format.Format21c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.STATIC_FIELD_ACCESSOR),
+    INVOKE_VIRTUAL(0x6e, "invoke-virtual", ReferenceType.METHOD, Format.Format35c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_RESULT),
+    INVOKE_SUPER(0x6f, "invoke-super", ReferenceType.METHOD, Format.Format35c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_RESULT),
+    INVOKE_DIRECT(0x70, "invoke-direct", ReferenceType.METHOD, Format.Format35c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_RESULT | Opcode.CAN_INITIALIZE_REFERENCE),
+    INVOKE_STATIC(0x71, "invoke-static", ReferenceType.METHOD, Format.Format35c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_RESULT),
+    INVOKE_INTERFACE(0x72, "invoke-interface", ReferenceType.METHOD, Format.Format35c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_RESULT),
+    INVOKE_VIRTUAL_RANGE(0x74, "invoke-virtual/range", ReferenceType.METHOD, Format.Format3rc, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_RESULT),
+    INVOKE_SUPER_RANGE(0x75, "invoke-super/range", ReferenceType.METHOD, Format.Format3rc, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_RESULT),
+    INVOKE_DIRECT_RANGE(0x76, "invoke-direct/range", ReferenceType.METHOD, Format.Format3rc, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_RESULT | Opcode.CAN_INITIALIZE_REFERENCE),
+    INVOKE_STATIC_RANGE(0x77, "invoke-static/range", ReferenceType.METHOD, Format.Format3rc, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_RESULT),
+    INVOKE_INTERFACE_RANGE(0x78, "invoke-interface/range", ReferenceType.METHOD, Format.Format3rc, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_RESULT),
+    NEG_INT(0x7b, "neg-int", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    NOT_INT(0x7c, "not-int", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    NEG_LONG(0x7d, "neg-long", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    NOT_LONG(0x7e, "not-long", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    NEG_FLOAT(0x7f, "neg-float", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    NEG_DOUBLE(0x80, "neg-double", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    INT_TO_LONG(0x81, "int-to-long", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    INT_TO_FLOAT(0x82, "int-to-float", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    INT_TO_DOUBLE(0x83, "int-to-double", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    LONG_TO_INT(0x84, "long-to-int", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    LONG_TO_FLOAT(0x85, "long-to-float", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    LONG_TO_DOUBLE(0x86, "long-to-double", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    FLOAT_TO_INT(0x87, "float-to-int", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    FLOAT_TO_LONG(0x88, "float-to-long", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    FLOAT_TO_DOUBLE(0x89, "float-to-double", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    DOUBLE_TO_INT(0x8a, "double-to-int", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    DOUBLE_TO_LONG(0x8b, "double-to-long", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    DOUBLE_TO_FLOAT(0x8c, "double-to-float", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    INT_TO_BYTE(0x8d, "int-to-byte", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    INT_TO_CHAR(0x8e, "int-to-char", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    INT_TO_SHORT(0x8f, "int-to-short", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    ADD_INT(0x90, "add-int", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    SUB_INT(0x91, "sub-int", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    MUL_INT(0x92, "mul-int", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    DIV_INT(0x93, "div-int", ReferenceType.NONE, Format.Format23x, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    REM_INT(0x94, "rem-int", ReferenceType.NONE, Format.Format23x, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    AND_INT(0x95, "and-int", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    OR_INT(0x96, "or-int", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    XOR_INT(0x97, "xor-int", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    SHL_INT(0x98, "shl-int", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    SHR_INT(0x99, "shr-int", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    USHR_INT(0x9a, "ushr-int", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    ADD_LONG(0x9b, "add-long", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    SUB_LONG(0x9c, "sub-long", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    MUL_LONG(0x9d, "mul-long", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    DIV_LONG(0x9e, "div-long", ReferenceType.NONE, Format.Format23x, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    REM_LONG(0x9f, "rem-long", ReferenceType.NONE, Format.Format23x, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    AND_LONG(0xa0, "and-long", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    OR_LONG(0xa1, "or-long", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    XOR_LONG(0xa2, "xor-long", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    SHL_LONG(0xa3, "shl-long", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    SHR_LONG(0xa4, "shr-long", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    USHR_LONG(0xa5, "ushr-long", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    ADD_FLOAT(0xa6, "add-float", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    SUB_FLOAT(0xa7, "sub-float", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    MUL_FLOAT(0xa8, "mul-float", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    DIV_FLOAT(0xa9, "div-float", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    REM_FLOAT(0xaa, "rem-float", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    ADD_DOUBLE(0xab, "add-double", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    SUB_DOUBLE(0xac, "sub-double", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    MUL_DOUBLE(0xad, "mul-double", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    DIV_DOUBLE(0xae, "div-double", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    REM_DOUBLE(0xaf, "rem-double", ReferenceType.NONE, Format.Format23x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    ADD_INT_2ADDR(0xb0, "add-int/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    SUB_INT_2ADDR(0xb1, "sub-int/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    MUL_INT_2ADDR(0xb2, "mul-int/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    DIV_INT_2ADDR(0xb3, "div-int/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    REM_INT_2ADDR(0xb4, "rem-int/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    AND_INT_2ADDR(0xb5, "and-int/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    OR_INT_2ADDR(0xb6, "or-int/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    XOR_INT_2ADDR(0xb7, "xor-int/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    SHL_INT_2ADDR(0xb8, "shl-int/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    SHR_INT_2ADDR(0xb9, "shr-int/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    USHR_INT_2ADDR(0xba, "ushr-int/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    ADD_LONG_2ADDR(0xbb, "add-long/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    SUB_LONG_2ADDR(0xbc, "sub-long/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    MUL_LONG_2ADDR(0xbd, "mul-long/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    DIV_LONG_2ADDR(0xbe, "div-long/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    REM_LONG_2ADDR(0xbf, "rem-long/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    AND_LONG_2ADDR(0xc0, "and-long/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    OR_LONG_2ADDR(0xc1, "or-long/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    XOR_LONG_2ADDR(0xc2, "xor-long/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    SHL_LONG_2ADDR(0xc3, "shl-long/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    SHR_LONG_2ADDR(0xc4, "shr-long/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    USHR_LONG_2ADDR(0xc5, "ushr-long/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    ADD_FLOAT_2ADDR(0xc6, "add-float/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    SUB_FLOAT_2ADDR(0xc7, "sub-float/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    MUL_FLOAT_2ADDR(0xc8, "mul-float/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    DIV_FLOAT_2ADDR(0xc9, "div-float/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    REM_FLOAT_2ADDR(0xca, "rem-float/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    ADD_DOUBLE_2ADDR(0xcb, "add-double/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    SUB_DOUBLE_2ADDR(0xcc, "sub-double/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    MUL_DOUBLE_2ADDR(0xcd, "mul-double/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    DIV_DOUBLE_2ADDR(0xce, "div-double/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    REM_DOUBLE_2ADDR(0xcf, "rem-double/2addr", ReferenceType.NONE, Format.Format12x, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    ADD_INT_LIT16(0xd0, "add-int/lit16", ReferenceType.NONE, Format.Format22s, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    RSUB_INT(0xd1, "rsub-int", ReferenceType.NONE, Format.Format22s, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    MUL_INT_LIT16(0xd2, "mul-int/lit16", ReferenceType.NONE, Format.Format22s, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    DIV_INT_LIT16(0xd3, "div-int/lit16", ReferenceType.NONE, Format.Format22s, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    REM_INT_LIT16(0xd4, "rem-int/lit16", ReferenceType.NONE, Format.Format22s, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    AND_INT_LIT16(0xd5, "and-int/lit16", ReferenceType.NONE, Format.Format22s, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    OR_INT_LIT16(0xd6, "or-int/lit16", ReferenceType.NONE, Format.Format22s, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    XOR_INT_LIT16(0xd7, "xor-int/lit16", ReferenceType.NONE, Format.Format22s, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    ADD_INT_LIT8(0xd8, "add-int/lit8", ReferenceType.NONE, Format.Format22b, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    RSUB_INT_LIT8(0xd9, "rsub-int/lit8", ReferenceType.NONE, Format.Format22b, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    MUL_INT_LIT8(0xda, "mul-int/lit8", ReferenceType.NONE, Format.Format22b, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    DIV_INT_LIT8(0xdb, "div-int/lit8", ReferenceType.NONE, Format.Format22b, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    REM_INT_LIT8(0xdc, "rem-int/lit8", ReferenceType.NONE, Format.Format22b, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    AND_INT_LIT8(0xdd, "and-int/lit8", ReferenceType.NONE, Format.Format22b, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    OR_INT_LIT8(0xde, "or-int/lit8", ReferenceType.NONE, Format.Format22b, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    XOR_INT_LIT8(0xdf, "xor-int/lit8", ReferenceType.NONE, Format.Format22b, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    SHL_INT_LIT8(0xe0, "shl-int/lit8", ReferenceType.NONE, Format.Format22b, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    SHR_INT_LIT8(0xe1, "shr-int/lit8", ReferenceType.NONE, Format.Format22b, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    USHR_INT_LIT8(0xe2, "ushr-int/lit8", ReferenceType.NONE, Format.Format22b, Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+
+    IGET_VOLATILE(firstApi(0xe3, 9), "iget-volatile", ReferenceType.FIELD, Format.Format22c, Opcode.ODEX_ONLY | Opcode.VOLATILE_FIELD_ACCESSOR | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    IPUT_VOLATILE(firstApi(0xe4, 9), "iput-volatile", ReferenceType.FIELD, Format.Format22c, Opcode.ODEX_ONLY | Opcode.VOLATILE_FIELD_ACCESSOR | Opcode.CAN_THROW | Opcode.CAN_CONTINUE),
+    SGET_VOLATILE(firstApi(0xe5, 9), "sget-volatile", ReferenceType.FIELD, Format.Format21c, Opcode.ODEX_ONLY | Opcode.VOLATILE_FIELD_ACCESSOR | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.STATIC_FIELD_ACCESSOR),
+    SPUT_VOLATILE(firstApi(0xe6, 9), "sput-volatile", ReferenceType.FIELD, Format.Format21c, Opcode.ODEX_ONLY | Opcode.VOLATILE_FIELD_ACCESSOR | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.STATIC_FIELD_ACCESSOR),
+    IGET_OBJECT_VOLATILE(firstApi(0xe7, 9), "iget-object-volatile", ReferenceType.FIELD, Format.Format22c, Opcode.ODEX_ONLY | Opcode.VOLATILE_FIELD_ACCESSOR | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    IGET_WIDE_VOLATILE(firstApi(0xe8, 9), "iget-wide-volatile", ReferenceType.FIELD, Format.Format22c, Opcode.ODEX_ONLY | Opcode.VOLATILE_FIELD_ACCESSOR | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    IPUT_WIDE_VOLATILE(firstApi(0xe9, 9), "iput-wide-volatile", ReferenceType.FIELD, Format.Format22c, Opcode.ODEX_ONLY | Opcode.VOLATILE_FIELD_ACCESSOR | Opcode.CAN_THROW | Opcode.CAN_CONTINUE),
+    SGET_WIDE_VOLATILE(firstApi(0xea, 9), "sget-wide-volatile", ReferenceType.FIELD, Format.Format21c, Opcode.ODEX_ONLY | Opcode.VOLATILE_FIELD_ACCESSOR | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER | Opcode.STATIC_FIELD_ACCESSOR),
+    SPUT_WIDE_VOLATILE(firstApi(0xeb, 9), "sput-wide-volatile", ReferenceType.FIELD, Format.Format21c, Opcode.ODEX_ONLY | Opcode.VOLATILE_FIELD_ACCESSOR | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.STATIC_FIELD_ACCESSOR),
+
+    THROW_VERIFICATION_ERROR(firstApi(0xed, 5), "throw-verification-error", ReferenceType.NONE, Format.Format20bc, Opcode.ODEX_ONLY | Opcode.CAN_THROW),
+    EXECUTE_INLINE(allApis(0xee), "execute-inline", ReferenceType.NONE,  Format.Format35mi, Opcode.ODEX_ONLY | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_RESULT),
+    EXECUTE_INLINE_RANGE(firstApi(0xef, 8), "execute-inline/range", ReferenceType.NONE,  Format.Format3rmi,  Opcode.ODEX_ONLY | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_RESULT),
+    INVOKE_DIRECT_EMPTY(lastApi(0xf0, 13), "invoke-direct-empty", ReferenceType.METHOD,  Format.Format35c, Opcode.ODEX_ONLY | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_RESULT | Opcode.CAN_INITIALIZE_REFERENCE),
+    INVOKE_OBJECT_INIT_RANGE(firstApi(0xf0, 14), "invoke-object-init/range", ReferenceType.METHOD,  Format.Format3rc, Opcode.ODEX_ONLY | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_RESULT | Opcode.CAN_INITIALIZE_REFERENCE),
+    RETURN_VOID_BARRIER(combine(firstApi(0xf1, 11), lastArtVersion(0x73, 59)), "return-void-barrier", ReferenceType.NONE, Format.Format10x, Opcode.ODEX_ONLY),
+    RETURN_VOID_NO_BARRIER(firstArtVersion(0x73, 60), "return-void-no-barrier", ReferenceType.NONE, Format.Format10x, Opcode.ODEX_ONLY),
+    IGET_QUICK(combine(allApis(0xf2), allArtVersions(0xe3)), "iget-quick", ReferenceType.NONE,  Format.Format22cs, Opcode.ODEX_ONLY | Opcode.QUICK_FIELD_ACCESSOR | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    IGET_WIDE_QUICK(combine(allApis(0xf3), allArtVersions(0xe4)), "iget-wide-quick", ReferenceType.NONE,  Format.Format22cs, Opcode.ODEX_ONLY | Opcode.QUICK_FIELD_ACCESSOR | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.SETS_WIDE_REGISTER),
+    IGET_OBJECT_QUICK(combine(allApis(0xf4), allArtVersions(0xe5)), "iget-object-quick", ReferenceType.NONE,  Format.Format22cs, Opcode.ODEX_ONLY | Opcode.QUICK_FIELD_ACCESSOR | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    IPUT_QUICK(combine(allApis(0xf5), allArtVersions(0xe6)), "iput-quick", ReferenceType.NONE,  Format.Format22cs, Opcode.ODEX_ONLY | Opcode.QUICK_FIELD_ACCESSOR | Opcode.CAN_THROW | Opcode.CAN_CONTINUE),
+    IPUT_WIDE_QUICK(combine(allApis(0xf6), allArtVersions(0xe7)), "iput-wide-quick", ReferenceType.NONE,  Format.Format22cs, Opcode.ODEX_ONLY | Opcode.QUICK_FIELD_ACCESSOR | Opcode.CAN_THROW | Opcode.CAN_CONTINUE),
+    IPUT_OBJECT_QUICK(combine(allApis(0xf7), allArtVersions(0xe8)), "iput-object-quick", ReferenceType.NONE,  Format.Format22cs, Opcode.ODEX_ONLY | Opcode.QUICK_FIELD_ACCESSOR | Opcode.CAN_THROW | Opcode.CAN_CONTINUE),
+    IPUT_BOOLEAN_QUICK(allArtVersions(0xeb), "iput-boolean-quick", ReferenceType.NONE, Format.Format22cs, Opcode.ODEX_ONLY | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.QUICK_FIELD_ACCESSOR),
+    IPUT_BYTE_QUICK(allArtVersions(0xec), "iput-byte-quick", ReferenceType.NONE, Format.Format22cs, Opcode.ODEX_ONLY | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.QUICK_FIELD_ACCESSOR),
+    IPUT_CHAR_QUICK(allArtVersions(0xed), "iput-char-quick", ReferenceType.NONE, Format.Format22cs, Opcode.ODEX_ONLY | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.QUICK_FIELD_ACCESSOR),
+    IPUT_SHORT_QUICK(allArtVersions(0xee), "iput-short-quick", ReferenceType.NONE, Format.Format22cs, Opcode.ODEX_ONLY | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.QUICK_FIELD_ACCESSOR),
+    IGET_BOOLEAN_QUICK(allArtVersions(0xef), "iget-boolean-quick", ReferenceType.NONE, Format.Format22cs, Opcode.ODEX_ONLY | Opcode.QUICK_FIELD_ACCESSOR | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    IGET_BYTE_QUICK(allArtVersions(0xf0), "iget-byte-quick", ReferenceType.NONE, Format.Format22cs, Opcode.ODEX_ONLY | Opcode.QUICK_FIELD_ACCESSOR | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    IGET_CHAR_QUICK(allArtVersions(0xf1), "iget-char-quick", ReferenceType.NONE, Format.Format22cs, Opcode.ODEX_ONLY | Opcode.QUICK_FIELD_ACCESSOR | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    IGET_SHORT_QUICK(allArtVersions(0xf2), "iget-short-quick", ReferenceType.NONE, Format.Format22cs, Opcode.ODEX_ONLY | Opcode.QUICK_FIELD_ACCESSOR | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    
+    INVOKE_VIRTUAL_QUICK(combine(allApis(0xf8), allArtVersions(0xe9)), "invoke-virtual-quick", ReferenceType.NONE,  Format.Format35ms, Opcode.ODEX_ONLY | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_RESULT),
+    INVOKE_VIRTUAL_QUICK_RANGE(combine(allApis(0xf9), allArtVersions(0xea)), "invoke-virtual-quick/range", ReferenceType.NONE,  Format.Format3rms, Opcode.ODEX_ONLY | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_RESULT),
+    INVOKE_SUPER_QUICK(lastApi(0xfa, 25), "invoke-super-quick", ReferenceType.NONE,  Format.Format35ms, Opcode.ODEX_ONLY | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_RESULT),
+    INVOKE_SUPER_QUICK_RANGE(lastApi(0xfb, 25), "invoke-super-quick/range", ReferenceType.NONE,  Format.Format3rms, Opcode.ODEX_ONLY | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_RESULT),
+
+    IPUT_OBJECT_VOLATILE(firstApi(0xfc, 9), "iput-object-volatile", ReferenceType.FIELD, Format.Format22c, Opcode.ODEX_ONLY | Opcode.VOLATILE_FIELD_ACCESSOR | Opcode.CAN_THROW | Opcode.CAN_CONTINUE),
+    SGET_OBJECT_VOLATILE(firstApi(0xfd, 9), "sget-object-volatile", ReferenceType.FIELD, Format.Format21c, Opcode.ODEX_ONLY | Opcode.VOLATILE_FIELD_ACCESSOR | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER | Opcode.STATIC_FIELD_ACCESSOR),
+    SPUT_OBJECT_VOLATILE(betweenApi(0xfe, 9, 19), "sput-object-volatile", ReferenceType.FIELD, Format.Format21c, Opcode.ODEX_ONLY | Opcode.VOLATILE_FIELD_ACCESSOR | Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.STATIC_FIELD_ACCESSOR),
+
+    PACKED_SWITCH_PAYLOAD(0x100, "packed-switch-payload", ReferenceType.NONE, Format.PackedSwitchPayload, 0),
+    SPARSE_SWITCH_PAYLOAD(0x200, "sparse-switch-payload", ReferenceType.NONE, Format.SparseSwitchPayload, 0),
+    ARRAY_PAYLOAD(0x300, "array-payload", ReferenceType.NONE, Format.ArrayPayload, 0),
+
+    INVOKE_POLYMORPHIC(firstArtVersion(0xfa, 87), "invoke-polymorphic", ReferenceType.METHOD, ReferenceType.METHOD_PROTO, Format.Format45cc, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_RESULT),
+    INVOKE_POLYMORPHIC_RANGE(firstArtVersion(0xfb, 87), "invoke-polymorphic/range", ReferenceType.METHOD, ReferenceType.METHOD_PROTO, Format.Format4rcc, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_RESULT),
+
+    INVOKE_CUSTOM(firstArtVersion(0xfc, 111), "invoke-custom", ReferenceType.CALL_SITE, Format.Format35c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_RESULT),
+    INVOKE_CUSTOM_RANGE(firstArtVersion(0xfd, 111), "invoke-custom/range", ReferenceType.CALL_SITE, Format.Format3rc, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_RESULT),
+
+    CONST_METHOD_HANDLE(firstArtVersion(0xfe, 134), "const-method-handle", ReferenceType.METHOD_HANDLE, Format.Format21c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER),
+    CONST_METHOD_TYPE(firstArtVersion(0xff, 134), "const-method-type", ReferenceType.METHOD_PROTO, Format.Format21c, Opcode.CAN_THROW | Opcode.CAN_CONTINUE | Opcode.SETS_REGISTER);
+
+    //if the instruction can throw an exception
+    public static final int CAN_THROW = 0x1;
+    //if the instruction is an odex only instruction
+    public static final int ODEX_ONLY = 0x2;
+    //if execution can continue to the next instruction
+    public static final int CAN_CONTINUE = 0x4;
+    //if the instruction sets the "hidden" result register
+    public static final int SETS_RESULT = 0x8;
+    //if the instruction sets the value of it's first register
+    public static final int SETS_REGISTER = 0x10;
+    //if the instruction sets the value of it's first register to a wide type
+    public static final int SETS_WIDE_REGISTER = 0x20;
+    //if the instruction is an iget-quick/iput-quick instruction
+    public static final int QUICK_FIELD_ACCESSOR = 0x40;
+    //if the instruction is a *get-volatile/*put-volatile instruction
+    public static final int VOLATILE_FIELD_ACCESSOR = 0x80;
+    //if the instruction is a static sget-*/sput-*instruction
+    public static final int STATIC_FIELD_ACCESSOR = 0x100;
+    //if the instruction is a jumbo instruction
+    public static final int JUMBO_OPCODE = 0x200;
+    //if the instruction can initialize an uninitialized object reference
+    public static final int CAN_INITIALIZE_REFERENCE = 0x400;
+
+    private static final int ALL_APIS = 0xFFFF0000;
+
+    private static int minApi(int api) {
+        return 0xFFFF0000 | (api & 0xFFFF);
+    }
+
+    private static int maxApi(int api) {
+        return api << 16;
+    }
+
+    // values and minApis provide a mapping of api -> bytecode value.
+    // the apis in minApis are guaranteed to be
+    public final RangeMap<Integer, Short> apiToValueMap;
+    public final RangeMap<Integer, Short> artVersionToValueMap;
+
+    public final String name;
+    public final int referenceType;
+    public final Format format;
+    public final int flags;
+    public final int referenceType2;
+
+    Opcode(int opcodeValue, String opcodeName, int referenceType, Format format) {
+        this(opcodeValue, opcodeName, referenceType, format, 0);
+    }
+
+    Opcode(int opcodeValue, String opcodeName, int referenceType, Format format, int flags) {
+        this(allVersions(opcodeValue), opcodeName, referenceType, format, flags);
+    }
+
+    Opcode(List<VersionConstraint> versionConstraints, String opcodeName, int referenceType, Format format, int flags) {
+        this(versionConstraints, opcodeName, referenceType, -1, format, flags);
+    }
+
+    Opcode(List<VersionConstraint> versionConstraints, String opcodeName, int referenceType, int referenceType2,
+           Format format, int flags) {
+        ImmutableRangeMap.Builder<Integer, Short> apiToValueBuilder = ImmutableRangeMap.builder();
+        ImmutableRangeMap.Builder<Integer, Short> artVersionToValueBuilder = ImmutableRangeMap.builder();
+
+        for (VersionConstraint versionConstraint : versionConstraints) {
+            if (!versionConstraint.apiRange.isEmpty()) {
+                apiToValueBuilder.put(versionConstraint.apiRange, (short)versionConstraint.opcodeValue);
+            }
+            if (!versionConstraint.artVersionRange.isEmpty()) {
+                artVersionToValueBuilder.put(versionConstraint.artVersionRange, (short)versionConstraint.opcodeValue);
+            }
+        }
+
+        this.apiToValueMap = apiToValueBuilder.build();
+        this.artVersionToValueMap = artVersionToValueBuilder.build();
+        this.name = opcodeName;
+        this.referenceType = referenceType;
+        this.referenceType2 = referenceType2;
+        this.format = format;
+        this.flags = flags;
+    }
+
+    private static List<VersionConstraint> firstApi(int opcodeValue, int api) {
+        return Lists.newArrayList(new VersionConstraint(Range.atLeast(api), Range.openClosed(0, 0), opcodeValue));
+    }
+
+    private static List<VersionConstraint> lastApi(int opcodeValue, int api) {
+        return Lists.newArrayList(new VersionConstraint(Range.atMost(api), Range.openClosed(0, 0), opcodeValue));
+    }
+
+    private static List<VersionConstraint> betweenApi(int opcodeValue, int minApi, int maxApi) {
+        return Lists.newArrayList(new VersionConstraint(Range.closed(minApi, maxApi), Range.openClosed(0, 0),
+                opcodeValue));
+    }
+
+    private static List<VersionConstraint> firstArtVersion(int opcodeValue, int artVersion) {
+        return Lists.newArrayList(new VersionConstraint(Range.openClosed(0, 0), Range.atLeast(artVersion), opcodeValue));
+    }
+
+    private static List<VersionConstraint> lastArtVersion(int opcodeValue, int artVersion) {
+        return Lists.newArrayList(new VersionConstraint(Range.openClosed(0, 0), Range.atMost(artVersion), opcodeValue));
+    }
+
+    private static List<VersionConstraint> allVersions(int opcodeValue) {
+        return Lists.newArrayList(new VersionConstraint(Range.<Integer>all(), Range.<Integer>all(), opcodeValue));
+    }
+
+    private static List<VersionConstraint> allApis(int opcodeValue) {
+        return Lists.newArrayList(new VersionConstraint(Range.<Integer>all(), Range.openClosed(0, 0), opcodeValue));
+    }
+
+    private static List<VersionConstraint> allArtVersions(int opcodeValue) {
+        return Lists.newArrayList(new VersionConstraint(Range.openClosed(0, 0), Range.<Integer>all(), opcodeValue));
+    }
+
+    @SuppressWarnings("unchecked")
+    private static List<VersionConstraint> combine(List<VersionConstraint>... versionConstraints) {
+        List<VersionConstraint> combinedList = Lists.newArrayList();
+        for (List<VersionConstraint> versionConstraintList: versionConstraints) {
+            combinedList.addAll(versionConstraintList);
+        }
+        return combinedList;
+    }
+
+    public final boolean canThrow() {
+        return (flags & CAN_THROW) != 0;
+    }
+
+    public final boolean odexOnly() {
+        return (flags & ODEX_ONLY) != 0;
+    }
+
+    public final boolean canContinue() {
+        return (flags & CAN_CONTINUE) != 0;
+    }
+
+    public final boolean setsResult() {
+        return (flags & SETS_RESULT) != 0;
+    }
+
+    public final boolean setsRegister() {
+        return (flags & SETS_REGISTER) != 0;
+    }
+
+    public final boolean setsWideRegister() {
+        return (flags & SETS_WIDE_REGISTER) != 0;
+    }
+
+    public final boolean isQuickFieldaccessor() {
+        return (flags & QUICK_FIELD_ACCESSOR) != 0;
+    }
+
+    public final boolean isVolatileFieldAccessor() {
+        return (flags & VOLATILE_FIELD_ACCESSOR) != 0;
+    }
+
+    public final boolean isStaticFieldAccessor() {
+        return (flags & STATIC_FIELD_ACCESSOR) != 0;
+    }
+
+    public final boolean isJumboOpcode() {
+        return (flags & JUMBO_OPCODE) != 0;
+    }
+
+    public final boolean canInitializeReference() {
+        return (flags & CAN_INITIALIZE_REFERENCE) != 0;
+    }
+
+    private static class VersionConstraint {
+        @Nonnull public final Range<Integer> apiRange;
+        @Nonnull public final Range<Integer> artVersionRange;
+        public final int opcodeValue;
+
+        public VersionConstraint(@Nonnull Range<Integer> apiRange, @Nonnull Range<Integer> artVersionRange,
+                                 int opcodeValue) {
+            this.apiRange = apiRange;
+            this.artVersionRange = artVersionRange;
+            this.opcodeValue = opcodeValue;
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java b/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java
new file mode 100644
index 0000000..8f24e02
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2;
+
+import com.google.common.collect.Maps;
+import com.google.common.collect.RangeMap;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.EnumMap;
+import java.util.HashMap;
+
+import static org.jf.dexlib2.VersionMap.NO_VERSION;
+import static org.jf.dexlib2.VersionMap.mapApiToArtVersion;
+import static org.jf.dexlib2.VersionMap.mapArtVersionToApi;
+
+public class Opcodes {
+
+    /**
+     * Either the api level for dalvik opcodes, or the art version for art opcodes
+     */
+    public final int api;
+    public final int artVersion;
+    @Nonnull private final Opcode[] opcodesByValue = new Opcode[256];
+    @Nonnull private final EnumMap<Opcode, Short> opcodeValues;
+    @Nonnull private final HashMap<String, Opcode> opcodesByName;
+
+    @Nonnull
+    public static Opcodes forApi(int api) {
+        return new Opcodes(api, NO_VERSION);
+    }
+
+    @Nonnull
+    public static Opcodes forArtVersion(int artVersion) {
+        return new Opcodes(NO_VERSION, artVersion);
+    }
+
+    @Nonnull
+    public static Opcodes forDexVersion(int dexVersion) {
+        int api = VersionMap.mapDexVersionToApi(dexVersion);
+        if (api == NO_VERSION) {
+            throw new RuntimeException("Unsupported dex version " + dexVersion);
+        }
+        return new Opcodes(api, NO_VERSION);
+    }
+
+    /**
+     * @return a default Opcodes instance for when the exact Opcodes to use doesn't matter or isn't known
+     */
+    @Nonnull
+    public static Opcodes getDefault() {
+        // The last pre-art api
+        return forApi(20);
+    }
+
+    private Opcodes(int api, int artVersion) {
+        if (api >= 21) {
+            this.api = api;
+            this.artVersion = mapApiToArtVersion(api);
+        } else if (artVersion >= 0 && artVersion < 39) {
+            this.api = mapArtVersionToApi(artVersion);
+            this.artVersion = artVersion;
+        } else {
+            this.api = api;
+            this.artVersion = artVersion;
+        }
+
+        opcodeValues = new EnumMap<Opcode, Short>(Opcode.class);
+        opcodesByName = Maps.newHashMap();
+
+        int version;
+        if (isArt()) {
+            version = this.artVersion;
+        } else {
+            version = this.api;
+        }
+
+        for (Opcode opcode: Opcode.values()) {
+            RangeMap<Integer, Short> versionToValueMap;
+
+            if (isArt()) {
+                versionToValueMap = opcode.artVersionToValueMap;
+            } else {
+                versionToValueMap = opcode.apiToValueMap;
+            }
+
+            Short opcodeValue = versionToValueMap.get(version);
+            if (opcodeValue != null) {
+                if (!opcode.format.isPayloadFormat) {
+                    opcodesByValue[opcodeValue] = opcode;
+                }
+                opcodeValues.put(opcode, opcodeValue);
+                opcodesByName.put(opcode.name.toLowerCase(), opcode);
+            }
+        }
+    }
+
+    @Nullable
+    public Opcode getOpcodeByName(@Nonnull String opcodeName) {
+        return opcodesByName.get(opcodeName.toLowerCase());
+    }
+
+    @Nullable
+    public Opcode getOpcodeByValue(int opcodeValue) {
+        switch (opcodeValue) {
+            case 0x100:
+                return Opcode.PACKED_SWITCH_PAYLOAD;
+            case 0x200:
+                return Opcode.SPARSE_SWITCH_PAYLOAD;
+            case 0x300:
+                return Opcode.ARRAY_PAYLOAD;
+            default:
+                if (opcodeValue >= 0 && opcodeValue < opcodesByValue.length) {
+                    return opcodesByValue[opcodeValue];
+                }
+                return null;
+        }
+    }
+
+    @Nullable
+    public Short getOpcodeValue(@Nonnull Opcode opcode) {
+        return opcodeValues.get(opcode);
+    }
+
+    public boolean isArt() {
+        return artVersion != NO_VERSION;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/ReferenceType.java b/dexlib2/src/main/java/org/jf/dexlib2/ReferenceType.java
new file mode 100644
index 0000000..8b77416
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/ReferenceType.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2;
+
+import org.jf.dexlib2.iface.reference.*;
+import org.jf.util.ExceptionWithContext;
+
+public final class ReferenceType {
+    public static final int STRING = 0;
+    public static final int TYPE = 1;
+    public static final int FIELD = 2;
+    public static final int METHOD = 3;
+    public static final int METHOD_PROTO = 4;
+    public static final int CALL_SITE = 5;
+    public static final int METHOD_HANDLE = 6;
+    public static final int NONE = 7;
+
+    public static int getReferenceType(Reference reference) {
+        if (reference instanceof StringReference) {
+            return STRING;
+        } else if (reference instanceof TypeReference) {
+            return TYPE;
+        } else if (reference instanceof FieldReference) {
+            return FIELD;
+        } else if (reference instanceof MethodReference) {
+            return METHOD;
+        } else if (reference instanceof MethodProtoReference) {
+            return METHOD_PROTO;
+        } else if (reference instanceof CallSiteReference) {
+            return CALL_SITE;
+        } else if (reference instanceof MethodHandleReference) {
+            return METHOD_HANDLE;
+        } else {
+            throw new IllegalStateException("Invalid reference");
+        }
+    }
+
+    /**
+     * Validate a specific reference type. Note that the NONE placeholder is specifically not considered valid here.
+     *
+     * @throws InvalidReferenceTypeException
+     */
+    public static void validateReferenceType(int referenceType) {
+        if (referenceType < 0 || referenceType > 4) {
+            throw new InvalidReferenceTypeException(referenceType);
+        }
+    }
+
+    public static class InvalidReferenceTypeException extends ExceptionWithContext {
+        private final int referenceType;
+
+        public InvalidReferenceTypeException(int referenceType) {
+            super("Invalid reference type: %d", referenceType);
+            this.referenceType = referenceType;
+        }
+
+        public InvalidReferenceTypeException(int referenceType, String message, Object... formatArgs) {
+            super(message, formatArgs);
+            this.referenceType = referenceType;
+        }
+
+        public int getReferenceType() {
+            return referenceType;
+        }
+    }
+
+    private ReferenceType() {}
+}
\ No newline at end of file
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/ValueType.java b/dexlib2/src/main/java/org/jf/dexlib2/ValueType.java
new file mode 100644
index 0000000..ecb967b
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/ValueType.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2;
+
+public final class ValueType {
+    public static final int BYTE = 0x00;
+    public static final int SHORT = 0x02;
+    public static final int CHAR = 0x03;
+    public static final int INT = 0x04;
+    public static final int LONG = 0x06;
+    public static final int FLOAT = 0x10;
+    public static final int DOUBLE = 0x11;
+    public static final int METHOD_TYPE = 0x15;
+    public static final int METHOD_HANDLE = 0x16;
+    public static final int STRING = 0x17;
+    public static final int TYPE = 0x18;
+    public static final int FIELD = 0x19;
+    public static final int METHOD = 0x1a;
+    public static final int ENUM = 0x1b;
+    public static final int ARRAY = 0x1c;
+    public static final int ANNOTATION = 0x1d;
+    public static final int NULL = 0x1e;
+    public static final int BOOLEAN = 0x1f;
+
+    private ValueType() {}
+
+    public static String getValueTypeName(int valueType) {
+        switch (valueType) {
+            case BYTE:
+                return "byte";
+            case SHORT:
+                return "short";
+            case CHAR:
+                return "char";
+            case INT:
+                return "int";
+            case LONG:
+                return "long";
+            case FLOAT:
+                return "float";
+            case DOUBLE:
+                return "double";
+            case METHOD_TYPE:
+                return "method_type";
+            case METHOD_HANDLE:
+                return "method_handle";
+            case STRING:
+                return "string";
+            case TYPE:
+                return "type";
+            case FIELD:
+                return "field";
+            case METHOD:
+                return "method";
+            case ENUM:
+                return "enum";
+            case ARRAY:
+                return "array";
+            case ANNOTATION:
+                return "annotation";
+            case NULL:
+                return "null";
+            case BOOLEAN:
+                return "boolean";
+            default:
+                throw new IllegalArgumentException("Unknown encoded value type: " + valueType);
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/VerificationError.java b/dexlib2/src/main/java/org/jf/dexlib2/VerificationError.java
new file mode 100644
index 0000000..d0aa029
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/VerificationError.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2;
+
+import com.google.common.collect.Maps;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nullable;
+import java.util.HashMap;
+
+public class VerificationError {
+    public static final int GENERIC = 1;
+    public static final int NO_SUCH_CLASS = 2;
+    public static final int NO_SUCH_FIELD = 3;
+    public static final int NO_SUCH_METHOD = 4;
+    public static final int ILLEGAL_CLASS_ACCESS = 5;
+    public static final int ILLEGAL_FIELD_ACCESS = 6;
+    public static final int ILLEGAL_METHOD_ACCESS = 7;
+    public static final int CLASS_CHANGE_ERROR = 8;
+    public static final int INSTANTIATION_ERROR = 9;
+
+    private static final HashMap<String, Integer> verificationErrorNames = Maps.newHashMap();
+
+    static {
+        verificationErrorNames.put("generic-error", GENERIC);
+        verificationErrorNames.put("no-such-class", NO_SUCH_CLASS);
+        verificationErrorNames.put("no-such-field", NO_SUCH_FIELD);
+        verificationErrorNames.put("no-such-method", NO_SUCH_METHOD);
+        verificationErrorNames.put("illegal-class-access", ILLEGAL_CLASS_ACCESS);
+        verificationErrorNames.put("illegal-field-access", ILLEGAL_FIELD_ACCESS);
+        verificationErrorNames.put("illegal-method-access", ILLEGAL_METHOD_ACCESS);
+        verificationErrorNames.put("class-change-error", CLASS_CHANGE_ERROR);
+        verificationErrorNames.put("instantiation-error", INSTANTIATION_ERROR);
+    }
+
+    @Nullable
+    public static String getVerificationErrorName(int verificationError) {
+        switch (verificationError) {
+            case GENERIC:
+                return "generic-error";
+            case NO_SUCH_CLASS:
+                return "no-such-class";
+            case NO_SUCH_FIELD:
+                return "no-such-field";
+            case NO_SUCH_METHOD:
+                return "no-such-method";
+            case ILLEGAL_CLASS_ACCESS:
+                return "illegal-class-access";
+            case ILLEGAL_FIELD_ACCESS:
+                return "illegal-field-access";
+            case ILLEGAL_METHOD_ACCESS:
+                return "illegal-method-access";
+            case CLASS_CHANGE_ERROR:
+                return "class-change-error";
+            case INSTANTIATION_ERROR:
+                return "instantiation-error";
+            default:
+                return null;
+        }
+    }
+
+    public static int getVerificationError(String verificationError) {
+        Integer ret = verificationErrorNames.get(verificationError);
+        if (ret == null) {
+            throw new ExceptionWithContext("Invalid verification error: %s", verificationError);
+        }
+        return ret;
+    }
+
+    public static boolean isValidVerificationError(int verificationError) {
+        return verificationError > 0 && verificationError < 10;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/VersionMap.java b/dexlib2/src/main/java/org/jf/dexlib2/VersionMap.java
new file mode 100644
index 0000000..38773d3
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/VersionMap.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2;
+
+public class VersionMap {
+    public static final int NO_VERSION = -1;
+
+    public static int mapDexVersionToApi(int dexVersion) {
+        switch (dexVersion) {
+            case 35:
+                return 23;
+            case 37:
+                return 25;
+            case 38:
+                return 27;
+            case 39:
+                return 28;
+            default:
+                return NO_VERSION;
+        }
+    }
+
+    public static int mapApiToDexVersion(int api) {
+        if (api <= 23) {
+            return 35;
+        }
+        if (api <= 25) {
+            return 37;
+        }
+        if (api <= 27) {
+            return 38;
+        }
+        return 39;
+    }
+
+    public static int mapArtVersionToApi(int artVersion) {
+        if (artVersion >= 170) {
+            return 29;
+        }
+        if (artVersion >= 138) {
+            return 28;
+        }
+        if (artVersion >= 131) {
+            return 27;
+        }
+        if (artVersion >= 124) {
+            return 26;
+        }
+        if (artVersion >= 79) {
+            return 24;
+        }
+        if (artVersion >= 64) {
+            return 23;
+        }
+        if (artVersion >= 45) {
+            return 22;
+        }
+        if (artVersion >= 39) {
+            return 21;
+        }
+        return 19;
+    }
+
+    public static int mapApiToArtVersion(int api) {
+        if (api < 19) {
+            return NO_VERSION;
+        }
+
+        switch (api) {
+            case 19:
+            case 20:
+                return 7;
+            case 21:
+                return 39;
+            case 22:
+                return 45;
+            case 23:
+                return 64;
+            case 24:
+            case 25:
+                return 79;
+            case 26:
+                return 124;
+            case 27:
+                return 131;
+            case 28:
+                return 138;
+            case 29:
+                return 170;
+            default:
+                // 178 is the current version in the master branch of AOSP as of 2020-02-02
+                return 178;
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/AnalysisException.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/AnalysisException.java
new file mode 100644
index 0000000..4ca7b13
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/AnalysisException.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis;
+
+import org.jf.util.ExceptionWithContext;
+
+public class AnalysisException extends ExceptionWithContext {
+    public int codeAddress;
+
+    public AnalysisException(Throwable cause) {
+        super(cause);
+    }
+
+    public AnalysisException(Throwable cause, String message, Object... formatArgs) {
+        super(cause, message, formatArgs);
+    }
+
+    public AnalysisException(String message, Object... formatArgs) {
+        super(message, formatArgs);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/AnalyzedInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/AnalyzedInstruction.java
new file mode 100644
index 0000000..1a9b9ad
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/AnalyzedInstruction.java
@@ -0,0 +1,669 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.*;
+import org.jf.dexlib2.iface.instruction.formats.Instruction22c;
+import org.jf.dexlib2.iface.reference.MethodReference;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.dexlib2.iface.reference.TypeReference;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.*;
+
+public class AnalyzedInstruction implements Comparable<AnalyzedInstruction> {
+    /**
+     * The MethodAnalyzer containing this instruction
+     */
+    @Nonnull
+    protected final MethodAnalyzer methodAnalyzer;
+
+    /**
+     * The actual instruction
+     */
+    @Nonnull
+    protected Instruction instruction;
+
+    /**
+     * The index of the instruction, where the first instruction in the method is at index 0, and so on
+     */
+    protected final int instructionIndex;
+
+    /**
+     * Instructions that can pass on execution to this one during normal execution
+     */
+    @Nonnull
+    protected final TreeSet<AnalyzedInstruction> predecessors = new TreeSet<AnalyzedInstruction>();
+
+    /**
+     * Instructions that can execution could pass on to next during normal execution
+     */
+    @Nonnull
+    protected final LinkedList<AnalyzedInstruction> successors = new LinkedList<AnalyzedInstruction>();
+
+    /**
+     * This contains the register types *before* the instruction has executed
+     */
+    @Nonnull
+    protected final RegisterType[] preRegisterMap;
+
+    /**
+     * This contains the register types *after* the instruction has executed
+     */
+    @Nonnull
+    protected final RegisterType[] postRegisterMap;
+
+    /**
+     * This contains optional register type overrides for register types from predecessors
+     */
+    @Nullable
+    protected Map<PredecessorOverrideKey, RegisterType> predecessorRegisterOverrides = null;
+
+    /**
+     * When deodexing, we might need to deodex this instruction multiple times, when we merge in new register
+     * information. When this happens, we need to restore the original (odexed) instruction, so we can deodex it again
+     */
+    protected final Instruction originalInstruction;
+
+    public AnalyzedInstruction(@Nonnull MethodAnalyzer methodAnalyzer, @Nonnull Instruction instruction,
+                               int instructionIndex, int registerCount) {
+        this.methodAnalyzer = methodAnalyzer;
+        this.instruction = instruction;
+        this.originalInstruction = instruction;
+        this.instructionIndex = instructionIndex;
+        this.postRegisterMap = new RegisterType[registerCount];
+        this.preRegisterMap = new RegisterType[registerCount];
+        RegisterType unknown = RegisterType.getRegisterType(RegisterType.UNKNOWN, null);
+        for (int i=0; i<registerCount; i++) {
+            preRegisterMap[i] = unknown;
+            postRegisterMap[i] = unknown;
+        }
+    }
+
+    public int getInstructionIndex() {
+        return instructionIndex;
+    }
+
+    public int getPredecessorCount() {
+        return predecessors.size();
+    }
+
+    public SortedSet<AnalyzedInstruction> getPredecessors() {
+        return Collections.unmodifiableSortedSet(predecessors);
+    }
+
+    public RegisterType getPredecessorRegisterType(@Nonnull AnalyzedInstruction predecessor, int registerNumber) {
+        if (predecessorRegisterOverrides != null) {
+            RegisterType override = predecessorRegisterOverrides.get(
+                    new PredecessorOverrideKey(predecessor, registerNumber));
+            if (override != null) {
+                return override;
+            }
+        }
+        return predecessor.postRegisterMap[registerNumber];
+    }
+
+    protected boolean addPredecessor(AnalyzedInstruction predecessor) {
+        return predecessors.add(predecessor);
+    }
+
+    protected void addSuccessor(AnalyzedInstruction successor) {
+        successors.add(successor);
+    }
+
+    protected void setDeodexedInstruction(Instruction instruction) {
+        assert originalInstruction.getOpcode().odexOnly();
+        this.instruction = instruction;
+    }
+
+    protected void restoreOdexedInstruction() {
+        assert originalInstruction.getOpcode().odexOnly();
+        instruction = originalInstruction;
+    }
+
+    @Nonnull
+    public List<AnalyzedInstruction> getSuccessors() {
+        return Collections.unmodifiableList(successors);
+    }
+
+    @Nonnull
+    public Instruction getInstruction() {
+        return instruction;
+    }
+
+    @Nonnull
+    public Instruction getOriginalInstruction() {
+        return originalInstruction;
+    }
+
+    /**
+     * Is this instruction a "beginning instruction". A beginning instruction is defined to be an instruction
+     * that can be the first successfully executed instruction in the method. The first instruction is always a
+     * beginning instruction. If the first instruction can throw an exception, and is covered by a try block, then
+     * the first instruction of any exception handler for that try block is also a beginning instruction. And likewise,
+     * if any of those instructions can throw an exception and are covered by try blocks, the first instruction of the
+     * corresponding exception handler is a beginning instruction, etc.
+     *
+     * To determine this, we simply check if the first predecessor is the fake "StartOfMethod" instruction, which has
+     * an instruction index of -1.
+     * @return a boolean value indicating whether this instruction is a beginning instruction
+     */
+    public boolean isBeginningInstruction() {
+        //if this instruction has no predecessors, it is either the fake "StartOfMethod" instruction or it is an
+        //unreachable instruction.
+        if (predecessors.size() == 0) {
+            return false;
+        }
+        return predecessors.first().instructionIndex == -1;
+    }
+
+    /*
+     * Merges the given register type into the specified pre-instruction register, and also sets the post-instruction
+     * register type accordingly if it isn't a destination register for this instruction
+     * @param registerNumber Which register to set
+     * @param registerType The register type
+     * @returns true If the post-instruction register type was changed. This might be false if either the specified
+     * register is a destination register for this instruction, or if the pre-instruction register type didn't change
+     * after merging in the given register type
+     */
+    protected boolean mergeRegister(int registerNumber, RegisterType registerType, BitSet verifiedInstructions,
+                                    boolean override) {
+        assert registerNumber >= 0 && registerNumber < postRegisterMap.length;
+        assert registerType != null;
+
+        RegisterType oldRegisterType = preRegisterMap[registerNumber];
+
+        RegisterType mergedRegisterType;
+        if (override) {
+            mergedRegisterType = getMergedPreRegisterTypeFromPredecessors(registerNumber);
+        } else {
+            mergedRegisterType = oldRegisterType.merge(registerType);
+        }
+
+        if (mergedRegisterType.equals(oldRegisterType)) {
+            return false;
+        }
+
+        preRegisterMap[registerNumber] = mergedRegisterType;
+        verifiedInstructions.clear(instructionIndex);
+
+        if (!setsRegister(registerNumber)) {
+            postRegisterMap[registerNumber] = mergedRegisterType;
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Iterates over the predecessors of this instruction, and merges all the post-instruction register types for the
+     * given register. Any dead, unreachable, or odexed predecessor is ignored. This takes into account any overridden
+     * predecessor register types
+     *
+     * @param registerNumber the register number
+     * @return The register type resulting from merging the post-instruction register types from all predecessors
+     */
+    @Nonnull
+    protected RegisterType getMergedPreRegisterTypeFromPredecessors(int registerNumber) {
+        RegisterType mergedRegisterType = null;
+        for (AnalyzedInstruction predecessor: predecessors) {
+            RegisterType predecessorRegisterType = getPredecessorRegisterType(predecessor, registerNumber);
+            if (predecessorRegisterType != null) {
+                if (mergedRegisterType == null) {
+                    mergedRegisterType = predecessorRegisterType;
+                } else {
+                    mergedRegisterType = predecessorRegisterType.merge(mergedRegisterType);
+                }
+            }
+        }
+        if (mergedRegisterType == null) {
+            // This is a start-of-method or unreachable instruction.
+            throw new IllegalStateException();
+        }
+        return mergedRegisterType;
+    }
+    /**
+     * Sets the "post-instruction" register type as indicated.
+     * @param registerNumber Which register to set
+     * @param registerType The "post-instruction" register type
+     * @return true if the given register type is different than the existing post-instruction register type
+     */
+    protected boolean setPostRegisterType(int registerNumber, RegisterType registerType) {
+        assert registerNumber >= 0 && registerNumber < postRegisterMap.length;
+        assert registerType != null;
+
+        RegisterType oldRegisterType = postRegisterMap[registerNumber];
+        if (oldRegisterType.equals(registerType)) {
+            return false;
+        }
+
+        postRegisterMap[registerNumber] = registerType;
+        return true;
+    }
+
+    /**
+     * Adds an override for a register type from a predecessor.
+     *
+     * This is used to set the register type for only one branch from a conditional jump.
+     *
+     * @param predecessor Which predecessor is being overridden
+     * @param registerNumber The register number of the register being overridden
+     * @param registerType The overridden register type
+     * @param verifiedInstructions A bit vector of instructions that have been verified
+     *
+     * @return true if the post-instruction register type for this instruction changed as a result of this override
+     */
+    protected boolean overridePredecessorRegisterType(@Nonnull AnalyzedInstruction predecessor, int registerNumber,
+                                                      @Nonnull RegisterType registerType, BitSet verifiedInstructions) {
+        if (predecessorRegisterOverrides == null) {
+            predecessorRegisterOverrides = Maps.newHashMap();
+        }
+        predecessorRegisterOverrides.put(new PredecessorOverrideKey(predecessor, registerNumber), registerType);
+
+        RegisterType mergedType = getMergedPreRegisterTypeFromPredecessors(registerNumber);
+
+        if (preRegisterMap[registerNumber].equals(mergedType)) {
+            return false;
+        }
+
+        preRegisterMap[registerNumber] = mergedType;
+        verifiedInstructions.clear(instructionIndex);
+
+        if (!setsRegister(registerNumber)) {
+            if (!postRegisterMap[registerNumber].equals(mergedType)) {
+                postRegisterMap[registerNumber] = mergedType;
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    public boolean isInvokeInit() {
+        if (!instruction.getOpcode().canInitializeReference()) {
+            return false;
+        }
+
+        ReferenceInstruction instruction = (ReferenceInstruction)this.instruction;
+
+        Reference reference = instruction.getReference();
+        if (reference instanceof MethodReference) {
+            return ((MethodReference)reference).getName().equals("<init>");
+        }
+
+        return false;
+    }
+
+    /**
+     * Determines if this instruction sets the given register, or alters its type
+     *
+     * @param registerNumber The register to check
+     * @return true if this instruction sets the given register or alters its type
+     */
+    public boolean setsRegister(int registerNumber) {
+        // This method could be implemented by calling getSetRegisters and checking if registerNumber is in the result
+        // However, this is a frequently called method, and this is a more efficient implementation, because it doesn't
+        // allocate a new list, and it can potentially exit earlier
+
+        if (isInvokeInit()) {
+            // When constructing a new object, the register type will be an uninitialized reference after the
+            // new-instance instruction, but becomes an initialized reference once the <init> method is called. So even
+            // though invoke instructions don't normally change any registers, calling an <init> method will change the
+            // type of its object register. If the uninitialized reference has been copied to other registers, they will
+            // be initialized as well, so we need to check for that too
+            int destinationRegister;
+            if (instruction instanceof FiveRegisterInstruction) {
+                assert ((FiveRegisterInstruction)instruction).getRegisterCount() > 0;
+                destinationRegister = ((FiveRegisterInstruction)instruction).getRegisterC();
+            } else {
+                assert instruction instanceof RegisterRangeInstruction;
+                RegisterRangeInstruction rangeInstruction = (RegisterRangeInstruction)instruction;
+                assert rangeInstruction.getRegisterCount() > 0;
+                destinationRegister = rangeInstruction.getStartRegister();
+            }
+
+            RegisterType preInstructionDestRegisterType = getPreInstructionRegisterType(destinationRegister);
+            if (preInstructionDestRegisterType.category == RegisterType.UNKNOWN) {
+                // We never let an uninitialized reference propagate past an invoke-init if the object register type is
+                // unknown This is because the uninitialized reference may be an alias to the reference being
+                // initialized, but we can't know that until the object register's type is known
+                RegisterType preInstructionRegisterType = getPreInstructionRegisterType(registerNumber);
+                if (preInstructionRegisterType.category == RegisterType.UNINIT_REF ||
+                        preInstructionRegisterType.category == RegisterType.UNINIT_THIS) {
+                    return true;
+                }
+            }
+
+            if (preInstructionDestRegisterType.category != RegisterType.UNINIT_REF &&
+                    preInstructionDestRegisterType.category != RegisterType.UNINIT_THIS) {
+                return false;
+            }
+
+            if (registerNumber == destinationRegister) {
+                return true;
+            }
+
+            //check if the uninit ref has been copied to another register
+            return preInstructionDestRegisterType.equals(getPreInstructionRegisterType(registerNumber));
+        }
+
+        // On art, the optimizer will often nop out a check-cast instruction after an instance-of instruction.
+        // Normally, check-cast is where the register type actually changes.
+        // In order to correctly handle this case, we have to propagate the narrowed register type to the appropriate
+        // branch of the following if-eqz/if-nez
+        if (instructionIndex > 0 &&
+                methodAnalyzer.getClassPath().isArt() &&
+                getPredecessorCount() == 1 &&
+                (instruction.getOpcode() == Opcode.IF_EQZ || instruction.getOpcode() == Opcode.IF_NEZ)) {
+
+            AnalyzedInstruction prevInstruction = predecessors.first();
+            if (prevInstruction.instruction.getOpcode() == Opcode.INSTANCE_OF &&
+                    MethodAnalyzer.canPropagateTypeAfterInstanceOf(
+                            prevInstruction, this, methodAnalyzer.getClassPath())) {
+                Instruction22c instanceOfInstruction = (Instruction22c)prevInstruction.instruction;
+
+                if (registerNumber == instanceOfInstruction.getRegisterB()) {
+                    return true;
+                }
+
+                // Additionally, there may be a move instruction just before the instance-of, in order to put the value
+                // into a register that is addressable by the instance-of. In this case, we also need to propagate the
+                // new register type for the original register that the value was moved from.
+                // In some cases, the instance-of may have multiple predecessors. In this case, we should only do the
+                // propagation if all predecessors are move-object instructions for the same source register
+                // TODO: do we need to do some sort of additional check that these multiple move-object predecessors actually refer to the same value?
+                if (instructionIndex > 1) {
+                    int originalSourceRegister = -1;
+
+                    RegisterType newType = null;
+
+                    for (AnalyzedInstruction prevPrevAnalyzedInstruction : prevInstruction.predecessors) {
+                        Opcode opcode = prevPrevAnalyzedInstruction.instruction.getOpcode();
+                        if (opcode == Opcode.MOVE_OBJECT || opcode == Opcode.MOVE_OBJECT_16 ||
+                                opcode == Opcode.MOVE_OBJECT_FROM16) {
+                            TwoRegisterInstruction moveInstruction =
+                                    ((TwoRegisterInstruction)prevPrevAnalyzedInstruction.instruction);
+                            RegisterType originalType =
+                                    prevPrevAnalyzedInstruction.getPostInstructionRegisterType(
+                                            moveInstruction.getRegisterB());
+                            if (moveInstruction.getRegisterA() != instanceOfInstruction.getRegisterB()) {
+                                originalSourceRegister = -1;
+                                break;
+                            }
+                            if (originalType.type == null) {
+                                originalSourceRegister = -1;
+                                break;
+                            }
+
+                            if (newType == null) {
+                                newType = RegisterType.getRegisterType(methodAnalyzer.getClassPath(),
+                                        (TypeReference)instanceOfInstruction.getReference());
+                            }
+
+                            if (MethodAnalyzer.isNotWideningConversion(originalType, newType)) {
+                                if (originalSourceRegister != -1) {
+                                    if (originalSourceRegister != moveInstruction.getRegisterB()) {
+                                        originalSourceRegister = -1;
+                                        break;
+                                    }
+                                } else {
+                                    originalSourceRegister = moveInstruction.getRegisterB();
+                                }
+                            }
+                        } else {
+                            originalSourceRegister = -1;
+                            break;
+                        }
+                    }
+                    if (originalSourceRegister != -1 && registerNumber == originalSourceRegister) {
+                        return true;
+                    }
+                }
+            }
+        }
+
+        if (!instruction.getOpcode().setsRegister()) {
+            return false;
+        }
+        int destinationRegister = getDestinationRegister();
+
+        if (registerNumber == destinationRegister) {
+            return true;
+        }
+        if (instruction.getOpcode().setsWideRegister() && registerNumber == (destinationRegister + 1)) {
+            return true;
+        }
+        return false;
+    }
+
+    public List<Integer> getSetRegisters() {
+        List<Integer> setRegisters = Lists.newArrayList();
+
+        if (instruction.getOpcode().setsRegister()) {
+            setRegisters.add(getDestinationRegister());
+        }
+        if (instruction.getOpcode().setsWideRegister()) {
+            setRegisters.add(getDestinationRegister() + 1);
+        }
+
+        if (isInvokeInit()) {
+            //When constructing a new object, the register type will be an uninitialized reference after the new-instance
+            //instruction, but becomes an initialized reference once the <init> method is called. So even though invoke
+            //instructions don't normally change any registers, calling an <init> method will change the type of its
+            //object register. If the uninitialized reference has been copied to other registers, they will be initialized
+            //as well, so we need to check for that too
+
+            int destinationRegister;
+            if (instruction instanceof FiveRegisterInstruction) {
+                destinationRegister = ((FiveRegisterInstruction)instruction).getRegisterC();
+                assert ((FiveRegisterInstruction)instruction).getRegisterCount() > 0;
+            } else {
+                assert instruction instanceof RegisterRangeInstruction;
+                RegisterRangeInstruction rangeInstruction = (RegisterRangeInstruction)instruction;
+                assert rangeInstruction.getRegisterCount() > 0;
+                destinationRegister = rangeInstruction.getStartRegister();
+            }
+
+            RegisterType preInstructionDestRegisterType = getPreInstructionRegisterType(destinationRegister);
+            if (preInstructionDestRegisterType.category == RegisterType.UNINIT_REF ||
+                    preInstructionDestRegisterType.category == RegisterType.UNINIT_THIS) {
+                setRegisters.add(destinationRegister);
+
+                RegisterType objectRegisterType = preRegisterMap[destinationRegister];
+                for (int i = 0; i < preRegisterMap.length; i++) {
+                    if (i == destinationRegister) {
+                        continue;
+                    }
+
+                    RegisterType preInstructionRegisterType = preRegisterMap[i];
+
+                    if (preInstructionRegisterType.equals(objectRegisterType)) {
+                        setRegisters.add(i);
+                    } else if (preInstructionRegisterType.category == RegisterType.UNINIT_REF ||
+                            preInstructionRegisterType.category == RegisterType.UNINIT_THIS) {
+                        RegisterType postInstructionRegisterType = postRegisterMap[i];
+                        if (postInstructionRegisterType.category == RegisterType.UNKNOWN) {
+                            setRegisters.add(i);
+                        }
+                    }
+                }
+            } else if (preInstructionDestRegisterType.category == RegisterType.UNKNOWN) {
+                // We never let an uninitialized reference propagate past an invoke-init if the object register type is
+                // unknown This is because the uninitialized reference may be an alias to the reference being
+                // initialized, but we can't know that until the object register's type is known
+
+                for (int i = 0; i < preRegisterMap.length; i++) {
+                    RegisterType registerType = preRegisterMap[i];
+                    if (registerType.category == RegisterType.UNINIT_REF ||
+                            registerType.category == RegisterType.UNINIT_THIS) {
+                        setRegisters.add(i);
+                    }
+                }
+            }
+        }
+
+        // On art, the optimizer will often nop out a check-cast instruction after an instance-of instruction.
+        // Normally, check-cast is where the register type actually changes.
+        // In order to correctly handle this case, we have to propagate the narrowed register type to the appropriate
+        // branch of the following if-eqz/if-nez
+        if (instructionIndex > 0 &&
+                methodAnalyzer.getClassPath().isArt() &&
+                getPredecessorCount() == 1 &&
+                (instruction.getOpcode() == Opcode.IF_EQZ || instruction.getOpcode() == Opcode.IF_NEZ)) {
+
+            AnalyzedInstruction prevInstruction = predecessors.first();
+            if (prevInstruction.instruction.getOpcode() == Opcode.INSTANCE_OF &&
+                    MethodAnalyzer.canPropagateTypeAfterInstanceOf(
+                            prevInstruction, this, methodAnalyzer.getClassPath())) {
+                Instruction22c instanceOfInstruction = (Instruction22c)prevInstruction.instruction;
+                setRegisters.add(instanceOfInstruction.getRegisterB());
+
+                // Additionally, there may be a move instruction just before the instance-of, in order to put the value
+                // into a register that is addressable by the instance-of. In this case, we also need to propagate the
+                // new register type for the original register that the value was moved from.
+                // In some cases, the instance-of may have multiple predecessors. In this case, we should only do the
+                // propagation if all predecessors are move-object instructions for the same source register
+                // TODO: do we need to do some sort of additional check that these multiple move-object predecessors actually refer to the same value?
+                if (instructionIndex > 1) {
+                    int originalSourceRegister = -1;
+
+                    RegisterType newType = null;
+
+                    for (AnalyzedInstruction prevPrevAnalyzedInstruction : prevInstruction.predecessors) {
+                        Opcode opcode = prevPrevAnalyzedInstruction.instruction.getOpcode();
+                        if (opcode == Opcode.MOVE_OBJECT || opcode == Opcode.MOVE_OBJECT_16 ||
+                                opcode == Opcode.MOVE_OBJECT_FROM16) {
+                            TwoRegisterInstruction moveInstruction =
+                                    ((TwoRegisterInstruction)prevPrevAnalyzedInstruction.instruction);
+                            RegisterType originalType =
+                                    prevPrevAnalyzedInstruction.getPostInstructionRegisterType(
+                                            moveInstruction.getRegisterB());
+                            if (moveInstruction.getRegisterA() != instanceOfInstruction.getRegisterB()) {
+                                originalSourceRegister = -1;
+                                break;
+                            }
+                            if (originalType.type == null) {
+                                originalSourceRegister = -1;
+                                break;
+                            }
+
+                            if (newType == null) {
+                                newType = RegisterType.getRegisterType(methodAnalyzer.getClassPath(),
+                                        (TypeReference)instanceOfInstruction.getReference());
+                            }
+
+                            if (MethodAnalyzer.isNotWideningConversion(originalType, newType)) {
+                                if (originalSourceRegister != -1) {
+                                    if (originalSourceRegister != moveInstruction.getRegisterB()) {
+                                        originalSourceRegister = -1;
+                                        break;
+                                    }
+                                } else {
+                                    originalSourceRegister = moveInstruction.getRegisterB();
+                                }
+                            }
+                        } else {
+                            originalSourceRegister = -1;
+                            break;
+                        }
+                    }
+                    if (originalSourceRegister != -1) {
+                        setRegisters.add(originalSourceRegister);
+                    }
+                }
+            }
+        }
+
+        return setRegisters;
+    }
+
+    public int getDestinationRegister() {
+        if (!this.instruction.getOpcode().setsRegister()) {
+            throw new ExceptionWithContext("Cannot call getDestinationRegister() for an instruction that doesn't " +
+                    "store a value");
+        }
+        return ((OneRegisterInstruction)instruction).getRegisterA();
+    }
+
+    public int getRegisterCount() {
+        return postRegisterMap.length;
+    }
+
+    @Nonnull
+    public RegisterType getPostInstructionRegisterType(int registerNumber) {
+        return postRegisterMap[registerNumber];
+    }
+
+    @Nonnull
+    public RegisterType getPreInstructionRegisterType(int registerNumber) {
+        return preRegisterMap[registerNumber];
+    }
+
+    public int compareTo(@Nonnull AnalyzedInstruction analyzedInstruction) {
+        if (instructionIndex < analyzedInstruction.instructionIndex) {
+            return -1;
+        } else if (instructionIndex == analyzedInstruction.instructionIndex) {
+            return 0;
+        } else {
+            return 1;
+        }
+    }
+
+    private static class PredecessorOverrideKey {
+        public final AnalyzedInstruction analyzedInstruction;
+        public final int registerNumber;
+
+        public PredecessorOverrideKey(AnalyzedInstruction analyzedInstruction, int registerNumber) {
+            this.analyzedInstruction = analyzedInstruction;
+            this.registerNumber = registerNumber;
+        }
+
+        @Override public boolean equals(Object o) {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+            PredecessorOverrideKey that = (PredecessorOverrideKey)o;
+            return com.google.common.base.Objects.equal(registerNumber, that.registerNumber) &&
+                    Objects.equal(analyzedInstruction, that.analyzedInstruction);
+        }
+
+        @Override public int hashCode() {
+            return Objects.hashCode(analyzedInstruction, registerNumber);
+        }
+    }
+}
+
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/AnalyzedMethodUtil.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/AnalyzedMethodUtil.java
new file mode 100644
index 0000000..775a819
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/AnalyzedMethodUtil.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis;
+
+import org.jf.dexlib2.AccessFlags;
+import org.jf.dexlib2.analysis.util.TypeProtoUtils;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.Method;
+import org.jf.dexlib2.util.MethodUtil;
+import org.jf.dexlib2.util.TypeUtils;
+
+import javax.annotation.Nonnull;
+
+public class AnalyzedMethodUtil {
+    public static boolean canAccess(@Nonnull TypeProto type, @Nonnull Method virtualMethod, boolean checkPackagePrivate,
+                                    boolean checkProtected, boolean checkClass) {
+        if (checkPackagePrivate && MethodUtil.isPackagePrivate(virtualMethod)) {
+            String otherPackage = TypeUtils.getPackage(virtualMethod.getDefiningClass());
+            String thisPackage = TypeUtils.getPackage(type.getType());
+            if (!otherPackage.equals(thisPackage)) {
+                return false;
+            }
+        }
+
+        if (checkProtected && (virtualMethod.getAccessFlags() & AccessFlags.PROTECTED.getValue()) != 0) {
+            if (!TypeProtoUtils.extendsFrom(type, virtualMethod.getDefiningClass())) {
+                return false;
+            }
+        }
+
+        if (checkClass) {
+            ClassPath classPath = type.getClassPath();
+            ClassDef methodClassDef = classPath.getClassDef(virtualMethod.getDefiningClass());
+            if (!TypeUtils.canAccessClass(type.getType(), methodClassDef)) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/ArrayProto.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ArrayProto.java
new file mode 100644
index 0000000..4aa9a5e
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ArrayProto.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis;
+
+import com.google.common.base.Strings;
+import org.jf.dexlib2.iface.Method;
+import org.jf.dexlib2.iface.reference.FieldReference;
+import org.jf.dexlib2.iface.reference.MethodReference;
+import org.jf.dexlib2.immutable.reference.ImmutableFieldReference;
+import org.jf.dexlib2.util.TypeUtils;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class ArrayProto implements TypeProto {
+    protected final ClassPath classPath;
+    protected final int dimensions;
+    protected final String elementType;
+
+    public ArrayProto(@Nonnull ClassPath classPath, @Nonnull String type) {
+        this.classPath = classPath;
+        int i=0;
+        while (type.charAt(i) == '[') {
+            i++;
+            if (i == type.length()) {
+                throw new ExceptionWithContext("Invalid array type: %s", type);
+            }
+        }
+
+        if (i == 0) {
+            throw new ExceptionWithContext("Invalid array type: %s", type);
+        }
+
+        dimensions = i;
+        elementType = type.substring(i);
+    }
+
+    @Override public String toString() { return getType(); }
+    @Nonnull @Override public ClassPath getClassPath() { return classPath; }
+    @Nonnull @Override public String getType() { return makeArrayType(elementType, dimensions); }
+    public int getDimensions() { return dimensions; }
+    @Override public boolean isInterface() { return false; }
+
+    /**
+     * @return The base element type of this array. E.g. This would return Ljava/lang/String; for [[Ljava/lang/String;
+     */
+    @Nonnull public String getElementType() { return elementType; }
+
+    /**
+     * @return The immediate element type of this array. E.g. This would return [Ljava/lang/String; for
+     * [[Ljava/lang/String;
+     */
+    @Nonnull public String getImmediateElementType() {
+        if (dimensions > 1) {
+            return makeArrayType(elementType, dimensions-1);
+        }
+        return elementType;
+    }
+
+    @Override public boolean implementsInterface(@Nonnull String iface) {
+        return iface.equals("Ljava/lang/Cloneable;") || iface.equals("Ljava/io/Serializable;");
+    }
+
+    @Nullable @Override
+    public String getSuperclass() {
+        return "Ljava/lang/Object;";
+    }
+
+    @Nonnull @Override
+    public TypeProto getCommonSuperclass(@Nonnull TypeProto other) {
+        if (other instanceof ArrayProto) {
+            if (TypeUtils.isPrimitiveType(getElementType()) ||
+                    TypeUtils.isPrimitiveType(((ArrayProto)other).getElementType())) {
+                if (dimensions == ((ArrayProto)other).dimensions &&
+                        getElementType().equals(((ArrayProto)other).getElementType())) {
+                    return this;
+                }
+                return classPath.getClass("Ljava/lang/Object;");
+            }
+
+            if (dimensions == ((ArrayProto)other).dimensions) {
+                TypeProto thisClass = classPath.getClass(elementType);
+                TypeProto otherClass = classPath.getClass(((ArrayProto)other).elementType);
+                TypeProto mergedClass = thisClass.getCommonSuperclass(otherClass);
+                if (thisClass == mergedClass) {
+                    return this;
+                }
+                if (otherClass == mergedClass) {
+                    return other;
+                }
+                return classPath.getClass(makeArrayType(mergedClass.getType(), dimensions));
+            }
+
+            int dimensions = Math.min(this.dimensions, ((ArrayProto)other).dimensions);
+            return classPath.getClass(makeArrayType("Ljava/lang/Object;", dimensions));
+        }
+
+        if (other instanceof ClassProto) {
+            try {
+                if (other.isInterface()) {
+                    if (implementsInterface(other.getType())) {
+                        return other;
+                    }
+                }
+            } catch (UnresolvedClassException ex) {
+                // ignore
+            }
+            return classPath.getClass("Ljava/lang/Object;");
+        }
+
+        // otherwise, defer to the other class' getCommonSuperclass
+        return other.getCommonSuperclass(this);
+    }
+
+    private static final String BRACKETS = Strings.repeat("[", 256);
+
+    @Nonnull
+    private static String makeArrayType(@Nonnull String elementType, int dimensions) {
+        return BRACKETS.substring(0, dimensions) + elementType;
+    }
+
+
+    @Override
+    @Nullable
+    public FieldReference getFieldByOffset(int fieldOffset) {
+        if (fieldOffset==8) {
+            return new ImmutableFieldReference(getType(), "length", "int");
+        }
+        return null;
+    }
+
+    @Override
+    @Nullable
+    public Method getMethodByVtableIndex(int vtableIndex) {
+        return classPath.getClass("Ljava/lang/Object;").getMethodByVtableIndex(vtableIndex);
+    }
+
+    @Override public int findMethodIndexInVtable(@Nonnull MethodReference method) {
+        return classPath.getClass("Ljava/lang/Object;").findMethodIndexInVtable(method);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPath.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPath.java
new file mode 100644
index 0000000..c6fdff6
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPath.java
@@ -0,0 +1,179 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis;
+
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.analysis.reflection.ReflectionClassDef;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.immutable.ImmutableDexFile;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.List;
+
+public class ClassPath {
+    @Nonnull private final TypeProto unknownClass;
+    @Nonnull private List<ClassProvider> classProviders;
+    private final boolean checkPackagePrivateAccess;
+    public final int oatVersion;
+
+    public static final int NOT_ART = -1;
+    public static final int NOT_SPECIFIED = -2;
+
+    /**
+     * Creates a new ClassPath instance that can load classes from the given providers
+     *
+     * @param classProviders A varargs array of ClassProviders. When loading a class, these providers will be searched
+     *                       in order
+     */
+    public ClassPath(ClassProvider... classProviders) throws IOException {
+        this(Arrays.asList(classProviders), false, NOT_ART);
+    }
+
+    /**
+     * Creates a new ClassPath instance that can load classes from the given providers
+     *
+     * @param classProviders An iterable of ClassProviders. When loading a class, these providers will be searched in
+     *                       order
+     */
+    public ClassPath(Iterable<ClassProvider> classProviders) throws IOException {
+        this(classProviders, false, NOT_ART);
+    }
+
+    /**
+     * Creates a new ClassPath instance that can load classes from the given providers
+     *
+     * @param classProviders An iterable of ClassProviders. When loading a class, these providers will be searched in
+     *                       order
+     * @param checkPackagePrivateAccess Whether checkPackagePrivateAccess is needed, enabled for ONLY early API 17 by
+     *                                  default
+     * @param oatVersion The applicable oat version, or NOT_ART
+     */
+    public ClassPath(@Nonnull Iterable<? extends ClassProvider> classProviders, boolean checkPackagePrivateAccess,
+                     int oatVersion) {
+        // add fallbacks for certain special classes that must be present
+        unknownClass = new UnknownClassProto(this);
+        loadedClasses.put(unknownClass.getType(), unknownClass);
+        this.checkPackagePrivateAccess = checkPackagePrivateAccess;
+        this.oatVersion = oatVersion;
+
+        loadPrimitiveType("Z");
+        loadPrimitiveType("B");
+        loadPrimitiveType("S");
+        loadPrimitiveType("C");
+        loadPrimitiveType("I");
+        loadPrimitiveType("J");
+        loadPrimitiveType("F");
+        loadPrimitiveType("D");
+        loadPrimitiveType("L");
+
+        this.classProviders = Lists.newArrayList(classProviders);
+        this.classProviders.add(getBasicClasses());
+    }
+
+    private void loadPrimitiveType(String type) {
+        loadedClasses.put(type, new PrimitiveProto(this, type));
+    }
+
+    private static ClassProvider getBasicClasses() {
+        // fallbacks for some special classes that we assume are present
+        return new DexClassProvider(new ImmutableDexFile(Opcodes.getDefault(), ImmutableSet.of(
+                new ReflectionClassDef(Class.class),
+                new ReflectionClassDef(Cloneable.class),
+                new ReflectionClassDef(Object.class),
+                new ReflectionClassDef(Serializable.class),
+                new ReflectionClassDef(String.class),
+                new ReflectionClassDef(Throwable.class))));
+    }
+
+    public boolean isArt() {
+        return oatVersion != NOT_ART;
+    }
+
+    @Nonnull
+    public TypeProto getClass(@Nonnull CharSequence type) {
+        return loadedClasses.getUnchecked(type.toString());
+    }
+
+    private final CacheLoader<String, TypeProto> classLoader = new CacheLoader<String, TypeProto>() {
+        @Override public TypeProto load(String type) throws Exception {
+            if (type.charAt(0) == '[') {
+                return new ArrayProto(ClassPath.this, type);
+            } else {
+                return new ClassProto(ClassPath.this, type);
+            }
+        }
+    };
+
+    @Nonnull private LoadingCache<String, TypeProto> loadedClasses = CacheBuilder.newBuilder().build(classLoader);
+
+    @Nonnull
+    public ClassDef getClassDef(String type) {
+        for (ClassProvider provider: classProviders) {
+            ClassDef classDef = provider.getClassDef(type);
+            if (classDef != null) {
+                return classDef;
+            }
+        }
+        throw new UnresolvedClassException("Could not resolve class %s", type);
+    }
+
+    @Nonnull
+    public TypeProto getUnknownClass() {
+        return unknownClass;
+    }
+
+    public boolean shouldCheckPackagePrivateAccess() {
+        return checkPackagePrivateAccess;
+    }
+
+    private final Supplier<OdexedFieldInstructionMapper> fieldInstructionMapperSupplier = Suppliers.memoize(
+            new Supplier<OdexedFieldInstructionMapper>() {
+                @Override public OdexedFieldInstructionMapper get() {
+                    return new OdexedFieldInstructionMapper(isArt());
+                }
+            });
+
+    @Nonnull
+    public OdexedFieldInstructionMapper getFieldInstructionMapper() {
+        return fieldInstructionMapperSupplier.get();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPathResolver.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPathResolver.java
new file mode 100644
index 0000000..7d28bde
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPathResolver.java
@@ -0,0 +1,396 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis;
+
+import com.google.common.base.Joiner;
+import com.google.common.base.Splitter;
+import com.google.common.collect.Lists;
+import org.jf.dexlib2.DexFileFactory.UnsupportedFileTypeException;
+import org.jf.dexlib2.dexbacked.DexBackedOdexFile;
+import org.jf.dexlib2.dexbacked.OatFile;
+import org.jf.dexlib2.iface.DexFile;
+import org.jf.dexlib2.iface.MultiDexContainer;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+public class ClassPathResolver {
+    private final Iterable<String> classPathDirs;
+
+    private final PathEntryLoader pathEntryLoader;
+
+    /**
+     * Constructs a new ClassPathResolver using a specified list of bootclasspath entries
+     *
+     * @param bootClassPathDirs A list of directories to search for boot classpath entries. Can be empty if all boot
+     *                          classpath entries are specified as local paths
+     * @param bootClassPathEntries A list of boot classpath entries to load. These can either be local paths, or
+     *                             device paths (e.g. "/system/framework/framework.jar"). The entry will be interpreted
+     *                             first as a local path. If not found as a local path, it will be interpreted as a
+     *                             partial or absolute device path, and will be searched for in bootClassPathDirs
+     * @param extraClassPathEntries A list of additional classpath entries to load. Can be empty. All entries must be
+     *                              local paths. Device paths are not supported.
+     * @param dexEntry The dex entry containing the dex file that the classpath will be used to analyze
+     * @throws IOException If any IOException occurs
+     * @throws ResolveException If any classpath entries cannot be loaded for some reason
+     *
+     *  If null, a default bootclasspath is used,
+     *                             depending on the the file type of dexFile and the api level. If empty, no boot
+     *                             classpath entries will be loaded
+     */
+    public ClassPathResolver(@Nonnull List<String> bootClassPathDirs,
+                             @Nullable List<String> bootClassPathEntries,
+                             @Nonnull List<String> extraClassPathEntries,
+                             @Nonnull MultiDexContainer.DexEntry<?> dexEntry)
+            throws IOException {
+        DexFile dexFile = dexEntry.getDexFile();
+
+        this.classPathDirs = bootClassPathDirs;
+        this.pathEntryLoader = new PathEntryLoader(dexEntry.getDexFile().getOpcodes());
+
+        if (bootClassPathEntries == null) {
+            bootClassPathEntries = getDefaultBootClassPath(dexEntry, dexFile.getOpcodes().api);
+        }
+
+        for (String entry : bootClassPathEntries) {
+            try {
+                loadLocalOrDeviceBootClassPathEntry(entry);
+            } catch (PathEntryLoader.NoDexException ex) {
+                if (entry.endsWith(".jar")) {
+                    String odexEntry = entry.substring(0, entry.length() - 4) + ".odex";
+                    try {
+                        loadLocalOrDeviceBootClassPathEntry(odexEntry);
+                    } catch (PathEntryLoader.NoDexException ex2) {
+                        throw new ResolveException("Neither %s nor %s contain a dex file", entry, odexEntry);
+                    } catch (NotFoundException ex2) {
+                        throw new ResolveException(ex);
+                    }
+                } else {
+                    throw new ResolveException(ex);
+                }
+            } catch (NotFoundException ex) {
+                if (entry.endsWith(".odex")) {
+                    String jarEntry = entry.substring(0, entry.length() - 5) + ".jar";
+                    try {
+                        loadLocalOrDeviceBootClassPathEntry(jarEntry);
+                    } catch (PathEntryLoader.NoDexException ex2) {
+                        throw new ResolveException("Neither %s nor %s contain a dex file", entry, jarEntry);
+                    } catch (NotFoundException ex2) {
+                        throw new ResolveException(ex);
+                    }
+                } else {
+                    throw new ResolveException(ex);
+                }
+            }
+        }
+
+        for (String entry: extraClassPathEntries) {
+            // extra classpath entries must be specified using a local path, so we don't need to do the search through
+            // bootClassPathDirs
+            try {
+                loadLocalClassPathEntry(entry);
+            } catch (PathEntryLoader.NoDexException ex) {
+                throw new ResolveException(ex);
+            }
+        }
+
+        MultiDexContainer<? extends DexFile> container = dexEntry.getContainer();
+        for (String entry: container.getDexEntryNames()) {
+            MultiDexContainer.DexEntry<? extends DexFile> tempDexEntry = container.getEntry(entry);
+            assert tempDexEntry != null;
+            pathEntryLoader.getClassProviders().add(new DexClassProvider(tempDexEntry.getDexFile()));
+        }
+    }
+
+    /**
+     * Constructs a new ClassPathResolver using a default list of bootclasspath entries
+     *
+     * @param bootClassPathDirs A list of directories to search for boot classpath entries
+     * @param extraClassPathEntries A list of additional classpath entries to load. Can be empty. All entries must be
+     *                              local paths. Device paths are not supported.
+     * @param dexEntry The dex entry containing the dex file that the classpath will be used to analyze
+     * @throws IOException If any IOException occurs
+     * @throws ResolveException If any classpath entries cannot be loaded for some reason
+     *
+     *  If null, a default bootclasspath is used,
+     *                             depending on the the file type of dexFile and the api level. If empty, no boot
+     *                             classpath entries will be loaded
+     */
+    public ClassPathResolver(@Nonnull List<String> bootClassPathDirs, @Nonnull List<String> extraClassPathEntries,
+                             @Nonnull MultiDexContainer.DexEntry<?> dexEntry)
+            throws IOException {
+        this(bootClassPathDirs, null, extraClassPathEntries, dexEntry);
+    }
+
+    @Nonnull
+    public List<ClassProvider> getResolvedClassProviders() {
+        return pathEntryLoader.getResolvedClassProviders();
+    }
+
+    private boolean loadLocalClassPathEntry(@Nonnull String entry) throws PathEntryLoader.NoDexException, IOException {
+        File entryFile = new File(entry);
+        if (entryFile.exists() && entryFile.isFile()) {
+            try {
+                pathEntryLoader.loadEntry(entryFile, true);
+                return true;
+            } catch (UnsupportedFileTypeException ex) {
+                throw new ResolveException(ex, "Couldn't load classpath entry %s", entry);
+            }
+        }
+        return false;
+    }
+
+    private void loadLocalOrDeviceBootClassPathEntry(@Nonnull String entry)
+            throws IOException, PathEntryLoader.NoDexException, NotFoundException {
+        // first, see if the entry is a valid local path
+        if (loadLocalClassPathEntry(entry)) {
+            return;
+        }
+
+        // It's not a local path, so let's try to resolve it as a device path, relative to one of the provided
+        // directories
+        List<String> pathComponents = splitDevicePath(entry);
+        Joiner pathJoiner = Joiner.on(File.separatorChar);
+
+        for (String directory: classPathDirs) {
+            File directoryFile = new File(directory);
+            if (!directoryFile.exists()) {
+                continue;
+            }
+
+            for (int i=0; i<pathComponents.size(); i++) {
+                String partialPath = pathJoiner.join(pathComponents.subList(i, pathComponents.size()));
+                File entryFile = new File(directoryFile, partialPath);
+                if (entryFile.exists() && entryFile.isFile()) {
+                    pathEntryLoader.loadEntry(entryFile, true);
+                    return;
+                }
+            }
+        }
+
+        throw new NotFoundException("Could not find classpath entry %s", entry);
+    }
+
+    @Nonnull
+    private static List<String> splitDevicePath(@Nonnull String path) {
+        return Lists.newArrayList(Splitter.on('/').split(path));
+    }
+
+    static class NotFoundException extends Exception {
+        public NotFoundException(String message, Object... formatArgs) {
+            super(String.format(message, formatArgs));
+        }
+    }
+
+    /**
+     * An error that occurred while resolving the classpath
+     */
+    public static class ResolveException extends RuntimeException {
+        public ResolveException (String message, Object... formatArgs) {
+            super(String.format(message, formatArgs));
+        }
+
+        public ResolveException (Throwable cause) {
+            super(cause);
+        }
+
+        public ResolveException (Throwable cause, String message, Object... formatArgs) {
+            super(String.format(message, formatArgs), cause);
+        }
+    }
+
+    /**
+     * Returns the default boot class path for the given dex file and api level.
+     */
+    @Nonnull
+    private static List<String> getDefaultBootClassPath(
+            @Nonnull MultiDexContainer.DexEntry<?> dexEntry, int apiLevel) {
+        MultiDexContainer<? extends DexFile> container = dexEntry.getContainer();
+
+        if (container instanceof OatFile) {
+            return bootClassPathForOat((OatFile) container);
+        }
+
+        DexFile dexFile = dexEntry.getDexFile();
+
+        if (dexFile instanceof DexBackedOdexFile) {
+            return ((DexBackedOdexFile)dexFile).getDependencies();
+        }
+
+        if (apiLevel <= 8) {
+            return Lists.newArrayList(
+                    "/system/framework/core.jar",
+                    "/system/framework/ext.jar",
+                    "/system/framework/framework.jar",
+                    "/system/framework/android.policy.jar",
+                    "/system/framework/services.jar");
+        } else if (apiLevel <= 11) {
+            return Lists.newArrayList(
+                    "/system/framework/core.jar",
+                    "/system/framework/bouncycastle.jar",
+                    "/system/framework/ext.jar",
+                    "/system/framework/framework.jar",
+                    "/system/framework/android.policy.jar",
+                    "/system/framework/services.jar",
+                    "/system/framework/core-junit.jar");
+        } else if (apiLevel <= 13) {
+            return Lists.newArrayList(
+                    "/system/framework/core.jar",
+                    "/system/framework/apache-xml.jar",
+                    "/system/framework/bouncycastle.jar",
+                    "/system/framework/ext.jar",
+                    "/system/framework/framework.jar",
+                    "/system/framework/android.policy.jar",
+                    "/system/framework/services.jar",
+                    "/system/framework/core-junit.jar");
+        } else if (apiLevel <= 15) {
+            return Lists.newArrayList(
+                    "/system/framework/core.jar",
+                    "/system/framework/core-junit.jar",
+                    "/system/framework/bouncycastle.jar",
+                    "/system/framework/ext.jar",
+                    "/system/framework/framework.jar",
+                    "/system/framework/android.policy.jar",
+                    "/system/framework/services.jar",
+                    "/system/framework/apache-xml.jar",
+                    "/system/framework/filterfw.jar");
+        } else if (apiLevel <= 17) {
+            // this is correct as of api 17/4.2.2
+            return Lists.newArrayList(
+                    "/system/framework/core.jar",
+                    "/system/framework/core-junit.jar",
+                    "/system/framework/bouncycastle.jar",
+                    "/system/framework/ext.jar",
+                    "/system/framework/framework.jar",
+                    "/system/framework/telephony-common.jar",
+                    "/system/framework/mms-common.jar",
+                    "/system/framework/android.policy.jar",
+                    "/system/framework/services.jar",
+                    "/system/framework/apache-xml.jar");
+        } else if (apiLevel <= 18) {
+            return Lists.newArrayList(
+                    "/system/framework/core.jar",
+                    "/system/framework/core-junit.jar",
+                    "/system/framework/bouncycastle.jar",
+                    "/system/framework/ext.jar",
+                    "/system/framework/framework.jar",
+                    "/system/framework/telephony-common.jar",
+                    "/system/framework/voip-common.jar",
+                    "/system/framework/mms-common.jar",
+                    "/system/framework/android.policy.jar",
+                    "/system/framework/services.jar",
+                    "/system/framework/apache-xml.jar");
+        } else if (apiLevel <= 19) {
+            return Lists.newArrayList(
+                    "/system/framework/core.jar",
+                    "/system/framework/conscrypt.jar",
+                    "/system/framework/core-junit.jar",
+                    "/system/framework/bouncycastle.jar",
+                    "/system/framework/ext.jar",
+                    "/system/framework/framework.jar",
+                    "/system/framework/framework2.jar",
+                    "/system/framework/telephony-common.jar",
+                    "/system/framework/voip-common.jar",
+                    "/system/framework/mms-common.jar",
+                    "/system/framework/android.policy.jar",
+                    "/system/framework/services.jar",
+                    "/system/framework/apache-xml.jar",
+                    "/system/framework/webviewchromium.jar");
+        } else if (apiLevel <= 22) {
+            return Lists.newArrayList(
+                    "/system/framework/core-libart.jar",
+                    "/system/framework/conscrypt.jar",
+                    "/system/framework/okhttp.jar",
+                    "/system/framework/core-junit.jar",
+                    "/system/framework/bouncycastle.jar",
+                    "/system/framework/ext.jar",
+                    "/system/framework/framework.jar",
+                    "/system/framework/telephony-common.jar",
+                    "/system/framework/voip-common.jar",
+                    "/system/framework/ims-common.jar",
+                    "/system/framework/mms-common.jar",
+                    "/system/framework/android.policy.jar",
+                    "/system/framework/apache-xml.jar");
+        } else if (apiLevel <= 23) {
+            return Lists.newArrayList(
+                    "/system/framework/core-libart.jar",
+                    "/system/framework/conscrypt.jar",
+                    "/system/framework/okhttp.jar",
+                    "/system/framework/core-junit.jar",
+                    "/system/framework/bouncycastle.jar",
+                    "/system/framework/ext.jar",
+                    "/system/framework/framework.jar",
+                    "/system/framework/telephony-common.jar",
+                    "/system/framework/voip-common.jar",
+                    "/system/framework/ims-common.jar",
+                    "/system/framework/apache-xml.jar",
+                    "/system/framework/org.apache.http.legacy.boot.jar");
+        } else /*if (apiLevel <= 24)*/ {
+            return Lists.newArrayList(
+                    "/system/framework/core-oj.jar",
+                    "/system/framework/core-libart.jar",
+                    "/system/framework/conscrypt.jar",
+                    "/system/framework/okhttp.jar",
+                    "/system/framework/core-junit.jar",
+                    "/system/framework/bouncycastle.jar",
+                    "/system/framework/ext.jar",
+                    "/system/framework/framework.jar",
+                    "/system/framework/telephony-common.jar",
+                    "/system/framework/voip-common.jar",
+                    "/system/framework/ims-common.jar",
+                    "/system/framework/apache-xml.jar",
+                    "/system/framework/org.apache.http.legacy.boot.jar");
+        }
+    }
+
+    private static List<String> bootClassPathForOat(@Nonnull OatFile oatFile) {
+        List<String> bcp = oatFile.getBootClassPath();
+        if(bcp.isEmpty()) {
+            return Lists.newArrayList("boot.oat");
+        } else {
+            return replaceElementsSuffix(bcp, ".art", ".oat");
+        }
+    }
+
+    private static List<String> replaceElementsSuffix(List<String> bcp, String originalSuffix, String newSuffix) {
+        for (int i=0; i<bcp.size(); i++) {
+            String entry = bcp.get(i);
+            if (entry.endsWith(originalSuffix)) {
+                bcp.set(i, entry.substring(0, entry.length() - originalSuffix.length()) + newSuffix);
+            }
+        }
+        return bcp;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassProto.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassProto.java
new file mode 100755
index 0000000..886f10b
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassProto.java
@@ -0,0 +1,1297 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis;
+
+import com.google.common.base.Joiner;
+import com.google.common.base.Predicates;
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
+import com.google.common.collect.*;
+import com.google.common.primitives.Ints;
+import org.jf.dexlib2.AccessFlags;
+import org.jf.dexlib2.HiddenApiRestriction;
+import org.jf.dexlib2.analysis.util.TypeProtoUtils;
+import org.jf.dexlib2.base.reference.BaseMethodReference;
+import org.jf.dexlib2.iface.*;
+import org.jf.dexlib2.iface.reference.FieldReference;
+import org.jf.dexlib2.iface.reference.MethodReference;
+import org.jf.dexlib2.util.AlignmentUtils;
+import org.jf.dexlib2.util.MethodUtil;
+import org.jf.util.ExceptionWithContext;
+import org.jf.util.SparseArray;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.*;
+import java.util.Map.Entry;
+
+/**
+ * A class "prototype". This contains things like the interfaces, the superclass, the vtable and the instance fields
+ * and their offsets.
+ */
+public class ClassProto implements TypeProto {
+    private static final byte REFERENCE = 0;
+    private static final byte WIDE = 1;
+    private static final byte OTHER = 2;
+
+    @Nonnull protected final ClassPath classPath;
+    @Nonnull protected final String type;
+
+    protected boolean vtableFullyResolved = true;
+    protected boolean interfacesFullyResolved = true;
+
+    protected Set<String> unresolvedInterfaces = null;
+
+    public ClassProto(@Nonnull ClassPath classPath, @Nonnull String type) {
+        if (type.charAt(0) != 'L') {
+            throw new ExceptionWithContext("Cannot construct ClassProto for non reference type: %s", type);
+        }
+        this.classPath = classPath;
+        this.type = type;
+    }
+
+    @Override public String toString() { return type; }
+    @Nonnull @Override public ClassPath getClassPath() { return classPath; }
+    @Nonnull @Override public String getType() { return type; }
+
+    @Nonnull
+    public ClassDef getClassDef() {
+        return classDefSupplier.get();
+    }
+
+
+    @Nonnull private final Supplier<ClassDef> classDefSupplier = Suppliers.memoize(new Supplier<ClassDef>() {
+        @Override public ClassDef get() {
+            return classPath.getClassDef(type);
+        }
+    });
+
+    /**
+     * Returns true if this class is an interface.
+     *
+     * If this class is not defined, then this will throw an UnresolvedClassException
+     *
+     * @return True if this class is an interface
+     */
+    public boolean isInterface() {
+        ClassDef classDef = getClassDef();
+        return (classDef.getAccessFlags() & AccessFlags.INTERFACE.getValue()) != 0;
+    }
+
+    /**
+     * Returns the set of interfaces that this class implements as a Map<String, ClassDef>.
+     *
+     * The ClassDef value will be present only for the interfaces that this class directly implements (including any
+     * interfaces transitively implemented), but not for any interfaces that are only implemented by a superclass of
+     * this class
+     *
+     * For any interfaces that are only implemented by a superclass (or the class itself, if the class is an interface),
+     * the value will be null.
+     *
+     * If any interface couldn't be resolved, then the interfacesFullyResolved field will be set to false upon return.
+     *
+     * @return the set of interfaces that this class implements as a Map<String, ClassDef>.
+     */
+    @Nonnull
+    protected LinkedHashMap<String, ClassDef> getInterfaces() {
+        if (!classPath.isArt() || classPath.oatVersion < 72) {
+            return preDefaultMethodInterfaceSupplier.get();
+        } else {
+            return postDefaultMethodInterfaceSupplier.get();
+        }
+    }
+
+    /**
+     * This calculates the interfaces in the order required for vtable generation for dalvik and pre-default method ART
+     */
+    @Nonnull
+    private final Supplier<LinkedHashMap<String, ClassDef>> preDefaultMethodInterfaceSupplier =
+            Suppliers.memoize(new Supplier<LinkedHashMap<String, ClassDef>>() {
+                @Override public LinkedHashMap<String, ClassDef> get() {
+                    Set<String> unresolvedInterfaces = new HashSet<String>(0);
+                    LinkedHashMap<String, ClassDef> interfaces = Maps.newLinkedHashMap();
+
+                    try {
+                        for (String interfaceType: getClassDef().getInterfaces()) {
+                            if (!interfaces.containsKey(interfaceType)) {
+                                ClassDef interfaceDef;
+                                try {
+                                    interfaceDef = classPath.getClassDef(interfaceType);
+                                    interfaces.put(interfaceType, interfaceDef);
+                                } catch (UnresolvedClassException ex) {
+                                    interfaces.put(interfaceType, null);
+                                    unresolvedInterfaces.add(interfaceType);
+                                    interfacesFullyResolved = false;
+                                }
+
+                                ClassProto interfaceProto = (ClassProto) classPath.getClass(interfaceType);
+                                for (String superInterface: interfaceProto.getInterfaces().keySet()) {
+                                    if (!interfaces.containsKey(superInterface)) {
+                                        interfaces.put(superInterface,
+                                                interfaceProto.getInterfaces().get(superInterface));
+                                    }
+                                }
+                                if (!interfaceProto.interfacesFullyResolved) {
+                                    unresolvedInterfaces.addAll(interfaceProto.getUnresolvedInterfaces());
+                                    interfacesFullyResolved = false;
+                                }
+                            }
+                        }
+                    } catch (UnresolvedClassException ex) {
+                        interfaces.put(type, null);
+                        unresolvedInterfaces.add(type);
+                        interfacesFullyResolved = false;
+                    }
+
+                    // now add self and super class interfaces, required for common super class lookup
+                    // we don't really need ClassDef's for that, so let's just use null
+
+                    if (isInterface() && !interfaces.containsKey(getType())) {
+                        interfaces.put(getType(), null);
+                    }
+
+                    String superclass = getSuperclass();
+                    try {
+                        if (superclass != null) {
+                            ClassProto superclassProto = (ClassProto) classPath.getClass(superclass);
+                            for (String superclassInterface: superclassProto.getInterfaces().keySet()) {
+                                if (!interfaces.containsKey(superclassInterface)) {
+                                    interfaces.put(superclassInterface, null);
+                                }
+                            }
+                            if (!superclassProto.interfacesFullyResolved) {
+                                unresolvedInterfaces.addAll(superclassProto.getUnresolvedInterfaces());
+                                interfacesFullyResolved = false;
+                            }
+                        }
+                    } catch (UnresolvedClassException ex) {
+                        unresolvedInterfaces.add(superclass);
+                        interfacesFullyResolved = false;
+                    }
+
+                    if (unresolvedInterfaces.size() > 0) {
+                        ClassProto.this.unresolvedInterfaces = unresolvedInterfaces;
+                    }
+
+                    return interfaces;
+                }
+            });
+
+    /**
+     * This calculates the interfaces in the order required for vtable generation for post-default method ART
+     */
+    @Nonnull
+    private final Supplier<LinkedHashMap<String, ClassDef>> postDefaultMethodInterfaceSupplier =
+            Suppliers.memoize(new Supplier<LinkedHashMap<String, ClassDef>>() {
+                @Override public LinkedHashMap<String, ClassDef> get() {
+                    Set<String> unresolvedInterfaces = new HashSet<String>(0);
+                    LinkedHashMap<String, ClassDef> interfaces = Maps.newLinkedHashMap();
+
+                    String superclass = getSuperclass();
+                    if (superclass != null) {
+                        ClassProto superclassProto = (ClassProto) classPath.getClass(superclass);
+                        for (String superclassInterface: superclassProto.getInterfaces().keySet()) {
+                            interfaces.put(superclassInterface, null);
+                        }
+                        if (!superclassProto.interfacesFullyResolved) {
+                            unresolvedInterfaces.addAll(superclassProto.getUnresolvedInterfaces());
+                            interfacesFullyResolved = false;
+                        }
+                    }
+
+                    try {
+                        for (String interfaceType: getClassDef().getInterfaces()) {
+                            if (!interfaces.containsKey(interfaceType)) {
+                                ClassProto interfaceProto = (ClassProto)classPath.getClass(interfaceType);
+                                try {
+                                    for (Entry<String, ClassDef> entry: interfaceProto.getInterfaces().entrySet()) {
+                                        if (!interfaces.containsKey(entry.getKey())) {
+                                            interfaces.put(entry.getKey(), entry.getValue());
+                                        }
+                                    }
+                                } catch (UnresolvedClassException ex) {
+                                    interfaces.put(interfaceType, null);
+                                    unresolvedInterfaces.add(interfaceType);
+                                    interfacesFullyResolved = false;
+                                }
+                                if (!interfaceProto.interfacesFullyResolved) {
+                                    unresolvedInterfaces.addAll(interfaceProto.getUnresolvedInterfaces());
+                                    interfacesFullyResolved = false;
+                                }
+                                try {
+                                    ClassDef interfaceDef = classPath.getClassDef(interfaceType);
+                                    interfaces.put(interfaceType, interfaceDef);
+                                } catch (UnresolvedClassException ex) {
+                                    interfaces.put(interfaceType, null);
+                                    unresolvedInterfaces.add(interfaceType);
+                                    interfacesFullyResolved = false;
+                                }
+                            }
+                        }
+                    } catch (UnresolvedClassException ex) {
+                        interfaces.put(type, null);
+                        unresolvedInterfaces.add(type);
+                        interfacesFullyResolved = false;
+                    }
+
+                    if (unresolvedInterfaces.size() > 0) {
+                        ClassProto.this.unresolvedInterfaces = unresolvedInterfaces;
+                    }
+
+                    return interfaces;
+                }
+            });
+
+    @Nonnull
+    protected Set<String> getUnresolvedInterfaces() {
+        if (unresolvedInterfaces == null) {
+            return ImmutableSet.of();
+        }
+        return unresolvedInterfaces;
+    }
+
+    /**
+     * Gets the interfaces directly implemented by this class, or the interfaces they transitively implement.
+     *
+     * This does not include any interfaces that are only implemented by a superclass
+     *
+     * @return An iterables of ClassDefs representing the directly or transitively implemented interfaces
+     * @throws UnresolvedClassException if interfaces could not be fully resolved
+     */
+    @Nonnull
+    protected Iterable<ClassDef> getDirectInterfaces() {
+        Iterable<ClassDef> directInterfaces =
+                FluentIterable.from(getInterfaces().values()).filter(Predicates.notNull());
+
+        if (!interfacesFullyResolved) {
+            throw new UnresolvedClassException("Interfaces for class %s not fully resolved: %s", getType(),
+                    Joiner.on(',').join(getUnresolvedInterfaces()));
+        }
+
+        return directInterfaces;
+    }
+
+    /**
+     * Checks if this class implements the given interface.
+     *
+     * If the interfaces of this class cannot be fully resolved then this
+     * method will either return true or throw an UnresolvedClassException
+     *
+     * @param iface The interface to check for
+     * @return true if this class implements the given interface, otherwise false
+     * @throws UnresolvedClassException if the interfaces for this class could not be fully resolved, and the interface
+     * is not one of the interfaces that were successfully resolved
+     */
+    @Override
+    public boolean implementsInterface(@Nonnull String iface) {
+        if (getInterfaces().containsKey(iface)) {
+            return true;
+        }
+        if (!interfacesFullyResolved) {
+            throw new UnresolvedClassException("Interfaces for class %s not fully resolved", getType());
+        }
+        return false;
+    }
+
+    @Nullable @Override
+    public String getSuperclass() {
+        return getClassDef().getSuperclass();
+    }
+
+    /**
+     * This is a helper method for getCommonSuperclass
+     *
+     * It checks if this class is an interface, and if so, if other implements it.
+     *
+     * If this class is undefined, we go ahead and check if it is listed in other's interfaces. If not, we throw an
+     * UndefinedClassException
+     *
+     * If the interfaces of other cannot be fully resolved, we check the interfaces that can be resolved. If not found,
+     * we throw an UndefinedClassException
+     *
+     * @param other The class to check the interfaces of
+     * @return true if this class is an interface (or is undefined) other implements this class
+     *
+     */
+    private boolean checkInterface(@Nonnull ClassProto other) {
+        boolean isResolved = true;
+        boolean isInterface = true;
+        try {
+            isInterface = isInterface();
+        } catch (UnresolvedClassException ex) {
+            isResolved = false;
+            // if we don't know if this class is an interface or not,
+            // we can still try to call other.implementsInterface(this)
+        }
+        if (isInterface) {
+            try {
+                if (other.implementsInterface(getType())) {
+                    return true;
+                }
+            } catch (UnresolvedClassException ex) {
+                // There are 2 possibilities here, depending on whether we were able to resolve this class.
+                // 1. If this class is resolved, then we know it is an interface class. The other class either
+                //    isn't defined, or its interfaces couldn't be fully resolved.
+                //    In this case, we throw an UnresolvedClassException
+                // 2. If this class is not resolved, we had tried to call implementsInterface anyway. We don't
+                //    know for sure if this class is an interface or not. We return false, and let processing
+                //    continue in getCommonSuperclass
+                if (isResolved) {
+                    throw ex;
+                }
+            }
+        }
+        return false;
+    }
+
+    @Override @Nonnull
+    public TypeProto getCommonSuperclass(@Nonnull TypeProto other) {
+        // use the other type's more specific implementation
+        if (!(other instanceof ClassProto)) {
+            return other.getCommonSuperclass(this);
+        }
+
+        if (this == other || getType().equals(other.getType())) {
+            return this;
+        }
+
+        if (this.getType().equals("Ljava/lang/Object;")) {
+            return this;
+        }
+
+        if (other.getType().equals("Ljava/lang/Object;")) {
+            return other;
+        }
+
+        boolean gotException = false;
+        try {
+            if (checkInterface((ClassProto)other)) {
+                return this;
+            }
+        } catch (UnresolvedClassException ex) {
+            gotException = true;
+        }
+
+        try {
+            if (((ClassProto)other).checkInterface(this)) {
+                return other;
+            }
+        } catch (UnresolvedClassException ex) {
+            gotException = true;
+        }
+        if (gotException) {
+            return classPath.getUnknownClass();
+        }
+
+        List<TypeProto> thisChain = Lists.<TypeProto>newArrayList(this);
+        Iterables.addAll(thisChain, TypeProtoUtils.getSuperclassChain(this));
+
+        List<TypeProto> otherChain = Lists.newArrayList(other);
+        Iterables.addAll(otherChain, TypeProtoUtils.getSuperclassChain(other));
+
+        // reverse them, so that the first entry is either Ljava/lang/Object; or Ujava/lang/Object;
+        thisChain = Lists.reverse(thisChain);
+        otherChain = Lists.reverse(otherChain);
+
+        for (int i=Math.min(thisChain.size(), otherChain.size())-1; i>=0; i--) {
+            TypeProto typeProto = thisChain.get(i);
+            if (typeProto.getType().equals(otherChain.get(i).getType())) {
+                return typeProto;
+            }
+        }
+
+        return classPath.getUnknownClass();
+    }
+
+    @Override
+    @Nullable
+    public FieldReference getFieldByOffset(int fieldOffset) {
+        if (getInstanceFields().size() == 0) {
+            return null;
+        }
+        return getInstanceFields().get(fieldOffset);
+    }
+
+    @Override
+    @Nullable
+    public Method getMethodByVtableIndex(int vtableIndex) {
+        List<Method> vtable = getVtable();
+        if (vtableIndex < 0 || vtableIndex >= vtable.size()) {
+            return null;
+        }
+
+        return vtable.get(vtableIndex);
+    }
+
+    public int findMethodIndexInVtable(@Nonnull MethodReference method) {
+        return findMethodIndexInVtable(getVtable(), method);
+    }
+
+    private int findMethodIndexInVtable(@Nonnull List<Method> vtable, MethodReference method) {
+        for (int i=0; i<vtable.size(); i++) {
+            Method candidate = vtable.get(i);
+            if (MethodUtil.methodSignaturesMatch(candidate, method)) {
+                if (!classPath.shouldCheckPackagePrivateAccess() ||
+                        AnalyzedMethodUtil.canAccess(this, candidate, true, false, false)) {
+                    return i;
+                }
+            }
+        }
+        return -1;
+    }
+
+    private int findMethodIndexInVtableReverse(@Nonnull List<Method> vtable, MethodReference method) {
+        for (int i=vtable.size() - 1; i>=0; i--) {
+            Method candidate = vtable.get(i);
+            if (MethodUtil.methodSignaturesMatch(candidate, method)) {
+                if (!classPath.shouldCheckPackagePrivateAccess() ||
+                        AnalyzedMethodUtil.canAccess(this, candidate, true, false, false)) {
+                    return i;
+                }
+            }
+        }
+        return -1;
+    }
+
+    @Nonnull public SparseArray<FieldReference> getInstanceFields() {
+        if (classPath.isArt()) {
+            return artInstanceFieldsSupplier.get();
+        } else {
+            return dalvikInstanceFieldsSupplier.get();
+        }
+    }
+
+    @Nonnull private final Supplier<SparseArray<FieldReference>> dalvikInstanceFieldsSupplier =
+            Suppliers.memoize(new Supplier<SparseArray<FieldReference>>() {
+                @Override public SparseArray<FieldReference> get() {
+                    //This is a bit of an "involved" operation. We need to follow the same algorithm that dalvik uses to
+                    //arrange fields, so that we end up with the same field offsets (which is needed for deodexing).
+                    //See mydroid/dalvik/vm/oo/Class.c - computeFieldOffsets()
+
+                    ArrayList<Field> fields = getSortedInstanceFields(getClassDef());
+                    final int fieldCount = fields.size();
+                    //the "type" for each field in fields. 0=reference,1=wide,2=other
+                    byte[] fieldTypes = new byte[fields.size()];
+                    for (int i=0; i<fieldCount; i++) {
+                        fieldTypes[i] = getFieldType(fields.get(i));
+                    }
+
+                    //The first operation is to move all of the reference fields to the front. To do this, find the first
+                    //non-reference field, then find the last reference field, swap them and repeat
+                    int back = fields.size() - 1;
+                    int front;
+                    for (front = 0; front<fieldCount; front++) {
+                        if (fieldTypes[front] != REFERENCE) {
+                            while (back > front) {
+                                if (fieldTypes[back] == REFERENCE) {
+                                    swap(fieldTypes, fields, front, back--);
+                                    break;
+                                }
+                                back--;
+                            }
+                        }
+
+                        if (fieldTypes[front] != REFERENCE) {
+                            break;
+                        }
+                    }
+
+                    int startFieldOffset = 8;
+                    String superclassType = getSuperclass();
+                    ClassProto superclass = null;
+                    if (superclassType != null) {
+                        superclass = (ClassProto) classPath.getClass(superclassType);
+                        startFieldOffset = superclass.getNextFieldOffset();
+                    }
+
+                    int fieldIndexMod;
+                    if ((startFieldOffset % 8) == 0) {
+                        fieldIndexMod = 0;
+                    } else {
+                        fieldIndexMod = 1;
+                    }
+
+                    //next, we need to group all the wide fields after the reference fields. But the wide fields have to be
+                    //8-byte aligned. If we're on an odd field index, we need to insert a 32-bit field. If the next field
+                    //is already a 32-bit field, use that. Otherwise, find the first 32-bit field from the end and swap it in.
+                    //If there are no 32-bit fields, do nothing for now. We'll add padding when calculating the field offsets
+                    if (front < fieldCount && (front % 2) != fieldIndexMod) {
+                        if (fieldTypes[front] == WIDE) {
+                            //we need to swap in a 32-bit field, so the wide fields will be correctly aligned
+                            back = fieldCount - 1;
+                            while (back > front) {
+                                if (fieldTypes[back] == OTHER) {
+                                    swap(fieldTypes, fields, front++, back);
+                                    break;
+                                }
+                                back--;
+                            }
+                        } else {
+                            //there's already a 32-bit field here that we can use
+                            front++;
+                        }
+                    }
+
+                    //do the swap thing for wide fields
+                    back = fieldCount - 1;
+                    for (; front<fieldCount; front++) {
+                        if (fieldTypes[front] != WIDE) {
+                            while (back > front) {
+                                if (fieldTypes[back] == WIDE) {
+                                    swap(fieldTypes, fields, front, back--);
+                                    break;
+                                }
+                                back--;
+                            }
+                        }
+
+                        if (fieldTypes[front] != WIDE) {
+                            break;
+                        }
+                    }
+
+                    SparseArray<FieldReference> superFields;
+                    if (superclass != null) {
+                        superFields = superclass.getInstanceFields();
+                    } else {
+                        superFields = new SparseArray<FieldReference>();
+                    }
+                    int superFieldCount = superFields.size();
+
+                    //now the fields are in the correct order. Add them to the SparseArray and lookup, and calculate the offsets
+                    int totalFieldCount = superFieldCount + fieldCount;
+                    SparseArray<FieldReference> instanceFields = new SparseArray<FieldReference>(totalFieldCount);
+
+                    int fieldOffset;
+
+                    if (superclass != null && superFieldCount > 0) {
+                        for (int i=0; i<superFieldCount; i++) {
+                            instanceFields.append(superFields.keyAt(i), superFields.valueAt(i));
+                        }
+
+                        fieldOffset = instanceFields.keyAt(superFieldCount-1);
+
+                        FieldReference lastSuperField = superFields.valueAt(superFieldCount-1);
+                        char fieldType = lastSuperField.getType().charAt(0);
+                        if (fieldType == 'J' || fieldType == 'D') {
+                            fieldOffset += 8;
+                        } else {
+                            fieldOffset += 4;
+                        }
+                    } else {
+                        //the field values start at 8 bytes into the DataObject dalvik structure
+                        fieldOffset = 8;
+                    }
+
+                    boolean gotDouble = false;
+                    for (int i=0; i<fieldCount; i++) {
+                        FieldReference field = fields.get(i);
+
+                        //add padding to align the wide fields, if needed
+                        if (fieldTypes[i] == WIDE && !gotDouble) {
+                            if (fieldOffset % 8 != 0) {
+                                assert fieldOffset % 8 == 4;
+                                fieldOffset += 4;
+                            }
+                            gotDouble = true;
+                        }
+
+                        instanceFields.append(fieldOffset, field);
+                        if (fieldTypes[i] == WIDE) {
+                            fieldOffset += 8;
+                        } else {
+                            fieldOffset += 4;
+                        }
+                    }
+
+                    return instanceFields;
+                }
+
+                @Nonnull
+                private ArrayList<Field> getSortedInstanceFields(@Nonnull ClassDef classDef) {
+                    ArrayList<Field> fields = Lists.newArrayList(classDef.getInstanceFields());
+                    Collections.sort(fields);
+                    return fields;
+                }
+
+                private void swap(byte[] fieldTypes, List<Field> fields, int position1, int position2) {
+                    byte tempType = fieldTypes[position1];
+                    fieldTypes[position1] = fieldTypes[position2];
+                    fieldTypes[position2] = tempType;
+
+                    Field tempField = fields.set(position1, fields.get(position2));
+                    fields.set(position2, tempField);
+                }
+            });
+
+    private static abstract class FieldGap implements Comparable<FieldGap> {
+        public final int offset;
+        public final int size;
+
+        public static FieldGap newFieldGap(int offset, int size, int oatVersion) {
+            if (oatVersion >= 67) {
+                return new FieldGap(offset, size) {
+                    @Override public int compareTo(@Nonnull FieldGap o) {
+                        int result = Ints.compare(o.size, size);
+                        if (result != 0) {
+                            return result;
+                        }
+                        return Ints.compare(offset, o.offset);
+                    }
+                };
+            } else {
+                return new FieldGap(offset, size) {
+                    @Override public int compareTo(@Nonnull FieldGap o) {
+                        int result = Ints.compare(size, o.size);
+                        if (result != 0) {
+                            return result;
+                        }
+                        return Ints.compare(o.offset, offset);
+                    }
+                };
+            }
+        }
+
+        private FieldGap(int offset, int size) {
+            this.offset = offset;
+            this.size = size;
+        }
+    }
+
+    @Nonnull private final Supplier<SparseArray<FieldReference>> artInstanceFieldsSupplier =
+            Suppliers.memoize(new Supplier<SparseArray<FieldReference>>() {
+
+                @Override public SparseArray<FieldReference> get() {
+                    // We need to follow the same algorithm that art uses to arrange fields, so that we end up with the
+                    // same field offsets, which is needed for deodexing.
+                    // See LinkFields() in art/runtime/class_linker.cc
+
+                    PriorityQueue<FieldGap> gaps = new PriorityQueue<FieldGap>();
+
+                    SparseArray<FieldReference> linkedFields = new SparseArray<FieldReference>();
+                    ArrayList<Field> fields = getSortedInstanceFields(getClassDef());
+
+                    int fieldOffset = 0;
+                    String superclassType = getSuperclass();
+                    if (superclassType != null) {
+                        // TODO: what to do if superclass doesn't exist?
+                        ClassProto superclass = (ClassProto) classPath.getClass(superclassType);
+                        SparseArray<FieldReference> superFields = superclass.getInstanceFields();
+                        FieldReference field = null;
+                        int lastOffset = 0;
+                        for (int i=0; i<superFields.size(); i++) {
+                            int offset = superFields.keyAt(i);
+                            field = superFields.valueAt(i);
+                            linkedFields.put(offset, field);
+                            lastOffset = offset;
+                        }
+                        if (field != null) {
+                            fieldOffset = lastOffset + getFieldSize(field);
+                        }
+                    }
+
+                    for (Field field: fields) {
+                        int fieldSize = getFieldSize(field);
+
+                        if (!AlignmentUtils.isAligned(fieldOffset, fieldSize)) {
+                            int oldOffset = fieldOffset;
+                            fieldOffset = AlignmentUtils.alignOffset(fieldOffset, fieldSize);
+                            addFieldGap(oldOffset, fieldOffset, gaps);
+                        }
+
+                        FieldGap gap = gaps.peek();
+                        if (gap != null && gap.size >= fieldSize) {
+                            gaps.poll();
+                            linkedFields.put(gap.offset, field);
+                            if (gap.size > fieldSize) {
+                                addFieldGap(gap.offset + fieldSize, gap.offset + gap.size, gaps);
+                            }
+                        } else {
+                            linkedFields.append(fieldOffset, field);
+                            fieldOffset += fieldSize;
+                        }
+                    }
+
+                    return linkedFields;
+                }
+
+                private void addFieldGap(int gapStart, int gapEnd, @Nonnull PriorityQueue<FieldGap> gaps) {
+                    int offset = gapStart;
+
+                    while (offset < gapEnd) {
+                        int remaining = gapEnd - offset;
+
+                        if ((remaining >= 4) && (offset % 4 == 0)) {
+                            gaps.add(FieldGap.newFieldGap(offset, 4, classPath.oatVersion));
+                            offset += 4;
+                        } else if (remaining >= 2 && (offset % 2 == 0)) {
+                            gaps.add(FieldGap.newFieldGap(offset, 2, classPath.oatVersion));
+                            offset += 2;
+                        } else {
+                            gaps.add(FieldGap.newFieldGap(offset, 1, classPath.oatVersion));
+                            offset += 1;
+                        }
+                    }
+                }
+
+                @Nonnull
+                private ArrayList<Field> getSortedInstanceFields(@Nonnull ClassDef classDef) {
+                    ArrayList<Field> fields = Lists.newArrayList(classDef.getInstanceFields());
+                    Collections.sort(fields, new Comparator<Field>() {
+                        @Override public int compare(Field field1, Field field2) {
+                            int result = Ints.compare(getFieldSortOrder(field1), getFieldSortOrder(field2));
+                            if (result != 0) {
+                                return result;
+                            }
+
+                            result = field1.getName().compareTo(field2.getName());
+                            if (result != 0) {
+                                return result;
+                            }
+                            return field1.getType().compareTo(field2.getType());
+                        }
+                    });
+                    return fields;
+                }
+
+                private int getFieldSortOrder(@Nonnull FieldReference field) {
+                    // The sort order is based on type size (except references are first), and then based on the
+                    // enum value of the primitive type for types of equal size. See: Primitive::Type enum
+                    // in art/runtime/primitive.h
+                    switch (field.getType().charAt(0)) {
+                        /* reference */
+                        case '[':
+                        case 'L':
+                            return 0;
+                        /* 64 bit */
+                        case 'J':
+                            return 1;
+                        case 'D':
+                            return 2;
+                        /* 32 bit */
+                        case 'I':
+                            return 3;
+                        case 'F':
+                            return 4;
+                        /* 16 bit */
+                        case 'C':
+                            return 5;
+                        case 'S':
+                            return 6;
+                        /* 8 bit */
+                        case 'Z':
+                            return 7;
+                        case 'B':
+                            return 8;
+                    }
+                    throw new ExceptionWithContext("Invalid field type: %s", field.getType());
+                }
+
+                private int getFieldSize(@Nonnull FieldReference field) {
+                    return getTypeSize(field.getType().charAt(0));
+                }
+            });
+
+    private int getNextFieldOffset() {
+        SparseArray<FieldReference> instanceFields = getInstanceFields();
+        if (instanceFields.size() == 0) {
+            return classPath.isArt() ? 0 : 8;
+        }
+
+        int lastItemIndex = instanceFields.size()-1;
+        int fieldOffset = instanceFields.keyAt(lastItemIndex);
+        FieldReference lastField = instanceFields.valueAt(lastItemIndex);
+
+        if (classPath.isArt()) {
+            return fieldOffset + getTypeSize(lastField.getType().charAt(0));
+        } else {
+            switch (lastField.getType().charAt(0)) {
+                case 'J':
+                case 'D':
+                    return fieldOffset + 8;
+                default:
+                    return fieldOffset + 4;
+            }
+        }
+    }
+
+    private static int getTypeSize(char type) {
+        switch (type) {
+            case 'J':
+            case 'D':
+                return 8;
+            case '[':
+            case 'L':
+            case 'I':
+            case 'F':
+                return 4;
+            case 'C':
+            case 'S':
+                return 2;
+            case 'B':
+            case 'Z':
+                return 1;
+        }
+        throw new ExceptionWithContext("Invalid type: %s", type);
+    }
+
+    @Nonnull public List<Method> getVtable() {
+        if (!classPath.isArt() || classPath.oatVersion < 72) {
+            return preDefaultMethodVtableSupplier.get();
+        } else if (classPath.oatVersion < 87) {
+            return buggyPostDefaultMethodVtableSupplier.get();
+        } else {
+            return postDefaultMethodVtableSupplier.get();
+        }
+    }
+
+    //TODO: check the case when we have a package private method that overrides an interface method
+    @Nonnull private final Supplier<List<Method>> preDefaultMethodVtableSupplier = Suppliers.memoize(new Supplier<List<Method>>() {
+        @Override public List<Method> get() {
+            List<Method> vtable = Lists.newArrayList();
+
+            //copy the virtual methods from the superclass
+            String superclassType;
+            try {
+                superclassType = getSuperclass();
+            } catch (UnresolvedClassException ex) {
+                vtable.addAll(((ClassProto)classPath.getClass("Ljava/lang/Object;")).getVtable());
+                vtableFullyResolved = false;
+                return vtable;
+            }
+
+            if (superclassType != null) {
+                ClassProto superclass = (ClassProto) classPath.getClass(superclassType);
+                vtable.addAll(superclass.getVtable());
+
+                // if the superclass's vtable wasn't fully resolved, then we can't know where the new methods added by this
+                // class should start, so we just propagate what we can from the parent and hope for the best.
+                if (!superclass.vtableFullyResolved) {
+                    vtableFullyResolved = false;
+                    return vtable;
+                }
+            }
+
+            //iterate over the virtual methods in the current class, and only add them when we don't already have the
+            //method (i.e. if it was implemented by the superclass)
+            if (!isInterface()) {
+                addToVtable(getClassDef().getVirtualMethods(), vtable, true, true);
+
+                // We use the current class for any vtable method references that we add, rather than the interface, so
+                // we don't end up trying to call invoke-virtual using an interface, which will fail verification
+                Iterable<ClassDef> interfaces = getDirectInterfaces();
+                for (ClassDef interfaceDef: interfaces) {
+                    List<Method> interfaceMethods = Lists.newArrayList();
+                    for (Method interfaceMethod: interfaceDef.getVirtualMethods()) {
+                        interfaceMethods.add(new ReparentedMethod(interfaceMethod, type));
+                    }
+                    addToVtable(interfaceMethods, vtable, false, true);
+                }
+            }
+            return vtable;
+        }
+    });
+
+    /**
+     * This is the vtable supplier for a version of art that had buggy vtable calculation logic. In some cases it can
+     * produce multiple vtable entries for a given virtual method. This supplier duplicates this buggy logic in order to
+     * generate an identical vtable
+     */
+    @Nonnull private final Supplier<List<Method>> buggyPostDefaultMethodVtableSupplier = Suppliers.memoize(new Supplier<List<Method>>() {
+        @Override public List<Method> get() {
+            List<Method> vtable = Lists.newArrayList();
+
+            //copy the virtual methods from the superclass
+            String superclassType;
+            try {
+                superclassType = getSuperclass();
+            } catch (UnresolvedClassException ex) {
+                vtable.addAll(((ClassProto)classPath.getClass("Ljava/lang/Object;")).getVtable());
+                vtableFullyResolved = false;
+                return vtable;
+            }
+
+            if (superclassType != null) {
+                ClassProto superclass = (ClassProto) classPath.getClass(superclassType);
+                vtable.addAll(superclass.getVtable());
+
+                // if the superclass's vtable wasn't fully resolved, then we can't know where the new methods added by
+                // this class should start, so we just propagate what we can from the parent and hope for the best.
+                if (!superclass.vtableFullyResolved) {
+                    vtableFullyResolved = false;
+                    return vtable;
+                }
+            }
+
+            //iterate over the virtual methods in the current class, and only add them when we don't already have the
+            //method (i.e. if it was implemented by the superclass)
+            if (!isInterface()) {
+                addToVtable(getClassDef().getVirtualMethods(), vtable, true, true);
+
+                List<String> interfaces = Lists.newArrayList(getInterfaces().keySet());
+
+                List<Method> defaultMethods = Lists.newArrayList();
+                List<Method> defaultConflictMethods = Lists.newArrayList();
+                List<Method> mirandaMethods = Lists.newArrayList();
+
+                final HashMap<MethodReference, Integer> methodOrder = Maps.newHashMap();
+
+                for (int i=interfaces.size()-1; i>=0; i--) {
+                    String interfaceType = interfaces.get(i);
+                    ClassDef interfaceDef = classPath.getClassDef(interfaceType);
+
+                    for (Method interfaceMethod : interfaceDef.getVirtualMethods()) {
+
+                        int vtableIndex = findMethodIndexInVtableReverse(vtable, interfaceMethod);
+                        Method oldVtableMethod = null;
+                        if (vtableIndex >= 0) {
+                            oldVtableMethod = vtable.get(vtableIndex);
+                        }
+
+                        for (int j=0; j<vtable.size(); j++) {
+                            Method candidate = vtable.get(j);
+                            if (MethodUtil.methodSignaturesMatch(candidate, interfaceMethod)) {
+                                if (!classPath.shouldCheckPackagePrivateAccess() ||
+                                        AnalyzedMethodUtil.canAccess(ClassProto.this, candidate, true, false, false)) {
+                                    if (interfaceMethodOverrides(interfaceMethod, candidate)) {
+                                        vtable.set(j, interfaceMethod);
+                                    }
+                                }
+                            }
+                        }
+
+                        if (vtableIndex >= 0) {
+                            if (!isOverridableByDefaultMethod(vtable.get(vtableIndex))) {
+                                continue;
+                            }
+                        }
+
+                        int defaultMethodIndex = findMethodIndexInVtable(defaultMethods, interfaceMethod);
+
+                        if (defaultMethodIndex >= 0) {
+                            if (!AccessFlags.ABSTRACT.isSet(interfaceMethod.getAccessFlags())) {
+                                ClassProto existingInterface = (ClassProto)classPath.getClass(
+                                        defaultMethods.get(defaultMethodIndex).getDefiningClass());
+                                if (!existingInterface.implementsInterface(interfaceMethod.getDefiningClass())) {
+                                    Method removedMethod = defaultMethods.remove(defaultMethodIndex);
+                                    defaultConflictMethods.add(removedMethod);
+                                }
+                            }
+                            continue;
+                        }
+
+                        int defaultConflictMethodIndex = findMethodIndexInVtable(
+                                defaultConflictMethods, interfaceMethod);
+                        if (defaultConflictMethodIndex >= 0) {
+                            // There's already a matching method in the conflict list, we don't need to do
+                            // anything else
+                            continue;
+                        }
+
+                        int mirandaMethodIndex = findMethodIndexInVtable(mirandaMethods, interfaceMethod);
+
+                        if (mirandaMethodIndex >= 0) {
+                            if (!AccessFlags.ABSTRACT.isSet(interfaceMethod.getAccessFlags())) {
+
+                                ClassProto existingInterface = (ClassProto)classPath.getClass(
+                                        mirandaMethods.get(mirandaMethodIndex).getDefiningClass());
+                                if (!existingInterface.implementsInterface(interfaceMethod.getDefiningClass())) {
+                                    Method oldMethod = mirandaMethods.remove(mirandaMethodIndex);
+                                    int methodOrderValue = methodOrder.get(oldMethod);
+                                    methodOrder.put(interfaceMethod, methodOrderValue);
+                                    defaultMethods.add(interfaceMethod);
+                                }
+                            }
+                            continue;
+                        }
+
+                        if (!AccessFlags.ABSTRACT.isSet(interfaceMethod.getAccessFlags())) {
+                            if (oldVtableMethod != null) {
+                                if (!interfaceMethodOverrides(interfaceMethod, oldVtableMethod)) {
+                                    continue;
+                                }
+                            }
+                            defaultMethods.add(interfaceMethod);
+                            methodOrder.put(interfaceMethod, methodOrder.size());
+                        } else {
+                            // TODO: do we need to check interfaceMethodOverrides here?
+                            if (oldVtableMethod == null) {
+                                mirandaMethods.add(interfaceMethod);
+                                methodOrder.put(interfaceMethod, methodOrder.size());
+                            }
+                        }
+                    }
+                }
+
+                Comparator<MethodReference> comparator = new Comparator<MethodReference>() {
+                    @Override public int compare(MethodReference o1, MethodReference o2) {
+                        return Ints.compare(methodOrder.get(o1), methodOrder.get(o2));
+                    }
+                };
+
+                // The methods should be in the same order within each list as they were iterated over.
+                // They can be misordered if, e.g. a method was originally added to the default list, but then moved
+                // to the conflict list.
+                Collections.sort(mirandaMethods, comparator);
+                Collections.sort(defaultMethods, comparator);
+                Collections.sort(defaultConflictMethods, comparator);
+
+                vtable.addAll(mirandaMethods);
+                vtable.addAll(defaultMethods);
+                vtable.addAll(defaultConflictMethods);
+            }
+            return vtable;
+        }
+    });
+
+    @Nonnull private final Supplier<List<Method>> postDefaultMethodVtableSupplier = Suppliers.memoize(new Supplier<List<Method>>() {
+        @Override public List<Method> get() {
+            List<Method> vtable = Lists.newArrayList();
+
+            //copy the virtual methods from the superclass
+            String superclassType;
+            try {
+                superclassType = getSuperclass();
+            } catch (UnresolvedClassException ex) {
+                vtable.addAll(((ClassProto)classPath.getClass("Ljava/lang/Object;")).getVtable());
+                vtableFullyResolved = false;
+                return vtable;
+            }
+
+            if (superclassType != null) {
+                ClassProto superclass = (ClassProto) classPath.getClass(superclassType);
+                vtable.addAll(superclass.getVtable());
+
+                // if the superclass's vtable wasn't fully resolved, then we can't know where the new methods added by
+                // this class should start, so we just propagate what we can from the parent and hope for the best.
+                if (!superclass.vtableFullyResolved) {
+                    vtableFullyResolved = false;
+                    return vtable;
+                }
+            }
+
+            //iterate over the virtual methods in the current class, and only add them when we don't already have the
+            //method (i.e. if it was implemented by the superclass)
+            if (!isInterface()) {
+                addToVtable(getClassDef().getVirtualMethods(), vtable, true, true);
+
+                Iterable<ClassDef> interfaces = Lists.reverse(Lists.newArrayList(getDirectInterfaces()));
+
+                List<Method> defaultMethods = Lists.newArrayList();
+                List<Method> defaultConflictMethods = Lists.newArrayList();
+                List<Method> mirandaMethods = Lists.newArrayList();
+
+                final HashMap<MethodReference, Integer> methodOrder = Maps.newHashMap();
+
+                for (ClassDef interfaceDef: interfaces) {
+                    for (Method interfaceMethod : interfaceDef.getVirtualMethods()) {
+
+                        int vtableIndex = findMethodIndexInVtable(vtable, interfaceMethod);
+
+                        if (vtableIndex >= 0) {
+                            if (interfaceMethodOverrides(interfaceMethod, vtable.get(vtableIndex))) {
+                                vtable.set(vtableIndex, interfaceMethod);
+                            }
+                        } else {
+                            int defaultMethodIndex = findMethodIndexInVtable(defaultMethods, interfaceMethod);
+
+                            if (defaultMethodIndex >= 0) {
+                                if (!AccessFlags.ABSTRACT.isSet(interfaceMethod.getAccessFlags())) {
+                                    ClassProto existingInterface = (ClassProto)classPath.getClass(
+                                            defaultMethods.get(defaultMethodIndex).getDefiningClass());
+                                    if (!existingInterface.implementsInterface(interfaceMethod.getDefiningClass())) {
+                                        Method removedMethod = defaultMethods.remove(defaultMethodIndex);
+                                        defaultConflictMethods.add(removedMethod);
+                                    }
+                                }
+                                continue;
+                            }
+
+                            int defaultConflictMethodIndex = findMethodIndexInVtable(
+                                    defaultConflictMethods, interfaceMethod);
+                            if (defaultConflictMethodIndex >= 0) {
+                                // There's already a matching method in the conflict list, we don't need to do
+                                // anything else
+                                continue;
+                            }
+
+                            int mirandaMethodIndex = findMethodIndexInVtable(mirandaMethods, interfaceMethod);
+
+                            if (mirandaMethodIndex >= 0) {
+                                if (!AccessFlags.ABSTRACT.isSet(interfaceMethod.getAccessFlags())) {
+
+                                    ClassProto existingInterface = (ClassProto)classPath.getClass(
+                                            mirandaMethods.get(mirandaMethodIndex).getDefiningClass());
+                                    if (!existingInterface.implementsInterface(interfaceMethod.getDefiningClass())) {
+                                        Method oldMethod = mirandaMethods.remove(mirandaMethodIndex);
+                                        int methodOrderValue = methodOrder.get(oldMethod);
+                                        methodOrder.put(interfaceMethod, methodOrderValue);
+                                        defaultMethods.add(interfaceMethod);
+                                    }
+                                }
+                                continue;
+                            }
+
+                            if (!AccessFlags.ABSTRACT.isSet(interfaceMethod.getAccessFlags())) {
+                                defaultMethods.add(interfaceMethod);
+                                methodOrder.put(interfaceMethod, methodOrder.size());
+                            } else {
+                                mirandaMethods.add(interfaceMethod);
+                                methodOrder.put(interfaceMethod, methodOrder.size());
+                            }
+                        }
+                    }
+                }
+
+                Comparator<MethodReference> comparator = new Comparator<MethodReference>() {
+                    @Override public int compare(MethodReference o1, MethodReference o2) {
+                        return Ints.compare(methodOrder.get(o1), methodOrder.get(o2));
+                    }
+                };
+
+                // The methods should be in the same order within each list as they were iterated over.
+                // They can be misordered if, e.g. a method was originally added to the default list, but then moved
+                // to the conflict list.
+                Collections.sort(defaultMethods, comparator);
+                Collections.sort(defaultConflictMethods, comparator);
+                Collections.sort(mirandaMethods, comparator);
+                addToVtable(defaultMethods, vtable, false, false);
+                addToVtable(defaultConflictMethods, vtable, false, false);
+                addToVtable(mirandaMethods, vtable, false, false);
+            }
+            return vtable;
+        }
+    });
+
+    private void addToVtable(@Nonnull Iterable<? extends Method> localMethods, @Nonnull List<Method> vtable,
+                             boolean replaceExisting, boolean sort) {
+        if (sort) {
+            ArrayList<Method> methods = Lists.newArrayList(localMethods);
+            Collections.sort(methods);
+            localMethods = methods;
+        }
+
+        for (Method virtualMethod: localMethods) {
+            int vtableIndex = findMethodIndexInVtable(vtable, virtualMethod);
+
+            if (vtableIndex >= 0) {
+                if (replaceExisting) {
+                    vtable.set(vtableIndex, virtualMethod);
+                }
+            } else {
+                // we didn't find an equivalent method, so add it as a new entry
+                vtable.add(virtualMethod);
+            }
+        }
+    }
+
+    private static byte getFieldType(@Nonnull FieldReference field) {
+        switch (field.getType().charAt(0)) {
+            case '[':
+            case 'L':
+                return 0; //REFERENCE
+            case 'J':
+            case 'D':
+                return 1; //WIDE
+            default:
+                return 2; //OTHER
+        }
+    }
+
+    private boolean isOverridableByDefaultMethod(@Nonnull Method method) {
+        ClassProto classProto = (ClassProto)classPath.getClass(method.getDefiningClass());
+        return classProto.isInterface();
+    }
+
+    /**
+     * Checks if the interface method overrides the virtual or interface method2
+     * @param method A Method from an interface
+     * @param method2 A Method from an interface or a class
+     * @return true if the interface method overrides the virtual or interface method2
+     */
+    private boolean interfaceMethodOverrides(@Nonnull Method method, @Nonnull Method method2) {
+        ClassProto classProto = (ClassProto)classPath.getClass(method2.getDefiningClass());
+
+        if (classProto.isInterface()) {
+            ClassProto targetClassProto = (ClassProto)classPath.getClass(method.getDefiningClass());
+            return targetClassProto.implementsInterface(method2.getDefiningClass());
+        } else {
+            return false;
+        }
+    }
+
+    static class ReparentedMethod extends BaseMethodReference implements Method {
+        private final Method method;
+        private final String definingClass;
+
+        public ReparentedMethod(Method method, String definingClass) {
+            this.method = method;
+            this.definingClass = definingClass;
+        }
+
+        @Nonnull @Override public String getDefiningClass() {
+            return definingClass;
+        }
+
+        @Nonnull @Override public String getName() {
+            return method.getName();
+        }
+
+        @Nonnull @Override public List<? extends CharSequence> getParameterTypes() {
+            return method.getParameterTypes();
+        }
+
+        @Nonnull @Override public String getReturnType() {
+            return method.getReturnType();
+        }
+
+        @Nonnull @Override public List<? extends MethodParameter> getParameters() {
+            return method.getParameters();
+        }
+
+        @Override public int getAccessFlags() {
+            return method.getAccessFlags();
+        }
+
+        @Nonnull @Override public Set<? extends Annotation> getAnnotations() {
+            return method.getAnnotations();
+        }
+
+        @Nonnull @Override public Set<HiddenApiRestriction> getHiddenApiRestrictions() {
+            return method.getHiddenApiRestrictions();
+        }
+
+        @Nullable @Override public MethodImplementation getImplementation() {
+            return method.getImplementation();
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassProvider.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassProvider.java
new file mode 100644
index 0000000..7c823ff
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassProvider.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis;
+
+import org.jf.dexlib2.iface.ClassDef;
+
+import javax.annotation.Nullable;
+
+public interface ClassProvider {
+    @Nullable ClassDef getClassDef(String type);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/CustomInlineMethodResolver.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/CustomInlineMethodResolver.java
new file mode 100644
index 0000000..f3ed86f
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/CustomInlineMethodResolver.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis;
+
+import com.google.common.io.Files;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.Method;
+import org.jf.dexlib2.iface.instruction.InlineIndexInstruction;
+import org.jf.dexlib2.immutable.ImmutableMethod;
+import org.jf.dexlib2.immutable.ImmutableMethodParameter;
+import org.jf.dexlib2.immutable.reference.ImmutableMethodReference;
+import org.jf.dexlib2.immutable.util.ParamUtil;
+
+import javax.annotation.Nonnull;
+import java.io.*;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class CustomInlineMethodResolver extends InlineMethodResolver {
+    @Nonnull private final ClassPath classPath;
+    @Nonnull private final Method[] inlineMethods;
+
+    public CustomInlineMethodResolver(@Nonnull ClassPath classPath, @Nonnull String inlineTable) {
+        this.classPath = classPath;
+
+        StringReader reader = new StringReader(inlineTable);
+        List<String> lines = new ArrayList<String>();
+
+        BufferedReader br = new BufferedReader(reader);
+
+        try {
+            String line = br.readLine();
+
+            while (line != null) {
+                if (line.length() > 0) {
+                    lines.add(line);
+                }
+
+                line = br.readLine();
+            }
+        } catch (IOException ex) {
+            throw new RuntimeException("Error while parsing inline table", ex);
+        }
+
+        inlineMethods = new Method[lines.size()];
+
+        for (int i=0; i<inlineMethods.length; i++) {
+            inlineMethods[i] = parseAndResolveInlineMethod(lines.get(i));
+        }
+    }
+
+    public CustomInlineMethodResolver(@Nonnull ClassPath classPath, @Nonnull File inlineTable) throws IOException {
+        this(classPath, Files.toString(inlineTable, Charset.forName("UTF-8")));
+    }
+
+    @Override
+    @Nonnull
+    public Method resolveExecuteInline(@Nonnull AnalyzedInstruction analyzedInstruction) {
+        InlineIndexInstruction instruction = (InlineIndexInstruction)analyzedInstruction.instruction;
+        int methodIndex = instruction.getInlineIndex();
+
+        if (methodIndex < 0 || methodIndex >= inlineMethods.length) {
+            throw new RuntimeException("Invalid method index: " + methodIndex);
+        }
+        return inlineMethods[methodIndex];
+    }
+
+    private static final Pattern longMethodPattern = Pattern.compile("(L[^;]+;)->([^(]+)\\(([^)]*)\\)(.+)");
+
+    @Nonnull
+    private Method parseAndResolveInlineMethod(@Nonnull String inlineMethod) {
+        Matcher m = longMethodPattern.matcher(inlineMethod);
+        if (!m.matches()) {
+            assert false;
+            throw new RuntimeException("Invalid method descriptor: " + inlineMethod);
+        }
+
+        String className = m.group(1);
+        String methodName = m.group(2);
+        Iterable<ImmutableMethodParameter> methodParams = ParamUtil.parseParamString(m.group(3));
+        String methodRet = m.group(4);
+        ImmutableMethodReference methodRef = new ImmutableMethodReference(className, methodName, methodParams,
+                methodRet);
+
+        int accessFlags = 0;
+
+        boolean resolved = false;
+        TypeProto typeProto = classPath.getClass(className);
+        if (typeProto instanceof ClassProto) {
+            ClassDef classDef = ((ClassProto)typeProto).getClassDef();
+            for (Method method: classDef.getMethods()) {
+                if (method.equals(methodRef)) {
+                    resolved = true;
+                    accessFlags = method.getAccessFlags();
+                    break;
+                }
+            }
+        }
+
+        if (!resolved) {
+            throw new RuntimeException("Cannot resolve inline method: " + inlineMethod);
+        }
+
+        return new ImmutableMethod(className, methodName, methodParams, methodRet, accessFlags, null, null, null);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/DexClassProvider.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/DexClassProvider.java
new file mode 100644
index 0000000..c460cc3
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/DexClassProvider.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis;
+
+import com.google.common.collect.Maps;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.DexFile;
+
+import javax.annotation.Nullable;
+import java.util.Map;
+
+public class DexClassProvider implements ClassProvider {
+    private final DexFile dexFile;
+    private Map<String, ClassDef> classMap = Maps.newHashMap();
+
+    public DexClassProvider(DexFile dexFile) {
+        this.dexFile = dexFile;
+
+        for (ClassDef classDef: dexFile.getClasses()) {
+            classMap.put(classDef.getType(), classDef);
+        }
+    }
+
+    @Nullable @Override public ClassDef getClassDef(String type) {
+        return classMap.get(type);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/InlineMethodResolver.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/InlineMethodResolver.java
new file mode 100644
index 0000000..ea5c7b4
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/InlineMethodResolver.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis;
+
+import com.google.common.collect.ImmutableList;
+import org.jf.dexlib2.iface.Method;
+import org.jf.dexlib2.iface.instruction.InlineIndexInstruction;
+import org.jf.dexlib2.iface.instruction.VariableRegisterInstruction;
+import org.jf.dexlib2.immutable.ImmutableMethod;
+import org.jf.dexlib2.immutable.ImmutableMethodParameter;
+import org.jf.dexlib2.immutable.util.ParamUtil;
+
+import javax.annotation.Nonnull;
+
+public abstract class InlineMethodResolver {
+    // These are the possible values for the accessFlag field on a resolved inline method
+    // We can't use, e.g. AccessFlags.STATIC.value, because we need them to be a constant in order to use them as cases
+    // in switch statements
+    public static final int STATIC = 0x8; // AccessFlags.STATIC.value;
+    public static final int VIRTUAL = 0x1; // AccessFlags.PUBLIC.value;
+    public static final int DIRECT = 0x2; // AccessFlags.PRIVATE.value;
+
+    @Nonnull
+    public static InlineMethodResolver createInlineMethodResolver(int odexVersion) {
+        if (odexVersion == 35) {
+            return new InlineMethodResolver_version35();
+        } else if (odexVersion == 36) {
+            return new InlineMethodResolver_version36();
+        } else {
+            throw new RuntimeException(String.format("odex version %d is not supported yet", odexVersion));
+        }
+    }
+
+    protected InlineMethodResolver() {
+    }
+
+    @Nonnull
+    private static Method inlineMethod(int accessFlags, @Nonnull String cls, @Nonnull String name,
+                                       @Nonnull String params, @Nonnull String returnType) {
+        ImmutableList<ImmutableMethodParameter> paramList = ImmutableList.copyOf(ParamUtil.parseParamString(params));
+        return new ImmutableMethod(cls, name, paramList, returnType, accessFlags, null, null, null);
+    }
+
+    @Nonnull public abstract Method resolveExecuteInline(@Nonnull AnalyzedInstruction instruction);
+
+    private static class InlineMethodResolver_version35 extends InlineMethodResolver
+    {
+        private final Method[] inlineMethods;
+
+        public InlineMethodResolver_version35() {
+            inlineMethods = new Method[] {
+                inlineMethod(STATIC, "Lorg/apache/harmony/dalvik/NativeTestTarget;", "emptyInlineMethod", "", "V"),
+                inlineMethod(VIRTUAL, "Ljava/lang/String;", "charAt", "I", "C"),
+                inlineMethod(VIRTUAL, "Ljava/lang/String;", "compareTo", "Ljava/lang/String;", "I"),
+                inlineMethod(VIRTUAL, "Ljava/lang/String;", "equals", "Ljava/lang/Object;", "Z"),
+                inlineMethod(VIRTUAL, "Ljava/lang/String;", "length", "", "I"),
+                inlineMethod(STATIC, "Ljava/lang/Math;", "abs", "I", "I"),
+                inlineMethod(STATIC, "Ljava/lang/Math;", "abs", "J", "J"),
+                inlineMethod(STATIC, "Ljava/lang/Math;", "abs", "F", "F"),
+                inlineMethod(STATIC, "Ljava/lang/Math;", "abs", "D", "D"),
+                inlineMethod(STATIC, "Ljava/lang/Math;", "min", "II", "I"),
+                inlineMethod(STATIC, "Ljava/lang/Math;", "max", "II", "I"),
+                inlineMethod(STATIC, "Ljava/lang/Math;", "sqrt", "D", "D"),
+                inlineMethod(STATIC, "Ljava/lang/Math;", "cos", "D", "D"),
+                inlineMethod(STATIC, "Ljava/lang/Math;", "sin", "D", "D")
+            };
+        }
+
+        @Override
+        @Nonnull
+        public Method resolveExecuteInline(@Nonnull AnalyzedInstruction analyzedInstruction) {
+            InlineIndexInstruction instruction = (InlineIndexInstruction)analyzedInstruction.instruction;
+            int inlineIndex = instruction.getInlineIndex();
+
+            if (inlineIndex < 0 || inlineIndex >= inlineMethods.length) {
+                throw new RuntimeException("Invalid inline index: " + inlineIndex);
+            }
+            return inlineMethods[inlineIndex];
+        }
+    }
+
+    private static class InlineMethodResolver_version36 extends InlineMethodResolver
+    {
+        private final Method[] inlineMethods;
+        private final Method indexOfIMethod;
+        private final Method indexOfIIMethod;
+        private final Method fastIndexOfMethod;
+        private final Method isEmptyMethod;
+
+        public InlineMethodResolver_version36() {
+            //The 5th and 6th entries differ between froyo and gingerbread. We have to look at the parameters being
+            //passed to distinguish between them.
+
+            //froyo
+            indexOfIMethod = inlineMethod(VIRTUAL, "Ljava/lang/String;", "indexOf", "I", "I");
+            indexOfIIMethod = inlineMethod(VIRTUAL, "Ljava/lang/String;", "indexOf", "II", "I");
+
+            //gingerbread
+            fastIndexOfMethod = inlineMethod(DIRECT, "Ljava/lang/String;", "fastIndexOf", "II", "I");
+            isEmptyMethod = inlineMethod(VIRTUAL, "Ljava/lang/String;", "isEmpty", "", "Z");
+
+            inlineMethods = new Method[] {
+                inlineMethod(STATIC, "Lorg/apache/harmony/dalvik/NativeTestTarget;", "emptyInlineMethod", "", "V"),
+                inlineMethod(VIRTUAL, "Ljava/lang/String;", "charAt", "I", "C"),
+                inlineMethod(VIRTUAL, "Ljava/lang/String;", "compareTo", "Ljava/lang/String;", "I"),
+                inlineMethod(VIRTUAL, "Ljava/lang/String;", "equals", "Ljava/lang/Object;", "Z"),
+                //froyo: deodexUtil.new InlineMethod(VIRTUAL, "Ljava/lang/String;", "indexOf", "I", "I"),
+                //gingerbread: deodexUtil.new InlineMethod(VIRTUAL, "Ljava/lang/String;", "fastIndexOf", "II", "I"),
+                null,
+                //froyo: deodexUtil.new InlineMethod(VIRTUAL, "Ljava/lang/String;", "indexOf", "II", "I"),
+                //gingerbread: deodexUtil.new InlineMethod(VIRTUAL, "Ljava/lang/String;", "isEmpty", "", "Z"),
+                null,
+                inlineMethod(VIRTUAL, "Ljava/lang/String;", "length", "", "I"),
+                inlineMethod(STATIC, "Ljava/lang/Math;", "abs", "I", "I"),
+                inlineMethod(STATIC, "Ljava/lang/Math;", "abs", "J", "J"),
+                inlineMethod(STATIC, "Ljava/lang/Math;", "abs", "F", "F"),
+                inlineMethod(STATIC, "Ljava/lang/Math;", "abs", "D", "D"),
+                inlineMethod(STATIC, "Ljava/lang/Math;", "min", "II", "I"),
+                inlineMethod(STATIC, "Ljava/lang/Math;", "max", "II", "I"),
+                inlineMethod(STATIC, "Ljava/lang/Math;", "sqrt", "D", "D"),
+                inlineMethod(STATIC, "Ljava/lang/Math;", "cos", "D", "D"),
+                inlineMethod(STATIC, "Ljava/lang/Math;", "sin", "D", "D"),
+                inlineMethod(STATIC, "Ljava/lang/Float;", "floatToIntBits", "F", "I"),
+                inlineMethod(STATIC, "Ljava/lang/Float;", "floatToRawIntBits", "F", "I"),
+                inlineMethod(STATIC, "Ljava/lang/Float;", "intBitsToFloat", "I", "F"),
+                inlineMethod(STATIC, "Ljava/lang/Double;", "doubleToLongBits", "D", "J"),
+                inlineMethod(STATIC, "Ljava/lang/Double;", "doubleToRawLongBits", "D", "J"),
+                inlineMethod(STATIC, "Ljava/lang/Double;", "longBitsToDouble", "J", "D"),
+                inlineMethod(STATIC, "Ljava/lang/StrictMath;", "abs", "I", "I"),
+                inlineMethod(STATIC, "Ljava/lang/StrictMath;", "abs", "J", "J"),
+                inlineMethod(STATIC, "Ljava/lang/StrictMath;", "abs", "F", "F"),
+                inlineMethod(STATIC, "Ljava/lang/StrictMath;", "abs", "D", "D"),
+                inlineMethod(STATIC, "Ljava/lang/StrictMath;", "min", "II", "I"),
+                inlineMethod(STATIC, "Ljava/lang/StrictMath;", "max", "II", "I"),
+                inlineMethod(STATIC, "Ljava/lang/StrictMath;", "sqrt", "D", "D"),
+            };
+        }
+
+        @Override
+        @Nonnull
+        public Method resolveExecuteInline(@Nonnull AnalyzedInstruction analyzedInstruction) {
+            InlineIndexInstruction instruction = (InlineIndexInstruction)analyzedInstruction.instruction;
+            int inlineIndex = instruction.getInlineIndex();
+
+            if (inlineIndex < 0 || inlineIndex >= inlineMethods.length) {
+                throw new RuntimeException("Invalid method index: " + inlineIndex);
+            }
+
+            if (inlineIndex == 4) {
+                int parameterCount = ((VariableRegisterInstruction)instruction).getRegisterCount();
+                if (parameterCount == 2) {
+                    return indexOfIMethod;
+                } else if (parameterCount == 3) {
+                    return fastIndexOfMethod;
+                } else {
+                    throw new RuntimeException("Could not determine the correct inline method to use");
+                }
+            } else if (inlineIndex == 5) {
+                int parameterCount = ((VariableRegisterInstruction)instruction).getRegisterCount();
+                if (parameterCount == 3) {
+                    return indexOfIIMethod;
+                } else if (parameterCount == 1) {
+                    return isEmptyMethod;
+                } else {
+                    throw new RuntimeException("Could not determine the correct inline method to use");
+                }
+            }
+
+            return inlineMethods[inlineIndex];
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/MethodAnalyzer.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/MethodAnalyzer.java
new file mode 100644
index 0000000..7a51c96
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/MethodAnalyzer.java
@@ -0,0 +1,2033 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis;
+
+import com.google.common.base.Function;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import org.jf.dexlib2.AccessFlags;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.base.reference.BaseMethodReference;
+import org.jf.dexlib2.iface.*;
+import org.jf.dexlib2.iface.instruction.*;
+import org.jf.dexlib2.iface.instruction.formats.*;
+import org.jf.dexlib2.iface.reference.FieldReference;
+import org.jf.dexlib2.iface.reference.MethodReference;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.dexlib2.iface.reference.TypeReference;
+import org.jf.dexlib2.immutable.instruction.*;
+import org.jf.dexlib2.immutable.reference.ImmutableFieldReference;
+import org.jf.dexlib2.immutable.reference.ImmutableMethodReference;
+import org.jf.dexlib2.util.MethodUtil;
+import org.jf.dexlib2.util.ReferenceUtil;
+import org.jf.dexlib2.util.TypeUtils;
+import org.jf.dexlib2.writer.util.TryListBuilder;
+import org.jf.util.BitSetUtils;
+import org.jf.util.ExceptionWithContext;
+import org.jf.util.SparseArray;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.BitSet;
+import java.util.List;
+
+/**
+ * The MethodAnalyzer performs several functions. It "analyzes" the instructions and infers the register types
+ * for each register, it can deodex odexed instructions, and it can verify the bytecode. The analysis and verification
+ * are done in two separate passes, because the analysis has to process instructions multiple times in some cases, and
+ * there's no need to perform the verification multiple times, so we wait until the method is fully analyzed and then
+ * verify it.
+ *
+ * Before calling the analyze() method, you must have initialized the ClassPath by calling
+ * ClassPath.InitializeClassPath
+ */
+public class MethodAnalyzer {
+    @Nonnull private final Method method;
+    @Nonnull private final MethodImplementation methodImpl;
+
+    private final boolean normalizeVirtualMethods;
+
+    private final int paramRegisterCount;
+
+    @Nonnull private final ClassPath classPath;
+    @Nullable private final InlineMethodResolver inlineResolver;
+
+    // This contains all the AnalyzedInstruction instances, keyed by the code unit address of the instruction
+    @Nonnull private final SparseArray<AnalyzedInstruction> analyzedInstructions =
+            new SparseArray<AnalyzedInstruction>(0);
+
+    // Which instructions have been analyzed, keyed by instruction index
+    @Nonnull private final BitSet analyzedState;
+
+    @Nullable private AnalysisException analysisException = null;
+
+    // This is a dummy instruction that occurs immediately before the first real instruction. We can initialize the
+    // register types for this instruction to the parameter types, in order to have them propagate to all of its
+    // successors, e.g. the first real instruction, the first instructions in any exception handlers covering the first
+    // instruction, etc.
+    private final AnalyzedInstruction startOfMethod;
+
+    public MethodAnalyzer(@Nonnull ClassPath classPath, @Nonnull Method method,
+                          @Nullable InlineMethodResolver inlineResolver, boolean normalizeVirtualMethods) {
+        this.classPath = classPath;
+        this.inlineResolver = inlineResolver;
+        this.normalizeVirtualMethods = normalizeVirtualMethods;
+
+        this.method = method;
+
+        MethodImplementation methodImpl = method.getImplementation();
+        if (methodImpl == null) {
+            throw new IllegalArgumentException("The method has no implementation");
+        }
+
+        this.methodImpl = methodImpl;
+
+        // Override AnalyzedInstruction and provide custom implementations of some of the methods, so that we don't
+        // have to handle the case this special case of instruction being null, in the main class
+        startOfMethod = new AnalyzedInstruction(this, new ImmutableInstruction10x(Opcode.NOP), -1, methodImpl.getRegisterCount()) {
+            @Override protected boolean addPredecessor(AnalyzedInstruction predecessor) {
+                throw new UnsupportedOperationException();
+            }
+
+            @Override @Nonnull
+            public RegisterType getPredecessorRegisterType(@Nonnull AnalyzedInstruction predecessor, int registerNumber) {
+                throw new UnsupportedOperationException();
+            }
+        };
+
+        buildInstructionList();
+
+        analyzedState = new BitSet(analyzedInstructions.size());
+        paramRegisterCount = MethodUtil.getParameterRegisterCount(method);
+        analyze();
+    }
+
+    @Nonnull
+    public ClassPath getClassPath() {
+        return classPath;
+    }
+
+    private void analyze() {
+        Method method = this.method;
+        MethodImplementation methodImpl = this.methodImpl;
+
+        int totalRegisters = methodImpl.getRegisterCount();
+        int parameterRegisters = paramRegisterCount;
+
+        int nonParameterRegisters = totalRegisters - parameterRegisters;
+
+        //if this isn't a static method, determine which register is the "this" register and set the type to the
+        //current class
+        if (!MethodUtil.isStatic(method)) {
+            int thisRegister = totalRegisters - parameterRegisters;
+
+            //if this is a constructor, then set the "this" register to an uninitialized reference of the current class
+            if (MethodUtil.isConstructor(method)) {
+                setPostRegisterTypeAndPropagateChanges(startOfMethod, thisRegister,
+                        RegisterType.getRegisterType(RegisterType.UNINIT_THIS,
+                                classPath.getClass(method.getDefiningClass())));
+            } else {
+                setPostRegisterTypeAndPropagateChanges(startOfMethod, thisRegister,
+                        RegisterType.getRegisterType(RegisterType.REFERENCE,
+                                classPath.getClass(method.getDefiningClass())));
+            }
+
+            propagateParameterTypes(totalRegisters-parameterRegisters+1);
+        } else {
+            propagateParameterTypes(totalRegisters-parameterRegisters);
+        }
+
+        RegisterType uninit = RegisterType.getRegisterType(RegisterType.UNINIT, null);
+        for (int i=0; i<nonParameterRegisters; i++) {
+            setPostRegisterTypeAndPropagateChanges(startOfMethod, i, uninit);
+        }
+
+        BitSet instructionsToAnalyze = new BitSet(analyzedInstructions.size());
+
+        //make sure all of the "first instructions" are marked for processing
+        for (AnalyzedInstruction successor: startOfMethod.successors) {
+            instructionsToAnalyze.set(successor.instructionIndex);
+        }
+
+        BitSet undeodexedInstructions = new BitSet(analyzedInstructions.size());
+
+        do {
+            boolean didSomething = false;
+
+            while (!instructionsToAnalyze.isEmpty()) {
+                for(int i=instructionsToAnalyze.nextSetBit(0); i>=0; i=instructionsToAnalyze.nextSetBit(i+1)) {
+                    instructionsToAnalyze.clear(i);
+                    if (analyzedState.get(i)) {
+                        continue;
+                    }
+                    AnalyzedInstruction instructionToAnalyze = analyzedInstructions.valueAt(i);
+                    try {
+                        if (instructionToAnalyze.originalInstruction.getOpcode().odexOnly()) {
+                            //if we had deodexed an odex instruction in a previous pass, we might have more specific
+                            //register information now, so let's restore the original odexed instruction and
+                            //re-deodex it
+                            instructionToAnalyze.restoreOdexedInstruction();
+                        }
+
+                        if (!analyzeInstruction(instructionToAnalyze)) {
+                            undeodexedInstructions.set(i);
+                            continue;
+                        } else {
+                            didSomething = true;
+                            undeodexedInstructions.clear(i);
+                        }
+                    } catch (AnalysisException ex) {
+                        this.analysisException = ex;
+                        int codeAddress = getInstructionAddress(instructionToAnalyze);
+                        ex.codeAddress = codeAddress;
+                        ex.addContext(String.format("opcode: %s", instructionToAnalyze.instruction.getOpcode().name));
+                        ex.addContext(String.format("code address: %d", codeAddress));
+                        ex.addContext(String.format("method: %s", ReferenceUtil.getReferenceString(method)));
+                        break;
+                    }
+
+                    analyzedState.set(instructionToAnalyze.getInstructionIndex());
+
+                    for (AnalyzedInstruction successor: instructionToAnalyze.successors) {
+                        instructionsToAnalyze.set(successor.getInstructionIndex());
+                    }
+                }
+                if (analysisException != null) {
+                    break;
+                }
+            }
+
+            if (!didSomething) {
+                break;
+            }
+
+            if (!undeodexedInstructions.isEmpty()) {
+                for (int i=undeodexedInstructions.nextSetBit(0); i>=0; i=undeodexedInstructions.nextSetBit(i+1)) {
+                    instructionsToAnalyze.set(i);
+                }
+            }
+        } while (true);
+
+        //Now, go through and fix up any unresolvable odex instructions. These are usually odex instructions
+        //that operate on a null register, and thus always throw an NPE. They can also be any sort of odex instruction
+        //that occurs after an unresolvable odex instruction. We deodex if possible, or replace with an
+        //UnresolvableOdexInstruction
+        for (int i=0; i< analyzedInstructions.size(); i++) {
+            AnalyzedInstruction analyzedInstruction = analyzedInstructions.valueAt(i);
+
+            Instruction instruction = analyzedInstruction.getInstruction();
+
+            if (instruction.getOpcode().odexOnly()) {
+                int objectRegisterNumber;
+                switch (instruction.getOpcode().format) {
+                    case Format10x:
+                        analyzeOdexReturnVoid(analyzedInstruction, false);
+                        continue;
+                    case Format21c:
+                    case Format22c:
+                        analyzePutGetVolatile(analyzedInstruction, false);
+                        continue;
+                    case Format35c:
+                        analyzeInvokeDirectEmpty(analyzedInstruction, false);
+                        continue;
+                    case Format3rc:
+                        analyzeInvokeObjectInitRange(analyzedInstruction, false);
+                        continue;
+                    case Format22cs:
+                        objectRegisterNumber = ((Instruction22cs)instruction).getRegisterB();
+                        break;
+                    case Format35mi:
+                    case Format35ms:
+                        objectRegisterNumber = ((FiveRegisterInstruction)instruction).getRegisterC();
+                        break;
+                    case Format3rmi:
+                    case Format3rms:
+                        objectRegisterNumber = ((RegisterRangeInstruction)instruction).getStartRegister();
+                        break;
+                    default:
+                        continue;
+                }
+
+                analyzedInstruction.setDeodexedInstruction(
+                        new UnresolvedOdexInstruction(instruction, objectRegisterNumber));
+            }
+        }
+    }
+
+    private void propagateParameterTypes(int parameterStartRegister) {
+        int i=0;
+        for (MethodParameter parameter: method.getParameters()) {
+            if (TypeUtils.isWideType(parameter)) {
+                setPostRegisterTypeAndPropagateChanges(startOfMethod, parameterStartRegister + i++,
+                        RegisterType.getWideRegisterType(parameter, true));
+                setPostRegisterTypeAndPropagateChanges(startOfMethod, parameterStartRegister + i++,
+                        RegisterType.getWideRegisterType(parameter, false));
+            } else {
+                setPostRegisterTypeAndPropagateChanges(startOfMethod, parameterStartRegister + i++,
+                        RegisterType.getRegisterType(classPath, parameter));
+            }
+        }
+    }
+
+    public List<AnalyzedInstruction> getAnalyzedInstructions() {
+        return analyzedInstructions.getValues();
+    }
+
+    public List<Instruction> getInstructions() {
+        return Lists.transform(analyzedInstructions.getValues(), new Function<AnalyzedInstruction, Instruction>() {
+            @Nullable @Override public Instruction apply(@Nullable AnalyzedInstruction input) {
+                if (input == null) {
+                    return null;
+                }
+                return input.instruction;
+            }
+        });
+    }
+
+    @Nullable
+    public AnalysisException getAnalysisException() {
+        return analysisException;
+    }
+
+    public int getParamRegisterCount() {
+        return paramRegisterCount;
+    }
+
+    public int getInstructionAddress(@Nonnull AnalyzedInstruction instruction) {
+        return analyzedInstructions.keyAt(instruction.instructionIndex);
+    }
+
+    private void setDestinationRegisterTypeAndPropagateChanges(@Nonnull AnalyzedInstruction analyzedInstruction,
+                                                               @Nonnull RegisterType registerType) {
+        setPostRegisterTypeAndPropagateChanges(analyzedInstruction, analyzedInstruction.getDestinationRegister(),
+                registerType);
+    }
+
+    private void propagateChanges(@Nonnull BitSet changedInstructions, int registerNumber, boolean override) {
+        //Using a for loop inside the while loop optimizes for the common case of the successors of an instruction
+        //occurring after the instruction. Any successors that occur prior to the instruction will be picked up on
+        //the next iteration of the while loop.
+        //This could also be done recursively, but in large methods it would likely cause very deep recursion.
+        while (!changedInstructions.isEmpty()) {
+            for (int instructionIndex=changedInstructions.nextSetBit(0);
+                 instructionIndex>=0;
+                 instructionIndex=changedInstructions.nextSetBit(instructionIndex+1)) {
+
+                changedInstructions.clear(instructionIndex);
+
+                propagateRegisterToSuccessors(analyzedInstructions.valueAt(instructionIndex), registerNumber,
+                        changedInstructions, override);
+            }
+        }
+    }
+
+    private void overridePredecessorRegisterTypeAndPropagateChanges(
+            @Nonnull AnalyzedInstruction analyzedInstruction, @Nonnull AnalyzedInstruction predecessor,
+            int registerNumber, @Nonnull RegisterType registerType) {
+
+        BitSet changedInstructions = new BitSet(analyzedInstructions.size());
+
+        if (!analyzedInstruction.overridePredecessorRegisterType(
+                predecessor, registerNumber, registerType, analyzedState)) {
+            return;
+        }
+        changedInstructions.set(analyzedInstruction.instructionIndex);
+
+        propagateChanges(changedInstructions, registerNumber, true);
+
+        if (registerType.category == RegisterType.LONG_LO) {
+            checkWidePair(registerNumber, analyzedInstruction);
+            overridePredecessorRegisterTypeAndPropagateChanges(analyzedInstruction, predecessor, registerNumber + 1,
+                    RegisterType.LONG_HI_TYPE);
+        } else if (registerType.category == RegisterType.DOUBLE_LO) {
+            checkWidePair(registerNumber, analyzedInstruction);
+            overridePredecessorRegisterTypeAndPropagateChanges(analyzedInstruction, predecessor, registerNumber + 1,
+                    RegisterType.DOUBLE_HI_TYPE);
+        }
+    }
+
+    private void initializeRefAndPropagateChanges(@Nonnull AnalyzedInstruction analyzedInstruction,
+                                                  int registerNumber, @Nonnull RegisterType registerType) {
+
+        BitSet changedInstructions = new BitSet(analyzedInstructions.size());
+
+        if (!analyzedInstruction.setPostRegisterType(registerNumber, registerType)) {
+            return;
+        }
+
+        propagateRegisterToSuccessors(analyzedInstruction, registerNumber, changedInstructions, false);
+
+        propagateChanges(changedInstructions, registerNumber, false);
+
+        if (registerType.category == RegisterType.LONG_LO) {
+            checkWidePair(registerNumber, analyzedInstruction);
+            setPostRegisterTypeAndPropagateChanges(analyzedInstruction, registerNumber+1, RegisterType.LONG_HI_TYPE);
+        } else if (registerType.category == RegisterType.DOUBLE_LO) {
+            checkWidePair(registerNumber, analyzedInstruction);
+            setPostRegisterTypeAndPropagateChanges(analyzedInstruction, registerNumber+1, RegisterType.DOUBLE_HI_TYPE);
+        }
+    }
+
+    private void setPostRegisterTypeAndPropagateChanges(@Nonnull AnalyzedInstruction analyzedInstruction,
+                                                        int registerNumber, @Nonnull RegisterType registerType) {
+
+        BitSet changedInstructions = new BitSet(analyzedInstructions.size());
+
+        if (!analyzedInstruction.setPostRegisterType(registerNumber, registerType)) {
+            return;
+        }
+
+        propagateRegisterToSuccessors(analyzedInstruction, registerNumber, changedInstructions, false);
+
+        propagateChanges(changedInstructions, registerNumber, false);
+
+        if (registerType.category == RegisterType.LONG_LO) {
+            checkWidePair(registerNumber, analyzedInstruction);
+            setPostRegisterTypeAndPropagateChanges(analyzedInstruction, registerNumber+1, RegisterType.LONG_HI_TYPE);
+        } else if (registerType.category == RegisterType.DOUBLE_LO) {
+            checkWidePair(registerNumber, analyzedInstruction);
+            setPostRegisterTypeAndPropagateChanges(analyzedInstruction, registerNumber+1, RegisterType.DOUBLE_HI_TYPE);
+        }
+    }
+
+    private void propagateRegisterToSuccessors(@Nonnull AnalyzedInstruction instruction, int registerNumber,
+                                               @Nonnull BitSet changedInstructions, boolean override) {
+        RegisterType postRegisterType = instruction.getPostInstructionRegisterType(registerNumber);
+        for (AnalyzedInstruction successor: instruction.successors) {
+            if (successor.mergeRegister(registerNumber, postRegisterType, analyzedState, override)) {
+                changedInstructions.set(successor.instructionIndex);
+            }
+        }
+    }
+
+    private void buildInstructionList() {
+        int registerCount = methodImpl.getRegisterCount();
+
+        ImmutableList<Instruction> instructions = ImmutableList.copyOf(methodImpl.getInstructions());
+
+        analyzedInstructions.ensureCapacity(instructions.size());
+
+        //first, create all the instructions and populate the instructionAddresses array
+        int currentCodeAddress = 0;
+        for (int i=0; i<instructions.size(); i++) {
+            Instruction instruction = instructions.get(i);
+            analyzedInstructions.append(currentCodeAddress,
+                    new AnalyzedInstruction(this, instruction, i, registerCount));
+            assert analyzedInstructions.indexOfKey(currentCodeAddress) == i;
+            currentCodeAddress += instruction.getCodeUnits();
+        }
+
+        //next, populate the exceptionHandlers array. The array item for each instruction that can throw an exception
+        //and is covered by a try block should be set to a list of the first instructions of each exception handler
+        //for the try block covering the instruction
+        List<? extends TryBlock<? extends ExceptionHandler>> tries = methodImpl.getTryBlocks();
+        tries = TryListBuilder.massageTryBlocks(tries);
+        int triesIndex = 0;
+        TryBlock currentTry = null;
+        AnalyzedInstruction[] currentExceptionHandlers = null;
+        AnalyzedInstruction[][] exceptionHandlers = new AnalyzedInstruction[instructions.size()][];
+
+        if (tries != null) {
+            for (int i=0; i< analyzedInstructions.size(); i++) {
+                AnalyzedInstruction instruction = analyzedInstructions.valueAt(i);
+                Opcode instructionOpcode = instruction.instruction.getOpcode();
+                currentCodeAddress = getInstructionAddress(instruction);
+
+                //check if we have gone past the end of the current try
+                if (currentTry != null) {
+                    if (currentTry.getStartCodeAddress() + currentTry.getCodeUnitCount()  <= currentCodeAddress) {
+                        currentTry = null;
+                        triesIndex++;
+                    }
+                }
+
+                //check if the next try is applicable yet
+                if (currentTry == null && triesIndex < tries.size()) {
+                    TryBlock<? extends ExceptionHandler> tryBlock = tries.get(triesIndex);
+                    if (tryBlock.getStartCodeAddress() <= currentCodeAddress) {
+                        assert(tryBlock.getStartCodeAddress() + tryBlock.getCodeUnitCount() > currentCodeAddress);
+
+                        currentTry = tryBlock;
+
+                        currentExceptionHandlers = buildExceptionHandlerArray(tryBlock);
+                    }
+                }
+
+                //if we're inside a try block, and the instruction can throw an exception, then add the exception handlers
+                //for the current instruction
+                if (currentTry != null && instructionOpcode.canThrow()) {
+                    exceptionHandlers[i] = currentExceptionHandlers;
+                }
+            }
+        }
+
+        //finally, populate the successors and predecessors for each instruction. We start at the fake "StartOfMethod"
+        //instruction and follow the execution path. Any unreachable code won't have any predecessors or successors,
+        //and no reachable code will have an unreachable predessor or successor
+        assert analyzedInstructions.size() > 0;
+        BitSet instructionsToProcess = new BitSet(instructions.size());
+
+        addPredecessorSuccessor(startOfMethod, analyzedInstructions.valueAt(0), exceptionHandlers, instructionsToProcess);
+        while (!instructionsToProcess.isEmpty()) {
+            int currentInstructionIndex = instructionsToProcess.nextSetBit(0);
+            instructionsToProcess.clear(currentInstructionIndex);
+
+            AnalyzedInstruction instruction = analyzedInstructions.valueAt(currentInstructionIndex);
+            Opcode instructionOpcode = instruction.instruction.getOpcode();
+            int instructionCodeAddress = getInstructionAddress(instruction);
+
+            if (instruction.instruction.getOpcode().canContinue()) {
+                if (currentInstructionIndex == analyzedInstructions.size() - 1) {
+                    throw new AnalysisException("Execution can continue past the last instruction");
+                }
+
+                AnalyzedInstruction nextInstruction = analyzedInstructions.valueAt(currentInstructionIndex+1);
+                addPredecessorSuccessor(instruction, nextInstruction, exceptionHandlers, instructionsToProcess);
+            }
+
+            if (instruction.instruction instanceof OffsetInstruction) {
+                OffsetInstruction offsetInstruction = (OffsetInstruction)instruction.instruction;
+
+                if (instructionOpcode == Opcode.PACKED_SWITCH || instructionOpcode == Opcode.SPARSE_SWITCH) {
+                    AnalyzedInstruction analyzedSwitchPayload = analyzedInstructions.get(
+                            instructionCodeAddress + offsetInstruction.getCodeOffset());
+                    if (analyzedSwitchPayload == null) {
+                        throw new AnalysisException("Invalid switch payload offset");
+                    }
+                    SwitchPayload switchPayload = (SwitchPayload)analyzedSwitchPayload.instruction;
+
+                    for (SwitchElement switchElement: switchPayload.getSwitchElements()) {
+                        AnalyzedInstruction targetInstruction = analyzedInstructions.get(instructionCodeAddress +
+                                switchElement.getOffset());
+                        if (targetInstruction == null) {
+                            throw new AnalysisException("Invalid switch target offset");
+                        }
+
+                        addPredecessorSuccessor(instruction, targetInstruction, exceptionHandlers,
+                                instructionsToProcess);
+                    }
+                } else if (instructionOpcode != Opcode.FILL_ARRAY_DATA) {
+                    int targetAddressOffset = offsetInstruction.getCodeOffset();
+                    AnalyzedInstruction targetInstruction = analyzedInstructions.get(instructionCodeAddress +
+                            targetAddressOffset);
+                    addPredecessorSuccessor(instruction, targetInstruction, exceptionHandlers, instructionsToProcess);
+                }
+            }
+        }
+    }
+
+    private void addPredecessorSuccessor(@Nonnull AnalyzedInstruction predecessor,
+                                         @Nonnull AnalyzedInstruction successor,
+                                         @Nonnull AnalyzedInstruction[][] exceptionHandlers,
+                                         @Nonnull BitSet instructionsToProcess) {
+        addPredecessorSuccessor(predecessor, successor, exceptionHandlers, instructionsToProcess, false);
+    }
+
+    private void addPredecessorSuccessor(@Nonnull AnalyzedInstruction predecessor,
+                                         @Nonnull AnalyzedInstruction successor,
+                                         @Nonnull AnalyzedInstruction[][] exceptionHandlers,
+                                         @Nonnull BitSet instructionsToProcess, boolean allowMoveException) {
+
+        if (!allowMoveException && successor.instruction.getOpcode() == Opcode.MOVE_EXCEPTION) {
+            throw new AnalysisException("Execution can pass from the " + predecessor.instruction.getOpcode().name +
+                    " instruction at code address 0x" + Integer.toHexString(getInstructionAddress(predecessor)) +
+                    " to the move-exception instruction at address 0x" +
+                    Integer.toHexString(getInstructionAddress(successor)));
+        }
+
+        if (!successor.addPredecessor(predecessor)) {
+            return;
+        }
+
+        predecessor.addSuccessor(successor);
+        instructionsToProcess.set(successor.getInstructionIndex());
+
+
+        //if the successor can throw an instruction, then we need to add the exception handlers as additional
+        //successors to the predecessor (and then apply this same logic recursively if needed)
+        //Technically, we should handle the monitor-exit instruction as a special case. The exception is actually
+        //thrown *after* the instruction executes, instead of "before" the instruction executes, lke for any other
+        //instruction. But since it doesn't modify any registers, we can treat it like any other instruction.
+        AnalyzedInstruction[] exceptionHandlersForSuccessor = exceptionHandlers[successor.instructionIndex];
+        if (exceptionHandlersForSuccessor != null) {
+            //the item for this instruction in exceptionHandlersForSuccessor should only be set if this instruction
+            //can throw an exception
+            assert successor.instruction.getOpcode().canThrow();
+
+            for (AnalyzedInstruction exceptionHandler: exceptionHandlersForSuccessor) {
+                addPredecessorSuccessor(predecessor, exceptionHandler, exceptionHandlers, instructionsToProcess, true);
+            }
+        }
+    }
+
+    @Nonnull
+    private AnalyzedInstruction[] buildExceptionHandlerArray(@Nonnull TryBlock<? extends ExceptionHandler> tryBlock) {
+        List<? extends ExceptionHandler> exceptionHandlers = tryBlock.getExceptionHandlers();
+
+        AnalyzedInstruction[] handlerInstructions = new AnalyzedInstruction[exceptionHandlers.size()];
+        for (int i=0; i<exceptionHandlers.size(); i++) {
+            handlerInstructions[i] = analyzedInstructions.get(exceptionHandlers.get(i).getHandlerCodeAddress());
+        }
+
+        return handlerInstructions;
+    }
+
+    /**
+     * @return false if analyzedInstruction is an odex instruction that couldn't be deodexed, due to its
+     * object register being null
+     */
+    private boolean analyzeInstruction(@Nonnull AnalyzedInstruction analyzedInstruction) {
+        Instruction instruction = analyzedInstruction.instruction;
+
+        switch (instruction.getOpcode()) {
+            case NOP:
+                return true;
+            case MOVE:
+            case MOVE_FROM16:
+            case MOVE_16:
+            case MOVE_WIDE:
+            case MOVE_WIDE_FROM16:
+            case MOVE_WIDE_16:
+            case MOVE_OBJECT:
+            case MOVE_OBJECT_FROM16:
+            case MOVE_OBJECT_16:
+                analyzeMove(analyzedInstruction);
+                return true;
+            case MOVE_RESULT:
+            case MOVE_RESULT_WIDE:
+            case MOVE_RESULT_OBJECT:
+                analyzeMoveResult(analyzedInstruction);
+                return true;
+            case MOVE_EXCEPTION:
+                analyzeMoveException(analyzedInstruction);
+                return true;
+            case RETURN_VOID:
+            case RETURN:
+            case RETURN_WIDE:
+            case RETURN_OBJECT:
+                return true;
+            case RETURN_VOID_BARRIER:
+            case RETURN_VOID_NO_BARRIER:
+                analyzeOdexReturnVoid(analyzedInstruction);
+                return true;
+            case CONST_4:
+            case CONST_16:
+            case CONST:
+            case CONST_HIGH16:
+                analyzeConst(analyzedInstruction);
+                return true;
+            case CONST_WIDE_16:
+            case CONST_WIDE_32:
+            case CONST_WIDE:
+            case CONST_WIDE_HIGH16:
+                analyzeWideConst(analyzedInstruction);
+                return true;
+            case CONST_STRING:
+            case CONST_STRING_JUMBO:
+                analyzeConstString(analyzedInstruction);
+                return true;
+            case CONST_CLASS:
+                analyzeConstClass(analyzedInstruction);
+                return true;
+            case MONITOR_ENTER:
+            case MONITOR_EXIT:
+                return true;
+            case CHECK_CAST:
+                analyzeCheckCast(analyzedInstruction);
+                return true;
+            case INSTANCE_OF:
+                analyzeInstanceOf(analyzedInstruction);
+                return true;
+            case ARRAY_LENGTH:
+                analyzeArrayLength(analyzedInstruction);
+                return true;
+            case NEW_INSTANCE:
+                analyzeNewInstance(analyzedInstruction);
+                return true;
+            case NEW_ARRAY:
+                analyzeNewArray(analyzedInstruction);
+                return true;
+            case FILLED_NEW_ARRAY:
+            case FILLED_NEW_ARRAY_RANGE:
+                return true;
+            case FILL_ARRAY_DATA:
+                return true;
+            case THROW:
+            case GOTO:
+            case GOTO_16:
+            case GOTO_32:
+                return true;
+            case PACKED_SWITCH:
+            case SPARSE_SWITCH:
+                return true;
+            case CMPL_FLOAT:
+            case CMPG_FLOAT:
+            case CMPL_DOUBLE:
+            case CMPG_DOUBLE:
+            case CMP_LONG:
+                analyzeFloatWideCmp(analyzedInstruction);
+                return true;
+            case IF_EQ:
+            case IF_NE:
+            case IF_LT:
+            case IF_GE:
+            case IF_GT:
+            case IF_LE:
+            case IF_LTZ:
+            case IF_GEZ:
+            case IF_GTZ:
+            case IF_LEZ:
+                return true;
+            case IF_EQZ:
+            case IF_NEZ:
+                analyzeIfEqzNez(analyzedInstruction);
+                return true;
+            case AGET:
+                analyze32BitPrimitiveAget(analyzedInstruction, RegisterType.INTEGER_TYPE);
+                return true;
+            case AGET_BOOLEAN:
+                analyze32BitPrimitiveAget(analyzedInstruction, RegisterType.BOOLEAN_TYPE);
+                return true;
+            case AGET_BYTE:
+                analyze32BitPrimitiveAget(analyzedInstruction, RegisterType.BYTE_TYPE);
+                return true;
+            case AGET_CHAR:
+                analyze32BitPrimitiveAget(analyzedInstruction, RegisterType.CHAR_TYPE);
+                return true;
+            case AGET_SHORT:
+                analyze32BitPrimitiveAget(analyzedInstruction, RegisterType.SHORT_TYPE);
+                return true;
+            case AGET_WIDE:
+                analyzeAgetWide(analyzedInstruction);
+                return true;
+            case AGET_OBJECT:
+                analyzeAgetObject(analyzedInstruction);
+                return true;
+            case APUT:
+            case APUT_BOOLEAN:
+            case APUT_BYTE:
+            case APUT_CHAR:
+            case APUT_SHORT:
+            case APUT_WIDE:
+            case APUT_OBJECT:
+                return true;
+            case IGET:
+                analyze32BitPrimitiveIgetSget(analyzedInstruction, RegisterType.INTEGER_TYPE);
+                return true;
+            case IGET_BOOLEAN:
+                analyze32BitPrimitiveIgetSget(analyzedInstruction, RegisterType.BOOLEAN_TYPE);
+                return true;
+            case IGET_BYTE:
+                analyze32BitPrimitiveIgetSget(analyzedInstruction, RegisterType.BYTE_TYPE);
+                return true;
+            case IGET_CHAR:
+                analyze32BitPrimitiveIgetSget(analyzedInstruction, RegisterType.CHAR_TYPE);
+                return true;
+            case IGET_SHORT:
+                analyze32BitPrimitiveIgetSget(analyzedInstruction, RegisterType.SHORT_TYPE);
+                return true;
+            case IGET_WIDE:
+            case IGET_OBJECT:
+                analyzeIgetSgetWideObject(analyzedInstruction);
+                return true;
+            case IPUT:
+            case IPUT_BOOLEAN:
+            case IPUT_BYTE:
+            case IPUT_CHAR:
+            case IPUT_SHORT:
+            case IPUT_WIDE:
+            case IPUT_OBJECT:
+                return true;
+            case SGET:
+                analyze32BitPrimitiveIgetSget(analyzedInstruction, RegisterType.INTEGER_TYPE);
+                return true;
+            case SGET_BOOLEAN:
+                analyze32BitPrimitiveIgetSget(analyzedInstruction, RegisterType.BOOLEAN_TYPE);
+                return true;
+            case SGET_BYTE:
+                analyze32BitPrimitiveIgetSget(analyzedInstruction, RegisterType.BYTE_TYPE);
+                return true;
+            case SGET_CHAR:
+                analyze32BitPrimitiveIgetSget(analyzedInstruction, RegisterType.CHAR_TYPE);
+                return true;
+            case SGET_SHORT:
+                analyze32BitPrimitiveIgetSget(analyzedInstruction, RegisterType.SHORT_TYPE);
+                return true;
+            case SGET_WIDE:
+            case SGET_OBJECT:
+                analyzeIgetSgetWideObject(analyzedInstruction);
+                return true;
+            case SPUT:
+            case SPUT_BOOLEAN:
+            case SPUT_BYTE:
+            case SPUT_CHAR:
+            case SPUT_SHORT:
+            case SPUT_WIDE:
+            case SPUT_OBJECT:
+                return true;
+            case INVOKE_VIRTUAL:
+                analyzeInvokeVirtual(analyzedInstruction, false);
+                return true;
+            case INVOKE_SUPER:
+                analyzeInvokeVirtual(analyzedInstruction, false);
+                return true;
+            case INVOKE_DIRECT:
+                analyzeInvokeDirect(analyzedInstruction);
+                return true;
+            case INVOKE_STATIC:
+                return true;
+            case INVOKE_INTERFACE:
+                // TODO: normalize interfaces
+                return true;
+            case INVOKE_VIRTUAL_RANGE:
+                analyzeInvokeVirtual(analyzedInstruction, true);
+                return true;
+            case INVOKE_SUPER_RANGE:
+                analyzeInvokeVirtual(analyzedInstruction, true);
+                return true;
+            case INVOKE_DIRECT_RANGE:
+                analyzeInvokeDirectRange(analyzedInstruction);
+                return true;
+            case INVOKE_STATIC_RANGE:
+                return true;
+            case INVOKE_INTERFACE_RANGE:
+                // TODO: normalize interfaces
+                return true;
+            case NEG_INT:
+            case NOT_INT:
+                analyzeUnaryOp(analyzedInstruction, RegisterType.INTEGER_TYPE);
+                return true;
+            case NEG_LONG:
+            case NOT_LONG:
+                analyzeUnaryOp(analyzedInstruction, RegisterType.LONG_LO_TYPE);
+                return true;
+            case NEG_FLOAT:
+                analyzeUnaryOp(analyzedInstruction, RegisterType.FLOAT_TYPE);
+                return true;
+            case NEG_DOUBLE:
+                analyzeUnaryOp(analyzedInstruction, RegisterType.DOUBLE_LO_TYPE);
+                return true;
+            case INT_TO_LONG:
+                analyzeUnaryOp(analyzedInstruction, RegisterType.LONG_LO_TYPE);
+                return true;
+            case INT_TO_FLOAT:
+                analyzeUnaryOp(analyzedInstruction, RegisterType.FLOAT_TYPE);
+                return true;
+            case INT_TO_DOUBLE:
+                analyzeUnaryOp(analyzedInstruction, RegisterType.DOUBLE_LO_TYPE);
+                return true;
+            case LONG_TO_INT:
+            case DOUBLE_TO_INT:
+                analyzeUnaryOp(analyzedInstruction, RegisterType.INTEGER_TYPE);
+                return true;
+            case LONG_TO_FLOAT:
+            case DOUBLE_TO_FLOAT:
+                analyzeUnaryOp(analyzedInstruction, RegisterType.FLOAT_TYPE);
+                return true;
+            case LONG_TO_DOUBLE:
+                analyzeUnaryOp(analyzedInstruction, RegisterType.DOUBLE_LO_TYPE);
+                return true;
+            case FLOAT_TO_INT:
+                analyzeUnaryOp(analyzedInstruction, RegisterType.INTEGER_TYPE);
+                return true;
+            case FLOAT_TO_LONG:
+                analyzeUnaryOp(analyzedInstruction, RegisterType.LONG_LO_TYPE);
+                return true;
+            case FLOAT_TO_DOUBLE:
+                analyzeUnaryOp(analyzedInstruction, RegisterType.DOUBLE_LO_TYPE);
+                return true;
+            case DOUBLE_TO_LONG:
+                analyzeUnaryOp(analyzedInstruction, RegisterType.LONG_LO_TYPE);
+                return true;
+            case INT_TO_BYTE:
+                analyzeUnaryOp(analyzedInstruction, RegisterType.BYTE_TYPE);
+                return true;
+            case INT_TO_CHAR:
+                analyzeUnaryOp(analyzedInstruction, RegisterType.CHAR_TYPE);
+                return true;
+            case INT_TO_SHORT:
+                analyzeUnaryOp(analyzedInstruction, RegisterType.SHORT_TYPE);
+                return true;
+            case ADD_INT:
+            case SUB_INT:
+            case MUL_INT:
+            case DIV_INT:
+            case REM_INT:
+            case SHL_INT:
+            case SHR_INT:
+            case USHR_INT:
+                analyzeBinaryOp(analyzedInstruction, RegisterType.INTEGER_TYPE, false);
+                return true;
+            case AND_INT:
+            case OR_INT:
+            case XOR_INT:
+                analyzeBinaryOp(analyzedInstruction, RegisterType.INTEGER_TYPE, true);
+                return true;
+            case ADD_LONG:
+            case SUB_LONG:
+            case MUL_LONG:
+            case DIV_LONG:
+            case REM_LONG:
+            case AND_LONG:
+            case OR_LONG:
+            case XOR_LONG:
+            case SHL_LONG:
+            case SHR_LONG:
+            case USHR_LONG:
+                analyzeBinaryOp(analyzedInstruction, RegisterType.LONG_LO_TYPE, false);
+                return true;
+            case ADD_FLOAT:
+            case SUB_FLOAT:
+            case MUL_FLOAT:
+            case DIV_FLOAT:
+            case REM_FLOAT:
+                analyzeBinaryOp(analyzedInstruction, RegisterType.FLOAT_TYPE, false);
+                return true;
+            case ADD_DOUBLE:
+            case SUB_DOUBLE:
+            case MUL_DOUBLE:
+            case DIV_DOUBLE:
+            case REM_DOUBLE:
+                analyzeBinaryOp(analyzedInstruction, RegisterType.DOUBLE_LO_TYPE, false);
+                return true;
+            case ADD_INT_2ADDR:
+            case SUB_INT_2ADDR:
+            case MUL_INT_2ADDR:
+            case DIV_INT_2ADDR:
+            case REM_INT_2ADDR:
+            case SHL_INT_2ADDR:
+            case SHR_INT_2ADDR:
+            case USHR_INT_2ADDR:
+                analyzeBinary2AddrOp(analyzedInstruction, RegisterType.INTEGER_TYPE, false);
+                return true;
+            case AND_INT_2ADDR:
+            case OR_INT_2ADDR:
+            case XOR_INT_2ADDR:
+                analyzeBinary2AddrOp(analyzedInstruction, RegisterType.INTEGER_TYPE, true);
+                return true;
+            case ADD_LONG_2ADDR:
+            case SUB_LONG_2ADDR:
+            case MUL_LONG_2ADDR:
+            case DIV_LONG_2ADDR:
+            case REM_LONG_2ADDR:
+            case AND_LONG_2ADDR:
+            case OR_LONG_2ADDR:
+            case XOR_LONG_2ADDR:
+            case SHL_LONG_2ADDR:
+            case SHR_LONG_2ADDR:
+            case USHR_LONG_2ADDR:
+                analyzeBinary2AddrOp(analyzedInstruction, RegisterType.LONG_LO_TYPE, false);
+                return true;
+            case ADD_FLOAT_2ADDR:
+            case SUB_FLOAT_2ADDR:
+            case MUL_FLOAT_2ADDR:
+            case DIV_FLOAT_2ADDR:
+            case REM_FLOAT_2ADDR:
+                analyzeBinary2AddrOp(analyzedInstruction, RegisterType.FLOAT_TYPE, false);
+                return true;
+            case ADD_DOUBLE_2ADDR:
+            case SUB_DOUBLE_2ADDR:
+            case MUL_DOUBLE_2ADDR:
+            case DIV_DOUBLE_2ADDR:
+            case REM_DOUBLE_2ADDR:
+                analyzeBinary2AddrOp(analyzedInstruction, RegisterType.DOUBLE_LO_TYPE, false);
+                return true;
+            case ADD_INT_LIT16:
+            case RSUB_INT:
+            case MUL_INT_LIT16:
+            case DIV_INT_LIT16:
+            case REM_INT_LIT16:
+                analyzeLiteralBinaryOp(analyzedInstruction, RegisterType.INTEGER_TYPE, false);
+                return true;
+            case AND_INT_LIT16:
+            case OR_INT_LIT16:
+            case XOR_INT_LIT16:
+                analyzeLiteralBinaryOp(analyzedInstruction, RegisterType.INTEGER_TYPE, true);
+                return true;
+            case ADD_INT_LIT8:
+            case RSUB_INT_LIT8:
+            case MUL_INT_LIT8:
+            case DIV_INT_LIT8:
+            case REM_INT_LIT8:
+            case SHL_INT_LIT8:
+                analyzeLiteralBinaryOp(analyzedInstruction, RegisterType.INTEGER_TYPE, false);
+                return true;
+            case AND_INT_LIT8:
+            case OR_INT_LIT8:
+            case XOR_INT_LIT8:
+                analyzeLiteralBinaryOp(analyzedInstruction, RegisterType.INTEGER_TYPE, true);
+                return true;
+            case SHR_INT_LIT8:
+                analyzeLiteralBinaryOp(analyzedInstruction, getDestTypeForLiteralShiftRight(analyzedInstruction, true),
+                        false);
+                return true;
+            case USHR_INT_LIT8:
+                analyzeLiteralBinaryOp(analyzedInstruction, getDestTypeForLiteralShiftRight(analyzedInstruction, false),
+                        false);
+                return true;
+
+            /*odexed instructions*/
+            case IGET_VOLATILE:
+            case IPUT_VOLATILE:
+            case SGET_VOLATILE:
+            case SPUT_VOLATILE:
+            case IGET_OBJECT_VOLATILE:
+            case IGET_WIDE_VOLATILE:
+            case IPUT_WIDE_VOLATILE:
+            case SGET_WIDE_VOLATILE:
+            case SPUT_WIDE_VOLATILE:
+                analyzePutGetVolatile(analyzedInstruction);
+                return true;
+            case THROW_VERIFICATION_ERROR:
+                return true;
+            case EXECUTE_INLINE:
+                analyzeExecuteInline(analyzedInstruction);
+                return true;
+            case EXECUTE_INLINE_RANGE:
+                analyzeExecuteInlineRange(analyzedInstruction);
+                return true;
+            case INVOKE_DIRECT_EMPTY:
+                analyzeInvokeDirectEmpty(analyzedInstruction);
+                return true;
+            case INVOKE_OBJECT_INIT_RANGE:
+                analyzeInvokeObjectInitRange(analyzedInstruction);
+                return true;
+            case IGET_QUICK:
+            case IGET_WIDE_QUICK:
+            case IGET_OBJECT_QUICK:
+            case IPUT_QUICK:
+            case IPUT_WIDE_QUICK:
+            case IPUT_OBJECT_QUICK:
+            case IPUT_BOOLEAN_QUICK:
+            case IPUT_BYTE_QUICK:
+            case IPUT_CHAR_QUICK:
+            case IPUT_SHORT_QUICK:
+            case IGET_BOOLEAN_QUICK:
+            case IGET_BYTE_QUICK:
+            case IGET_CHAR_QUICK:
+            case IGET_SHORT_QUICK:
+                return analyzeIputIgetQuick(analyzedInstruction);
+            case INVOKE_VIRTUAL_QUICK:
+                return analyzeInvokeVirtualQuick(analyzedInstruction, false, false);
+            case INVOKE_SUPER_QUICK:
+                return analyzeInvokeVirtualQuick(analyzedInstruction, true, false);
+            case INVOKE_VIRTUAL_QUICK_RANGE:
+                return analyzeInvokeVirtualQuick(analyzedInstruction, false, true);
+            case INVOKE_SUPER_QUICK_RANGE:
+                return analyzeInvokeVirtualQuick(analyzedInstruction, true, true);
+            case IPUT_OBJECT_VOLATILE:
+            case SGET_OBJECT_VOLATILE:
+            case SPUT_OBJECT_VOLATILE:
+                analyzePutGetVolatile(analyzedInstruction);
+                return true;
+            default:
+                assert false;
+                return true;
+        }
+    }
+
+    private static final BitSet Primitive32BitCategories = BitSetUtils.bitSetOfIndexes(
+            RegisterType.NULL,
+            RegisterType.ONE,
+            RegisterType.BOOLEAN,
+            RegisterType.BYTE,
+            RegisterType.POS_BYTE,
+            RegisterType.SHORT,
+            RegisterType.POS_SHORT,
+            RegisterType.CHAR,
+            RegisterType.INTEGER,
+            RegisterType.FLOAT);
+
+    private static final BitSet WideLowCategories = BitSetUtils.bitSetOfIndexes(
+            RegisterType.LONG_LO,
+            RegisterType.DOUBLE_LO);
+
+    private static final BitSet WideHighCategories = BitSetUtils.bitSetOfIndexes(
+            RegisterType.LONG_HI,
+            RegisterType.DOUBLE_HI);
+
+    private static final BitSet ReferenceOrUninitCategories = BitSetUtils.bitSetOfIndexes(
+            RegisterType.NULL,
+            RegisterType.UNINIT_REF,
+            RegisterType.UNINIT_THIS,
+            RegisterType.REFERENCE);
+
+    private static final BitSet BooleanCategories = BitSetUtils.bitSetOfIndexes(
+            RegisterType.NULL,
+            RegisterType.ONE,
+            RegisterType.BOOLEAN);
+
+    private void analyzeMove(@Nonnull AnalyzedInstruction analyzedInstruction) {
+        TwoRegisterInstruction instruction = (TwoRegisterInstruction)analyzedInstruction.instruction;
+
+        RegisterType sourceRegisterType = analyzedInstruction.getPreInstructionRegisterType(instruction.getRegisterB());
+        setDestinationRegisterTypeAndPropagateChanges(analyzedInstruction, sourceRegisterType);
+    }
+
+    private void analyzeMoveResult(@Nonnull AnalyzedInstruction analyzedInstruction) {
+        AnalyzedInstruction previousInstruction = null;
+        if (analyzedInstruction.instructionIndex > 0) {
+            previousInstruction = analyzedInstructions.valueAt(analyzedInstruction.instructionIndex-1);
+        }
+        if (previousInstruction == null || !previousInstruction.instruction.getOpcode().setsResult()) {
+            throw new AnalysisException(analyzedInstruction.instruction.getOpcode().name + " must occur after an " +
+                    "invoke-*/fill-new-array instruction");
+        }
+
+        RegisterType resultRegisterType;
+        ReferenceInstruction invokeInstruction = (ReferenceInstruction)previousInstruction.instruction;
+        Reference reference = invokeInstruction.getReference();
+
+        if (reference instanceof MethodReference) {
+            resultRegisterType = RegisterType.getRegisterType(classPath, ((MethodReference)reference).getReturnType());
+        } else {
+            resultRegisterType = RegisterType.getRegisterType(classPath, (TypeReference)reference);
+        }
+
+        setDestinationRegisterTypeAndPropagateChanges(analyzedInstruction, resultRegisterType);
+    }
+
+    private void analyzeMoveException(@Nonnull AnalyzedInstruction analyzedInstruction) {
+        int instructionAddress = getInstructionAddress(analyzedInstruction);
+
+        RegisterType exceptionType = RegisterType.UNKNOWN_TYPE;
+
+        for (TryBlock<? extends ExceptionHandler> tryBlock: methodImpl.getTryBlocks()) {
+            for (ExceptionHandler handler: tryBlock.getExceptionHandlers()) {
+
+                if (handler.getHandlerCodeAddress() == instructionAddress) {
+                    String type = handler.getExceptionType();
+                    if (type == null) {
+                        exceptionType = RegisterType.getRegisterType(RegisterType.REFERENCE,
+                                classPath.getClass("Ljava/lang/Throwable;"));
+                    } else {
+                        exceptionType = RegisterType.getRegisterType(RegisterType.REFERENCE, classPath.getClass(type))
+                                .merge(exceptionType);
+                    }
+                }
+            }
+        }
+
+        if (exceptionType.category == RegisterType.UNKNOWN) {
+            throw new AnalysisException("move-exception must be the first instruction in an exception handler block");
+        }
+
+        setDestinationRegisterTypeAndPropagateChanges(analyzedInstruction, exceptionType);
+    }
+
+    private void analyzeOdexReturnVoid(AnalyzedInstruction analyzedInstruction) {
+        analyzeOdexReturnVoid(analyzedInstruction, true);
+    }
+
+    private void analyzeOdexReturnVoid(@Nonnull AnalyzedInstruction analyzedInstruction, boolean analyzeResult) {
+        Instruction10x deodexedInstruction = new ImmutableInstruction10x(Opcode.RETURN_VOID);
+
+        analyzedInstruction.setDeodexedInstruction(deodexedInstruction);
+
+        if (analyzeResult) {
+            analyzeInstruction(analyzedInstruction);
+        }
+    }
+
+    private void analyzeConst(@Nonnull AnalyzedInstruction analyzedInstruction) {
+        NarrowLiteralInstruction instruction = (NarrowLiteralInstruction)analyzedInstruction.instruction;
+
+        //we assume that the literal value is a valid value for the given instruction type, because it's impossible
+        //to store an invalid literal with the instruction. so we don't need to check the type of the literal
+        setDestinationRegisterTypeAndPropagateChanges(analyzedInstruction,
+                RegisterType.getRegisterTypeForLiteral(instruction.getNarrowLiteral()));
+    }
+
+    private void analyzeWideConst(@Nonnull AnalyzedInstruction analyzedInstruction) {
+        setDestinationRegisterTypeAndPropagateChanges(analyzedInstruction, RegisterType.LONG_LO_TYPE);
+    }
+
+    private void analyzeConstString(@Nonnull AnalyzedInstruction analyzedInstruction) {
+        TypeProto stringClass = classPath.getClass("Ljava/lang/String;");
+        RegisterType stringType = RegisterType.getRegisterType(RegisterType.REFERENCE, stringClass);
+        setDestinationRegisterTypeAndPropagateChanges(analyzedInstruction, stringType);
+    }
+
+    private void analyzeConstClass(@Nonnull AnalyzedInstruction analyzedInstruction) {
+        TypeProto classClass = classPath.getClass("Ljava/lang/Class;");
+        RegisterType classType = RegisterType.getRegisterType(RegisterType.REFERENCE, classClass);
+        setDestinationRegisterTypeAndPropagateChanges(analyzedInstruction, classType);
+    }
+
+    private void analyzeCheckCast(@Nonnull AnalyzedInstruction analyzedInstruction) {
+        ReferenceInstruction instruction = (ReferenceInstruction)analyzedInstruction.instruction;
+        TypeReference reference = (TypeReference)instruction.getReference();
+        RegisterType castRegisterType = RegisterType.getRegisterType(classPath, reference);
+        setDestinationRegisterTypeAndPropagateChanges(analyzedInstruction, castRegisterType);
+    }
+
+    public static boolean isNotWideningConversion(RegisterType originalType, RegisterType newType) {
+        if (originalType.type == null || newType.type == null) {
+            return true;
+        }
+        if (originalType.type.isInterface()) {
+            return newType.type.implementsInterface(originalType.type.getType());
+        } else {
+            TypeProto commonSuperclass = newType.type.getCommonSuperclass(originalType.type);
+            if (commonSuperclass.getType().equals(originalType.type.getType())) {
+                return true;
+        }
+            if (commonSuperclass.getType().equals(newType.type.getType())) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    static boolean canPropagateTypeAfterInstanceOf(AnalyzedInstruction analyzedInstanceOfInstruction,
+                                                   AnalyzedInstruction analyzedIfInstruction, ClassPath classPath) {
+        if (!classPath.isArt()) {
+            return false;
+        }
+
+        Instruction ifInstruction = analyzedIfInstruction.instruction;
+        if (((Instruction21t)ifInstruction).getRegisterA() == analyzedInstanceOfInstruction.getDestinationRegister()) {
+            Reference reference = ((Instruction22c)analyzedInstanceOfInstruction.getInstruction()).getReference();
+            RegisterType registerType = RegisterType.getRegisterType(classPath, (TypeReference)reference);
+
+            try {
+                if (registerType.type != null && !registerType.type.isInterface()) {
+                    int objectRegister = ((TwoRegisterInstruction)analyzedInstanceOfInstruction.getInstruction())
+                            .getRegisterB();
+
+                    RegisterType originalType = analyzedIfInstruction.getPreInstructionRegisterType(objectRegister);
+
+                    return isNotWideningConversion(originalType, registerType);
+                }
+            } catch (UnresolvedClassException ex) {
+                return false;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Art uses a peephole optimization for an if-eqz or if-nez that occur immediately after an instance-of. It will
+     * narrow the type if possible, and then NOP out any corresponding check-cast instruction later on
+     */
+    private void analyzeIfEqzNez(@Nonnull AnalyzedInstruction analyzedInstruction) {
+        if (classPath.isArt()) {
+            int instructionIndex = analyzedInstruction.getInstructionIndex();
+            if (instructionIndex > 0) {
+                if (analyzedInstruction.getPredecessorCount() != 1) {
+                    return;
+                }
+                AnalyzedInstruction prevAnalyzedInstruction = analyzedInstruction.getPredecessors().first();
+                if (prevAnalyzedInstruction.instruction.getOpcode() == Opcode.INSTANCE_OF) {
+
+                    AnalyzedInstruction fallthroughInstruction = analyzedInstructions.valueAt(
+                            analyzedInstruction.getInstructionIndex() + 1);
+
+                    int nextAddress = getInstructionAddress(analyzedInstruction) +
+                            ((Instruction21t)analyzedInstruction.instruction).getCodeOffset();
+                    AnalyzedInstruction branchInstruction = analyzedInstructions.get(nextAddress);
+
+                    int narrowingRegister = ((Instruction22c)prevAnalyzedInstruction.instruction).getRegisterB();
+                    RegisterType originalType = analyzedInstruction.getPreInstructionRegisterType(narrowingRegister);
+
+                    Instruction22c instanceOfInstruction = (Instruction22c)prevAnalyzedInstruction.instruction;
+                    RegisterType newType = RegisterType.getRegisterType(classPath,
+                            (TypeReference)instanceOfInstruction.getReference());
+
+                    for (int register : analyzedInstruction.getSetRegisters()) {
+                        if (analyzedInstruction.instruction.getOpcode() == Opcode.IF_EQZ) {
+                            overridePredecessorRegisterTypeAndPropagateChanges(fallthroughInstruction,
+                                    analyzedInstruction, register, newType);
+                            overridePredecessorRegisterTypeAndPropagateChanges(branchInstruction, analyzedInstruction,
+                                    register, originalType);
+                        } else {
+                            overridePredecessorRegisterTypeAndPropagateChanges(fallthroughInstruction,
+                                    analyzedInstruction, register, originalType);
+                            overridePredecessorRegisterTypeAndPropagateChanges(branchInstruction, analyzedInstruction,
+                                    register, newType);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    private void analyzeInstanceOf(@Nonnull AnalyzedInstruction analyzedInstruction) {
+        setDestinationRegisterTypeAndPropagateChanges(analyzedInstruction, RegisterType.BOOLEAN_TYPE);
+    }
+
+    private void analyzeArrayLength(@Nonnull AnalyzedInstruction analyzedInstruction) {
+        setDestinationRegisterTypeAndPropagateChanges(analyzedInstruction, RegisterType.INTEGER_TYPE);
+    }
+
+    private void analyzeNewInstance(@Nonnull AnalyzedInstruction analyzedInstruction) {
+        ReferenceInstruction instruction = (ReferenceInstruction)analyzedInstruction.instruction;
+
+        int register = ((OneRegisterInstruction)analyzedInstruction.instruction).getRegisterA();
+        RegisterType destRegisterType = analyzedInstruction.getPostInstructionRegisterType(register);
+        if (destRegisterType.category != RegisterType.UNKNOWN) {
+            //the post-instruction destination register will only be set if we have already analyzed this instruction
+            //at least once. If this is the case, then the uninit reference has already been propagated to all
+            //successors and nothing else needs to be done.
+            assert destRegisterType.category == RegisterType.UNINIT_REF;
+            return;
+        }
+
+        TypeReference typeReference = (TypeReference)instruction.getReference();
+
+        RegisterType classType = RegisterType.getRegisterType(classPath, typeReference);
+
+        setDestinationRegisterTypeAndPropagateChanges(analyzedInstruction,
+                RegisterType.getRegisterType(RegisterType.UNINIT_REF, classType.type));
+    }
+
+    private void analyzeNewArray(@Nonnull AnalyzedInstruction analyzedInstruction) {
+        ReferenceInstruction instruction = (ReferenceInstruction)analyzedInstruction.instruction;
+
+        TypeReference type = (TypeReference)instruction.getReference();
+        if (type.getType().charAt(0) != '[') {
+            throw new AnalysisException("new-array used with non-array type");
+        }
+
+        RegisterType arrayType = RegisterType.getRegisterType(classPath, type);
+
+        setDestinationRegisterTypeAndPropagateChanges(analyzedInstruction, arrayType);
+    }
+
+    private void analyzeFloatWideCmp(@Nonnull AnalyzedInstruction analyzedInstruction) {
+        setDestinationRegisterTypeAndPropagateChanges(analyzedInstruction, RegisterType.BYTE_TYPE);
+    }
+
+    private void analyze32BitPrimitiveAget(@Nonnull AnalyzedInstruction analyzedInstruction,
+                                           @Nonnull RegisterType registerType) {
+        setDestinationRegisterTypeAndPropagateChanges(analyzedInstruction, registerType);
+    }
+
+    private void analyzeAgetWide(@Nonnull AnalyzedInstruction analyzedInstruction) {
+        ThreeRegisterInstruction instruction = (ThreeRegisterInstruction)analyzedInstruction.instruction;
+
+        RegisterType arrayRegisterType = analyzedInstruction.getPreInstructionRegisterType(instruction.getRegisterB());
+        if (arrayRegisterType.category != RegisterType.NULL) {
+            if (arrayRegisterType.category != RegisterType.REFERENCE ||
+                    !(arrayRegisterType.type instanceof ArrayProto)) {
+                throw new AnalysisException("aget-wide used with non-array register: %s", arrayRegisterType.toString());
+            }
+            ArrayProto arrayProto = (ArrayProto)arrayRegisterType.type;
+
+            if (arrayProto.dimensions != 1) {
+                throw new AnalysisException("aget-wide used with multi-dimensional array: %s",
+                        arrayRegisterType.toString());
+            }
+
+            char arrayBaseType = arrayProto.getElementType().charAt(0);
+            if (arrayBaseType == 'J') {
+                setDestinationRegisterTypeAndPropagateChanges(analyzedInstruction, RegisterType.LONG_LO_TYPE);
+            } else if (arrayBaseType == 'D') {
+                setDestinationRegisterTypeAndPropagateChanges(analyzedInstruction, RegisterType.DOUBLE_LO_TYPE);
+            } else {
+                throw new AnalysisException("aget-wide used with narrow array: %s", arrayRegisterType);
+            }
+        } else {
+            // If the array register is null, we can assume that the destination register was meant to be a wide type.
+            // This is the same behavior as dalvik's verifier
+            setDestinationRegisterTypeAndPropagateChanges(analyzedInstruction, RegisterType.LONG_LO_TYPE);
+        }
+    }
+
+    private void analyzeAgetObject(@Nonnull AnalyzedInstruction analyzedInstruction) {
+        ThreeRegisterInstruction instruction = (ThreeRegisterInstruction)analyzedInstruction.instruction;
+
+        RegisterType arrayRegisterType = analyzedInstruction.getPreInstructionRegisterType(instruction.getRegisterB());
+        if (arrayRegisterType.category != RegisterType.NULL) {
+            if (arrayRegisterType.category != RegisterType.REFERENCE ||
+                    !(arrayRegisterType.type instanceof ArrayProto)) {
+                throw new AnalysisException("aget-object used with non-array register: %s",
+                        arrayRegisterType.toString());
+            }
+
+            ArrayProto arrayProto = (ArrayProto)arrayRegisterType.type;
+
+            String elementType = arrayProto.getImmediateElementType();
+
+            setDestinationRegisterTypeAndPropagateChanges(analyzedInstruction,
+                    RegisterType.getRegisterType(RegisterType.REFERENCE, classPath.getClass(elementType)));
+        } else {
+            // If the array register is null, we can assume that the destination register was meant to be a reference
+            // type, so we set the destination to NULL. This is the same behavior as dalvik's verifier
+            setDestinationRegisterTypeAndPropagateChanges(analyzedInstruction, RegisterType.NULL_TYPE);
+        }
+    }
+
+    private void analyze32BitPrimitiveIgetSget(@Nonnull AnalyzedInstruction analyzedInstruction,
+                                               @Nonnull RegisterType registerType) {
+        setDestinationRegisterTypeAndPropagateChanges(analyzedInstruction, registerType);
+    }
+
+    private void analyzeIgetSgetWideObject(@Nonnull AnalyzedInstruction analyzedInstruction) {
+        ReferenceInstruction referenceInstruction = (ReferenceInstruction)analyzedInstruction.instruction;
+
+        FieldReference fieldReference = (FieldReference)referenceInstruction.getReference();
+
+        RegisterType fieldType = RegisterType.getRegisterType(classPath, fieldReference.getType());
+        setDestinationRegisterTypeAndPropagateChanges(analyzedInstruction, fieldType);
+    }
+
+    private void analyzeInvokeDirect(@Nonnull AnalyzedInstruction analyzedInstruction) {
+        FiveRegisterInstruction instruction = (FiveRegisterInstruction)analyzedInstruction.instruction;
+        analyzeInvokeDirectCommon(analyzedInstruction, instruction.getRegisterC());
+    }
+
+    private void analyzeInvokeDirectRange(@Nonnull AnalyzedInstruction analyzedInstruction) {
+        RegisterRangeInstruction instruction = (RegisterRangeInstruction)analyzedInstruction.instruction;
+        analyzeInvokeDirectCommon(analyzedInstruction, instruction.getStartRegister());
+    }
+
+    private void analyzeInvokeDirectCommon(@Nonnull AnalyzedInstruction analyzedInstruction, int objectRegister) {
+        // This handles the case of invoking a constructor on an uninitialized reference. This propagates the
+        // initialized type for the object register, and also any known aliased registers.
+        //
+        // In some cases, unrelated uninitialized references may not have been propagated past this instruction. This
+        // happens when propagating those types and the type of object register of this instruction isn't known yet.
+        // In this case, we can't determine if the uninitialized reference being propagated in an alias of the object
+        // register, so we don't stop propagation.
+        //
+        // We check for any of these unpropagated uninitialized references here and propagate them.
+        if (analyzedInstruction.isInvokeInit()) {
+            RegisterType uninitRef = analyzedInstruction.getPreInstructionRegisterType(objectRegister);
+            if (uninitRef.category != RegisterType.UNINIT_REF && uninitRef.category != RegisterType.UNINIT_THIS) {
+                assert analyzedInstruction.getSetRegisters().isEmpty();
+                return;
+            }
+
+            RegisterType initRef = RegisterType.getRegisterType(RegisterType.REFERENCE, uninitRef.type);
+
+            for (int register: analyzedInstruction.getSetRegisters()) {
+                RegisterType registerType = analyzedInstruction.getPreInstructionRegisterType(register);
+
+                if (registerType == uninitRef) {
+                    setPostRegisterTypeAndPropagateChanges(analyzedInstruction, register, initRef);
+                } else {
+                    // This is unrelated uninitialized reference. propagate it as-is
+                    setPostRegisterTypeAndPropagateChanges(analyzedInstruction, register, registerType);
+                }
+            }
+        }
+    }
+
+    private void analyzeUnaryOp(@Nonnull AnalyzedInstruction analyzedInstruction,
+                                @Nonnull RegisterType destRegisterType) {
+        setDestinationRegisterTypeAndPropagateChanges(analyzedInstruction, destRegisterType);
+    }
+
+    private void analyzeBinaryOp(@Nonnull AnalyzedInstruction analyzedInstruction,
+                                 @Nonnull RegisterType destRegisterType, boolean checkForBoolean) {
+        if (checkForBoolean) {
+            ThreeRegisterInstruction instruction = (ThreeRegisterInstruction)analyzedInstruction.instruction;
+
+            RegisterType source1RegisterType =
+                    analyzedInstruction.getPreInstructionRegisterType(instruction.getRegisterB());
+            RegisterType source2RegisterType =
+                    analyzedInstruction.getPreInstructionRegisterType(instruction.getRegisterC());
+
+            if (BooleanCategories.get(source1RegisterType.category) &&
+                    BooleanCategories.get(source2RegisterType.category)) {
+                destRegisterType = RegisterType.BOOLEAN_TYPE;
+            }
+        }
+
+        setDestinationRegisterTypeAndPropagateChanges(analyzedInstruction, destRegisterType);
+    }
+
+    private void analyzeBinary2AddrOp(@Nonnull AnalyzedInstruction analyzedInstruction,
+                                      @Nonnull RegisterType destRegisterType, boolean checkForBoolean) {
+        if (checkForBoolean) {
+            TwoRegisterInstruction instruction = (TwoRegisterInstruction)analyzedInstruction.instruction;
+
+            RegisterType source1RegisterType =
+                    analyzedInstruction.getPreInstructionRegisterType(instruction.getRegisterA());
+            RegisterType source2RegisterType =
+                    analyzedInstruction.getPreInstructionRegisterType(instruction.getRegisterB());
+
+            if (BooleanCategories.get(source1RegisterType.category) &&
+                    BooleanCategories.get(source2RegisterType.category)) {
+                destRegisterType = RegisterType.BOOLEAN_TYPE;
+            }
+        }
+
+        setDestinationRegisterTypeAndPropagateChanges(analyzedInstruction, destRegisterType);
+    }
+
+    private void analyzeLiteralBinaryOp(@Nonnull AnalyzedInstruction analyzedInstruction,
+                                        @Nonnull RegisterType destRegisterType, boolean checkForBoolean) {
+        if (checkForBoolean) {
+            TwoRegisterInstruction instruction = (TwoRegisterInstruction)analyzedInstruction.instruction;
+
+            RegisterType sourceRegisterType =
+                    analyzedInstruction.getPreInstructionRegisterType(instruction.getRegisterB());
+
+            if (BooleanCategories.get(sourceRegisterType.category)) {
+                int literal = ((NarrowLiteralInstruction)analyzedInstruction.instruction).getNarrowLiteral();
+                if (literal == 0 || literal == 1) {
+                    destRegisterType = RegisterType.BOOLEAN_TYPE;
+                }
+            }
+        }
+
+        setDestinationRegisterTypeAndPropagateChanges(analyzedInstruction, destRegisterType);
+    }
+
+    private RegisterType getDestTypeForLiteralShiftRight(@Nonnull AnalyzedInstruction analyzedInstruction, boolean signedShift) {
+        TwoRegisterInstruction instruction = (TwoRegisterInstruction)analyzedInstruction.instruction;
+
+        RegisterType sourceRegisterType = getAndCheckSourceRegister(analyzedInstruction, instruction.getRegisterB(),
+                Primitive32BitCategories);
+        long literalShift = ((NarrowLiteralInstruction)analyzedInstruction.instruction).getNarrowLiteral();
+
+        if (literalShift == 0) {
+            return sourceRegisterType;
+        }
+
+        RegisterType destRegisterType;
+        if (!signedShift) {
+            destRegisterType = RegisterType.INTEGER_TYPE;
+        } else {
+            destRegisterType = sourceRegisterType;
+        }
+
+        literalShift = literalShift & 0x1f;
+
+        switch (sourceRegisterType.category) {
+            case RegisterType.INTEGER:
+            case RegisterType.FLOAT:
+                if (!signedShift) {
+                    if (literalShift > 24) {
+                        return RegisterType.POS_BYTE_TYPE;
+                    }
+                    if (literalShift >= 16) {
+                        return RegisterType.CHAR_TYPE;
+                    }
+                } else {
+                    if (literalShift >= 24) {
+                        return RegisterType.BYTE_TYPE;
+                    }
+                    if (literalShift >= 16) {
+                        return RegisterType.SHORT_TYPE;
+                    }
+                }
+                break;
+            case RegisterType.SHORT:
+                if (signedShift && literalShift >= 8) {
+                    return RegisterType.BYTE_TYPE;
+                }
+                break;
+            case RegisterType.POS_SHORT:
+                if (literalShift >= 8) {
+                    return RegisterType.POS_BYTE_TYPE;
+                }
+                break;
+            case RegisterType.CHAR:
+                if (literalShift > 8) {
+                    return RegisterType.POS_BYTE_TYPE;
+                }
+                break;
+            case RegisterType.BYTE:
+                break;
+            case RegisterType.POS_BYTE:
+                return RegisterType.POS_BYTE_TYPE;
+            case RegisterType.NULL:
+            case RegisterType.ONE:
+            case RegisterType.BOOLEAN:
+                return RegisterType.NULL_TYPE;
+            default:
+                assert false;
+        }
+
+        return destRegisterType;
+    }
+
+
+    private void analyzeExecuteInline(@Nonnull AnalyzedInstruction analyzedInstruction) {
+        if (inlineResolver == null) {
+            throw new AnalysisException("Cannot analyze an odexed instruction unless we are deodexing");
+        }
+
+        Instruction35mi instruction = (Instruction35mi)analyzedInstruction.instruction;
+        Method resolvedMethod = inlineResolver.resolveExecuteInline(analyzedInstruction);
+
+        Opcode deodexedOpcode;
+        int acccessFlags = resolvedMethod.getAccessFlags();
+        if (AccessFlags.STATIC.isSet(acccessFlags)) {
+            deodexedOpcode = Opcode.INVOKE_STATIC;
+        } else if (AccessFlags.PRIVATE.isSet(acccessFlags)) {
+            deodexedOpcode = Opcode.INVOKE_DIRECT;
+        } else {
+            deodexedOpcode = Opcode.INVOKE_VIRTUAL;
+        }
+
+        Instruction35c deodexedInstruction = new ImmutableInstruction35c(deodexedOpcode, instruction.getRegisterCount(),
+                instruction.getRegisterC(), instruction.getRegisterD(), instruction.getRegisterE(),
+                instruction.getRegisterF(), instruction.getRegisterG(), resolvedMethod);
+
+        analyzedInstruction.setDeodexedInstruction(deodexedInstruction);
+        analyzeInstruction(analyzedInstruction);
+    }
+
+    private void analyzeExecuteInlineRange(@Nonnull AnalyzedInstruction analyzedInstruction) {
+        if (inlineResolver == null) {
+            throw new AnalysisException("Cannot analyze an odexed instruction unless we are deodexing");
+        }
+
+        Instruction3rmi instruction = (Instruction3rmi)analyzedInstruction.instruction;
+        Method resolvedMethod = inlineResolver.resolveExecuteInline(analyzedInstruction);
+
+        Opcode deodexedOpcode;
+        int acccessFlags = resolvedMethod.getAccessFlags();
+        if (AccessFlags.STATIC.isSet(acccessFlags)) {
+            deodexedOpcode = Opcode.INVOKE_STATIC_RANGE;
+        } else if (AccessFlags.PRIVATE.isSet(acccessFlags)) {
+            deodexedOpcode = Opcode.INVOKE_DIRECT_RANGE;
+        } else {
+            deodexedOpcode = Opcode.INVOKE_VIRTUAL_RANGE;
+        }
+
+        Instruction3rc deodexedInstruction = new ImmutableInstruction3rc(deodexedOpcode, instruction.getStartRegister(),
+                instruction.getRegisterCount(), resolvedMethod);
+
+        analyzedInstruction.setDeodexedInstruction(deodexedInstruction);
+        analyzeInstruction(analyzedInstruction);
+    }
+
+    private void analyzeInvokeDirectEmpty(@Nonnull AnalyzedInstruction analyzedInstruction) {
+        analyzeInvokeDirectEmpty(analyzedInstruction, true);
+    }
+
+    private void analyzeInvokeDirectEmpty(@Nonnull AnalyzedInstruction analyzedInstruction, boolean analyzeResult) {
+        Instruction35c instruction = (Instruction35c)analyzedInstruction.instruction;
+
+        Instruction35c deodexedInstruction = new ImmutableInstruction35c(Opcode.INVOKE_DIRECT,
+                instruction.getRegisterCount(), instruction.getRegisterC(), instruction.getRegisterD(),
+                instruction.getRegisterE(), instruction.getRegisterF(), instruction.getRegisterG(),
+                instruction.getReference());
+
+        analyzedInstruction.setDeodexedInstruction(deodexedInstruction);
+
+        if (analyzeResult) {
+            analyzeInstruction(analyzedInstruction);
+        }
+    }
+
+    private void analyzeInvokeObjectInitRange(@Nonnull AnalyzedInstruction analyzedInstruction) {
+        analyzeInvokeObjectInitRange(analyzedInstruction, true);
+    }
+
+    private void analyzeInvokeObjectInitRange(@Nonnull AnalyzedInstruction analyzedInstruction, boolean analyzeResult) {
+        Instruction3rc instruction = (Instruction3rc)analyzedInstruction.instruction;
+
+        Instruction deodexedInstruction;
+
+        int startRegister = instruction.getStartRegister();
+        // hack: we should be using instruction.getRegisterCount, but some tweaked versions of dalvik appear
+        // to generate invoke-object-init/range instructions with an invalid register count. We know it should
+        // always be 1, so just use that.
+        int registerCount = 1;
+        if (startRegister < 16) {
+            deodexedInstruction = new ImmutableInstruction35c(Opcode.INVOKE_DIRECT,
+                    registerCount, startRegister, 0, 0, 0, 0, instruction.getReference());
+        } else {
+            deodexedInstruction = new ImmutableInstruction3rc(Opcode.INVOKE_DIRECT_RANGE,
+                    startRegister, registerCount, instruction.getReference());
+        }
+
+        analyzedInstruction.setDeodexedInstruction(deodexedInstruction);
+
+        if (analyzeResult) {
+            analyzeInstruction(analyzedInstruction);
+        }
+    }
+
+    private boolean analyzeIputIgetQuick(@Nonnull AnalyzedInstruction analyzedInstruction) {
+        Instruction22cs instruction = (Instruction22cs)analyzedInstruction.instruction;
+
+        int fieldOffset = instruction.getFieldOffset();
+        RegisterType objectRegisterType = getAndCheckSourceRegister(analyzedInstruction, instruction.getRegisterB(),
+                ReferenceOrUninitCategories);
+
+        if (objectRegisterType.category == RegisterType.NULL) {
+            return false;
+        }
+
+        TypeProto objectRegisterTypeProto = objectRegisterType.type;
+        assert objectRegisterTypeProto != null;
+
+        TypeProto classTypeProto = classPath.getClass(objectRegisterTypeProto.getType());
+        FieldReference resolvedField = classTypeProto.getFieldByOffset(fieldOffset);
+
+        if (resolvedField == null) {
+            throw new AnalysisException("Could not resolve the field in class %s at offset %d",
+                    objectRegisterType.type.getType(), fieldOffset);
+        }
+
+        ClassDef thisClass = classPath.getClassDef(method.getDefiningClass());
+
+        if (!TypeUtils.canAccessClass(thisClass.getType(), classPath.getClassDef(resolvedField.getDefiningClass()))) {
+
+            // the class is not accessible. So we start looking at objectRegisterTypeProto (which may be different
+            // than resolvedField.getDefiningClass()), and walk up the class hierarchy.
+            ClassDef fieldClass = classPath.getClassDef(objectRegisterTypeProto.getType());
+            while (!TypeUtils.canAccessClass(thisClass.getType(), fieldClass)) {
+                String superclass = fieldClass.getSuperclass();
+                if (superclass == null) {
+                    throw new ExceptionWithContext("Couldn't find accessible class while resolving field %s",
+                            ReferenceUtil.getShortFieldDescriptor(resolvedField));
+                }
+
+                fieldClass = classPath.getClassDef(superclass);
+            }
+
+            // fieldClass is now the first accessible class found. Now. we need to make sure that the field is
+            // actually valid for this class
+            FieldReference newResolvedField = classPath.getClass(fieldClass.getType()).getFieldByOffset(fieldOffset);
+            if (newResolvedField == null) {
+                throw new ExceptionWithContext("Couldn't find accessible class while resolving field %s",
+                        ReferenceUtil.getShortFieldDescriptor(resolvedField));
+            }
+            resolvedField = new ImmutableFieldReference(fieldClass.getType(), newResolvedField.getName(),
+                    newResolvedField.getType());
+        }
+
+        String fieldType = resolvedField.getType();
+
+        Opcode opcode = classPath.getFieldInstructionMapper().getAndCheckDeodexedOpcode(
+                fieldType, instruction.getOpcode());
+
+        Instruction22c deodexedInstruction = new ImmutableInstruction22c(opcode, (byte)instruction.getRegisterA(),
+                (byte)instruction.getRegisterB(), resolvedField);
+        analyzedInstruction.setDeodexedInstruction(deodexedInstruction);
+
+        analyzeInstruction(analyzedInstruction);
+
+        return true;
+    }
+
+    private boolean analyzeInvokeVirtual(@Nonnull AnalyzedInstruction analyzedInstruction, boolean isRange) {
+        MethodReference targetMethod;
+
+        if (!normalizeVirtualMethods) {
+            return true;
+        }
+
+        if (isRange) {
+            Instruction3rc instruction = (Instruction3rc)analyzedInstruction.instruction;
+            targetMethod = (MethodReference)instruction.getReference();
+        } else {
+            Instruction35c instruction = (Instruction35c)analyzedInstruction.instruction;
+            targetMethod = (MethodReference)instruction.getReference();
+        }
+
+        MethodReference replacementMethod = normalizeMethodReference(targetMethod);
+
+        if (replacementMethod == null || replacementMethod.equals(targetMethod)) {
+            return true;
+        }
+
+        Instruction deodexedInstruction;
+        if (isRange) {
+            Instruction3rc instruction = (Instruction3rc)analyzedInstruction.instruction;
+            deodexedInstruction = new ImmutableInstruction3rc(instruction.getOpcode(), instruction.getStartRegister(),
+                    instruction.getRegisterCount(), replacementMethod);
+        } else {
+            Instruction35c instruction = (Instruction35c)analyzedInstruction.instruction;
+            deodexedInstruction = new ImmutableInstruction35c(instruction.getOpcode(), instruction.getRegisterCount(),
+                    instruction.getRegisterC(), instruction.getRegisterD(), instruction.getRegisterE(),
+                    instruction.getRegisterF(), instruction.getRegisterG(), replacementMethod);
+        }
+
+        analyzedInstruction.setDeodexedInstruction(deodexedInstruction);
+        return true;
+    }
+
+    private boolean analyzeInvokeVirtualQuick(@Nonnull AnalyzedInstruction analyzedInstruction, boolean isSuper,
+                                              boolean isRange) {
+        int methodIndex;
+        int objectRegister;
+
+        if (isRange) {
+            Instruction3rms instruction = (Instruction3rms)analyzedInstruction.instruction;
+            methodIndex = instruction.getVtableIndex();
+            objectRegister = instruction.getStartRegister();
+        } else {
+            Instruction35ms instruction = (Instruction35ms)analyzedInstruction.instruction;
+            methodIndex = instruction.getVtableIndex();
+            objectRegister = instruction.getRegisterC();
+        }
+
+        RegisterType objectRegisterType = getAndCheckSourceRegister(analyzedInstruction, objectRegister,
+                ReferenceOrUninitCategories);
+        TypeProto objectRegisterTypeProto = objectRegisterType.type;
+
+        if (objectRegisterType.category == RegisterType.NULL) {
+            return false;
+        }
+
+        assert objectRegisterTypeProto != null;
+
+        MethodReference resolvedMethod;
+        if (isSuper) {
+            // invoke-super is only used for the same class that we're currently in
+            TypeProto typeProto = classPath.getClass(method.getDefiningClass());
+            TypeProto superType;
+
+            String superclassType = typeProto.getSuperclass();
+            if (superclassType != null) {
+                superType = classPath.getClass(superclassType);
+            } else {
+                // This is either java.lang.Object, or an UnknownClassProto
+                superType = typeProto;
+            }
+
+            resolvedMethod = superType.getMethodByVtableIndex(methodIndex);
+        } else {
+            resolvedMethod = objectRegisterTypeProto.getMethodByVtableIndex(methodIndex);
+        }
+
+        if (resolvedMethod == null) {
+            throw new AnalysisException("Could not resolve the method in class %s at index %d",
+                    objectRegisterType.type.getType(), methodIndex);
+        }
+
+        // no need to check class access for invoke-super. A class can obviously access its superclass.
+        ClassDef thisClass = classPath.getClassDef(method.getDefiningClass());
+
+        if (classPath.getClass(resolvedMethod.getDefiningClass()).isInterface()) {
+            resolvedMethod = new ReparentedMethodReference(resolvedMethod, objectRegisterTypeProto.getType());
+        } else if (!isSuper && !TypeUtils.canAccessClass(
+                thisClass.getType(), classPath.getClassDef(resolvedMethod.getDefiningClass()))) {
+
+            // the class is not accessible. So we start looking at objectRegisterTypeProto (which may be different
+            // than resolvedMethod.getDefiningClass()), and walk up the class hierarchy.
+            ClassDef methodClass = classPath.getClassDef(objectRegisterTypeProto.getType());
+            while (!TypeUtils.canAccessClass(thisClass.getType(), methodClass)) {
+                String superclass = methodClass.getSuperclass();
+                if (superclass == null) {
+                    throw new ExceptionWithContext("Couldn't find accessible class while resolving method %s",
+                            ReferenceUtil.getMethodDescriptor(resolvedMethod, true));
+                }
+
+                methodClass = classPath.getClassDef(superclass);
+            }
+
+            // methodClass is now the first accessible class found. Now. we need to make sure that the method is
+            // actually valid for this class
+            MethodReference newResolvedMethod =
+                    classPath.getClass(methodClass.getType()).getMethodByVtableIndex(methodIndex);
+            if (newResolvedMethod == null) {
+                throw new ExceptionWithContext("Couldn't find accessible class while resolving method %s",
+                        ReferenceUtil.getMethodDescriptor(resolvedMethod, true));
+            }
+            resolvedMethod = newResolvedMethod;
+            resolvedMethod = new ImmutableMethodReference(methodClass.getType(), resolvedMethod.getName(),
+                    resolvedMethod.getParameterTypes(), resolvedMethod.getReturnType());
+
+        }
+
+        if (normalizeVirtualMethods) {
+            MethodReference replacementMethod = normalizeMethodReference(resolvedMethod);
+            if (replacementMethod != null) {
+                resolvedMethod = replacementMethod;
+            }
+        }
+
+        Instruction deodexedInstruction;
+        if (isRange) {
+            Instruction3rms instruction = (Instruction3rms)analyzedInstruction.instruction;
+            Opcode opcode;
+            if (isSuper) {
+                opcode = Opcode.INVOKE_SUPER_RANGE;
+            } else {
+                opcode = Opcode.INVOKE_VIRTUAL_RANGE;
+            }
+
+            deodexedInstruction = new ImmutableInstruction3rc(opcode, instruction.getStartRegister(),
+                    instruction.getRegisterCount(), resolvedMethod);
+        } else {
+            Instruction35ms instruction = (Instruction35ms)analyzedInstruction.instruction;
+            Opcode opcode;
+            if (isSuper) {
+                opcode = Opcode.INVOKE_SUPER;
+            } else {
+                opcode = Opcode.INVOKE_VIRTUAL;
+            }
+
+            deodexedInstruction = new ImmutableInstruction35c(opcode, instruction.getRegisterCount(),
+                    instruction.getRegisterC(), instruction.getRegisterD(), instruction.getRegisterE(),
+                    instruction.getRegisterF(), instruction.getRegisterG(), resolvedMethod);
+        }
+
+        analyzedInstruction.setDeodexedInstruction(deodexedInstruction);
+        analyzeInstruction(analyzedInstruction);
+
+        return true;
+    }
+
+    private boolean analyzePutGetVolatile(@Nonnull AnalyzedInstruction analyzedInstruction) {
+        return analyzePutGetVolatile(analyzedInstruction, true);
+    }
+
+    private boolean analyzePutGetVolatile(@Nonnull AnalyzedInstruction analyzedInstruction, boolean analyzeResult) {
+        FieldReference field = (FieldReference)((ReferenceInstruction)analyzedInstruction.instruction).getReference();
+        String fieldType = field.getType();
+
+        Opcode originalOpcode = analyzedInstruction.instruction.getOpcode();
+
+        Opcode opcode = classPath.getFieldInstructionMapper().getAndCheckDeodexedOpcode(
+                fieldType, originalOpcode);
+
+        Instruction deodexedInstruction;
+
+        if (originalOpcode.isStaticFieldAccessor()) {
+            OneRegisterInstruction instruction = (OneRegisterInstruction)analyzedInstruction.instruction;
+            deodexedInstruction = new ImmutableInstruction21c(opcode, instruction.getRegisterA(), field);
+        } else {
+            TwoRegisterInstruction instruction = (TwoRegisterInstruction)analyzedInstruction.instruction;
+
+            deodexedInstruction = new ImmutableInstruction22c(opcode, instruction.getRegisterA(),
+                    instruction.getRegisterB(), field);
+        }
+
+        analyzedInstruction.setDeodexedInstruction(deodexedInstruction);
+
+        if (analyzeResult) {
+            analyzeInstruction(analyzedInstruction);
+        }
+        return true;
+    }
+
+    @Nonnull
+    private static RegisterType getAndCheckSourceRegister(@Nonnull AnalyzedInstruction analyzedInstruction,
+                                                          int registerNumber, BitSet validCategories) {
+        assert registerNumber >= 0 && registerNumber < analyzedInstruction.postRegisterMap.length;
+
+        RegisterType registerType = analyzedInstruction.getPreInstructionRegisterType(registerNumber);
+
+        checkRegister(registerType, registerNumber, validCategories);
+
+        if (validCategories == WideLowCategories) {
+            checkRegister(registerType, registerNumber, WideLowCategories);
+            checkWidePair(registerNumber, analyzedInstruction);
+
+            RegisterType secondRegisterType = analyzedInstruction.getPreInstructionRegisterType(registerNumber + 1);
+            checkRegister(secondRegisterType, registerNumber+1, WideHighCategories);
+        }
+
+        return registerType;
+    }
+
+    private static void checkRegister(RegisterType registerType, int registerNumber, BitSet validCategories) {
+        if (!validCategories.get(registerType.category)) {
+            throw new AnalysisException(String.format("Invalid register type %s for register v%d.",
+                    registerType.toString(), registerNumber));
+        }
+    }
+
+    private static void checkWidePair(int registerNumber, AnalyzedInstruction analyzedInstruction) {
+        if (registerNumber + 1 >= analyzedInstruction.postRegisterMap.length) {
+            throw new AnalysisException(String.format("v%d cannot be used as the first register in a wide register" +
+                    "pair because it is the last register.", registerNumber));
+        }
+    }
+
+    @Nullable
+    private MethodReference normalizeMethodReference(@Nonnull MethodReference methodRef) {
+        TypeProto typeProto = classPath.getClass(methodRef.getDefiningClass());
+        int methodIndex;
+        try {
+            methodIndex = typeProto.findMethodIndexInVtable(methodRef);
+        } catch (UnresolvedClassException ex) {
+            return null;
+        }
+
+        if (methodIndex < 0) {
+            return null;
+        }
+
+        ClassProto thisClass = (ClassProto)classPath.getClass(method.getDefiningClass());
+
+        Method replacementMethod = typeProto.getMethodByVtableIndex(methodIndex);
+        assert replacementMethod != null;
+        while (true) {
+            String superType = typeProto.getSuperclass();
+            if (superType == null) {
+                break;
+            }
+            typeProto = classPath.getClass(superType);
+            Method resolvedMethod = typeProto.getMethodByVtableIndex(methodIndex);
+            if (resolvedMethod == null) {
+                break;
+            }
+
+            if (!resolvedMethod.equals(replacementMethod)) {
+                if (!AnalyzedMethodUtil.canAccess(thisClass, resolvedMethod, false, false, true)) {
+                    continue;
+                }
+
+                replacementMethod = resolvedMethod;
+            }
+        }
+        return replacementMethod;
+    }
+
+    private static class ReparentedMethodReference extends BaseMethodReference {
+        private final MethodReference baseReference;
+        private final String definingClass;
+
+        public ReparentedMethodReference(MethodReference baseReference, String definingClass) {
+            this.baseReference = baseReference;
+            this.definingClass = definingClass;
+        }
+
+        @Override @Nonnull public String getName() {
+            return baseReference.getName();
+        }
+
+        @Override @Nonnull public List<? extends CharSequence> getParameterTypes() {
+            return baseReference.getParameterTypes();
+        }
+
+        @Override @Nonnull public String getReturnType() {
+            return baseReference.getReturnType();
+        }
+
+        @Nonnull @Override public String getDefiningClass() {
+            return definingClass;
+        }
+    }
+}
\ No newline at end of file
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/OdexedFieldInstructionMapper.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/OdexedFieldInstructionMapper.java
new file mode 100644
index 0000000..0ed1fef
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/OdexedFieldInstructionMapper.java
@@ -0,0 +1,257 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis;
+
+import org.jf.dexlib2.Opcode;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.HashMap;
+import java.util.Map;
+
+public class OdexedFieldInstructionMapper {
+
+    private static final int GET = 0;
+    private static final int PUT = 1;
+
+    private static final int INSTANCE = 0;
+    private static final int STATIC = 1;
+
+    private static final int PRIMITIVE = 0;
+    private static final int WIDE = 1;
+    private static final int REFERENCE = 2;
+
+    private static class FieldOpcode {
+        public final char type;
+        public final boolean isStatic;
+        @Nonnull public final Opcode normalOpcode;
+        @Nullable public final Opcode quickOpcode;
+        @Nullable public final Opcode volatileOpcode;
+
+        public FieldOpcode(char type, @Nonnull Opcode normalOpcode, @Nullable Opcode quickOpcode,
+                           @Nullable Opcode volatileOpcode) {
+            this.type = type;
+            this.isStatic = false;
+            this.normalOpcode = normalOpcode;
+            this.quickOpcode = quickOpcode;
+            this.volatileOpcode = volatileOpcode;
+        }
+
+        public FieldOpcode(char type, boolean isStatic, @Nonnull Opcode normalOpcode, @Nullable Opcode volatileOpcode) {
+            this.type = type;
+            this.isStatic = isStatic;
+            this.normalOpcode = normalOpcode;
+            this.quickOpcode = null;
+            this.volatileOpcode = volatileOpcode;
+        }
+
+        public FieldOpcode(char type, @Nonnull Opcode normalOpcode, @Nullable Opcode quickOpcode) {
+            this.type = type;
+            this.isStatic = false;
+            this.normalOpcode = normalOpcode;
+            this.quickOpcode = quickOpcode;
+            this.volatileOpcode = null;
+        }
+    }
+
+    private static final FieldOpcode[] dalvikFieldOpcodes = new FieldOpcode[] {
+            new FieldOpcode('Z', Opcode.IGET_BOOLEAN, Opcode.IGET_QUICK, Opcode.IGET_VOLATILE),
+            new FieldOpcode('B', Opcode.IGET_BYTE, Opcode.IGET_QUICK, Opcode.IGET_VOLATILE),
+            new FieldOpcode('S', Opcode.IGET_SHORT, Opcode.IGET_QUICK, Opcode.IGET_VOLATILE),
+            new FieldOpcode('C', Opcode.IGET_CHAR, Opcode.IGET_QUICK, Opcode.IGET_VOLATILE),
+            new FieldOpcode('I', Opcode.IGET, Opcode.IGET_QUICK, Opcode.IGET_VOLATILE),
+            new FieldOpcode('F', Opcode.IGET, Opcode.IGET_QUICK, Opcode.IGET_VOLATILE),
+            new FieldOpcode('J', Opcode.IGET_WIDE, Opcode.IGET_WIDE_QUICK, Opcode.IGET_WIDE_VOLATILE),
+            new FieldOpcode('D', Opcode.IGET_WIDE, Opcode.IGET_WIDE_QUICK, Opcode.IGET_WIDE_VOLATILE),
+            new FieldOpcode('L', Opcode.IGET_OBJECT, Opcode.IGET_OBJECT_QUICK, Opcode.IGET_OBJECT_VOLATILE),
+            new FieldOpcode('[', Opcode.IGET_OBJECT, Opcode.IGET_OBJECT_QUICK, Opcode.IGET_OBJECT_VOLATILE),
+
+            new FieldOpcode('Z', Opcode.IPUT_BOOLEAN, Opcode.IPUT_QUICK, Opcode.IPUT_VOLATILE),
+            new FieldOpcode('B', Opcode.IPUT_BYTE, Opcode.IPUT_QUICK, Opcode.IPUT_VOLATILE),
+            new FieldOpcode('S', Opcode.IPUT_SHORT, Opcode.IPUT_QUICK, Opcode.IPUT_VOLATILE),
+            new FieldOpcode('C', Opcode.IPUT_CHAR, Opcode.IPUT_QUICK, Opcode.IPUT_VOLATILE),
+            new FieldOpcode('I', Opcode.IPUT, Opcode.IPUT_QUICK, Opcode.IPUT_VOLATILE),
+            new FieldOpcode('F', Opcode.IPUT, Opcode.IPUT_QUICK, Opcode.IPUT_VOLATILE),
+            new FieldOpcode('J', Opcode.IPUT_WIDE, Opcode.IPUT_WIDE_QUICK, Opcode.IPUT_WIDE_VOLATILE),
+            new FieldOpcode('D', Opcode.IPUT_WIDE, Opcode.IPUT_WIDE_QUICK, Opcode.IPUT_WIDE_VOLATILE),
+            new FieldOpcode('L', Opcode.IPUT_OBJECT, Opcode.IPUT_OBJECT_QUICK, Opcode.IPUT_OBJECT_VOLATILE),
+            new FieldOpcode('[', Opcode.IPUT_OBJECT, Opcode.IPUT_OBJECT_QUICK, Opcode.IPUT_OBJECT_VOLATILE),
+
+            new FieldOpcode('Z', true, Opcode.SPUT_BOOLEAN, Opcode.SPUT_VOLATILE),
+            new FieldOpcode('B', true, Opcode.SPUT_BYTE, Opcode.SPUT_VOLATILE),
+            new FieldOpcode('S', true, Opcode.SPUT_SHORT, Opcode.SPUT_VOLATILE),
+            new FieldOpcode('C', true, Opcode.SPUT_CHAR, Opcode.SPUT_VOLATILE),
+            new FieldOpcode('I', true, Opcode.SPUT, Opcode.SPUT_VOLATILE),
+            new FieldOpcode('F', true, Opcode.SPUT, Opcode.SPUT_VOLATILE),
+            new FieldOpcode('J', true, Opcode.SPUT_WIDE, Opcode.SPUT_WIDE_VOLATILE),
+            new FieldOpcode('D', true, Opcode.SPUT_WIDE, Opcode.SPUT_WIDE_VOLATILE),
+            new FieldOpcode('L', true, Opcode.SPUT_OBJECT, Opcode.SPUT_OBJECT_VOLATILE),
+            new FieldOpcode('[', true, Opcode.SPUT_OBJECT, Opcode.SPUT_OBJECT_VOLATILE),
+
+            new FieldOpcode('Z', true, Opcode.SGET_BOOLEAN, Opcode.SGET_VOLATILE),
+            new FieldOpcode('B', true, Opcode.SGET_BYTE, Opcode.SGET_VOLATILE),
+            new FieldOpcode('S', true, Opcode.SGET_SHORT, Opcode.SGET_VOLATILE),
+            new FieldOpcode('C', true, Opcode.SGET_CHAR, Opcode.SGET_VOLATILE),
+            new FieldOpcode('I', true, Opcode.SGET, Opcode.SGET_VOLATILE),
+            new FieldOpcode('F', true, Opcode.SGET, Opcode.SGET_VOLATILE),
+            new FieldOpcode('J', true, Opcode.SGET_WIDE, Opcode.SGET_WIDE_VOLATILE),
+            new FieldOpcode('D', true, Opcode.SGET_WIDE, Opcode.SGET_WIDE_VOLATILE),
+            new FieldOpcode('L', true, Opcode.SGET_OBJECT, Opcode.SGET_OBJECT_VOLATILE),
+            new FieldOpcode('[', true, Opcode.SGET_OBJECT, Opcode.SGET_OBJECT_VOLATILE),
+    };
+
+    private static final FieldOpcode[] artFieldOpcodes = new FieldOpcode[] {
+            new FieldOpcode('Z', Opcode.IGET_BOOLEAN, Opcode.IGET_BOOLEAN_QUICK),
+            new FieldOpcode('B', Opcode.IGET_BYTE, Opcode.IGET_BYTE_QUICK),
+            new FieldOpcode('S', Opcode.IGET_SHORT, Opcode.IGET_SHORT_QUICK),
+            new FieldOpcode('C', Opcode.IGET_CHAR, Opcode.IGET_CHAR_QUICK),
+            new FieldOpcode('I', Opcode.IGET, Opcode.IGET_QUICK),
+            new FieldOpcode('F', Opcode.IGET, Opcode.IGET_QUICK),
+            new FieldOpcode('J', Opcode.IGET_WIDE, Opcode.IGET_WIDE_QUICK),
+            new FieldOpcode('D', Opcode.IGET_WIDE, Opcode.IGET_WIDE_QUICK),
+            new FieldOpcode('L', Opcode.IGET_OBJECT, Opcode.IGET_OBJECT_QUICK),
+            new FieldOpcode('[', Opcode.IGET_OBJECT, Opcode.IGET_OBJECT_QUICK),
+
+            new FieldOpcode('Z', Opcode.IPUT_BOOLEAN, Opcode.IPUT_BOOLEAN_QUICK),
+            new FieldOpcode('B', Opcode.IPUT_BYTE, Opcode.IPUT_BYTE_QUICK),
+            new FieldOpcode('S', Opcode.IPUT_SHORT, Opcode.IPUT_SHORT_QUICK),
+            new FieldOpcode('C', Opcode.IPUT_CHAR, Opcode.IPUT_CHAR_QUICK),
+            new FieldOpcode('I', Opcode.IPUT, Opcode.IPUT_QUICK),
+            new FieldOpcode('F', Opcode.IPUT, Opcode.IPUT_QUICK),
+            new FieldOpcode('J', Opcode.IPUT_WIDE, Opcode.IPUT_WIDE_QUICK),
+            new FieldOpcode('D', Opcode.IPUT_WIDE, Opcode.IPUT_WIDE_QUICK),
+            new FieldOpcode('L', Opcode.IPUT_OBJECT, Opcode.IPUT_OBJECT_QUICK),
+            new FieldOpcode('[', Opcode.IPUT_OBJECT, Opcode.IPUT_OBJECT_QUICK)
+    };
+
+    private final FieldOpcode[][][] opcodeMap = new FieldOpcode[2][2][10];
+    private final Map<Opcode, Integer> opcodeValueTypeMap = new HashMap<Opcode, Integer>(30);
+
+    private static int getValueType(char type) {
+        switch (type) {
+            case 'Z':
+            case 'B':
+            case 'S':
+            case 'C':
+            case 'I':
+            case 'F':
+                return PRIMITIVE;
+            case 'J':
+            case 'D':
+                return WIDE;
+            case 'L':
+            case '[':
+                return REFERENCE;
+        }
+        throw new RuntimeException(String.format("Unknown type %s: ", type));
+    }
+
+    private static int getTypeIndex(char type) {
+        switch (type) {
+            case 'Z':
+                return 0;
+            case 'B':
+                return 1;
+            case 'S':
+                return 2;
+            case 'C':
+                return 3;
+            case 'I':
+                return 4;
+            case 'F':
+                return 5;
+            case 'J':
+                return 6;
+            case 'D':
+                return 7;
+            case 'L':
+                return 8;
+            case '[':
+                return 9;
+        }
+        throw new RuntimeException(String.format("Unknown type %s: ", type));
+    }
+
+    private static boolean isGet(@Nonnull Opcode opcode) {
+        return (opcode.flags & Opcode.SETS_REGISTER) != 0;
+    }
+
+    private static boolean isStatic(@Nonnull Opcode opcode) {
+        return (opcode.flags & Opcode.STATIC_FIELD_ACCESSOR) != 0;
+    }
+
+    public OdexedFieldInstructionMapper(boolean isArt) {
+        FieldOpcode[] opcodes;
+        if (isArt) {
+            opcodes = artFieldOpcodes;
+        } else {
+            opcodes = dalvikFieldOpcodes;
+        }
+
+        for (FieldOpcode fieldOpcode: opcodes) {
+            opcodeMap[isGet(fieldOpcode.normalOpcode)?GET:PUT]
+                    [isStatic(fieldOpcode.normalOpcode)?STATIC:INSTANCE]
+                    [getTypeIndex(fieldOpcode.type)] = fieldOpcode;
+
+            if (fieldOpcode.quickOpcode != null) {
+                opcodeValueTypeMap.put(fieldOpcode.quickOpcode, getValueType(fieldOpcode.type));
+            }
+            if (fieldOpcode.volatileOpcode != null) {
+                opcodeValueTypeMap.put(fieldOpcode.volatileOpcode, getValueType(fieldOpcode.type));
+            }
+        }
+    }
+
+    @Nonnull
+    public Opcode getAndCheckDeodexedOpcode(@Nonnull String fieldType, @Nonnull Opcode odexedOpcode) {
+        FieldOpcode fieldOpcode = opcodeMap[isGet(odexedOpcode)?GET:PUT]
+                [isStatic(odexedOpcode)?STATIC:INSTANCE]
+                [getTypeIndex(fieldType.charAt(0))];
+
+        if (!isCompatible(odexedOpcode, fieldOpcode.type)) {
+            throw new AnalysisException(String.format("Incorrect field type \"%s\" for %s", fieldType,
+                    odexedOpcode.name));
+        }
+
+        return fieldOpcode.normalOpcode;
+    }
+
+    private boolean isCompatible(Opcode opcode, char type) {
+        Integer valueType = opcodeValueTypeMap.get(opcode);
+        if (valueType == null) {
+            throw new RuntimeException("Unexpected opcode: " + opcode.name);
+        }
+        return valueType == getValueType(type);
+    }
+}
+
+
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/PathEntryLoader.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/PathEntryLoader.java
new file mode 100644
index 0000000..d4ea5ae
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/PathEntryLoader.java
@@ -0,0 +1,109 @@
+package org.jf.dexlib2.analysis;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import org.jf.dexlib2.DexFileFactory;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.OatFile;
+import org.jf.dexlib2.iface.MultiDexContainer;
+
+import javax.annotation.Nonnull;
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.Set;
+
+public class PathEntryLoader {
+    Opcodes opcodes;
+
+    public Opcodes getOpcodes() {
+        return opcodes;
+    }
+
+    final Set<File> loadedFiles = Sets.newHashSet();
+    final List<ClassProvider> classProviders = Lists.newArrayList();
+
+    public List<ClassProvider> getClassProviders() {
+        return classProviders;
+    }
+
+    public PathEntryLoader(Opcodes opcodes) {
+        this.opcodes = opcodes;
+    }
+
+    @Nonnull
+    public List<ClassProvider> getResolvedClassProviders() {
+        return classProviders;
+    }
+
+    public void loadEntry(@Nonnull File entryFile, boolean loadOatDependencies)
+            throws IOException, NoDexException {
+        if (loadedFiles.contains(entryFile)) {
+            return;
+        }
+
+        MultiDexContainer<? extends DexBackedDexFile> container;
+        try {
+            container = DexFileFactory.loadDexContainer(entryFile, opcodes);
+        } catch (DexFileFactory.UnsupportedFileTypeException ex) {
+            throw new ClassPathResolver.ResolveException(ex);
+        }
+
+        List<String> entryNames = container.getDexEntryNames();
+
+        if (entryNames.isEmpty()) {
+            throw new NoDexException("%s contains no dex file", entryFile);
+        }
+
+        loadedFiles.add(entryFile);
+
+        for (String entryName : entryNames) {
+            classProviders.add(new DexClassProvider(container.getEntry(entryName).getDexFile()));
+        }
+
+        if (loadOatDependencies && container instanceof OatFile) {
+            List<String> oatDependencies = ((OatFile) container).getBootClassPath();
+            if (!oatDependencies.isEmpty()) {
+                try {
+                    loadOatDependencies(entryFile.getParentFile(), oatDependencies);
+                } catch (ClassPathResolver.NotFoundException ex) {
+                    throw new ClassPathResolver.ResolveException(ex, "Error while loading oat file %s", entryFile);
+                } catch (NoDexException ex) {
+                    throw new ClassPathResolver.ResolveException(ex, "Error while loading dependencies for oat file %s", entryFile);
+                }
+            }
+        }
+    }
+
+    private void loadOatDependencies(@Nonnull File directory, @Nonnull List<String> oatDependencies)
+            throws IOException, NoDexException, ClassPathResolver.NotFoundException {
+        // We assume that all oat dependencies are located in the same directory as the oat file
+        for (String oatDependency : oatDependencies) {
+            String oatDependencyName = getFilenameForOatDependency(oatDependency);
+            File file = new File(directory, oatDependencyName);
+            if (!file.exists()) {
+                throw new ClassPathResolver.NotFoundException("Cannot find dependency %s in %s", oatDependencyName, directory);
+            }
+
+            loadEntry(file, false);
+        }
+    }
+
+    @Nonnull
+    private String getFilenameForOatDependency(String oatDependency) {
+        int index = oatDependency.lastIndexOf('/');
+
+        String dependencyLeaf = oatDependency.substring(index + 1);
+        if (dependencyLeaf.endsWith(".art")) {
+            return dependencyLeaf.substring(0, dependencyLeaf.length() - 4) + ".oat";
+        }
+        return dependencyLeaf;
+    }
+
+    static class NoDexException extends Exception {
+        public NoDexException(String message, Object... formatArgs) {
+            super(String.format(message, formatArgs));
+        }
+    }
+}
\ No newline at end of file
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/PrimitiveProto.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/PrimitiveProto.java
new file mode 100644
index 0000000..2c28393
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/PrimitiveProto.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis;
+
+import org.jf.dexlib2.iface.Method;
+import org.jf.dexlib2.iface.reference.FieldReference;
+import org.jf.dexlib2.iface.reference.MethodReference;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class PrimitiveProto implements TypeProto {
+    protected final ClassPath classPath;
+    protected final String type;
+
+    public PrimitiveProto(@Nonnull ClassPath classPath, @Nonnull String type) {
+        this.classPath = classPath;
+        this.type = type;
+    }
+
+    @Override public String toString() { return type; }
+    @Nonnull @Override public ClassPath getClassPath() { return classPath; }
+    @Nonnull @Override public String getType() { return type; }
+    @Override public boolean isInterface() { return false; }
+    @Override public boolean implementsInterface(@Nonnull String iface) { return false; }
+    @Nullable @Override public String getSuperclass() { return null; }
+    @Nonnull @Override public TypeProto getCommonSuperclass(@Nonnull TypeProto other) {
+        throw new ExceptionWithContext("Cannot call getCommonSuperclass on PrimitiveProto");
+    }
+
+    @Override
+    @Nullable
+    public FieldReference getFieldByOffset(int fieldOffset) {
+        return null;
+    }
+
+    @Override
+    @Nullable
+    public Method getMethodByVtableIndex(int vtableIndex) {
+        return null;
+    }
+
+    @Override public int findMethodIndexInVtable(@Nonnull MethodReference method) {
+        return -1;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/RegisterType.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/RegisterType.java
new file mode 100644
index 0000000..75478ca
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/RegisterType.java
@@ -0,0 +1,351 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis;
+
+
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.IOException;
+import java.io.Writer;
+
+public class RegisterType {
+    public final byte category;
+    @Nullable public final TypeProto type;
+
+    private RegisterType(byte category, @Nullable TypeProto type) {
+        assert ((category == REFERENCE || category == UNINIT_REF || category == UNINIT_THIS) && type != null) ||
+               ((category != REFERENCE && category != UNINIT_REF && category != UNINIT_THIS) && type == null);
+
+        this.category = category;
+        this.type = type;
+    }
+
+    @Override
+    public String toString() {
+        return "(" + CATEGORY_NAMES[category] + (type==null?"":("," + type)) + ")";
+    }
+
+    public void writeTo(Writer writer) throws IOException {
+        writer.write('(');
+        writer.write(CATEGORY_NAMES[category]);
+        if (type != null) {
+            writer.write(',');
+            writer.write(type.getType());
+        }
+        writer.write(')');
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        RegisterType that = (RegisterType) o;
+
+        if (category != that.category) {
+            return false;
+        }
+
+        // These require strict reference equality. Every instance represents a unique
+        // reference that can't be merged with a different one, even if they have the same type.
+        if (category == UNINIT_REF || category == UNINIT_THIS) {
+            return false;
+        }
+        return (type != null ? type.equals(that.type) : that.type == null);
+    }
+
+    @Override
+    public int hashCode() {
+        int result = category;
+        result = 31 * result + (type != null ? type.hashCode() : 0);
+        return result;
+    }
+    
+    // The Unknown category denotes a register type that hasn't been determined yet
+    public static final byte UNKNOWN = 0;
+    // The Uninit category is for registers that haven't been set yet. e.g. the non-parameter registers in a method
+    // start out as unint
+    public static final byte UNINIT = 1;
+    public static final byte NULL = 2;
+    public static final byte ONE = 3;
+    public static final byte BOOLEAN = 4;
+    public static final byte BYTE = 5;
+    public static final byte POS_BYTE = 6;
+    public static final byte SHORT = 7;
+    public static final byte POS_SHORT = 8;
+    public static final byte CHAR = 9;
+    public static final byte INTEGER = 10;
+    public static final byte FLOAT = 11;
+    public static final byte LONG_LO = 12;
+    public static final byte LONG_HI = 13;
+    public static final byte DOUBLE_LO = 14;
+    public static final byte DOUBLE_HI = 15;
+    // The UninitRef category is used after a new-instance operation, and before the corresponding <init> is called
+    public static final byte UNINIT_REF = 16;
+    // The UninitThis category is used the "this" register inside an <init> method, before the superclass' <init>
+    // method is called
+    public static final byte UNINIT_THIS = 17;
+    public static final byte REFERENCE = 18;
+    // This is used when there are multiple incoming execution paths that have incompatible register types. For
+    // example if the register's type is an Integer on one incoming code path, but is a Reference type on another
+    // incomming code path. There is no register type that can hold either an Integer or a Reference.
+    public static final byte CONFLICTED = 19;
+
+    public static final String[] CATEGORY_NAMES = new String[] {
+            "Unknown",
+            "Uninit",
+            "Null",
+            "One",
+            "Boolean",
+            "Byte",
+            "PosByte",
+            "Short",
+            "PosShort",
+            "Char",
+            "Integer",
+            "Float",
+            "LongLo",
+            "LongHi",
+            "DoubleLo",
+            "DoubleHi",
+            "UninitRef",
+            "UninitThis",
+            "Reference",
+            "Conflicted"
+    };
+
+    //this table is used when merging register types. For example, if a particular register can be either a BYTE
+    //or a Char, then the "merged" type of that register would be Integer, because it is the "smallest" type can
+    //could hold either type of value.
+    protected static byte[][] mergeTable  =
+    {
+            /*              UNKNOWN      UNINIT      NULL        ONE,        BOOLEAN     BYTE        POS_BYTE    SHORT       POS_SHORT   CHAR        INTEGER,    FLOAT,      LONG_LO     LONG_HI     DOUBLE_LO   DOUBLE_HI   UNINIT_REF  UNINIT_THIS REFERENCE   CONFLICTED*/
+            /*UNKNOWN*/    {UNKNOWN,     UNINIT,     NULL,       ONE,        BOOLEAN,    BYTE,       POS_BYTE,   SHORT,      POS_SHORT,  CHAR,       INTEGER,    FLOAT,      LONG_LO,    LONG_HI,    DOUBLE_LO,  DOUBLE_HI,  UNINIT_REF, UNINIT_THIS,REFERENCE,  CONFLICTED},
+            /*UNINIT*/     {UNINIT,      UNINIT,     CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED},
+            /*NULL*/       {NULL,        CONFLICTED, NULL,       BOOLEAN,    BOOLEAN,    BYTE,       POS_BYTE,   SHORT,      POS_SHORT,  CHAR,       INTEGER,    FLOAT,      CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, REFERENCE,  CONFLICTED},
+            /*ONE*/        {ONE,         CONFLICTED, BOOLEAN,    ONE,        BOOLEAN,    BYTE,       POS_BYTE,   SHORT,      POS_SHORT,  CHAR,       INTEGER,    FLOAT,      CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED},
+            /*BOOLEAN*/    {BOOLEAN,     CONFLICTED, BOOLEAN,    BOOLEAN,    BOOLEAN,    BYTE,       POS_BYTE,   SHORT,      POS_SHORT,  CHAR,       INTEGER,    FLOAT,      CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED},
+            /*BYTE*/       {BYTE,        CONFLICTED, BYTE,       BYTE,       BYTE,       BYTE,       BYTE,       SHORT,      SHORT,      INTEGER,    INTEGER,    FLOAT,      CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED},
+            /*POS_BYTE*/   {POS_BYTE,    CONFLICTED, POS_BYTE,   POS_BYTE,   POS_BYTE,   BYTE,       POS_BYTE,   SHORT,      POS_SHORT,  CHAR,       INTEGER,    FLOAT,      CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED},
+            /*SHORT*/      {SHORT,       CONFLICTED, SHORT,      SHORT,      SHORT,      SHORT,      SHORT,      SHORT,      SHORT,      INTEGER,    INTEGER,    FLOAT,      CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED},
+            /*POS_SHORT*/  {POS_SHORT,   CONFLICTED, POS_SHORT,  POS_SHORT,  POS_SHORT,  SHORT,      POS_SHORT,  SHORT,      POS_SHORT,  CHAR,       INTEGER,    FLOAT,      CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED},
+            /*CHAR*/       {CHAR,        CONFLICTED, CHAR,       CHAR,       CHAR,       INTEGER,    CHAR,       INTEGER,    CHAR,       CHAR,       INTEGER,    FLOAT,      CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED},
+            /*INTEGER*/    {INTEGER,     CONFLICTED, INTEGER,    INTEGER,    INTEGER,    INTEGER,    INTEGER,    INTEGER,    INTEGER,    INTEGER,    INTEGER,    INTEGER,    CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED},
+            /*FLOAT*/      {FLOAT,       CONFLICTED, FLOAT,      FLOAT,      FLOAT,      FLOAT,      FLOAT,      FLOAT,      FLOAT,      FLOAT,      INTEGER,    FLOAT,      CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED},
+            /*LONG_LO*/    {LONG_LO,     CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, LONG_LO,    CONFLICTED, LONG_LO,    CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED},
+            /*LONG_HI*/    {LONG_HI,     CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, LONG_HI,    CONFLICTED, LONG_HI,    CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED},
+            /*DOUBLE_LO*/  {DOUBLE_LO,   CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, LONG_LO,    CONFLICTED, DOUBLE_LO,  CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED},
+            /*DOUBLE_HI*/  {DOUBLE_HI,   CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, LONG_HI,    CONFLICTED, DOUBLE_HI,  CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED},
+            /*UNINIT_REF*/ {UNINIT_REF,  CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED},
+            /*UNINIT_THIS*/{UNINIT_THIS, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, UNINIT_THIS,CONFLICTED, CONFLICTED},
+            /*REFERENCE*/  {REFERENCE,   CONFLICTED, REFERENCE,  CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, REFERENCE,  CONFLICTED},
+            /*CONFLICTED*/ {CONFLICTED,  CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED, CONFLICTED}
+    };
+
+
+    public static final RegisterType UNKNOWN_TYPE = new RegisterType(UNKNOWN, null);
+    public static final RegisterType UNINIT_TYPE = new RegisterType(UNINIT, null);
+    public static final RegisterType NULL_TYPE = new RegisterType(NULL, null);
+    public static final RegisterType ONE_TYPE = new RegisterType(ONE, null);
+    public static final RegisterType BOOLEAN_TYPE = new RegisterType(BOOLEAN, null);
+    public static final RegisterType BYTE_TYPE = new RegisterType(BYTE, null);
+    public static final RegisterType POS_BYTE_TYPE = new RegisterType(POS_BYTE, null);
+    public static final RegisterType SHORT_TYPE = new RegisterType(SHORT, null);
+    public static final RegisterType POS_SHORT_TYPE = new RegisterType(POS_SHORT, null);
+    public static final RegisterType CHAR_TYPE = new RegisterType(CHAR, null);
+    public static final RegisterType INTEGER_TYPE = new RegisterType(INTEGER, null);
+    public static final RegisterType FLOAT_TYPE = new RegisterType(FLOAT, null);
+    public static final RegisterType LONG_LO_TYPE = new RegisterType(LONG_LO, null);
+    public static final RegisterType LONG_HI_TYPE = new RegisterType(LONG_HI, null);
+    public static final RegisterType DOUBLE_LO_TYPE = new RegisterType(DOUBLE_LO, null);
+    public static final RegisterType DOUBLE_HI_TYPE = new RegisterType(DOUBLE_HI, null);
+    public static final RegisterType CONFLICTED_TYPE = new RegisterType(CONFLICTED, null);
+
+    @Nonnull
+    public static RegisterType getWideRegisterType(@Nonnull CharSequence type, boolean firstRegister) {
+        switch (type.charAt(0)) {
+            case 'J':
+                if (firstRegister) {
+                    return getRegisterType(LONG_LO, null);
+                } else {
+                    return getRegisterType(LONG_HI, null);
+                }
+            case 'D':
+                if (firstRegister) {
+                    return getRegisterType(DOUBLE_LO, null);
+                } else {
+                    return getRegisterType(DOUBLE_HI, null);
+                }
+            default:
+                throw new ExceptionWithContext("Cannot use this method for narrow register type: %s", type);
+        }
+    }
+
+    @Nonnull
+    public static RegisterType getRegisterType(@Nonnull ClassPath classPath, @Nonnull CharSequence type) {
+        switch (type.charAt(0)) {
+            case 'Z':
+                return BOOLEAN_TYPE;
+            case 'B':
+                return BYTE_TYPE;
+            case 'S':
+                return SHORT_TYPE;
+            case 'C':
+                return CHAR_TYPE;
+            case 'I':
+                return INTEGER_TYPE;
+            case 'F':
+                return FLOAT_TYPE;
+            case 'J':
+                return LONG_LO_TYPE;
+            case 'D':
+                return DOUBLE_LO_TYPE;
+            case 'L':
+            case '[':
+                return getRegisterType(REFERENCE, classPath.getClass(type));
+            default:
+                throw new AnalysisException("Invalid type: " + type);
+        }
+    }
+
+    @Nonnull
+    public static RegisterType getRegisterTypeForLiteral(int literalValue) {
+        if (literalValue < -32768) {
+            return INTEGER_TYPE;
+        }
+        if (literalValue < -128) {
+            return SHORT_TYPE;
+        }
+        if (literalValue < 0) {
+            return BYTE_TYPE;
+        }
+        if (literalValue == 0) {
+            return NULL_TYPE;
+        }
+        if (literalValue == 1) {
+            return ONE_TYPE;
+        }
+        if (literalValue < 128) {
+            return POS_BYTE_TYPE;
+        }
+        if (literalValue < 32768) {
+            return POS_SHORT_TYPE;
+        }
+        if (literalValue < 65536) {
+            return CHAR_TYPE;
+        }
+        return INTEGER_TYPE;
+    }
+
+    @Nonnull
+    public RegisterType merge(@Nonnull RegisterType other) {
+        if (other.equals(this)) {
+            return this;
+        }
+
+        byte mergedCategory = mergeTable[this.category][other.category];
+
+        TypeProto mergedType = null;
+        if (mergedCategory == REFERENCE) {
+            TypeProto type = this.type;
+            if (type != null) {
+                if (other.type != null) {
+                    mergedType = type.getCommonSuperclass(other.type);
+                } else {
+                    mergedType = type;
+                }
+            } else {
+                mergedType = other.type;
+            }
+        } else if (mergedCategory == UNINIT_REF || mergedCategory == UNINIT_THIS) {
+            if (this.category == UNKNOWN) {
+                return other;
+            }
+            assert other.category == UNKNOWN;
+            return this;
+        }
+
+        if (mergedType != null) {
+            if (mergedType.equals(this.type)) {
+                return this;
+            }
+            if (mergedType.equals(other.type)) {
+                return other;
+            }
+        }
+        return RegisterType.getRegisterType(mergedCategory, mergedType);
+    }
+
+    @Nonnull
+    public static RegisterType getRegisterType(byte category, @Nullable TypeProto typeProto) {
+        switch (category) {
+            case UNKNOWN:
+                return UNKNOWN_TYPE;
+            case UNINIT:
+                return UNINIT_TYPE;
+            case NULL:
+                return NULL_TYPE;
+            case ONE:
+                return ONE_TYPE;
+            case BOOLEAN:
+                return BOOLEAN_TYPE;
+            case BYTE:
+                return BYTE_TYPE;
+            case POS_BYTE:
+                return POS_BYTE_TYPE;
+            case SHORT:
+                return SHORT_TYPE;
+            case POS_SHORT:
+                return POS_SHORT_TYPE;
+            case CHAR:
+                return CHAR_TYPE;
+            case INTEGER:
+                return INTEGER_TYPE;
+            case FLOAT:
+                return FLOAT_TYPE;
+            case LONG_LO:
+                return LONG_LO_TYPE;
+            case LONG_HI:
+                return LONG_HI_TYPE;
+            case DOUBLE_LO:
+                return DOUBLE_LO_TYPE;
+            case DOUBLE_HI:
+                return DOUBLE_HI_TYPE;
+            case CONFLICTED:
+                return CONFLICTED_TYPE;
+        }
+
+        return new RegisterType(category, typeProto);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/TypeProto.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/TypeProto.java
new file mode 100644
index 0000000..776363b
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/TypeProto.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis;
+
+import org.jf.dexlib2.iface.Method;
+import org.jf.dexlib2.iface.reference.FieldReference;
+import org.jf.dexlib2.iface.reference.MethodReference;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public interface TypeProto {
+    @Nonnull ClassPath getClassPath();
+    @Nonnull String getType();
+    boolean isInterface();
+    boolean implementsInterface(@Nonnull String iface);
+    @Nullable String getSuperclass();
+    @Nonnull TypeProto getCommonSuperclass(@Nonnull TypeProto other);
+    @Nullable FieldReference getFieldByOffset(int fieldOffset);
+    @Nullable Method getMethodByVtableIndex(int vtableIndex);
+    int findMethodIndexInVtable(@Nonnull MethodReference method);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/UnknownClassProto.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/UnknownClassProto.java
new file mode 100644
index 0000000..3287345
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/UnknownClassProto.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis;
+
+import org.jf.dexlib2.iface.Method;
+import org.jf.dexlib2.iface.reference.FieldReference;
+import org.jf.dexlib2.iface.reference.MethodReference;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class UnknownClassProto implements TypeProto {
+    @Nonnull protected final ClassPath classPath;
+
+    public UnknownClassProto(@Nonnull ClassPath classPath) {
+        this.classPath = classPath;
+    }
+
+    @Override public String toString() { return "Ujava/lang/Object;"; }
+    @Nonnull @Override public ClassPath getClassPath() { return classPath; }
+    @Nullable @Override public String getSuperclass() { return null; }
+    @Override public boolean isInterface() { return false; }
+    @Override public boolean implementsInterface(@Nonnull String iface) { return false; }
+
+    @Nonnull @Override public TypeProto getCommonSuperclass(@Nonnull TypeProto other) {
+        if (other.getType().equals("Ljava/lang/Object;")) {
+            return other;
+        }
+        if (other instanceof ArrayProto) {
+            // if it's an array class, it's safe to assume this unknown class isn't related, and so
+            // java.lang.Object is the only possible superclass
+            return classPath.getClass("Ljava/lang/Object;");
+        }
+        return this;
+    }
+
+    @Nonnull @Override public String getType() {
+        // use the otherwise used U prefix for an unknown/unresolvable class
+        return "Ujava/lang/Object;";
+    }
+
+    @Override
+    @Nullable
+    public FieldReference getFieldByOffset(int fieldOffset) {
+        return classPath.getClass("Ljava/lang/Object;").getFieldByOffset(fieldOffset);
+    }
+
+    @Override
+    @Nullable
+    public Method getMethodByVtableIndex(int vtableIndex) {
+        return classPath.getClass("Ljava/lang/Object;").getMethodByVtableIndex(vtableIndex);
+    }
+
+    @Override public int findMethodIndexInVtable(@Nonnull MethodReference method) {
+        return classPath.getClass("Ljava/lang/Object;").findMethodIndexInVtable(method);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/UnresolvedClassException.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/UnresolvedClassException.java
new file mode 100644
index 0000000..6ee36ca
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/UnresolvedClassException.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis;
+
+import org.jf.util.ExceptionWithContext;
+
+public class UnresolvedClassException extends ExceptionWithContext {
+    public UnresolvedClassException(Throwable cause) {
+        super(cause);
+    }
+
+    public UnresolvedClassException(Throwable cause, String message, Object... formatArgs) {
+        super(cause, message, formatArgs);
+    }
+
+    public UnresolvedClassException(String message, Object... formatArgs) {
+        super(message, formatArgs);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/UnresolvedOdexInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/UnresolvedOdexInstruction.java
new file mode 100644
index 0000000..fb201b0
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/UnresolvedOdexInstruction.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.Instruction;
+
+/**
+ * This represents a "fixed" odexed instruction, where the object register is always null and so the correct type
+ * can't be determined. Typically, these are replaced by an equivalent instruction that would have the same
+ * effect (namely, an NPE)
+ */
+public class UnresolvedOdexInstruction implements Instruction {
+    public final Instruction originalInstruction;
+    //the register number that holds the (null) reference type that the instruction operates on
+    public final int objectRegisterNum;
+
+    public UnresolvedOdexInstruction(Instruction originalInstruction, int objectRegisterNumber) {
+        this.originalInstruction = originalInstruction;
+        this.objectRegisterNum = objectRegisterNumber;
+    }
+
+    @Override public Opcode getOpcode() {
+        return originalInstruction.getOpcode();
+    }
+
+    @Override public int getCodeUnits() {
+        return originalInstruction.getCodeUnits();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/reflection/ReflectionClassDef.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/reflection/ReflectionClassDef.java
new file mode 100644
index 0000000..7e8a282
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/reflection/ReflectionClassDef.java
@@ -0,0 +1,247 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis.reflection;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterators;
+import org.jf.dexlib2.analysis.reflection.util.ReflectionUtils;
+import org.jf.dexlib2.base.reference.BaseTypeReference;
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.Field;
+import org.jf.dexlib2.iface.Method;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Modifier;
+import java.util.AbstractSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Wraps a ClassDef around a class loaded in the current VM
+ *
+ * Only supports the basic information exposed by ClassProto
+ */
+public class ReflectionClassDef extends BaseTypeReference implements ClassDef {
+    private final Class cls;
+
+    public ReflectionClassDef(Class cls) {
+        this.cls = cls;
+    }
+
+    @Override public int getAccessFlags() {
+        // the java modifiers appear to be the same as the dex access flags
+        return cls.getModifiers();
+    }
+
+    @Nullable @Override public String getSuperclass() {
+        if (Modifier.isInterface(cls.getModifiers())) {
+            return "Ljava/lang/Object;";
+        }
+        Class superClass = cls.getSuperclass();
+        if (superClass == null) {
+            return null;
+        }
+        return ReflectionUtils.javaToDexName(superClass.getName());
+    }
+
+    @Nonnull @Override public List<String> getInterfaces() {
+        return ImmutableList.copyOf(Iterators.transform(Iterators.forArray(cls.getInterfaces()), new Function<Class, String>() {
+            @Nullable
+            @Override
+            public String apply(@Nullable Class input) {
+                if (input == null) {
+                    return null;
+                }
+                return ReflectionUtils.javaToDexName(input.getName());
+            }
+        }));
+    }
+
+    @Nullable @Override public String getSourceFile() {
+        return null;
+    }
+
+    @Nonnull @Override public Set<? extends Annotation> getAnnotations() {
+        return ImmutableSet.of();
+    }
+
+    @Nonnull @Override public Iterable<? extends Field> getStaticFields() {
+        return new Iterable<Field>() {
+            @Nonnull @Override public Iterator<Field> iterator() {
+                Iterator<java.lang.reflect.Field> staticFields = Iterators.filter(
+                        Iterators.forArray(cls.getDeclaredFields()),
+                        new Predicate<java.lang.reflect.Field>() {
+                            @Override public boolean apply(@Nullable java.lang.reflect.Field input) {
+                                return input!=null && Modifier.isStatic(input.getModifiers());
+                            }
+                        });
+
+                return Iterators.transform(staticFields,
+                        new Function<java.lang.reflect.Field, Field>() {
+                            @Nullable @Override public Field apply(@Nullable java.lang.reflect.Field input) {
+                                return new ReflectionField(input);
+                            }
+                        }
+                );
+            }
+        };
+    }
+
+    @Nonnull @Override public Iterable<? extends Field> getInstanceFields() {
+        return new Iterable<Field>() {
+            @Nonnull @Override public Iterator<Field> iterator() {
+                Iterator<java.lang.reflect.Field> staticFields = Iterators.filter(
+                        Iterators.forArray(cls.getDeclaredFields()),
+                        new Predicate<java.lang.reflect.Field>() {
+                            @Override public boolean apply(@Nullable java.lang.reflect.Field input) {
+                                return input!=null && !Modifier.isStatic(input.getModifiers());
+                            }
+                        });
+
+                return Iterators.transform(staticFields,
+                        new Function<java.lang.reflect.Field, Field>() {
+                            @Nullable @Override public Field apply(@Nullable java.lang.reflect.Field input) {
+                                return new ReflectionField(input);
+                            }
+                        }
+                );
+            }
+        };
+    }
+
+    @Nonnull @Override public Set<? extends Field> getFields() {
+        return new AbstractSet<Field>() {
+            @Nonnull @Override public Iterator<Field> iterator() {
+                return Iterators.transform(Iterators.forArray(cls.getDeclaredFields()),
+                        new Function<java.lang.reflect.Field, Field>() {
+                            @Nullable @Override public Field apply(@Nullable java.lang.reflect.Field input) {
+                                return new ReflectionField(input);
+                            }
+                        });
+            }
+
+            @Override public int size() {
+                return cls.getDeclaredFields().length;
+            }
+        };
+    }
+
+    private static final int DIRECT_MODIFIERS = Modifier.PRIVATE | Modifier.STATIC;
+    @Nonnull @Override public Iterable<? extends Method> getDirectMethods() {
+        return new Iterable<Method>() {
+            @Nonnull @Override public Iterator<Method> iterator() {
+                Iterator<Method> constructorIterator =
+                        Iterators.transform(Iterators.forArray(cls.getDeclaredConstructors()),
+                                new Function<Constructor, Method>() {
+                                    @Nullable @Override public Method apply(@Nullable Constructor input) {
+                                        return new ReflectionConstructor(input);
+                                    }
+                                });
+
+                Iterator<java.lang.reflect.Method> directMethods = Iterators.filter(
+                        Iterators.forArray(cls.getDeclaredMethods()),
+                        new Predicate<java.lang.reflect.Method>() {
+                            @Override public boolean apply(@Nullable java.lang.reflect.Method input) {
+                                return input != null && (input.getModifiers() & DIRECT_MODIFIERS) != 0;
+                            }
+                        });
+
+                Iterator<Method> methodIterator = Iterators.transform(directMethods,
+                        new Function<java.lang.reflect.Method, Method>() {
+                            @Nullable @Override public Method apply(@Nullable java.lang.reflect.Method input) {
+                                return new ReflectionMethod(input);
+                            }
+                        });
+                return Iterators.concat(constructorIterator, methodIterator);
+            }
+        };
+    }
+
+    @Nonnull @Override public Iterable<? extends Method> getVirtualMethods() {
+        return new Iterable<Method>() {
+            @Nonnull @Override public Iterator<Method> iterator() {
+                Iterator<java.lang.reflect.Method> directMethods = Iterators.filter(
+                        Iterators.forArray(cls.getDeclaredMethods()),
+                        new Predicate<java.lang.reflect.Method>() {
+                            @Override public boolean apply(@Nullable java.lang.reflect.Method input) {
+                                return input != null && (input.getModifiers() & DIRECT_MODIFIERS) == 0;
+                            }
+                        });
+
+                return Iterators.transform(directMethods,
+                        new Function<java.lang.reflect.Method, Method>() {
+                            @Nullable @Override public Method apply(@Nullable java.lang.reflect.Method input) {
+                                return new ReflectionMethod(input);
+                            }
+                        });
+            }
+        };
+    }
+
+    @Nonnull @Override public Set<? extends Method> getMethods() {
+        return new AbstractSet<Method>() {
+            @Nonnull @Override public Iterator<Method> iterator() {
+                Iterator<Method> constructorIterator =
+                        Iterators.transform(Iterators.forArray(cls.getDeclaredConstructors()),
+                                new Function<Constructor, Method>() {
+                                    @Nullable @Override public Method apply(@Nullable Constructor input) {
+                                        return new ReflectionConstructor(input);
+                                    }
+                                });
+
+                Iterator<Method> methodIterator =
+                        Iterators.transform(Iterators.forArray(cls.getDeclaredMethods()),
+                                new Function<java.lang.reflect.Method, Method>() {
+                                    @Nullable @Override public Method apply(@Nullable java.lang.reflect.Method input) {
+                                        return new ReflectionMethod(input);
+                                    }
+                                });
+                return Iterators.concat(constructorIterator, methodIterator);
+            }
+
+            @Override public int size() {
+                return cls.getDeclaredMethods().length + cls.getDeclaredConstructors().length;
+            }
+        };
+    }
+
+    @Nonnull @Override public String getType() {
+        return ReflectionUtils.javaToDexName(cls.getName());
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/reflection/ReflectionConstructor.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/reflection/ReflectionConstructor.java
new file mode 100644
index 0000000..9aa9b7f
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/reflection/ReflectionConstructor.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis.reflection;
+
+import com.google.common.collect.ImmutableSet;
+import org.jf.dexlib2.HiddenApiRestriction;
+import org.jf.dexlib2.analysis.reflection.util.ReflectionUtils;
+import org.jf.dexlib2.base.BaseMethodParameter;
+import org.jf.dexlib2.base.reference.BaseMethodReference;
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.iface.Method;
+import org.jf.dexlib2.iface.MethodImplementation;
+import org.jf.dexlib2.iface.MethodParameter;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.lang.reflect.Constructor;
+import java.util.AbstractList;
+import java.util.List;
+import java.util.Set;
+
+public class ReflectionConstructor extends BaseMethodReference implements Method {
+    private final Constructor constructor;
+
+    public ReflectionConstructor(Constructor constructor) {
+        this.constructor = constructor;
+    }
+
+    @Nonnull @Override public List<? extends MethodParameter> getParameters() {
+        final Constructor method = this.constructor;
+        return new AbstractList<MethodParameter>() {
+            private final Class[] parameters = method.getParameterTypes();
+
+            @Override public MethodParameter get(final int index) {
+                return new BaseMethodParameter() {
+                    @Nonnull @Override public Set<? extends Annotation> getAnnotations() {
+                        return ImmutableSet.of();
+                    }
+
+                    @Nullable @Override public String getName() {
+                        return null;
+                    }
+
+                    @Nonnull @Override public String getType() {
+                        return ReflectionUtils.javaToDexName(parameters[index].getName());
+                    }
+                };
+            }
+
+            @Override public int size() {
+                return parameters.length;
+            }
+        };
+    }
+
+    @Override public int getAccessFlags() {
+        return constructor.getModifiers();
+    }
+
+    @Nonnull @Override public Set<? extends Annotation> getAnnotations() {
+        return ImmutableSet.of();
+    }
+
+    @Nullable @Override public MethodImplementation getImplementation() {
+        return null;
+    }
+
+    @Nonnull @Override public String getDefiningClass() {
+        return ReflectionUtils.javaToDexName(constructor.getDeclaringClass().getName());
+    }
+
+    @Nonnull @Override public String getName() {
+        return constructor.getName();
+    }
+
+    @Nonnull @Override public List<String> getParameterTypes() {
+        return new AbstractList<String>() {
+            private final List<? extends MethodParameter> parameters = getParameters();
+
+            @Override public String get(int index) {
+                return parameters.get(index).getType();
+            }
+
+            @Override public int size() {
+                return parameters.size();
+            }
+        };
+    }
+
+    @Nonnull @Override public String getReturnType() {
+        return "V";
+    }
+
+    @Nonnull @Override public Set<HiddenApiRestriction> getHiddenApiRestrictions() {
+        return ImmutableSet.of();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/reflection/ReflectionField.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/reflection/ReflectionField.java
new file mode 100644
index 0000000..3f0578a
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/reflection/ReflectionField.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis.reflection;
+
+import com.google.common.collect.ImmutableSet;
+import org.jf.dexlib2.HiddenApiRestriction;
+import org.jf.dexlib2.analysis.reflection.util.ReflectionUtils;
+import org.jf.dexlib2.base.reference.BaseFieldReference;
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.iface.Field;
+import org.jf.dexlib2.iface.value.EncodedValue;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Set;
+
+public class ReflectionField extends BaseFieldReference implements Field {
+    private final java.lang.reflect.Field field;
+
+    public ReflectionField(java.lang.reflect.Field field) {
+        this.field = field;
+    }
+
+    @Override public int getAccessFlags() {
+        return field.getModifiers();
+    }
+
+    @Nullable @Override public EncodedValue getInitialValue() {
+        return null;
+    }
+
+    @Nonnull @Override public Set<? extends Annotation> getAnnotations() {
+        return ImmutableSet.of();
+    }
+
+    @Nonnull @Override public String getDefiningClass() {
+        return ReflectionUtils.javaToDexName(field.getDeclaringClass().getName());
+    }
+
+    @Nonnull @Override public String getName() {
+        return field.getName();
+    }
+
+    @Nonnull @Override public String getType() {
+        return ReflectionUtils.javaToDexName(field.getType().getName());
+    }
+
+    @Nonnull @Override public Set<HiddenApiRestriction> getHiddenApiRestrictions() {
+        return ImmutableSet.of();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/reflection/ReflectionMethod.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/reflection/ReflectionMethod.java
new file mode 100644
index 0000000..b3a0125
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/reflection/ReflectionMethod.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis.reflection;
+
+import com.google.common.collect.ImmutableSet;
+import org.jf.dexlib2.HiddenApiRestriction;
+import org.jf.dexlib2.analysis.reflection.util.ReflectionUtils;
+import org.jf.dexlib2.base.BaseMethodParameter;
+import org.jf.dexlib2.base.reference.BaseMethodReference;
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.iface.Method;
+import org.jf.dexlib2.iface.MethodImplementation;
+import org.jf.dexlib2.iface.MethodParameter;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.AbstractList;
+import java.util.List;
+import java.util.Set;
+
+public class ReflectionMethod extends BaseMethodReference implements Method {
+    private final java.lang.reflect.Method method;
+
+    public ReflectionMethod(java.lang.reflect.Method method) {
+        this.method = method;
+    }
+
+    @Nonnull @Override public List<? extends MethodParameter> getParameters() {
+        final java.lang.reflect.Method method = this.method;
+        return new AbstractList<MethodParameter>() {
+            private final Class[] parameters = method.getParameterTypes();
+
+            @Override public MethodParameter get(final int index) {
+                return new BaseMethodParameter() {
+                    @Nonnull @Override public Set<? extends Annotation> getAnnotations() {
+                        return ImmutableSet.of();
+                    }
+
+                    @Nullable @Override public String getName() {
+                        return null;
+                    }
+
+                    @Nonnull @Override public String getType() {
+                        return ReflectionUtils.javaToDexName(parameters[index].getName());
+                    }
+                };
+            }
+
+            @Override public int size() {
+                return parameters.length;
+            }
+        };
+    }
+
+    @Override public int getAccessFlags() {
+        return method.getModifiers();
+    }
+
+    @Nonnull @Override public Set<? extends Annotation> getAnnotations() {
+        return ImmutableSet.of();
+    }
+
+    @Nullable @Override public MethodImplementation getImplementation() {
+        return null;
+    }
+
+    @Nonnull @Override public String getDefiningClass() {
+        return ReflectionUtils.javaToDexName(method.getDeclaringClass().getName());
+    }
+
+    @Nonnull @Override public String getName() {
+        return method.getName();
+    }
+
+    @Nonnull @Override public List<String> getParameterTypes() {
+        return new AbstractList<String>() {
+            private final List<? extends MethodParameter> parameters = getParameters();
+
+            @Override public String get(int index) {
+                return parameters.get(index).getType();
+            }
+
+            @Override public int size() {
+                return parameters.size();
+            }
+        };
+    }
+
+    @Nonnull @Override public String getReturnType() {
+        return ReflectionUtils.javaToDexName(method.getReturnType().getName());
+    }
+
+    @Nonnull @Override public Set<HiddenApiRestriction> getHiddenApiRestrictions() {
+        return ImmutableSet.of();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/reflection/util/ReflectionUtils.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/reflection/util/ReflectionUtils.java
new file mode 100644
index 0000000..029ddb9
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/reflection/util/ReflectionUtils.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis.reflection.util;
+
+import com.google.common.collect.ImmutableBiMap;
+
+public class ReflectionUtils {
+
+    private static ImmutableBiMap<String, String> primitiveMap = ImmutableBiMap.<String, String>builder()
+            .put("boolean", "Z")
+            .put("int", "I")
+            .put("long", "J")
+            .put("double", "D")
+            .put("void", "V")
+            .put("float", "F")
+            .put("char", "C")
+            .put("short", "S")
+            .put("byte", "B")
+            .build();
+
+    public static String javaToDexName(String javaName) {
+        if (javaName.charAt(0) == '[') {
+            return javaName.replace('.', '/');
+        }
+
+        if (primitiveMap.containsKey(javaName)) {
+            return primitiveMap.get(javaName);
+        }
+
+        return 'L' + javaName.replace('.', '/') + ';';
+    }
+
+    public static String dexToJavaName(String dexName) {
+        if (dexName.charAt(0) == '[') {
+            return dexName.replace('/', '.');
+        }
+
+        if (primitiveMap.inverse().containsKey(dexName)) {
+            return primitiveMap.inverse().get(dexName);
+        }
+
+        return dexName.replace('/', '.').substring(1, dexName.length()-2);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/util/TypeProtoUtils.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/util/TypeProtoUtils.java
new file mode 100644
index 0000000..e2adf1c
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/util/TypeProtoUtils.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis.util;
+
+import org.jf.dexlib2.analysis.TypeProto;
+import org.jf.dexlib2.analysis.UnresolvedClassException;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+public class TypeProtoUtils {
+    /**
+     * Get the chain of superclasses of the given class. The first element will be the immediate superclass followed by
+     * it's superclass, etc. up to java.lang.Object.
+     *
+     * Returns an empty iterable if called on java.lang.Object or a primitive.
+     *
+     * If any class in the superclass chain can't be resolved, the iterable will return Ujava/lang/Object; to represent
+     * the unknown class.
+     *
+     * @return An iterable containing the superclasses of this class.
+     */
+    @Nonnull
+    public static Iterable<TypeProto> getSuperclassChain(@Nonnull final TypeProto typeProto) {
+        return new Iterable<TypeProto>() {
+
+            @Override public Iterator<TypeProto> iterator() {
+                return new Iterator<TypeProto>() {
+                    @Nullable private TypeProto type = getSuperclassAsTypeProto(typeProto);
+
+                    @Override public boolean hasNext() {
+                        return type != null;
+                    }
+
+                    @Override public TypeProto next() {
+                        TypeProto type = this.type;
+                        if (type == null) {
+                            throw new NoSuchElementException();
+                        }
+
+                        this.type = getSuperclassAsTypeProto(type);
+                        return type;
+                    }
+
+                    @Override public void remove() {
+                        throw new UnsupportedOperationException();
+                    }
+                };
+            }
+        };
+    }
+
+    @Nullable
+    public static TypeProto getSuperclassAsTypeProto(@Nonnull TypeProto type) {
+        try {
+            String next = type.getSuperclass();
+            if (next != null) {
+                return type.getClassPath().getClass(next);
+            } else {
+                return null;
+            }
+        } catch (UnresolvedClassException ex) {
+            return type.getClassPath().getUnknownClass();
+        }
+    }
+
+    public static boolean extendsFrom(@Nonnull TypeProto candidate, @Nonnull String possibleSuper) {
+        if (candidate.getType().equals(possibleSuper)) {
+            return true;
+        }
+        for (TypeProto superProto: getSuperclassChain(candidate)) {
+            if (superProto.getType().equals(possibleSuper)) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/BaseAnnotation.java b/dexlib2/src/main/java/org/jf/dexlib2/base/BaseAnnotation.java
new file mode 100644
index 0000000..134f374
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/BaseAnnotation.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base;
+
+import com.google.common.primitives.Ints;
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.util.CollectionUtils;
+
+import java.util.Comparator;
+
+public abstract class BaseAnnotation implements Annotation {
+    @Override
+    public int hashCode() {
+        int hashCode = getVisibility();
+        hashCode = hashCode*31 + getType().hashCode();
+        return hashCode*31 + getElements().hashCode();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o instanceof Annotation) {
+            Annotation other = (Annotation)o;
+            return (getVisibility() == other.getVisibility()) &&
+                   getType().equals(other.getType()) &&
+                   getElements().equals(other.getElements());
+        }
+        return false;
+    }
+
+    @Override
+    public int compareTo(Annotation o) {
+        int res = Ints.compare(getVisibility(), o.getVisibility());
+        if (res != 0) return res;
+        res = getType().compareTo(o.getType());
+        if (res != 0) return res;
+        return CollectionUtils.compareAsSet(getElements(), o.getElements());
+    }
+
+    public static final Comparator<? super Annotation> BY_TYPE = new Comparator<Annotation>() {
+        @Override
+        public int compare(Annotation annotation1, Annotation annotation2) {
+            return annotation1.getType().compareTo(annotation2.getType());
+        }
+    };
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/BaseAnnotationElement.java b/dexlib2/src/main/java/org/jf/dexlib2/base/BaseAnnotationElement.java
new file mode 100644
index 0000000..92566cb
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/BaseAnnotationElement.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base;
+
+import org.jf.dexlib2.iface.AnnotationElement;
+
+import javax.annotation.Nonnull;
+import java.util.Comparator;
+
+public abstract class BaseAnnotationElement implements AnnotationElement {
+    @Override
+    public int hashCode() {
+        int hashCode = getName().hashCode();
+        return hashCode*31 + getValue().hashCode();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o != null && o instanceof AnnotationElement) {
+            AnnotationElement other = (AnnotationElement)o;
+            return getName().equals(other.getName()) &&
+                   getValue().equals(other.getValue());
+        }
+        return false;
+    }
+
+    @Override
+    public int compareTo(AnnotationElement o) {
+        int res = getName().compareTo(o.getName());
+        if (res != 0) return res;
+        return getValue().compareTo(o.getValue());
+    }
+
+    public static final Comparator<AnnotationElement> BY_NAME = new Comparator<AnnotationElement>() {
+        @Override
+        public int compare(@Nonnull AnnotationElement element1, @Nonnull AnnotationElement element2) {
+            return element1.getName().compareTo(element2.getName());
+        }
+    };
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/BaseExceptionHandler.java b/dexlib2/src/main/java/org/jf/dexlib2/base/BaseExceptionHandler.java
new file mode 100644
index 0000000..9ad6b64
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/BaseExceptionHandler.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base;
+
+import com.google.common.base.Objects;
+import com.google.common.primitives.Ints;
+import org.jf.dexlib2.base.reference.BaseTypeReference;
+import org.jf.dexlib2.iface.ExceptionHandler;
+import org.jf.dexlib2.iface.reference.TypeReference;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Comparator;
+
+public abstract class BaseExceptionHandler implements ExceptionHandler {
+    @Nullable @Override public TypeReference getExceptionTypeReference() {
+        final String exceptionType = getExceptionType();
+        if (exceptionType == null) {
+            return null;
+        }
+
+        return new BaseTypeReference() {
+            @Nonnull @Override public String getType() {
+                return exceptionType;
+            }
+        };
+    }
+
+    @Override
+    public int hashCode() {
+        String exceptionType = getExceptionType();
+        int hashCode = exceptionType==null?0:exceptionType.hashCode();
+        return hashCode*31 + getHandlerCodeAddress();
+    }
+
+    @Override
+    public boolean equals(@Nullable Object o) {
+        if (o instanceof ExceptionHandler) {
+            ExceptionHandler other = (ExceptionHandler)o;
+            return Objects.equal(getExceptionType(), other.getExceptionType()) &&
+                   (getHandlerCodeAddress() == other.getHandlerCodeAddress());
+        }
+        return false;
+    }
+
+    @Override
+    public int compareTo(@Nonnull ExceptionHandler o) {
+        int res;
+        String exceptionType = getExceptionType();
+        if (exceptionType == null) {
+            if (o.getExceptionType() != null) {
+                return 1;
+            }
+        } else {
+            String otherExceptionType = o.getExceptionType();
+            if (otherExceptionType == null) {
+                return -1;
+            }
+            res = exceptionType.compareTo(o.getExceptionType());
+            if (res != 0) return res;
+        }
+        return Ints.compare(getHandlerCodeAddress(), o.getHandlerCodeAddress());
+    }
+
+
+
+    public static final Comparator<ExceptionHandler> BY_EXCEPTION = new Comparator<ExceptionHandler>() {
+        @Override public int compare(ExceptionHandler o1, ExceptionHandler o2) {
+            String exceptionType1 = o1.getExceptionType();
+            if (exceptionType1 == null) {
+                if (o2.getExceptionType() != null) {
+                    return 1;
+                }
+                return 0;
+            } else {
+                String exceptionType2 = o2.getExceptionType();
+                if (exceptionType2 == null) {
+                    return -1;
+                }
+                return exceptionType1.compareTo(o2.getExceptionType());
+            }
+        }
+    };
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/BaseMethodParameter.java b/dexlib2/src/main/java/org/jf/dexlib2/base/BaseMethodParameter.java
new file mode 100644
index 0000000..ecac3c9
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/BaseMethodParameter.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base;
+
+import org.jf.dexlib2.ValueType;
+import org.jf.dexlib2.base.reference.BaseTypeReference;
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.iface.AnnotationElement;
+import org.jf.dexlib2.iface.MethodParameter;
+import org.jf.dexlib2.iface.value.ArrayEncodedValue;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.dexlib2.iface.value.StringEncodedValue;
+
+import javax.annotation.Nullable;
+
+public abstract class BaseMethodParameter extends BaseTypeReference implements MethodParameter {
+    @Nullable
+    @Override
+    public String getSignature() {
+        Annotation signatureAnnotation = null;
+        for (Annotation annotation: getAnnotations()) {
+            if (annotation.getType().equals("Ldalvik/annotation/Signature;")) {
+                signatureAnnotation = annotation;
+                break;
+            }
+        }
+        if (signatureAnnotation == null) {
+            return null;
+        }
+
+        ArrayEncodedValue signatureValues = null;
+        for (AnnotationElement annotationElement: signatureAnnotation.getElements()) {
+            if (annotationElement.getName().equals("value")) {
+                EncodedValue encodedValue = annotationElement.getValue();
+                if (encodedValue.getValueType() != ValueType.ARRAY) {
+                    return null;
+                }
+                signatureValues = (ArrayEncodedValue)encodedValue;
+                break;
+            }
+        }
+        if (signatureValues == null) {
+            return null;
+        }
+
+        StringBuilder sb = new StringBuilder();
+        for (EncodedValue signatureValue: signatureValues.getValue()) {
+            if (signatureValue.getValueType() != ValueType.STRING) {
+                return null;
+            }
+            sb.append(((StringEncodedValue)signatureValue).getValue());
+        }
+        return sb.toString();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/BaseTryBlock.java b/dexlib2/src/main/java/org/jf/dexlib2/base/BaseTryBlock.java
new file mode 100644
index 0000000..d1afe9a
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/BaseTryBlock.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base;
+
+import org.jf.dexlib2.iface.ExceptionHandler;
+import org.jf.dexlib2.iface.TryBlock;
+
+public abstract class BaseTryBlock<EH extends ExceptionHandler> implements TryBlock<EH> {
+    @Override public boolean equals(Object o) {
+        if (o instanceof TryBlock) {
+            TryBlock other = (TryBlock)o;
+            return getStartCodeAddress() == other.getStartCodeAddress() &&
+                    getCodeUnitCount() == other.getCodeUnitCount() &&
+                    getExceptionHandlers().equals(other.getExceptionHandlers());
+        }
+        return false;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseCallSiteReference.java b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseCallSiteReference.java
new file mode 100644
index 0000000..304075a
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseCallSiteReference.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base.reference;
+
+import org.jf.dexlib2.iface.reference.CallSiteReference;
+
+public abstract class BaseCallSiteReference extends BaseReference implements CallSiteReference {
+    @Override
+    public int hashCode() {
+        int hashCode = getName().hashCode();
+        hashCode = hashCode*31 + getMethodHandle().hashCode();
+        hashCode = hashCode*31 + getMethodName().hashCode();
+        hashCode = hashCode*31 + getMethodProto().hashCode();
+        hashCode = hashCode*31 + getExtraArguments().hashCode();
+        return hashCode;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o != null && o instanceof CallSiteReference) {
+            CallSiteReference other = (CallSiteReference) o;
+            return getMethodHandle().equals(other.getMethodHandle()) &&
+                    getMethodName().equals(other.getMethodName()) &&
+                    getMethodProto().equals(other.getMethodProto()) &&
+                    getExtraArguments().equals(other.getExtraArguments());
+        }
+        return false;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseFieldReference.java b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseFieldReference.java
new file mode 100644
index 0000000..d303082
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseFieldReference.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base.reference;
+
+import org.jf.dexlib2.iface.reference.FieldReference;
+import org.jf.dexlib2.util.ReferenceUtil;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public abstract class BaseFieldReference extends BaseReference implements FieldReference {
+    @Override
+    public int hashCode() {
+        int hashCode = getDefiningClass().hashCode();
+        hashCode = hashCode*31 + getName().hashCode();
+        return hashCode*31 + getType().hashCode();
+    }
+
+    @Override
+    public boolean equals(@Nullable Object o) {
+        if (o instanceof FieldReference) {
+            FieldReference other = (FieldReference)o;
+            return getDefiningClass().equals(other.getDefiningClass()) &&
+                   getName().equals(other.getName()) &&
+                   getType().equals(other.getType());
+
+        }
+        return false;
+    }
+
+    @Override
+    public int compareTo(@Nonnull FieldReference o) {
+        int res = getDefiningClass().compareTo(o.getDefiningClass());
+        if (res != 0) return res;
+        res = getName().compareTo(o.getName());
+        if (res != 0) return res;
+        return getType().compareTo(o.getType());
+    }
+
+    @Override public String toString() {
+        return ReferenceUtil.getFieldDescriptor(this);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseMethodHandleReference.java b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseMethodHandleReference.java
new file mode 100644
index 0000000..752da36
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseMethodHandleReference.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base.reference;
+
+import com.google.common.primitives.Ints;
+import org.jf.dexlib2.iface.reference.FieldReference;
+import org.jf.dexlib2.iface.reference.MethodHandleReference;
+import org.jf.dexlib2.iface.reference.MethodReference;
+import org.jf.dexlib2.iface.reference.Reference;
+
+import javax.annotation.Nonnull;
+
+public abstract class BaseMethodHandleReference extends BaseReference implements MethodHandleReference {
+    @Override
+    public int hashCode() {
+        int hashCode =  getMethodHandleType();
+        hashCode = hashCode*31 + getMemberReference().hashCode();
+        return hashCode;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o != null && o instanceof MethodHandleReference) {
+            MethodHandleReference other = (MethodHandleReference) o;
+            return getMethodHandleType() == other.getMethodHandleType() &&
+                    getMemberReference().equals(other.getMemberReference());
+        }
+        return false;
+    }
+
+    @Override
+    public int compareTo(@Nonnull MethodHandleReference o) {
+        int res = Ints.compare(getMethodHandleType(), o.getMethodHandleType());
+        if (res != 0) return res;
+
+        Reference reference = getMemberReference();
+        if (reference instanceof FieldReference) {
+            // "This should never happen", but if it does, we'll arbitrarily say a field reference compares less than
+            // a method reference
+            if (!(o.getMemberReference() instanceof FieldReference)) {
+                return -1;
+            }
+            return ((FieldReference) reference).compareTo((FieldReference) o.getMemberReference());
+        } else {
+            if (!(o.getMemberReference() instanceof MethodReference)) {
+                return 1;
+            }
+            return ((MethodReference) reference).compareTo((MethodReference) o.getMemberReference());
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseMethodProtoReference.java b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseMethodProtoReference.java
new file mode 100644
index 0000000..5f51c73
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseMethodProtoReference.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base.reference;
+
+import com.google.common.collect.Ordering;
+import org.jf.dexlib2.iface.reference.MethodProtoReference;
+import org.jf.dexlib2.util.ReferenceUtil;
+import org.jf.util.CharSequenceUtils;
+import org.jf.util.CollectionUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+
+public abstract class BaseMethodProtoReference extends BaseReference implements MethodProtoReference {
+    @Override
+    public int hashCode() {
+        int hashCode = getReturnType().hashCode();
+        return hashCode*31 + getParameterTypes().hashCode();
+    }
+
+    @Override
+    public boolean equals(@Nullable Object o) {
+        if (o instanceof MethodProtoReference) {
+            MethodProtoReference other = (MethodProtoReference)o;
+            return getReturnType().equals(other.getReturnType()) &&
+                    CharSequenceUtils.listEquals(getParameterTypes(), other.getParameterTypes());
+        }
+        return false;
+    }
+
+    @Override
+    public int compareTo(@Nonnull MethodProtoReference o) {
+        int res = getReturnType().compareTo(o.getReturnType());
+        if (res != 0) return res;
+        return CollectionUtils.compareAsIterable(Ordering.usingToString(), getParameterTypes(), o.getParameterTypes());
+    }
+
+    @Override public String toString() {
+        return ReferenceUtil.getMethodProtoDescriptor(this);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseMethodReference.java b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseMethodReference.java
new file mode 100644
index 0000000..5da96ac
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseMethodReference.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base.reference;
+
+import com.google.common.collect.Ordering;
+import org.jf.dexlib2.iface.reference.MethodReference;
+import org.jf.dexlib2.util.ReferenceUtil;
+import org.jf.util.CharSequenceUtils;
+import org.jf.util.CollectionUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public abstract class BaseMethodReference extends BaseReference implements MethodReference {
+    @Override
+    public int hashCode() {
+        int hashCode = getDefiningClass().hashCode();
+        hashCode = hashCode*31 + getName().hashCode();
+        hashCode = hashCode*31 + getReturnType().hashCode();
+        return hashCode*31 + getParameterTypes().hashCode();
+    }
+
+    @Override
+    public boolean equals(@Nullable Object o) {
+        if (o != null && o instanceof MethodReference) {
+            MethodReference other = (MethodReference)o;
+            return getDefiningClass().equals(other.getDefiningClass()) &&
+                   getName().equals(other.getName()) &&
+                   getReturnType().equals(other.getReturnType()) &&
+                   CharSequenceUtils.listEquals(getParameterTypes(), other.getParameterTypes());
+        }
+        return false;
+    }
+
+    @Override
+    public int compareTo(@Nonnull MethodReference o) {
+        int res = getDefiningClass().compareTo(o.getDefiningClass());
+        if (res != 0) return res;
+        res = getName().compareTo(o.getName());
+        if (res != 0) return res;
+        res = getReturnType().compareTo(o.getReturnType());
+        if (res != 0) return res;
+        return CollectionUtils.compareAsIterable(Ordering.usingToString(), getParameterTypes(), o.getParameterTypes());
+    }
+
+    @Override public String toString() {
+        return ReferenceUtil.getMethodDescriptor(this);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseReference.java b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseReference.java
new file mode 100644
index 0000000..f526fd0
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseReference.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2019, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base.reference;
+
+import org.jf.dexlib2.iface.reference.Reference;
+
+public abstract class BaseReference implements Reference {
+    @Override
+    public void validateReference() throws InvalidReferenceException {
+        // A reference is valid by default
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseStringReference.java b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseStringReference.java
new file mode 100644
index 0000000..214c1c8
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseStringReference.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base.reference;
+
+import org.jf.dexlib2.iface.reference.StringReference;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public abstract class BaseStringReference extends BaseReference implements StringReference {
+    @Override
+    public int hashCode() {
+        return getString().hashCode();
+    }
+
+    @Override
+    public boolean equals(@Nullable Object o) {
+        if (o != null && o instanceof StringReference) {
+            return getString().equals(((StringReference)o).getString());
+        }
+        return false;
+    }
+
+    @Override
+    public int compareTo(@Nonnull CharSequence o) {
+        return getString().compareTo(o.toString());
+    }
+
+    @Override public int length() { return getString().length(); }
+    @Override public char charAt(int index) { return getString().charAt(index); }
+    @Override public CharSequence subSequence(int start, int end) { return getString().subSequence(start, end); }
+    @Override @Nonnull public String toString() { return getString(); }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseTypeReference.java b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseTypeReference.java
new file mode 100644
index 0000000..867b75c
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseTypeReference.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base.reference;
+
+import org.jf.dexlib2.iface.reference.TypeReference;
+
+import javax.annotation.Nonnull;
+
+public abstract class BaseTypeReference extends BaseReference implements TypeReference {
+    @Override
+    public int hashCode() {
+        return getType().hashCode();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o != null) {
+            if (o instanceof TypeReference) {
+                return getType().equals(((TypeReference)o).getType());
+            }
+            if (o instanceof CharSequence) {
+                return getType().equals(o.toString());
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public int compareTo(@Nonnull CharSequence o) {
+        return getType().compareTo(o.toString());
+    }
+
+    @Override public int length() { return getType().length(); }
+    @Override public char charAt(int index) { return getType().charAt(index); }
+    @Override public CharSequence subSequence(int start, int end) { return getType().subSequence(start, end); }
+    @Override @Nonnull public String toString() { return getType(); }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseAnnotationEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseAnnotationEncodedValue.java
new file mode 100644
index 0000000..828c1ec
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseAnnotationEncodedValue.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base.value;
+
+import com.google.common.primitives.Ints;
+import org.jf.dexlib2.ValueType;
+import org.jf.dexlib2.iface.value.AnnotationEncodedValue;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.util.CollectionUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public abstract class BaseAnnotationEncodedValue implements AnnotationEncodedValue {
+    @Override
+    public int hashCode() {
+        int hashCode = getType().hashCode();
+        return hashCode * 31 + getElements().hashCode();
+    }
+
+    @Override
+    public boolean equals(@Nullable Object o) {
+        if (o instanceof AnnotationEncodedValue) {
+            AnnotationEncodedValue other = (AnnotationEncodedValue)o;
+            return getType().equals(other.getType()) &&
+                    getElements().equals(other.getElements());
+        }
+        return false;
+    }
+
+    @Override
+    public int compareTo(@Nonnull EncodedValue o) {
+        int res = Ints.compare(getValueType(), o.getValueType());
+        if (res != 0) return res;
+        AnnotationEncodedValue other = (AnnotationEncodedValue)o;
+        res = getType().compareTo(other.getType());
+        if (res != 0) return res;
+        return CollectionUtils.compareAsSet(getElements(), other.getElements());
+    }
+
+    public int getValueType() {
+        return ValueType.ANNOTATION;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseArrayEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseArrayEncodedValue.java
new file mode 100644
index 0000000..7c6efd3
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseArrayEncodedValue.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base.value;
+
+import com.google.common.primitives.Ints;
+import org.jf.dexlib2.ValueType;
+import org.jf.dexlib2.iface.value.ArrayEncodedValue;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.util.CollectionUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public abstract class BaseArrayEncodedValue implements ArrayEncodedValue {
+    @Override
+    public int hashCode() {
+        return getValue().hashCode();
+    }
+
+    @Override
+    public boolean equals(@Nullable Object o) {
+        if (o instanceof ArrayEncodedValue) {
+            return getValue().equals(((ArrayEncodedValue)o).getValue());
+        }
+        return false;
+    }
+
+    @Override public int compareTo(@Nonnull EncodedValue o) {
+        int res = Ints.compare(getValueType(), o.getValueType());
+        if (res != 0) return res;
+        return CollectionUtils.compareAsList(getValue(), ((ArrayEncodedValue)o).getValue());
+    }
+
+    public int getValueType() { return ValueType.ARRAY; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseBooleanEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseBooleanEncodedValue.java
new file mode 100644
index 0000000..aeedc2c
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseBooleanEncodedValue.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base.value;
+
+import com.google.common.primitives.Booleans;
+import com.google.common.primitives.Ints;
+import org.jf.dexlib2.ValueType;
+import org.jf.dexlib2.iface.value.BooleanEncodedValue;
+import org.jf.dexlib2.iface.value.EncodedValue;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public abstract class BaseBooleanEncodedValue implements BooleanEncodedValue {
+    @Override
+    public int hashCode() {
+        return getValue()?1:0;
+    }
+
+    @Override
+    public boolean equals(@Nullable Object o) {
+        if (o instanceof BooleanEncodedValue) {
+            return getValue() == ((BooleanEncodedValue)o).getValue();
+        }
+        return false;
+    }
+
+    @Override
+    public int compareTo(@Nonnull EncodedValue o) {
+        int res = Ints.compare(getValueType(), o.getValueType());
+        if (res != 0) return res;
+        return Booleans.compare(getValue(), ((BooleanEncodedValue)o).getValue());
+    }
+
+    public int getValueType() { return ValueType.BOOLEAN; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseByteEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseByteEncodedValue.java
new file mode 100644
index 0000000..5ec1624
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseByteEncodedValue.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base.value;
+
+import com.google.common.primitives.Ints;
+import org.jf.dexlib2.ValueType;
+import org.jf.dexlib2.iface.value.ByteEncodedValue;
+import org.jf.dexlib2.iface.value.EncodedValue;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public abstract class BaseByteEncodedValue implements ByteEncodedValue {
+    @Override
+    public int hashCode() {
+        return getValue();
+    }
+
+    @Override
+    public boolean equals(@Nullable Object o) {
+        if (o instanceof ByteEncodedValue) {
+            return getValue() == ((ByteEncodedValue)o).getValue();
+        }
+        return false;
+    }
+
+    @Override
+    public int compareTo(@Nonnull EncodedValue o) {
+        int res = Ints.compare(getValueType(), o.getValueType());
+        if (res != 0) return res;
+        return Ints.compare(getValue(), ((ByteEncodedValue)o).getValue());
+    }
+
+    public int getValueType() { return ValueType.BYTE; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseCharEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseCharEncodedValue.java
new file mode 100644
index 0000000..9f076e2
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseCharEncodedValue.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base.value;
+
+import com.google.common.primitives.Chars;
+import com.google.common.primitives.Ints;
+import org.jf.dexlib2.ValueType;
+import org.jf.dexlib2.iface.value.CharEncodedValue;
+import org.jf.dexlib2.iface.value.EncodedValue;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public abstract class BaseCharEncodedValue implements CharEncodedValue {
+    @Override
+    public int hashCode() {
+        return getValue();
+    }
+
+    @Override
+    public boolean equals(@Nullable Object o) {
+        if (o instanceof CharEncodedValue) {
+            return getValue() == ((CharEncodedValue)o).getValue();
+        }
+        return false;
+    }
+
+    @Override
+    public int compareTo(@Nonnull EncodedValue o) {
+        int res = Ints.compare(getValueType(), o.getValueType());
+        if (res != 0) return res;
+        return Chars.compare(getValue(), ((CharEncodedValue)o).getValue());
+    }
+
+    public int getValueType() { return ValueType.CHAR; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseDoubleEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseDoubleEncodedValue.java
new file mode 100644
index 0000000..d8b08c3
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseDoubleEncodedValue.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base.value;
+
+import com.google.common.primitives.Ints;
+import org.jf.dexlib2.ValueType;
+import org.jf.dexlib2.iface.value.DoubleEncodedValue;
+import org.jf.dexlib2.iface.value.EncodedValue;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public abstract class BaseDoubleEncodedValue implements DoubleEncodedValue {
+    @Override
+    public int hashCode() {
+        long v = Double.doubleToRawLongBits(getValue());
+        return (int)(v^(v>>>32));
+    }
+
+    @Override
+    public boolean equals(@Nullable Object o) {
+        if (o instanceof DoubleEncodedValue) {
+            return Double.doubleToRawLongBits(getValue()) ==
+                   Double.doubleToRawLongBits(((DoubleEncodedValue)o).getValue());
+        }
+        return false;
+    }
+
+    @Override
+    public int compareTo(@Nonnull EncodedValue o) {
+        int res = Ints.compare(getValueType(), o.getValueType());
+        if (res != 0) return res;
+        return Double.compare(getValue(), ((DoubleEncodedValue)o).getValue());
+    }
+
+    public int getValueType() { return ValueType.DOUBLE; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseEnumEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseEnumEncodedValue.java
new file mode 100644
index 0000000..ea2ec12
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseEnumEncodedValue.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base.value;
+
+import com.google.common.primitives.Ints;
+import org.jf.dexlib2.ValueType;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.dexlib2.iface.value.EnumEncodedValue;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public abstract class BaseEnumEncodedValue implements EnumEncodedValue {
+    @Override
+    public int hashCode() {
+        return getValue().hashCode();
+    }
+
+    @Override
+    public boolean equals(@Nullable Object o) {
+        if (o instanceof EnumEncodedValue) {
+            return getValue().equals(((EnumEncodedValue)o).getValue());
+        }
+        return false;
+    }
+
+    @Override
+    public int compareTo(@Nonnull EncodedValue o) {
+        int res = Ints.compare(getValueType(), o.getValueType());
+        if (res != 0) return res;
+        return getValue().compareTo(((EnumEncodedValue)o).getValue());
+    }
+
+    public int getValueType() { return ValueType.ENUM; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseFieldEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseFieldEncodedValue.java
new file mode 100644
index 0000000..8d4f3d9
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseFieldEncodedValue.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base.value;
+
+import com.google.common.primitives.Ints;
+import org.jf.dexlib2.ValueType;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.dexlib2.iface.value.FieldEncodedValue;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public abstract class BaseFieldEncodedValue implements FieldEncodedValue {
+    @Override
+    public int hashCode() {
+        return getValue().hashCode();
+    }
+
+    @Override
+    public boolean equals(@Nullable Object o) {
+        if (o instanceof FieldEncodedValue) {
+            return getValue().equals(((FieldEncodedValue)o).getValue());
+        }
+        return false;
+    }
+
+    @Override
+    public int compareTo(@Nonnull EncodedValue o) {
+        int res = Ints.compare(getValueType(), o.getValueType());
+        if (res != 0) return res;
+        return getValue().compareTo(((FieldEncodedValue)o).getValue());
+    }
+
+    public int getValueType() { return ValueType.FIELD; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseFloatEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseFloatEncodedValue.java
new file mode 100644
index 0000000..5092567
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseFloatEncodedValue.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base.value;
+
+import com.google.common.primitives.Ints;
+import org.jf.dexlib2.ValueType;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.dexlib2.iface.value.FloatEncodedValue;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public abstract class BaseFloatEncodedValue implements FloatEncodedValue {
+    @Override
+    public int hashCode() {
+        return Float.floatToRawIntBits(getValue());
+    }
+
+    @Override
+    public boolean equals(@Nullable Object o) {
+        if (o != null && o instanceof FloatEncodedValue) {
+            return Float.floatToRawIntBits(getValue()) == Float.floatToRawIntBits(((FloatEncodedValue)o).getValue());
+        }
+        return false;
+    }
+
+    @Override
+    public int compareTo(@Nonnull EncodedValue o) {
+        int res = Ints.compare(getValueType(), o.getValueType());
+        if (res != 0) return res;
+        return Float.compare(getValue(), ((FloatEncodedValue)o).getValue());
+    }
+
+    public int getValueType() { return ValueType.FLOAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseIntEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseIntEncodedValue.java
new file mode 100644
index 0000000..94f7e14
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseIntEncodedValue.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base.value;
+
+import com.google.common.primitives.Ints;
+import org.jf.dexlib2.ValueType;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.dexlib2.iface.value.IntEncodedValue;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public abstract class BaseIntEncodedValue implements IntEncodedValue {
+    @Override
+    public int hashCode() {
+        return getValue();
+    }
+
+    @Override
+    public boolean equals(@Nullable Object o) {
+        if (o instanceof IntEncodedValue) {
+            return getValue() == ((IntEncodedValue)o).getValue();
+        }
+        return false;
+    }
+
+    @Override
+    public int compareTo(@Nonnull EncodedValue o) {
+        int res = Ints.compare(getValueType(), o.getValueType());
+        if (res != 0) return res;
+        return Ints.compare(getValue(), ((IntEncodedValue)o).getValue());
+    }
+
+    public int getValueType() { return ValueType.INT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseLongEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseLongEncodedValue.java
new file mode 100644
index 0000000..8808dda
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseLongEncodedValue.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base.value;
+
+import com.google.common.primitives.Ints;
+import com.google.common.primitives.Longs;
+import org.jf.dexlib2.ValueType;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.dexlib2.iface.value.LongEncodedValue;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public abstract class BaseLongEncodedValue implements LongEncodedValue {
+    @Override
+    public int hashCode() {
+        long value = getValue();
+        int hashCode = (int)value;
+        return hashCode*31 + (int)(value>>>32);
+    }
+
+    @Override
+    public boolean equals(@Nullable Object o) {
+        if (o instanceof LongEncodedValue) {
+            return getValue() == ((LongEncodedValue)o).getValue();
+        }
+        return false;
+    }
+
+    @Override
+    public int compareTo(@Nonnull EncodedValue o) {
+        int res = Ints.compare(getValueType(), o.getValueType());
+        if (res != 0) return res;
+        return Longs.compare(getValue(), ((LongEncodedValue)o).getValue());
+    }
+
+    public int getValueType() { return ValueType.LONG; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseMethodEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseMethodEncodedValue.java
new file mode 100644
index 0000000..7149214
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseMethodEncodedValue.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base.value;
+
+import com.google.common.primitives.Ints;
+import org.jf.dexlib2.ValueType;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.dexlib2.iface.value.MethodEncodedValue;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public abstract class BaseMethodEncodedValue implements MethodEncodedValue {
+    @Override
+    public int hashCode() {
+        return getValue().hashCode();
+    }
+
+    @Override
+    public boolean equals(@Nullable Object o) {
+        if (o instanceof MethodEncodedValue) {
+            return getValue().equals(((MethodEncodedValue)o).getValue());
+        }
+        return false;
+    }
+
+    @Override
+    public int compareTo(@Nonnull EncodedValue o) {
+        int res = Ints.compare(getValueType(), o.getValueType());
+        if (res != 0) return res;
+        return getValue().compareTo(((MethodEncodedValue)o).getValue());
+    }
+
+    public int getValueType() { return ValueType.METHOD; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseMethodHandleEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseMethodHandleEncodedValue.java
new file mode 100644
index 0000000..f3bbbb9
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseMethodHandleEncodedValue.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base.value;
+
+import com.google.common.primitives.Ints;
+import org.jf.dexlib2.ValueType;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.dexlib2.iface.value.MethodHandleEncodedValue;
+
+import javax.annotation.Nonnull;
+
+public abstract class BaseMethodHandleEncodedValue implements MethodHandleEncodedValue {
+    @Override
+    public int hashCode() {
+        return getValue().hashCode();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o instanceof MethodHandleEncodedValue) {
+            return getValue().equals(((MethodHandleEncodedValue) o).getValue());
+        }
+        return false;
+    }
+
+    @Override
+    public int compareTo(@Nonnull EncodedValue o) {
+        int res = Ints.compare(getValueType(), o.getValueType());
+        if (res != 0) return res;
+        return getValue().compareTo(((MethodHandleEncodedValue) o).getValue());
+    }
+
+    @Override
+    public int getValueType() {
+        return ValueType.METHOD_HANDLE;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseMethodTypeEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseMethodTypeEncodedValue.java
new file mode 100644
index 0000000..6ded330
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseMethodTypeEncodedValue.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base.value;
+
+import com.google.common.primitives.Ints;
+import org.jf.dexlib2.ValueType;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.dexlib2.iface.value.MethodTypeEncodedValue;
+
+import javax.annotation.Nonnull;
+
+public abstract class BaseMethodTypeEncodedValue implements MethodTypeEncodedValue {
+    @Override
+    public int hashCode() {
+        return getValue().hashCode();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o instanceof MethodTypeEncodedValue) {
+            return getValue().equals(((MethodTypeEncodedValue) o).getValue());
+        }
+        return false;
+    }
+
+    @Override
+    public int compareTo(@Nonnull EncodedValue o) {
+        int res = Ints.compare(getValueType(), o.getValueType());
+        if (res != 0) return res;
+        return getValue().compareTo(((MethodTypeEncodedValue) o).getValue());
+    }
+
+    @Override
+    public int getValueType() {
+        return ValueType.METHOD_TYPE;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseNullEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseNullEncodedValue.java
new file mode 100644
index 0000000..923619b
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseNullEncodedValue.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base.value;
+
+import com.google.common.primitives.Ints;
+import org.jf.dexlib2.ValueType;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.dexlib2.iface.value.NullEncodedValue;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public abstract class BaseNullEncodedValue implements NullEncodedValue {
+    @Override
+    public int hashCode() {
+        return 0;
+    }
+
+    @Override
+    public boolean equals(@Nullable Object o) {
+        return o instanceof NullEncodedValue;
+    }
+
+    @Override
+    public int compareTo(@Nonnull EncodedValue o) {
+        return Ints.compare(getValueType(), o.getValueType());
+    }
+
+    public int getValueType() { return ValueType.NULL; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseShortEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseShortEncodedValue.java
new file mode 100644
index 0000000..88aabaa
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseShortEncodedValue.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base.value;
+
+import com.google.common.primitives.Ints;
+import com.google.common.primitives.Shorts;
+import org.jf.dexlib2.ValueType;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.dexlib2.iface.value.ShortEncodedValue;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public abstract class BaseShortEncodedValue implements ShortEncodedValue {
+    @Override
+    public int hashCode() {
+        return getValue();
+    }
+
+    @Override
+    public boolean equals(@Nullable Object o) {
+        if (o instanceof ShortEncodedValue) {
+            return getValue() == ((ShortEncodedValue)o).getValue();
+        }
+        return false;
+    }
+
+    @Override
+    public int compareTo(@Nonnull EncodedValue o) {
+        int res = Ints.compare(getValueType(), o.getValueType());
+        if (res != 0) return res;
+        return Shorts.compare(getValue(), ((ShortEncodedValue)o).getValue());
+    }
+
+    public int getValueType() { return ValueType.SHORT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseStringEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseStringEncodedValue.java
new file mode 100644
index 0000000..a9bd6cd
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseStringEncodedValue.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base.value;
+
+import com.google.common.primitives.Ints;
+import org.jf.dexlib2.ValueType;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.dexlib2.iface.value.StringEncodedValue;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public abstract class BaseStringEncodedValue implements StringEncodedValue {
+    @Override
+    public int hashCode() {
+        return getValue().hashCode();
+    }
+
+    @Override
+    public boolean equals(@Nullable Object o) {
+        if (o instanceof StringEncodedValue) {
+            return getValue().equals(((StringEncodedValue)o).getValue());
+        }
+        return false;
+    }
+
+    @Override
+    public int compareTo(@Nonnull EncodedValue o) {
+        int res = Ints.compare(getValueType(), o.getValueType());
+        if (res != 0) return res;
+        return getValue().compareTo(((StringEncodedValue)o).getValue());
+    }
+
+    public int getValueType() { return ValueType.STRING; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseTypeEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseTypeEncodedValue.java
new file mode 100644
index 0000000..80f7399
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/value/BaseTypeEncodedValue.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.base.value;
+
+import com.google.common.primitives.Ints;
+import org.jf.dexlib2.ValueType;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.dexlib2.iface.value.TypeEncodedValue;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public abstract class BaseTypeEncodedValue implements TypeEncodedValue {
+    @Override
+    public int hashCode() {
+        return getValue().hashCode();
+    }
+
+    @Override
+    public boolean equals(@Nullable Object o) {
+        if (o instanceof TypeEncodedValue) {
+            return getValue().equals(((TypeEncodedValue)o).getValue());
+        }
+        return false;
+    }
+
+    @Override
+    public int compareTo(@Nonnull EncodedValue o) {
+        int res = Ints.compare(getValueType(), o.getValueType());
+        if (res != 0) return res;
+        return getValue().compareTo(((TypeEncodedValue)o).getValue());
+    }
+
+    public int getValueType() { return ValueType.TYPE; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/BuilderDebugItem.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/BuilderDebugItem.java
new file mode 100644
index 0000000..41effa1
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/BuilderDebugItem.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder;
+
+import org.jf.dexlib2.iface.debug.DebugItem;
+
+public abstract class BuilderDebugItem extends ItemWithLocation implements DebugItem {
+
+    public BuilderDebugItem() {
+    }
+
+    @Override public int getCodeAddress() {
+        if (location == null) {
+            throw new IllegalStateException("Cannot get the address of a BuilderDebugItem that isn't associated with " +
+                    "a method.");
+        }
+        return location.getCodeAddress();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/BuilderExceptionHandler.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/BuilderExceptionHandler.java
new file mode 100644
index 0000000..e7376df
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/BuilderExceptionHandler.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder;
+
+import org.jf.dexlib2.base.BaseExceptionHandler;
+import org.jf.dexlib2.iface.reference.TypeReference;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public abstract class BuilderExceptionHandler extends BaseExceptionHandler {
+    @Nonnull protected final Label handler;
+
+    private BuilderExceptionHandler(@Nonnull Label handler) {
+        this.handler = handler;
+    }
+
+    @Nonnull
+    public Label getHandler() {
+        return handler;
+    }
+
+    static BuilderExceptionHandler newExceptionHandler(@Nullable final TypeReference exceptionType,
+                                                @Nonnull Label handler) {
+        if (exceptionType == null) {
+            return newExceptionHandler(handler);
+        }
+        return new BuilderExceptionHandler(handler) {
+            @Nullable @Override public String getExceptionType() {
+                return exceptionType.getType();
+            }
+
+            @Override public int getHandlerCodeAddress() {
+                return handler.getCodeAddress();
+            }
+
+            @Nullable @Override public TypeReference getExceptionTypeReference() {
+                return exceptionType;
+            }
+        };
+    }
+
+    static BuilderExceptionHandler newExceptionHandler(@Nonnull Label handler) {
+        return new BuilderExceptionHandler(handler) {
+            @Nullable @Override public String getExceptionType() {
+                return null;
+            }
+
+            @Override public int getHandlerCodeAddress() {
+                return handler.getCodeAddress();
+            }
+        };
+    }
+
+    static BuilderExceptionHandler newExceptionHandler(@Nullable final String exceptionType,
+                                                @Nonnull Label handler) {
+        if (exceptionType == null) {
+            return newExceptionHandler(handler);
+        }
+        return new BuilderExceptionHandler(handler) {
+            @Nullable @Override public String getExceptionType() {
+                return exceptionType;
+            }
+
+            @Override public int getHandlerCodeAddress() {
+                return handler.getCodeAddress();
+            }
+        };
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/BuilderInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/BuilderInstruction.java
new file mode 100644
index 0000000..d06f7a8
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/BuilderInstruction.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public abstract class BuilderInstruction implements Instruction {
+    @Nonnull protected final Opcode opcode;
+
+    @Nullable MethodLocation location;
+
+    protected BuilderInstruction(@Nonnull Opcode opcode) {
+        Preconditions.checkFormat(opcode, getFormat());
+        this.opcode = opcode;
+    }
+
+    @Nonnull public Opcode getOpcode() {
+        return opcode;
+    }
+
+    public abstract Format getFormat();
+
+    public int getCodeUnits() {
+        return getFormat().size / 2;
+    }
+
+    @Nonnull
+    public MethodLocation getLocation() {
+        if (location == null) {
+            throw new IllegalStateException("Cannot get the location of an instruction that hasn't been added to a " +
+                    "method.");
+        }
+        return location;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/BuilderOffsetInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/BuilderOffsetInstruction.java
new file mode 100644
index 0000000..27e43d5
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/BuilderOffsetInstruction.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.OffsetInstruction;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+
+public abstract class BuilderOffsetInstruction extends BuilderInstruction implements OffsetInstruction {
+    @Nonnull
+    protected final Label target;
+
+    public BuilderOffsetInstruction(@Nonnull Opcode opcode,
+                                    @Nonnull Label target) {
+        super(opcode);
+        this.target = target;
+    }
+
+    @Override public int getCodeOffset() {
+        int codeOffset = internalGetCodeOffset();
+        if (this.getCodeUnits() == 1) {
+            if (codeOffset < Byte.MIN_VALUE || codeOffset > Byte.MAX_VALUE) {
+                throw new ExceptionWithContext("Invalid instruction offset: %d. " +
+                        "Offset must be in [-128, 127]", codeOffset);
+            }
+        } else if (this.getCodeUnits() == 2) {
+            if (codeOffset < Short.MIN_VALUE || codeOffset > Short.MAX_VALUE) {
+                throw new ExceptionWithContext("Invalid instruction offset: %d. " +
+                        "Offset must be in [-32768, 32767]", codeOffset);
+            }
+        }
+        return codeOffset;
+    }
+
+
+    int internalGetCodeOffset() {
+        return target.getCodeAddress() - this.getLocation().getCodeAddress();
+    }
+
+    @Nonnull
+    public Label getTarget() {
+        return target;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/BuilderSwitchPayload.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/BuilderSwitchPayload.java
new file mode 100644
index 0000000..2fd490b
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/BuilderSwitchPayload.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.instruction.BuilderSwitchElement;
+import org.jf.dexlib2.iface.instruction.SwitchPayload;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.List;
+
+public abstract class BuilderSwitchPayload extends BuilderInstruction implements SwitchPayload {
+    @Nullable
+    MethodLocation referrer;
+
+    protected BuilderSwitchPayload(@Nonnull Opcode opcode) {
+        super(opcode);
+    }
+
+    @Nonnull
+    public MethodLocation getReferrer() {
+        if (referrer == null) {
+            throw new IllegalStateException("The referrer has not been set yet");
+        }
+        return referrer;
+    }
+
+    @Nonnull @Override public abstract List<? extends BuilderSwitchElement> getSwitchElements();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/BuilderTryBlock.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/BuilderTryBlock.java
new file mode 100644
index 0000000..f238788
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/BuilderTryBlock.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder;
+
+import com.google.common.collect.ImmutableList;
+import org.jf.dexlib2.base.BaseTryBlock;
+import org.jf.dexlib2.iface.reference.TypeReference;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.List;
+
+public class BuilderTryBlock extends BaseTryBlock<BuilderExceptionHandler> {
+    // We only ever have one exception handler per try block. They are later merged as needed in TryListBuilder
+    @Nonnull public final BuilderExceptionHandler exceptionHandler;
+    @Nonnull public final Label start;
+    // The end location is exclusive, it should point to the codeAddress of the instruction immediately after the last
+    // covered instruction.
+    @Nonnull public final Label end;
+
+    public BuilderTryBlock(@Nonnull Label start, @Nonnull Label end, @Nullable String exceptionType,
+                           @Nonnull Label handler) {
+        this.start = start;
+        this.end = end;
+        this.exceptionHandler = BuilderExceptionHandler.newExceptionHandler(exceptionType, handler);
+    }
+
+    public BuilderTryBlock(@Nonnull Label start, @Nonnull Label end, @Nullable TypeReference exceptionType,
+                           @Nonnull Label handler) {
+        this.start = start;
+        this.end = end;
+        this.exceptionHandler = BuilderExceptionHandler.newExceptionHandler(exceptionType, handler);
+    }
+
+    public BuilderTryBlock(@Nonnull Label start, @Nonnull Label end, @Nonnull Label handler) {
+        this.start = start;
+        this.end = end;
+        this.exceptionHandler = BuilderExceptionHandler.newExceptionHandler(handler);
+    }
+
+    @Override public int getStartCodeAddress() {
+        return start.getCodeAddress();
+    }
+
+    @Override public int getCodeUnitCount() {
+        return end.getCodeAddress() - start.getCodeAddress();
+    }
+
+    @Nonnull @Override public List<? extends BuilderExceptionHandler> getExceptionHandlers() {
+        return ImmutableList.of(exceptionHandler);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/ItemWithLocation.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/ItemWithLocation.java
new file mode 100644
index 0000000..f651552
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/ItemWithLocation.java
@@ -0,0 +1,16 @@
+package org.jf.dexlib2.builder;
+
+import javax.annotation.Nullable;
+
+public abstract class ItemWithLocation {
+    @Nullable
+    MethodLocation location;
+
+    public boolean isPlaced() {
+        return location != null;
+    }
+
+    public void setLocation(MethodLocation methodLocation) {
+        location = methodLocation;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/Label.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/Label.java
new file mode 100644
index 0000000..35c3f56
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/Label.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder;
+
+import javax.annotation.Nonnull;
+
+public class Label extends ItemWithLocation {
+    Label() {
+    }
+
+    Label(MethodLocation location) {
+        this.location = location;
+    }
+
+    public int getCodeAddress() {
+        return getLocation().getCodeAddress();
+    }
+
+    @Nonnull
+    public MethodLocation getLocation() {
+        if (location == null) {
+            throw new IllegalStateException("Cannot get the location of a label that hasn't been placed yet.");
+        }
+        return location;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/LocatedDebugItems.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/LocatedDebugItems.java
new file mode 100644
index 0000000..77291ac
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/LocatedDebugItems.java
@@ -0,0 +1,10 @@
+package org.jf.dexlib2.builder;
+
+public class LocatedDebugItems extends LocatedItems<BuilderDebugItem> {
+
+    @Override
+    protected String getAddLocatedItemError() {
+        return "Cannot add a debug item that has already been added to a method." +
+                "You must remove it from its current location first.";
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/LocatedItems.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/LocatedItems.java
new file mode 100644
index 0000000..89f0ac1
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/LocatedItems.java
@@ -0,0 +1,96 @@
+package org.jf.dexlib2.builder;
+
+import com.google.common.collect.ImmutableList;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.*;
+
+public abstract class LocatedItems<T extends ItemWithLocation> {
+    // We end up creating and keeping around a *lot* of MethodLocation objects
+    // when building a new dex file, so it's worth the trouble of lazily creating
+    // the labels and debugItems lists only when they are needed
+    @Nullable
+    private List<T> items = null;
+
+    @Nonnull
+    private List<T> getItems() {
+        if (items == null) {
+            return ImmutableList.of();
+        }
+        return items;
+    }
+
+    public Set<T> getModifiableItems(MethodLocation newItemsLocation) {
+        return new AbstractSet<T>() {
+            @Nonnull
+            @Override
+            public Iterator<T> iterator() {
+                final Iterator<T> it = getItems().iterator();
+
+                return new Iterator<T>() {
+                    private @Nullable
+                    T currentItem = null;
+
+                    @Override
+                    public boolean hasNext() {
+                        return it.hasNext();
+                    }
+
+                    @Override
+                    public T next() {
+                        currentItem = it.next();
+                        return currentItem;
+                    }
+
+                    @Override
+                    public void remove() {
+                        if (currentItem != null) {
+                            currentItem.setLocation(null);
+                        }
+                        it.remove();
+                    }
+                };
+            }
+
+            @Override
+            public int size() {
+                return getItems().size();
+            }
+
+            @Override
+            public boolean add(@Nonnull T item) {
+                if (item.isPlaced()) {
+                    throw new IllegalArgumentException(getAddLocatedItemError());
+                }
+                item.setLocation(newItemsLocation);
+                addItem(item);
+                return true;
+            }
+        };
+    }
+
+    private void addItem(@Nonnull T item) {
+        if (items == null) {
+            items = new ArrayList<>(1);
+        }
+        items.add(item);
+    }
+
+    protected abstract String getAddLocatedItemError();
+
+    public void mergeItemsIntoNext(@Nonnull MethodLocation nextLocation, LocatedItems<T> otherLocatedItems) {
+        if (otherLocatedItems == this) {
+            return;
+        }
+        if (items != null) {
+            for (T item : items) {
+                item.setLocation(nextLocation);
+            }
+            List<T> mergedItems = items;
+            mergedItems.addAll(otherLocatedItems.getItems());
+            otherLocatedItems.items = mergedItems;
+            items = null;
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/LocatedLabels.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/LocatedLabels.java
new file mode 100644
index 0000000..d14ce7b
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/LocatedLabels.java
@@ -0,0 +1,9 @@
+package org.jf.dexlib2.builder;
+
+public class LocatedLabels extends LocatedItems<Label> {
+    @Override
+    protected String getAddLocatedItemError() {
+        return "Cannot add a label that is already placed." +
+                "You must remove it from its current location first.";
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/MethodImplementationBuilder.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/MethodImplementationBuilder.java
new file mode 100644
index 0000000..e830b65
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/MethodImplementationBuilder.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder;
+
+import org.jf.dexlib2.iface.MethodImplementation;
+import org.jf.dexlib2.iface.reference.StringReference;
+import org.jf.dexlib2.iface.reference.TypeReference;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.HashMap;
+
+public class MethodImplementationBuilder {
+    // Contains all named labels - both placed and unplaced
+    private final HashMap<String, Label> labels = new HashMap<String, Label>();
+
+    @Nonnull
+    private final MutableMethodImplementation impl;
+
+    private MethodLocation currentLocation;
+
+    public MethodImplementationBuilder(int registerCount) {
+        this.impl = new MutableMethodImplementation(registerCount);
+        this.currentLocation = impl.instructionList.get(0);
+    }
+
+    public MethodImplementation getMethodImplementation() {
+        return impl;
+    }
+
+    /**
+     * Adds a new named label at the current location.
+     *
+     * Any previous unplaced references to a label of this name will now refer to this label/location
+     *
+     * @param name The name of the label to add
+     * @return A LabelRef representing the label
+     */
+    @Nonnull
+    public Label addLabel(@Nonnull String name) {
+        Label label = labels.get(name);
+
+        if (label != null) {
+            if (label.isPlaced()) {
+                throw new IllegalArgumentException("There is already a label with that name.");
+            } else {
+                currentLocation.getLabels().add(label);
+            }
+        } else {
+            label = currentLocation.addNewLabel();
+            labels.put(name, label);
+        }
+
+        return label;
+    }
+
+    /**
+     * Get a reference to a label with the given name.
+     *
+     * If a label with that name has not been added yet, a new one is created, but is left
+     * in an unplaced state. It is assumed that addLabel(name) will be called at a later
+     * point to define the location of the label.
+     *
+     * @param name The name of the label to get
+     * @return A LabelRef representing the label
+     */
+    @Nonnull
+    public Label getLabel(@Nonnull String name) {
+        Label label = labels.get(name);
+        if (label == null) {
+            label = new Label();
+            labels.put(name, label);
+        }
+        return label;
+    }
+
+    public void addCatch(@Nullable TypeReference type, @Nonnull Label from,
+                         @Nonnull Label to, @Nonnull Label handler) {
+        impl.addCatch(type, from, to, handler);
+    }
+
+    public void addCatch(@Nullable String type, @Nonnull Label from, @Nonnull Label to,
+                         @Nonnull Label handler) {
+        impl.addCatch(type, from, to, handler);
+    }
+
+    public void addCatch(@Nonnull Label from, @Nonnull Label to, @Nonnull Label handler) {
+        impl.addCatch(from, to, handler);
+    }
+
+    public void addLineNumber(int lineNumber) {
+        currentLocation.addLineNumber(lineNumber);
+    }
+
+    public void addStartLocal(int registerNumber, @Nullable StringReference name, @Nullable TypeReference type,
+                              @Nullable StringReference signature) {
+        currentLocation.addStartLocal(registerNumber, name, type, signature);
+    }
+
+    public void addEndLocal(int registerNumber) {
+        currentLocation.addEndLocal(registerNumber);
+    }
+
+    public void addRestartLocal(int registerNumber) {
+        currentLocation.addRestartLocal(registerNumber);
+    }
+
+    public void addPrologue() {
+        currentLocation.addPrologue();
+    }
+
+    public void addEpilogue() {
+        currentLocation.addEpilogue();
+    }
+
+    public void addSetSourceFile(@Nullable StringReference sourceFile) {
+        currentLocation.addSetSourceFile(sourceFile);
+    }
+
+    public void addInstruction(@Nullable BuilderInstruction instruction) {
+        impl.addInstruction(instruction);
+        currentLocation = impl.instructionList.get(impl.instructionList.size()-1);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/MethodLocation.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/MethodLocation.java
new file mode 100644
index 0000000..da746e1
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/MethodLocation.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder;
+
+import org.jf.dexlib2.builder.debug.*;
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.dexlib2.iface.reference.StringReference;
+import org.jf.dexlib2.iface.reference.TypeReference;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.*;
+
+public class MethodLocation {
+    @Nullable BuilderInstruction instruction;
+    int codeAddress;
+    int index;
+
+    private final LocatedItems<Label> labels;
+    private final LocatedItems<BuilderDebugItem> debugItems;
+
+    MethodLocation(@Nullable BuilderInstruction instruction, int codeAddress, int index) {
+        this.debugItems = new LocatedDebugItems();
+        this.labels = new LocatedLabels();
+        this.instruction = instruction;
+        this.codeAddress = codeAddress;
+        this.index = index;
+    }
+
+    @Nullable
+    public Instruction getInstruction() {
+        return instruction;
+    }
+
+    public int getCodeAddress() {
+        return codeAddress;
+    }
+
+    public int getIndex() {
+        return index;
+    }
+
+    void mergeInto(@Nonnull MethodLocation nextLocation) {
+        labels.mergeItemsIntoNext(nextLocation, nextLocation.labels);
+        debugItems.mergeItemsIntoNext(nextLocation, nextLocation.debugItems);
+    }
+
+    @Nonnull
+    public Set<Label> getLabels() {
+        return labels.getModifiableItems(MethodLocation.this);
+    }
+
+    @Nonnull
+    public Label addNewLabel() {
+        Label newLabel = new Label();
+        getLabels().add(newLabel);
+        return newLabel;
+    }
+
+    @Nonnull
+    public Set<BuilderDebugItem> getDebugItems() {
+        return debugItems.getModifiableItems(MethodLocation.this);
+    }
+
+    public void addLineNumber(int lineNumber) {
+        getDebugItems().add(new BuilderLineNumber(lineNumber));
+    }
+
+    public void addStartLocal(int registerNumber, @Nullable StringReference name, @Nullable TypeReference type,
+                              @Nullable StringReference signature) {
+        getDebugItems().add(new BuilderStartLocal(registerNumber, name, type, signature));
+    }
+
+    public void addEndLocal(int registerNumber) {
+        getDebugItems().add(new BuilderEndLocal(registerNumber));
+    }
+
+    public void addRestartLocal(int registerNumber) {
+        getDebugItems().add(new BuilderRestartLocal(registerNumber));
+    }
+
+    public void addPrologue() {
+        getDebugItems().add(new BuilderPrologueEnd());
+    }
+
+    public void addEpilogue() {
+        getDebugItems().add(new BuilderEpilogueBegin());
+    }
+
+    public void addSetSourceFile(@Nullable StringReference sourceFile) {
+        getDebugItems().add(new BuilderSetSourceFile(sourceFile));
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/MutableMethodImplementation.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/MutableMethodImplementation.java
new file mode 100644
index 0000000..3e4925e
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/MutableMethodImplementation.java
@@ -0,0 +1,1077 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import org.jf.dexlib2.DebugItemType;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.debug.*;
+import org.jf.dexlib2.builder.instruction.*;
+import org.jf.dexlib2.iface.ExceptionHandler;
+import org.jf.dexlib2.iface.MethodImplementation;
+import org.jf.dexlib2.iface.TryBlock;
+import org.jf.dexlib2.iface.debug.*;
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.dexlib2.iface.instruction.SwitchElement;
+import org.jf.dexlib2.iface.instruction.formats.*;
+import org.jf.dexlib2.iface.reference.TypeReference;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.*;
+
+public class MutableMethodImplementation implements MethodImplementation {
+    private final int registerCount;
+    final ArrayList<MethodLocation> instructionList = Lists.newArrayList(new MethodLocation(null, 0, 0));
+    private final ArrayList<BuilderTryBlock> tryBlocks = Lists.newArrayList();
+    private boolean fixInstructions = true;
+
+    public MutableMethodImplementation(@Nonnull MethodImplementation methodImplementation) {
+        this.registerCount = methodImplementation.getRegisterCount();
+
+        int codeAddress = 0;
+        int index = 0;
+
+        for (Instruction instruction: methodImplementation.getInstructions()) {
+            codeAddress += instruction.getCodeUnits();
+            index++;
+
+            instructionList.add(new MethodLocation(null, codeAddress, index));
+        }
+
+        final int[] codeAddressToIndex = new int[codeAddress+1];
+        Arrays.fill(codeAddressToIndex, -1);
+
+        for (int i=0; i<instructionList.size(); i++) {
+            codeAddressToIndex[instructionList.get(i).codeAddress] = i;
+        }
+
+        List<Task> switchPayloadTasks = Lists.newArrayList();
+        index = 0;
+        for (final Instruction instruction: methodImplementation.getInstructions()) {
+            final MethodLocation location = instructionList.get(index);
+            final Opcode opcode = instruction.getOpcode();
+            if (opcode == Opcode.PACKED_SWITCH_PAYLOAD || opcode == Opcode.SPARSE_SWITCH_PAYLOAD) {
+                switchPayloadTasks.add(new Task() {
+                    @Override public void perform() {
+                        convertAndSetInstruction(location, codeAddressToIndex, instruction);
+                    }
+                });
+            } else {
+                convertAndSetInstruction(location, codeAddressToIndex, instruction);
+            }
+            index++;
+        }
+
+        // the switch payload instructions must be converted last, so that any switch statements that refer to them
+        // have created the referring labels that we look for
+        for (Task switchPayloadTask: switchPayloadTasks) {
+            switchPayloadTask.perform();
+        }
+
+        for (DebugItem debugItem: methodImplementation.getDebugItems()) {
+            int debugCodeAddress = debugItem.getCodeAddress();
+            int locationIndex = mapCodeAddressToIndex(codeAddressToIndex, debugCodeAddress);
+            MethodLocation debugLocation = instructionList.get(locationIndex);
+            BuilderDebugItem builderDebugItem = convertDebugItem(debugItem);
+            debugLocation.getDebugItems().add(builderDebugItem);
+            builderDebugItem.location = debugLocation;
+        }
+
+        for (TryBlock<? extends ExceptionHandler> tryBlock: methodImplementation.getTryBlocks()) {
+            Label startLabel = newLabel(codeAddressToIndex, tryBlock.getStartCodeAddress());
+            Label endLabel = newLabel(codeAddressToIndex, tryBlock.getStartCodeAddress() + tryBlock.getCodeUnitCount());
+
+            for (ExceptionHandler exceptionHandler: tryBlock.getExceptionHandlers()) {
+                tryBlocks.add(new BuilderTryBlock(startLabel, endLabel,
+                        exceptionHandler.getExceptionTypeReference(),
+                        newLabel(codeAddressToIndex, exceptionHandler.getHandlerCodeAddress())));
+            }
+        }
+    }
+
+    private interface Task {
+        void perform();
+    }
+
+    public MutableMethodImplementation(int registerCount) {
+        this.registerCount = registerCount;
+    }
+
+    @Override public int getRegisterCount() {
+        return registerCount;
+    }
+
+    @Nonnull
+    public List<BuilderInstruction> getInstructions() {
+        if (fixInstructions) {
+            fixInstructions();
+        }
+
+        return new AbstractList<BuilderInstruction>() {
+            @Override public BuilderInstruction get(int i) {
+                if (i >= size()) {
+                    throw new IndexOutOfBoundsException();
+                }
+                if (fixInstructions) {
+                    fixInstructions();
+                }
+                return instructionList.get(i).instruction;
+            }
+
+            @Override public int size() {
+                if (fixInstructions) {
+                    fixInstructions();
+                }
+                // don't include the last MethodLocation, which always has a null instruction
+                return instructionList.size() - 1;
+            }
+        };
+    }
+
+    @Nonnull @Override public List<BuilderTryBlock> getTryBlocks() {
+        if (fixInstructions) {
+            fixInstructions();
+        }
+        return Collections.unmodifiableList(tryBlocks);
+    }
+
+    @Nonnull @Override public Iterable<? extends DebugItem> getDebugItems() {
+        if (fixInstructions) {
+            fixInstructions();
+        }
+        return Iterables.concat(
+                Iterables.transform(instructionList, new Function<MethodLocation, Iterable<? extends DebugItem>>() {
+                    @Nullable @Override public Iterable<? extends DebugItem> apply(@Nullable MethodLocation input) {
+                        assert input != null;
+                        if (fixInstructions) {
+                            throw new IllegalStateException("This iterator was invalidated by a change to" +
+                                    " this MutableMethodImplementation.");
+                        }
+                        return input.getDebugItems();
+                    }
+                }));
+    }
+
+    public void addCatch(@Nullable TypeReference type, @Nonnull Label from,
+                         @Nonnull Label to, @Nonnull Label handler) {
+        tryBlocks.add(new BuilderTryBlock(from, to, type, handler));
+    }
+
+    public void addCatch(@Nullable String type, @Nonnull Label from, @Nonnull Label to,
+                         @Nonnull Label handler) {
+        tryBlocks.add(new BuilderTryBlock(from, to, type, handler));
+    }
+
+    public void addCatch(@Nonnull Label from, @Nonnull Label to, @Nonnull Label handler) {
+        tryBlocks.add(new BuilderTryBlock(from, to, handler));
+    }
+
+    public void addInstruction(int index, BuilderInstruction instruction) {
+        // the end check here is intentially >= rather than >, because the list always includes an "empty"
+        // (null instruction) MethodLocation at the end. To add an instruction to the end of the list, the user would
+        // provide the index of this empty item, which would be size() - 1.
+        if (index >= instructionList.size()) {
+            throw new IndexOutOfBoundsException();
+        }
+
+        if (index == instructionList.size() - 1) {
+            addInstruction(instruction);
+            return;
+        }
+        int codeAddress = instructionList.get(index).getCodeAddress();
+        MethodLocation newLoc = new MethodLocation(instruction, codeAddress, index);
+        instructionList.add(index, newLoc);
+        instruction.location = newLoc;
+
+        codeAddress += instruction.getCodeUnits();
+
+        for (int i=index+1; i<instructionList.size(); i++) {
+            MethodLocation location = instructionList.get(i);
+            location.index++;
+            location.codeAddress = codeAddress;
+            if (location.instruction != null) {
+                codeAddress += location.instruction.getCodeUnits();
+            } else {
+                // only the last MethodLocation should have a null instruction
+                assert i == instructionList.size()-1;
+            }
+        }
+
+        this.fixInstructions = true;
+    }
+
+    public void addInstruction(@Nonnull BuilderInstruction instruction) {
+        MethodLocation last = instructionList.get(instructionList.size()-1);
+        last.instruction = instruction;
+        instruction.location = last;
+
+        int nextCodeAddress = last.codeAddress + instruction.getCodeUnits();
+        instructionList.add(new MethodLocation(null, nextCodeAddress, instructionList.size()));
+
+        this.fixInstructions = true;
+    }
+
+    public void replaceInstruction(int index, @Nonnull BuilderInstruction replacementInstruction) {
+        if (index >= instructionList.size() - 1) {
+            throw new IndexOutOfBoundsException();
+        }
+
+        MethodLocation replaceLocation = instructionList.get(index);
+        replacementInstruction.location = replaceLocation;
+        BuilderInstruction old = replaceLocation.instruction;
+        assert old != null;
+        old.location = null;
+        replaceLocation.instruction = replacementInstruction;
+
+        // TODO: factor out index/address fix up loop
+        int codeAddress = replaceLocation.codeAddress + replaceLocation.instruction.getCodeUnits();
+        for (int i=index+1; i<instructionList.size(); i++) {
+            MethodLocation location = instructionList.get(i);
+            location.codeAddress = codeAddress;
+
+            Instruction instruction = location.getInstruction();
+            if (instruction != null) {
+                codeAddress += instruction.getCodeUnits();
+            } else {
+                assert i == instructionList.size() - 1;
+            }
+        }
+
+        this.fixInstructions = true;
+    }
+
+    public void removeInstruction(int index) {
+        if (index >= instructionList.size() - 1) {
+            throw new IndexOutOfBoundsException();
+        }
+
+        MethodLocation toRemove = instructionList.get(index);
+        toRemove.instruction = null;
+        MethodLocation next = instructionList.get(index+1);
+        toRemove.mergeInto(next);
+
+        instructionList.remove(index);
+        int codeAddress = toRemove.codeAddress;
+        for (int i=index; i<instructionList.size(); i++) {
+            MethodLocation location = instructionList.get(i);
+            location.index = i;
+            location.codeAddress = codeAddress;
+
+            Instruction instruction = location.getInstruction();
+            if (instruction != null) {
+                codeAddress += instruction.getCodeUnits();
+            } else {
+                assert i == instructionList.size() - 1;
+            }
+        }
+
+        this.fixInstructions = true;
+    }
+
+    public void swapInstructions(int index1, int index2) {
+        if (index1 >= instructionList.size() - 1 || index2 >= instructionList.size() - 1) {
+            throw new IndexOutOfBoundsException();
+        }
+        MethodLocation first = instructionList.get(index1);
+        MethodLocation second = instructionList.get(index2);
+
+        // only the last MethodLocation may have a null instruction
+        assert first.instruction != null;
+        assert second.instruction != null;
+
+        first.instruction.location = second;
+        second.instruction.location = first;
+
+        {
+            BuilderInstruction tmp = second.instruction;
+            second.instruction = first.instruction;
+            first.instruction = tmp;
+        }
+
+        if (index2 < index1) {
+            int tmp = index2;
+            index2 = index1;
+            index1 = tmp;
+        }
+
+        int codeAddress = first.codeAddress + first.instruction.getCodeUnits();
+        for (int i=index1+1; i<=index2; i++) {
+            MethodLocation location = instructionList.get(i);
+            location.codeAddress = codeAddress;
+
+            Instruction instruction = location.instruction;
+            assert instruction != null;
+            codeAddress += location.instruction.getCodeUnits();
+        }
+
+        this.fixInstructions = true;
+    }
+
+    @Nullable
+    private BuilderInstruction getFirstNonNop(int startIndex) {
+
+        for (int i=startIndex; i<instructionList.size()-1; i++) {
+            BuilderInstruction instruction = instructionList.get(i).instruction;
+            assert instruction != null;
+            if (instruction.getOpcode() != Opcode.NOP) {
+                return instruction;
+            }
+        }
+        return null;
+    }
+
+    private void fixInstructions() {
+        HashSet<MethodLocation> payloadLocations = Sets.newHashSet();
+
+        for (MethodLocation location: instructionList) {
+            BuilderInstruction instruction = location.instruction;
+            if (instruction != null) {
+                switch (instruction.getOpcode()) {
+                    case SPARSE_SWITCH:
+                    case PACKED_SWITCH: {
+                        MethodLocation targetLocation =
+                                ((BuilderOffsetInstruction)instruction).getTarget().getLocation();
+                        BuilderInstruction targetInstruction = targetLocation.instruction;
+                        if (targetInstruction == null) {
+                            throw new IllegalStateException(String.format("Switch instruction at address/index " +
+                                    "0x%x/%d points to the end of the method.", location.codeAddress, location.index));
+                        }
+
+                        if (targetInstruction.getOpcode() == Opcode.NOP) {
+                            targetInstruction = getFirstNonNop(targetLocation.index+1);
+                        }
+                        if (targetInstruction == null || !(targetInstruction instanceof BuilderSwitchPayload)) {
+                            throw new IllegalStateException(String.format("Switch instruction at address/index " +
+                                    "0x%x/%d does not refer to a payload instruction.",
+                                    location.codeAddress, location.index));
+                        }
+                        if ((instruction.opcode == Opcode.PACKED_SWITCH &&
+                                targetInstruction.getOpcode() != Opcode.PACKED_SWITCH_PAYLOAD) ||
+                            (instruction.opcode == Opcode.SPARSE_SWITCH &&
+                                targetInstruction.getOpcode() != Opcode.SPARSE_SWITCH_PAYLOAD)) {
+                            throw new IllegalStateException(String.format("Switch instruction at address/index " +
+                                    "0x%x/%d refers to the wrong type of payload instruction.",
+                                    location.codeAddress, location.index));
+                        }
+
+                        if (!payloadLocations.add(targetLocation)) {
+                            throw new IllegalStateException("Multiple switch instructions refer to the same payload. " +
+                                    "This is not currently supported. Please file a bug :)");
+                        }
+
+                        ((BuilderSwitchPayload)targetInstruction).referrer = location;
+                        break;
+                    }
+                }
+            }
+        }
+
+        boolean madeChanges;
+        do {
+            madeChanges = false;
+
+            for (int index=0; index<instructionList.size(); index++) {
+                MethodLocation location = instructionList.get(index);
+                BuilderInstruction instruction = location.instruction;
+                if (instruction != null) {
+                    switch (instruction.getOpcode()) {
+                        case GOTO: {
+                            int offset = ((BuilderOffsetInstruction)instruction).internalGetCodeOffset();
+                            if (offset < Byte.MIN_VALUE || offset > Byte.MAX_VALUE) {
+                                BuilderOffsetInstruction replacement;
+                                if (offset < Short.MIN_VALUE || offset > Short.MAX_VALUE) {
+                                    replacement = new BuilderInstruction30t(Opcode.GOTO_32,
+                                            ((BuilderOffsetInstruction)instruction).getTarget());
+                                } else {
+                                    replacement = new BuilderInstruction20t(Opcode.GOTO_16,
+                                            ((BuilderOffsetInstruction)instruction).getTarget());
+                                }
+                                replaceInstruction(location.index, replacement);
+                                madeChanges = true;
+                            }
+                            break;
+                        }
+                        case GOTO_16: {
+                            int offset = ((BuilderOffsetInstruction)instruction).internalGetCodeOffset();
+                            if (offset < Short.MIN_VALUE || offset > Short.MAX_VALUE) {
+                                BuilderOffsetInstruction replacement =  new BuilderInstruction30t(Opcode.GOTO_32,
+                                            ((BuilderOffsetInstruction)instruction).getTarget());
+                                replaceInstruction(location.index, replacement);
+                                madeChanges = true;
+                            }
+                            break;
+                        }
+                        case SPARSE_SWITCH_PAYLOAD:
+                        case PACKED_SWITCH_PAYLOAD:
+                            if (((BuilderSwitchPayload)instruction).referrer == null) {
+                                // if the switch payload isn't referenced, just remove it
+                                removeInstruction(index);
+                                index--;
+                                madeChanges = true;
+                                break;
+                            }
+                            // intentional fall-through
+                        case ARRAY_PAYLOAD: {
+                            if ((location.codeAddress & 0x01) != 0) {
+                                int previousIndex = location.index - 1;
+                                MethodLocation previousLocation = instructionList.get(previousIndex);
+                                Instruction previousInstruction = previousLocation.instruction;
+                                assert previousInstruction != null;
+                                if (previousInstruction.getOpcode() == Opcode.NOP) {
+                                    removeInstruction(previousIndex);
+                                    index--;
+                                } else {
+                                    addInstruction(location.index, new BuilderInstruction10x(Opcode.NOP));
+                                    index++;
+                                }
+                                madeChanges = true;
+                            }
+                            break;
+                        }
+                    }
+                }
+            }
+        } while (madeChanges);
+
+        fixInstructions = false;
+    }
+
+    private int mapCodeAddressToIndex(@Nonnull int[] codeAddressToIndex, int codeAddress) {
+        int index;
+        do {
+            if (codeAddress >= codeAddressToIndex.length) {
+                codeAddress = codeAddressToIndex.length - 1;
+            }
+            index = codeAddressToIndex[codeAddress];
+            if (index < 0) {
+                codeAddress--;
+            } else {
+                return index;
+            }
+        } while (true);
+    }
+
+    private int mapCodeAddressToIndex(int codeAddress) {
+        float avgCodeUnitsPerInstruction = 1.9f;
+
+        int index = (int)(codeAddress/avgCodeUnitsPerInstruction);
+        if (index >= instructionList.size()) {
+            index = instructionList.size() - 1;
+        }
+
+        MethodLocation guessedLocation = instructionList.get(index);
+
+        if (guessedLocation.codeAddress == codeAddress) {
+            return index;
+        } else if (guessedLocation.codeAddress > codeAddress) {
+            do {
+                index--;
+            } while (instructionList.get(index).codeAddress > codeAddress);
+            return index;
+        } else {
+            do {
+                index++;
+            } while (index < instructionList.size() && instructionList.get(index).codeAddress <= codeAddress);
+            return index-1;
+        }
+    }
+
+    @Nonnull
+    public Label newLabelForAddress(int codeAddress) {
+        if (codeAddress < 0 || codeAddress > instructionList.get(instructionList.size()-1).codeAddress) {
+            throw new IndexOutOfBoundsException(String.format("codeAddress %d out of bounds", codeAddress));
+        }
+        MethodLocation referent = instructionList.get(mapCodeAddressToIndex(codeAddress));
+        return referent.addNewLabel();
+    }
+
+    @Nonnull
+    public Label newLabelForIndex(int instructionIndex) {
+        if (instructionIndex < 0 || instructionIndex >= instructionList.size()) {
+            throw new IndexOutOfBoundsException(String.format("instruction index %d out of bounds", instructionIndex));
+        }
+        MethodLocation referent = instructionList.get(instructionIndex);
+        return referent.addNewLabel();
+    }
+
+    @Nonnull
+    private Label newLabel(@Nonnull int[] codeAddressToIndex, int codeAddress) {
+        MethodLocation referent = instructionList.get(mapCodeAddressToIndex(codeAddressToIndex, codeAddress));
+        return referent.addNewLabel();
+    }
+
+    private static class SwitchPayloadReferenceLabel extends Label {
+        @Nonnull public MethodLocation switchLocation;
+    }
+
+    @Nonnull
+    public Label newSwitchPayloadReferenceLabel(@Nonnull MethodLocation switchLocation,
+                                                @Nonnull int[] codeAddressToIndex, int codeAddress) {
+        MethodLocation referent = instructionList.get(mapCodeAddressToIndex(codeAddressToIndex, codeAddress));
+        SwitchPayloadReferenceLabel label = new SwitchPayloadReferenceLabel();
+        label.switchLocation = switchLocation;
+        referent.getLabels().add(label);
+        return label;
+    }
+
+    private void setInstruction(@Nonnull MethodLocation location, @Nonnull BuilderInstruction instruction) {
+        location.instruction = instruction;
+        instruction.location = location;
+    }
+
+    private void convertAndSetInstruction(@Nonnull MethodLocation location, int[] codeAddressToIndex,
+                                          @Nonnull Instruction instruction) {
+        switch (instruction.getOpcode().format) {
+            case Format10t:
+                setInstruction(location, newBuilderInstruction10t(location.codeAddress,
+                        codeAddressToIndex,
+                        (Instruction10t) instruction));
+                return;
+            case Format10x:
+                setInstruction(location, newBuilderInstruction10x((Instruction10x) instruction));
+                return;
+            case Format11n:
+                setInstruction(location, newBuilderInstruction11n((Instruction11n) instruction));
+                return;
+            case Format11x:
+                setInstruction(location, newBuilderInstruction11x((Instruction11x) instruction));
+                return;
+            case Format12x:
+                setInstruction(location, newBuilderInstruction12x((Instruction12x) instruction));
+                return;
+            case Format20bc:
+                setInstruction(location, newBuilderInstruction20bc((Instruction20bc) instruction));
+                return;
+            case Format20t:
+                setInstruction(location, newBuilderInstruction20t(location.codeAddress,
+                        codeAddressToIndex,
+                        (Instruction20t) instruction));
+                return;
+            case Format21c:
+                setInstruction(location, newBuilderInstruction21c((Instruction21c) instruction));
+                return;
+            case Format21ih:
+                setInstruction(location, newBuilderInstruction21ih((Instruction21ih) instruction));
+                return;
+            case Format21lh:
+                setInstruction(location, newBuilderInstruction21lh((Instruction21lh) instruction));
+                return;
+            case Format21s:
+                setInstruction(location, newBuilderInstruction21s((Instruction21s) instruction));
+                return;
+            case Format21t:
+                setInstruction(location, newBuilderInstruction21t(location.codeAddress,
+                        codeAddressToIndex,
+                        (Instruction21t) instruction));
+                return;
+            case Format22b:
+                setInstruction(location, newBuilderInstruction22b((Instruction22b) instruction));
+                return;
+            case Format22c:
+                setInstruction(location, newBuilderInstruction22c((Instruction22c) instruction));
+                return;
+            case Format22cs:
+                setInstruction(location, newBuilderInstruction22cs((Instruction22cs) instruction));
+                return;
+            case Format22s:
+                setInstruction(location, newBuilderInstruction22s((Instruction22s) instruction));
+                return;
+            case Format22t:
+                setInstruction(location, newBuilderInstruction22t(location.codeAddress,
+                        codeAddressToIndex,
+                        (Instruction22t) instruction));
+                return;
+            case Format22x:
+                setInstruction(location, newBuilderInstruction22x((Instruction22x) instruction));
+                return;
+            case Format23x:
+                setInstruction(location, newBuilderInstruction23x((Instruction23x) instruction));
+                return;
+            case Format30t:
+                setInstruction(location, newBuilderInstruction30t(location.codeAddress,
+                        codeAddressToIndex,
+                        (Instruction30t) instruction));
+                return;
+            case Format31c:
+                setInstruction(location, newBuilderInstruction31c((Instruction31c) instruction));
+                return;
+            case Format31i:
+                setInstruction(location, newBuilderInstruction31i((Instruction31i) instruction));
+                return;
+            case Format31t:
+                setInstruction(location, newBuilderInstruction31t(location, codeAddressToIndex,
+                        (Instruction31t) instruction));
+                return;
+            case Format32x:
+                setInstruction(location, newBuilderInstruction32x((Instruction32x) instruction));
+                return;
+            case Format35c:
+                setInstruction(location, newBuilderInstruction35c((Instruction35c) instruction));
+                return;
+            case Format35mi:
+                setInstruction(location, newBuilderInstruction35mi((Instruction35mi) instruction));
+                return;
+            case Format35ms:
+                setInstruction(location, newBuilderInstruction35ms((Instruction35ms) instruction));
+                return;
+            case Format3rc:
+                setInstruction(location, newBuilderInstruction3rc((Instruction3rc)instruction));
+                return;
+            case Format3rmi:
+                setInstruction(location, newBuilderInstruction3rmi((Instruction3rmi)instruction));
+                return;
+            case Format3rms:
+                setInstruction(location, newBuilderInstruction3rms((Instruction3rms)instruction));
+                return;
+            case Format51l:
+                setInstruction(location, newBuilderInstruction51l((Instruction51l)instruction));
+                return;
+            case PackedSwitchPayload:
+                setInstruction(location,
+                        newBuilderPackedSwitchPayload(location, codeAddressToIndex, (PackedSwitchPayload)instruction));
+                return;
+            case SparseSwitchPayload:
+                setInstruction(location,
+                        newBuilderSparseSwitchPayload(location, codeAddressToIndex, (SparseSwitchPayload)instruction));
+                return;
+            case ArrayPayload:
+                setInstruction(location, newBuilderArrayPayload((ArrayPayload)instruction));
+                return;
+            default:
+                throw new ExceptionWithContext("Instruction format %s not supported", instruction.getOpcode().format);
+        }
+    }
+
+    @Nonnull
+    private BuilderInstruction10t newBuilderInstruction10t(int codeAddress, int[] codeAddressToIndex,
+                                                           @Nonnull Instruction10t instruction) {
+        return new BuilderInstruction10t(
+                instruction.getOpcode(),
+                newLabel(codeAddressToIndex, codeAddress + instruction.getCodeOffset()));
+    }
+
+    @Nonnull
+    private BuilderInstruction10x newBuilderInstruction10x(@Nonnull Instruction10x instruction) {
+        return new BuilderInstruction10x(
+                instruction.getOpcode());
+    }
+
+    @Nonnull
+    private BuilderInstruction11n newBuilderInstruction11n(@Nonnull Instruction11n instruction) {
+        return new BuilderInstruction11n(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getNarrowLiteral());
+    }
+
+    @Nonnull
+    private BuilderInstruction11x newBuilderInstruction11x(@Nonnull Instruction11x instruction) {
+        return new BuilderInstruction11x(
+                instruction.getOpcode(),
+                instruction.getRegisterA());
+    }
+
+    @Nonnull
+    private BuilderInstruction12x newBuilderInstruction12x(@Nonnull Instruction12x instruction) {
+        return new BuilderInstruction12x(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getRegisterB());
+    }
+
+    @Nonnull
+    private BuilderInstruction20bc newBuilderInstruction20bc(@Nonnull Instruction20bc instruction) {
+        return new BuilderInstruction20bc(
+                instruction.getOpcode(),
+                instruction.getVerificationError(),
+                instruction.getReference());
+    }
+
+    @Nonnull
+    private BuilderInstruction20t newBuilderInstruction20t(int codeAddress, int[] codeAddressToIndex,
+                                                           @Nonnull Instruction20t instruction) {
+        return new BuilderInstruction20t(
+                instruction.getOpcode(),
+                newLabel(codeAddressToIndex, codeAddress + instruction.getCodeOffset()));
+    }
+
+    @Nonnull
+    private BuilderInstruction21c newBuilderInstruction21c(@Nonnull Instruction21c instruction) {
+        return new BuilderInstruction21c(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getReference());
+    }
+
+    @Nonnull
+    private BuilderInstruction21ih newBuilderInstruction21ih(@Nonnull Instruction21ih instruction) {
+        return new BuilderInstruction21ih(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getNarrowLiteral());
+    }
+
+    @Nonnull
+    private BuilderInstruction21lh newBuilderInstruction21lh(@Nonnull Instruction21lh instruction) {
+        return new BuilderInstruction21lh(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getWideLiteral());
+    }
+
+    @Nonnull
+    private BuilderInstruction21s newBuilderInstruction21s(@Nonnull Instruction21s instruction) {
+        return new BuilderInstruction21s(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getNarrowLiteral());
+    }
+
+    @Nonnull
+    private BuilderInstruction21t newBuilderInstruction21t(int codeAddress, int[] codeAddressToIndex,
+                                                           @Nonnull Instruction21t instruction) {
+        return new BuilderInstruction21t(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                newLabel(codeAddressToIndex, codeAddress + instruction.getCodeOffset()));
+    }
+
+    @Nonnull
+    private BuilderInstruction22b newBuilderInstruction22b(@Nonnull Instruction22b instruction) {
+        return new BuilderInstruction22b(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getRegisterB(),
+                instruction.getNarrowLiteral());
+    }
+
+    @Nonnull
+    private BuilderInstruction22c newBuilderInstruction22c(@Nonnull Instruction22c instruction) {
+        return new BuilderInstruction22c(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getRegisterB(),
+                instruction.getReference());
+    }
+
+    @Nonnull
+    private BuilderInstruction22cs newBuilderInstruction22cs(@Nonnull Instruction22cs instruction) {
+        return new BuilderInstruction22cs(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getRegisterB(),
+                instruction.getFieldOffset());
+    }
+
+    @Nonnull
+    private BuilderInstruction22s newBuilderInstruction22s(@Nonnull Instruction22s instruction) {
+        return new BuilderInstruction22s(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getRegisterB(),
+                instruction.getNarrowLiteral());
+    }
+
+    @Nonnull
+    private BuilderInstruction22t newBuilderInstruction22t(int codeAddress, int[] codeAddressToIndex,
+                                                           @Nonnull Instruction22t instruction) {
+        return new BuilderInstruction22t(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getRegisterB(),
+                newLabel(codeAddressToIndex, codeAddress + instruction.getCodeOffset()));
+    }
+
+    @Nonnull
+    private BuilderInstruction22x newBuilderInstruction22x(@Nonnull Instruction22x instruction) {
+        return new BuilderInstruction22x(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getRegisterB());
+    }
+
+    @Nonnull
+    private BuilderInstruction23x newBuilderInstruction23x(@Nonnull Instruction23x instruction) {
+        return new BuilderInstruction23x(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getRegisterB(),
+                instruction.getRegisterC());
+    }
+
+    @Nonnull
+    private BuilderInstruction30t newBuilderInstruction30t(int codeAddress, int[] codeAddressToIndex,
+                                                           @Nonnull Instruction30t instruction) {
+        return new BuilderInstruction30t(
+                instruction.getOpcode(),
+                newLabel(codeAddressToIndex, codeAddress + instruction.getCodeOffset()));
+    }
+
+    @Nonnull
+    private BuilderInstruction31c newBuilderInstruction31c(@Nonnull Instruction31c instruction) {
+        return new BuilderInstruction31c(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getReference());
+    }
+
+    @Nonnull
+    private BuilderInstruction31i newBuilderInstruction31i(@Nonnull Instruction31i instruction) {
+        return new BuilderInstruction31i(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getNarrowLiteral());
+    }
+
+    @Nonnull
+    private BuilderInstruction31t newBuilderInstruction31t(@Nonnull MethodLocation location , int[] codeAddressToIndex,
+                                                           @Nonnull Instruction31t instruction) {
+        int codeAddress = location.getCodeAddress();
+        Label newLabel;
+        if (instruction.getOpcode() != Opcode.FILL_ARRAY_DATA) {
+            // if it's a sparse switch or packed switch
+            newLabel = newSwitchPayloadReferenceLabel(location, codeAddressToIndex, codeAddress + instruction.getCodeOffset());
+        } else {
+            newLabel = newLabel(codeAddressToIndex, codeAddress + instruction.getCodeOffset());
+        }
+        return new BuilderInstruction31t(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                newLabel);
+    }
+
+    @Nonnull
+    private BuilderInstruction32x newBuilderInstruction32x(@Nonnull Instruction32x instruction) {
+        return new BuilderInstruction32x(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getRegisterB());
+    }
+
+    @Nonnull
+    private BuilderInstruction35c newBuilderInstruction35c(@Nonnull Instruction35c instruction) {
+        return new BuilderInstruction35c(
+                instruction.getOpcode(),
+                instruction.getRegisterCount(),
+                instruction.getRegisterC(),
+                instruction.getRegisterD(),
+                instruction.getRegisterE(),
+                instruction.getRegisterF(),
+                instruction.getRegisterG(),
+                instruction.getReference());
+    }
+
+    @Nonnull
+    private BuilderInstruction35mi newBuilderInstruction35mi(@Nonnull Instruction35mi instruction) {
+        return new BuilderInstruction35mi(
+                instruction.getOpcode(),
+                instruction.getRegisterCount(),
+                instruction.getRegisterC(),
+                instruction.getRegisterD(),
+                instruction.getRegisterE(),
+                instruction.getRegisterF(),
+                instruction.getRegisterG(),
+                instruction.getInlineIndex());
+    }
+
+    @Nonnull
+    private BuilderInstruction35ms newBuilderInstruction35ms(@Nonnull Instruction35ms instruction) {
+        return new BuilderInstruction35ms(
+                instruction.getOpcode(),
+                instruction.getRegisterCount(),
+                instruction.getRegisterC(),
+                instruction.getRegisterD(),
+                instruction.getRegisterE(),
+                instruction.getRegisterF(),
+                instruction.getRegisterG(),
+                instruction.getVtableIndex());
+    }
+
+    @Nonnull
+    private BuilderInstruction3rc newBuilderInstruction3rc(@Nonnull Instruction3rc instruction) {
+        return new BuilderInstruction3rc(
+                instruction.getOpcode(),
+                instruction.getStartRegister(),
+                instruction.getRegisterCount(),
+                instruction.getReference());
+    }
+
+    @Nonnull
+    private BuilderInstruction3rmi newBuilderInstruction3rmi(@Nonnull Instruction3rmi instruction) {
+        return new BuilderInstruction3rmi(
+                instruction.getOpcode(),
+                instruction.getStartRegister(),
+                instruction.getRegisterCount(),
+                instruction.getInlineIndex());
+    }
+
+    @Nonnull
+    private BuilderInstruction3rms newBuilderInstruction3rms(@Nonnull Instruction3rms instruction) {
+        return new BuilderInstruction3rms(
+                instruction.getOpcode(),
+                instruction.getStartRegister(),
+                instruction.getRegisterCount(),
+                instruction.getVtableIndex());
+    }
+
+    @Nonnull
+    private BuilderInstruction51l newBuilderInstruction51l(@Nonnull Instruction51l instruction) {
+        return new BuilderInstruction51l(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getWideLiteral());
+    }
+
+    @Nullable
+    private MethodLocation findSwitchForPayload(@Nonnull MethodLocation payloadLocation) {
+        MethodLocation location = payloadLocation;
+        MethodLocation switchLocation = null;
+        do {
+            for (Label label: location.getLabels()) {
+                if (label instanceof SwitchPayloadReferenceLabel) {
+                    if (switchLocation != null) {
+                        throw new IllegalStateException("Multiple switch instructions refer to the same payload. " +
+                                "This is not currently supported. Please file a bug :)");
+                    }
+                    switchLocation = ((SwitchPayloadReferenceLabel)label).switchLocation;
+                }
+            }
+
+            // A switch instruction can refer to the payload instruction itself, or to a nop before the payload
+            // instruction.
+            // We need to search for all occurrences of a switch reference, so we can detect when multiple switch
+            // statements refer to the same payload
+            // TODO: confirm that it could refer to the first NOP in a series of NOPs preceding the payload
+            if (location.index == 0) {
+                return switchLocation;
+            }
+            location = instructionList.get(location.index - 1);
+            if (location.instruction == null || location.instruction.getOpcode() != Opcode.NOP) {
+                return switchLocation;
+            }
+        } while (true);
+    }
+
+    @Nonnull
+    private BuilderPackedSwitchPayload newBuilderPackedSwitchPayload(@Nonnull MethodLocation location,
+                                                                     @Nonnull int[] codeAddressToIndex,
+                                                                     @Nonnull PackedSwitchPayload instruction) {
+        List<? extends SwitchElement> switchElements = instruction.getSwitchElements();
+        if (switchElements.size() == 0) {
+            return new BuilderPackedSwitchPayload(0, null);
+        }
+
+        MethodLocation switchLocation = findSwitchForPayload(location);
+        int baseAddress;
+        if (switchLocation == null) {
+            baseAddress = 0;
+        } else {
+            baseAddress = switchLocation.codeAddress;
+        }
+
+        List<Label> labels = Lists.newArrayList();
+        for (SwitchElement element: switchElements) {
+            labels.add(newLabel(codeAddressToIndex, element.getOffset() + baseAddress));
+        }
+
+        return new BuilderPackedSwitchPayload(switchElements.get(0).getKey(), labels);
+    }
+
+    @Nonnull
+    private BuilderSparseSwitchPayload newBuilderSparseSwitchPayload(@Nonnull MethodLocation location,
+                                                                     @Nonnull int[] codeAddressToIndex,
+                                                                     @Nonnull SparseSwitchPayload instruction) {
+        List<? extends SwitchElement> switchElements = instruction.getSwitchElements();
+        if (switchElements.size() == 0) {
+            return new BuilderSparseSwitchPayload(null);
+        }
+
+        MethodLocation switchLocation = findSwitchForPayload(location);
+        int baseAddress;
+        if (switchLocation == null) {
+            baseAddress = 0;
+        } else {
+            baseAddress = switchLocation.codeAddress;
+        }
+
+        List<SwitchLabelElement> labelElements = Lists.newArrayList();
+        for (SwitchElement element: switchElements) {
+            labelElements.add(new SwitchLabelElement(element.getKey(),
+                    newLabel(codeAddressToIndex, element.getOffset() + baseAddress)));
+        }
+
+        return new BuilderSparseSwitchPayload(labelElements);
+    }
+
+    @Nonnull
+    private BuilderArrayPayload newBuilderArrayPayload(@Nonnull ArrayPayload instruction) {
+        return new BuilderArrayPayload(instruction.getElementWidth(), instruction.getArrayElements());
+    }
+
+    @Nonnull
+    private BuilderDebugItem convertDebugItem(@Nonnull DebugItem debugItem) {
+        switch (debugItem.getDebugItemType()) {
+            case DebugItemType.START_LOCAL: {
+                StartLocal startLocal = (StartLocal)debugItem;
+                return new BuilderStartLocal(startLocal.getRegister(), startLocal.getNameReference(),
+                        startLocal.getTypeReference(), startLocal.getSignatureReference());
+            }
+            case DebugItemType.END_LOCAL: {
+                EndLocal endLocal = (EndLocal)debugItem;
+                return new BuilderEndLocal(endLocal.getRegister());
+            }
+            case DebugItemType.RESTART_LOCAL: {
+                RestartLocal restartLocal = (RestartLocal)debugItem;
+                return new BuilderRestartLocal(restartLocal.getRegister());
+            }
+            case DebugItemType.PROLOGUE_END:
+                return new BuilderPrologueEnd();
+            case DebugItemType.EPILOGUE_BEGIN:
+                return new BuilderEpilogueBegin();
+            case DebugItemType.LINE_NUMBER: {
+                LineNumber lineNumber = (LineNumber)debugItem;
+                return new BuilderLineNumber(lineNumber.getLineNumber());
+            }
+            case DebugItemType.SET_SOURCE_FILE: {
+                SetSourceFile setSourceFile = (SetSourceFile)debugItem;
+                return new BuilderSetSourceFile(setSourceFile.getSourceFileReference());
+            }
+            default:
+                throw new ExceptionWithContext("Invalid debug item type: " + debugItem.getDebugItemType());
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/SwitchLabelElement.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/SwitchLabelElement.java
new file mode 100644
index 0000000..99a82eb
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/SwitchLabelElement.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder;
+
+import javax.annotation.Nonnull;
+
+public class SwitchLabelElement {
+    public final int key;
+    @Nonnull public final Label target;
+
+    public SwitchLabelElement(int key, @Nonnull Label target) {
+        this.key = key;
+        this.target = target;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/debug/BuilderEndLocal.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/debug/BuilderEndLocal.java
new file mode 100644
index 0000000..a3e333d
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/debug/BuilderEndLocal.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.debug;
+
+import org.jf.dexlib2.DebugItemType;
+import org.jf.dexlib2.builder.BuilderDebugItem;
+import org.jf.dexlib2.iface.debug.EndLocal;
+
+import javax.annotation.Nullable;
+
+public class BuilderEndLocal extends BuilderDebugItem implements EndLocal {
+    private final int register;
+
+    public BuilderEndLocal(int register) {
+        this.register = register;
+    }
+
+    @Override public int getRegister() { return register; }
+    @Nullable @Override public String getName() { return null; }
+    @Nullable @Override public String getType() { return null; }
+    @Nullable @Override public String getSignature() { return null; }
+
+    @Override public int getDebugItemType() { return DebugItemType.END_LOCAL; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/debug/BuilderEpilogueBegin.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/debug/BuilderEpilogueBegin.java
new file mode 100644
index 0000000..65309e7
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/debug/BuilderEpilogueBegin.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.debug;
+
+import org.jf.dexlib2.DebugItemType;
+import org.jf.dexlib2.builder.BuilderDebugItem;
+import org.jf.dexlib2.iface.debug.EpilogueBegin;
+
+public class BuilderEpilogueBegin extends BuilderDebugItem implements EpilogueBegin {
+    public BuilderEpilogueBegin() {
+    }
+
+    @Override public int getDebugItemType() { return DebugItemType.EPILOGUE_BEGIN; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/debug/BuilderLineNumber.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/debug/BuilderLineNumber.java
new file mode 100644
index 0000000..4428499
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/debug/BuilderLineNumber.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.debug;
+
+import org.jf.dexlib2.DebugItemType;
+import org.jf.dexlib2.builder.BuilderDebugItem;
+import org.jf.dexlib2.iface.debug.LineNumber;
+
+public class BuilderLineNumber extends BuilderDebugItem implements LineNumber {
+    private final int lineNumber;
+
+    public BuilderLineNumber(int lineNumber) {
+        this.lineNumber = lineNumber;
+    }
+
+    @Override public int getLineNumber() { return lineNumber; }
+
+    @Override public int getDebugItemType() { return DebugItemType.LINE_NUMBER; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/debug/BuilderPrologueEnd.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/debug/BuilderPrologueEnd.java
new file mode 100644
index 0000000..d073229
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/debug/BuilderPrologueEnd.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.debug;
+
+import org.jf.dexlib2.DebugItemType;
+import org.jf.dexlib2.builder.BuilderDebugItem;
+import org.jf.dexlib2.iface.debug.PrologueEnd;
+
+public class BuilderPrologueEnd extends BuilderDebugItem implements PrologueEnd {
+    public BuilderPrologueEnd() {
+    }
+
+    @Override public int getDebugItemType() { return DebugItemType.PROLOGUE_END; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/debug/BuilderRestartLocal.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/debug/BuilderRestartLocal.java
new file mode 100644
index 0000000..7ed60c8
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/debug/BuilderRestartLocal.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.debug;
+
+import org.jf.dexlib2.DebugItemType;
+import org.jf.dexlib2.builder.BuilderDebugItem;
+import org.jf.dexlib2.iface.debug.RestartLocal;
+
+import javax.annotation.Nullable;
+
+public class BuilderRestartLocal extends BuilderDebugItem implements RestartLocal {
+    private final int register;
+
+    public BuilderRestartLocal(int register) {
+        this.register = register;
+    }
+
+    @Override public int getRegister() { return register; }
+    @Nullable @Override public String getName() { return null; }
+    @Nullable @Override public String getType() { return null; }
+    @Nullable @Override public String getSignature() { return null; }
+
+    @Override public int getDebugItemType() { return DebugItemType.RESTART_LOCAL; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/debug/BuilderSetSourceFile.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/debug/BuilderSetSourceFile.java
new file mode 100644
index 0000000..562d560
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/debug/BuilderSetSourceFile.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.debug;
+
+import org.jf.dexlib2.DebugItemType;
+import org.jf.dexlib2.builder.BuilderDebugItem;
+import org.jf.dexlib2.iface.debug.SetSourceFile;
+import org.jf.dexlib2.iface.reference.StringReference;
+
+import javax.annotation.Nullable;
+
+public class BuilderSetSourceFile extends BuilderDebugItem implements SetSourceFile {
+    @Nullable
+    private final StringReference sourceFile;
+
+    public BuilderSetSourceFile(@Nullable StringReference sourceFile) {
+        this.sourceFile = sourceFile;
+    }
+
+    @Override public int getDebugItemType() { return DebugItemType.SET_SOURCE_FILE; }
+
+    @Nullable @Override public String getSourceFile() {
+        return sourceFile==null?null:sourceFile.getString();
+    }
+
+    @Nullable @Override public StringReference getSourceFileReference() {
+        return sourceFile;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/debug/BuilderStartLocal.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/debug/BuilderStartLocal.java
new file mode 100644
index 0000000..3470d04
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/debug/BuilderStartLocal.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.debug;
+
+import org.jf.dexlib2.DebugItemType;
+import org.jf.dexlib2.builder.BuilderDebugItem;
+import org.jf.dexlib2.iface.debug.StartLocal;
+import org.jf.dexlib2.iface.reference.StringReference;
+import org.jf.dexlib2.iface.reference.TypeReference;
+
+import javax.annotation.Nullable;
+
+public class BuilderStartLocal extends BuilderDebugItem implements StartLocal {
+    private final int register;
+    @Nullable private final StringReference name;
+    @Nullable private final TypeReference type;
+    @Nullable private final StringReference signature;
+
+    public BuilderStartLocal(int register,
+                             @Nullable StringReference name,
+                             @Nullable TypeReference type,
+                             @Nullable StringReference signature) {
+        this.register = register;
+        this.name = name;
+        this.type = type;
+        this.signature = signature;
+    }
+
+    @Override public int getRegister() { return register; }
+
+    @Nullable @Override public StringReference getNameReference() { return name; }
+    @Nullable @Override public TypeReference getTypeReference() { return type; }
+    @Nullable @Override public StringReference getSignatureReference() { return signature; }
+
+    @Nullable @Override public String getName() {
+        return name==null?null:name.getString();
+    }
+
+    @Nullable @Override public String getType() {
+        return type==null?null:type.getType();
+    }
+
+    @Nullable @Override public String getSignature() {
+        return signature==null?null:signature.getString();
+    }
+
+    @Override public int getDebugItemType() { return DebugItemType.START_LOCAL; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderArrayPayload.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderArrayPayload.java
new file mode 100644
index 0000000..eb69245
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderArrayPayload.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import com.google.common.collect.ImmutableList;
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderInstruction;
+import org.jf.dexlib2.iface.instruction.formats.ArrayPayload;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.List;
+
+public class BuilderArrayPayload extends BuilderInstruction implements ArrayPayload {
+    public static final Opcode OPCODE = Opcode.ARRAY_PAYLOAD;
+
+    protected final int elementWidth;
+    @Nonnull protected final List<Number> arrayElements;
+
+    public BuilderArrayPayload(int elementWidth,
+                               @Nullable List<Number> arrayElements) {
+        super(OPCODE);
+        this.elementWidth = elementWidth;
+        this.arrayElements = arrayElements==null?ImmutableList.<Number>of():arrayElements;
+    }
+
+    @Override public int getElementWidth() { return elementWidth; }
+    @Nonnull @Override public List<Number> getArrayElements() { return arrayElements; }
+
+    @Override public int getCodeUnits() { return 4 + (elementWidth * arrayElements.size() + 1) / 2; }
+    @Override public Format getFormat() { return OPCODE.format; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction10t.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction10t.java
new file mode 100644
index 0000000..7362666
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction10t.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderOffsetInstruction;
+import org.jf.dexlib2.builder.Label;
+import org.jf.dexlib2.iface.instruction.formats.Instruction10t;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction10t extends BuilderOffsetInstruction implements Instruction10t {
+    public static final Format FORMAT = Format.Format10t;
+
+    public BuilderInstruction10t(@Nonnull Opcode opcode,
+                                 @Nonnull Label target) {
+        super(opcode, target);
+    }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction10x.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction10x.java
new file mode 100644
index 0000000..c7792b6
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction10x.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderInstruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction10x;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction10x extends BuilderInstruction implements Instruction10x {
+    public static final Format FORMAT = Format.Format10x;
+
+    public BuilderInstruction10x(@Nonnull Opcode opcode) {
+        super(opcode);
+    }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction11n.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction11n.java
new file mode 100644
index 0000000..8c77209
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction11n.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderInstruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction11n;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction11n extends BuilderInstruction implements Instruction11n {
+    public static final Format FORMAT = Format.Format11n;
+
+    protected final int registerA;
+    protected final int literal;
+
+    public BuilderInstruction11n(@Nonnull Opcode opcode,
+                                 int registerA,
+                                 int literal) {
+        super(opcode);
+        this.registerA = Preconditions.checkNibbleRegister(registerA);
+        this.literal = Preconditions.checkNibbleLiteral(literal);
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public int getNarrowLiteral() { return literal; }
+    @Override public long getWideLiteral() { return literal; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction11x.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction11x.java
new file mode 100644
index 0000000..03b3542
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction11x.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderInstruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction11x;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction11x extends BuilderInstruction implements Instruction11x {
+    public static final Format FORMAT = Format.Format11x;
+
+    protected final int registerA;
+
+    public BuilderInstruction11x(@Nonnull Opcode opcode,
+                                 int registerA) {
+        super(opcode);
+        this.registerA = Preconditions.checkByteRegister(registerA);
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction12x.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction12x.java
new file mode 100644
index 0000000..a285aae
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction12x.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderInstruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction12x;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction12x extends BuilderInstruction implements Instruction12x {
+    public static final Format FORMAT = Format.Format12x;
+
+    protected final int registerA;
+    protected final int registerB;
+
+    public BuilderInstruction12x(@Nonnull Opcode opcode,
+                                 int registerA,
+                                 int registerB) {
+        super(opcode);
+        this.registerA = Preconditions.checkNibbleRegister(registerA);
+        this.registerB = Preconditions.checkNibbleRegister(registerB);
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public int getRegisterB() { return registerB; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction20bc.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction20bc.java
new file mode 100644
index 0000000..55f2d48
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction20bc.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.ReferenceType;
+import org.jf.dexlib2.builder.BuilderInstruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction20bc;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction20bc extends BuilderInstruction implements Instruction20bc {
+    public static final Format FORMAT = Format.Format20bc;
+
+    protected final int verificationError;
+    @Nonnull protected final Reference reference;
+
+    public BuilderInstruction20bc(@Nonnull Opcode opcode,
+                                    int verificationError,
+                                    @Nonnull Reference reference) {
+        super(opcode);
+        this.verificationError = Preconditions.checkVerificationError(verificationError);
+        this.reference = reference;
+    }
+
+    @Override public int getVerificationError() { return verificationError; }
+    @Nonnull @Override public Reference getReference() { return reference; }
+    @Override public int getReferenceType() { return ReferenceType.getReferenceType(reference); }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction20t.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction20t.java
new file mode 100644
index 0000000..a1e983a
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction20t.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderOffsetInstruction;
+import org.jf.dexlib2.builder.Label;
+import org.jf.dexlib2.iface.instruction.formats.Instruction20t;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction20t extends BuilderOffsetInstruction implements Instruction20t {
+    public static final Format FORMAT = Format.Format20t;
+
+    public BuilderInstruction20t(@Nonnull Opcode opcode,
+                                 @Nonnull Label target) {
+        super(opcode, target);
+    }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction21c.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction21c.java
new file mode 100644
index 0000000..4e23832
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction21c.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderInstruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction21c;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction21c extends BuilderInstruction implements Instruction21c {
+    public static final Format FORMAT = Format.Format21c;
+
+    protected final int registerA;
+    @Nonnull protected final Reference reference;
+
+    public BuilderInstruction21c(@Nonnull Opcode opcode,
+                                 int registerA,
+                                 @Nonnull Reference reference) {
+        super(opcode);
+        this.registerA = Preconditions.checkByteRegister(registerA);
+        this.reference = reference;
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Nonnull @Override public Reference getReference() { return reference; }
+    @Override public int getReferenceType() { return opcode.referenceType; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction21ih.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction21ih.java
new file mode 100644
index 0000000..916782c
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction21ih.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderInstruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction21ih;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction21ih extends BuilderInstruction implements Instruction21ih {
+    public static final Format FORMAT = Format.Format21ih;
+
+    protected final int registerA;
+    protected final int literal;
+
+    public BuilderInstruction21ih(@Nonnull Opcode opcode,
+                                  int registerA,
+                                  int literal) {
+        super(opcode);
+        this.registerA = Preconditions.checkByteRegister(registerA);
+        this.literal = Preconditions.checkIntegerHatLiteral(literal);
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public int getNarrowLiteral() { return literal; }
+    @Override public long getWideLiteral() { return literal; }
+    @Override public short getHatLiteral() { return (short)(literal >>> 16); }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction21lh.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction21lh.java
new file mode 100644
index 0000000..e2cd699
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction21lh.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderInstruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction21lh;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction21lh extends BuilderInstruction implements Instruction21lh {
+    public static final Format FORMAT = Format.Format21lh;
+
+    protected final int registerA;
+    protected final long literal;
+
+    public BuilderInstruction21lh(@Nonnull Opcode opcode,
+                                  int registerA,
+                                  long literal) {
+        super(opcode);
+        this.registerA = Preconditions.checkByteRegister(registerA);
+        this.literal = Preconditions.checkLongHatLiteral(literal);
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public long getWideLiteral() { return literal; }
+    @Override public short getHatLiteral() { return (short)(literal >>> 48); }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction21s.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction21s.java
new file mode 100644
index 0000000..b1c815f
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction21s.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderInstruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction21s;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction21s extends BuilderInstruction implements Instruction21s {
+    public static final Format FORMAT = Format.Format21s;
+
+    protected final int registerA;
+    protected final int literal;
+
+    public BuilderInstruction21s(@Nonnull Opcode opcode,
+                                 int registerA,
+                                 int literal) {
+        super(opcode);
+        this.registerA = Preconditions.checkByteRegister(registerA);
+        this.literal = Preconditions.checkShortLiteral(literal);
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public int getNarrowLiteral() { return literal; }
+    @Override public long getWideLiteral() { return literal; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction21t.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction21t.java
new file mode 100644
index 0000000..b77351e
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction21t.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderOffsetInstruction;
+import org.jf.dexlib2.builder.Label;
+import org.jf.dexlib2.iface.instruction.formats.Instruction21t;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction21t extends BuilderOffsetInstruction implements Instruction21t {
+    public static final Format FORMAT = Format.Format21t;
+
+    protected final int registerA;
+
+    public BuilderInstruction21t(@Nonnull Opcode opcode,
+                                 int registerA,
+                                 @Nonnull Label target) {
+        super(opcode, target);
+        this.registerA = Preconditions.checkByteRegister(registerA);
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction22b.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction22b.java
new file mode 100644
index 0000000..4d5f8b8
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction22b.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderInstruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction22b;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction22b extends BuilderInstruction implements Instruction22b {
+    public static final Format FORMAT = Format.Format22b;
+
+    protected final int registerA;
+    protected final int registerB;
+    protected final int literal;
+
+    public BuilderInstruction22b(@Nonnull Opcode opcode,
+                                 int registerA,
+                                 int registerB,
+                                 int literal) {
+        super(opcode);
+        this.registerA = Preconditions.checkByteRegister(registerA);
+        this.registerB = Preconditions.checkByteRegister(registerB);
+        this.literal = Preconditions.checkByteLiteral(literal);
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public int getRegisterB() { return registerB; }
+    @Override public int getNarrowLiteral() { return literal; }
+    @Override public long getWideLiteral() { return literal; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction22c.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction22c.java
new file mode 100644
index 0000000..9c5f930
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction22c.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderInstruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction22c;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction22c extends BuilderInstruction implements Instruction22c {
+    public static final Format FORMAT = Format.Format22c;
+
+    protected final int registerA;
+    protected final int registerB;
+    @Nonnull protected final Reference reference;
+
+    public BuilderInstruction22c(@Nonnull Opcode opcode,
+                                 int registerA,
+                                 int registerB,
+                                 @Nonnull Reference reference) {
+        super(opcode);
+        this.registerA = Preconditions.checkNibbleRegister(registerA);
+        this.registerB = Preconditions.checkNibbleRegister(registerB);
+        this.reference = reference;
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public int getRegisterB() { return registerB; }
+    @Nonnull @Override public Reference getReference() { return reference; }
+    @Override public int getReferenceType() { return opcode.referenceType; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
\ No newline at end of file
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction22cs.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction22cs.java
new file mode 100644
index 0000000..e43f39d
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction22cs.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderInstruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction22c;
+import org.jf.dexlib2.iface.instruction.formats.Instruction22cs;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction22cs extends BuilderInstruction implements Instruction22cs {
+    public static final Format FORMAT = Format.Format22cs;
+
+    protected final int registerA;
+    protected final int registerB;
+    protected final int fieldOffset;
+
+    public BuilderInstruction22cs(@Nonnull Opcode opcode,
+                                  int registerA,
+                                  int registerB,
+                                  int fieldOffset) {
+        super(opcode);
+        this.registerA = Preconditions.checkNibbleRegister(registerA);
+        this.registerB = Preconditions.checkNibbleRegister(registerB);
+        this.fieldOffset = fieldOffset;
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public int getRegisterB() { return registerB; }
+    @Override public int getFieldOffset() { return fieldOffset; }
+    @Override public Format getFormat() { return FORMAT; }
+}
\ No newline at end of file
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction22s.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction22s.java
new file mode 100644
index 0000000..9fea0d5
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction22s.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderInstruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction22s;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction22s extends BuilderInstruction implements Instruction22s {
+    public static final Format FORMAT = Format.Format22s;
+
+    protected final int registerA;
+    protected final int registerB;
+    protected final int literal;
+
+    public BuilderInstruction22s(@Nonnull Opcode opcode,
+                                 int registerA,
+                                 int registerB,
+                                 int literal) {
+        super(opcode);
+        this.registerA = Preconditions.checkNibbleRegister(registerA);
+        this.registerB = Preconditions.checkNibbleRegister(registerB);
+        this.literal = Preconditions.checkShortLiteral(literal);
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public int getRegisterB() { return registerB; }
+    @Override public int getNarrowLiteral() { return literal; }
+    @Override public long getWideLiteral() { return literal; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
\ No newline at end of file
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction22t.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction22t.java
new file mode 100644
index 0000000..85f7c48
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction22t.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderOffsetInstruction;
+import org.jf.dexlib2.builder.Label;
+import org.jf.dexlib2.iface.instruction.formats.Instruction22t;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction22t extends BuilderOffsetInstruction implements Instruction22t {
+    public static final Format FORMAT = Format.Format22t;
+
+    protected final int registerA;
+    protected final int registerB;
+
+    public BuilderInstruction22t(@Nonnull Opcode opcode,
+                                 int registerA,
+                                 int registerB,
+                                 @Nonnull Label target) {
+        super(opcode, target);
+        this.registerA = Preconditions.checkNibbleRegister(registerA);
+        this.registerB = Preconditions.checkNibbleRegister(registerB);
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public int getRegisterB() { return registerB; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction22x.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction22x.java
new file mode 100644
index 0000000..878bc94
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction22x.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderInstruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction22x;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction22x extends BuilderInstruction implements Instruction22x {
+    public static final Format FORMAT = Format.Format22x;
+
+    protected final int registerA;
+    protected final int registerB;
+
+    public BuilderInstruction22x(@Nonnull Opcode opcode,
+                                 int registerA,
+                                 int registerB) {
+        super(opcode);
+        this.registerA = Preconditions.checkByteRegister(registerA);
+        this.registerB = Preconditions.checkShortRegister(registerB);
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public int getRegisterB() { return registerB; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction23x.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction23x.java
new file mode 100644
index 0000000..9454e16
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction23x.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderInstruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction23x;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction23x extends BuilderInstruction implements Instruction23x {
+    public static final Format FORMAT = Format.Format23x;
+
+    protected final int registerA;
+    protected final int registerB;
+    protected final int registerC;
+
+    public BuilderInstruction23x(@Nonnull Opcode opcode,
+                                 int registerA,
+                                 int registerB,
+                                 int registerC) {
+        super(opcode);
+        this.registerA = Preconditions.checkByteRegister(registerA);
+        this.registerB = Preconditions.checkByteRegister(registerB);
+        this.registerC = Preconditions.checkByteRegister(registerC);
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public int getRegisterB() { return registerB; }
+    @Override public int getRegisterC() { return registerC; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction30t.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction30t.java
new file mode 100644
index 0000000..acaec60
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction30t.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderOffsetInstruction;
+import org.jf.dexlib2.builder.Label;
+import org.jf.dexlib2.iface.instruction.formats.Instruction30t;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction30t extends BuilderOffsetInstruction implements Instruction30t {
+    public static final Format FORMAT = Format.Format30t;
+
+    public BuilderInstruction30t(@Nonnull Opcode opcode,
+                                 @Nonnull Label target) {
+        super(opcode, target);
+    }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
+
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction31c.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction31c.java
new file mode 100644
index 0000000..e4b1828
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction31c.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderInstruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction31c;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction31c extends BuilderInstruction implements Instruction31c {
+    public static final Format FORMAT = Format.Format31c;
+
+    protected final int registerA;
+    @Nonnull protected final Reference reference;
+
+    public BuilderInstruction31c(@Nonnull Opcode opcode,
+                                 int registerA,
+                                 @Nonnull Reference reference) {
+        super(opcode);
+        this.registerA = Preconditions.checkByteRegister(registerA);
+        this.reference = reference;
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Nonnull @Override public Reference getReference() { return reference; }
+    @Override public int getReferenceType() { return opcode.referenceType; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction31i.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction31i.java
new file mode 100644
index 0000000..db151d0
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction31i.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderInstruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction31i;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction31i extends BuilderInstruction implements Instruction31i {
+    public static final Format FORMAT = Format.Format31i;
+
+    protected final int registerA;
+    protected final int literal;
+
+    public BuilderInstruction31i(@Nonnull Opcode opcode,
+                                 int registerA,
+                                 int literal) {
+        super(opcode);
+        this.registerA = Preconditions.checkByteRegister(registerA);
+        this.literal = literal;
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public int getNarrowLiteral() { return literal; }
+    @Override public long getWideLiteral() { return literal; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction31t.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction31t.java
new file mode 100644
index 0000000..c969cf2
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction31t.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderOffsetInstruction;
+import org.jf.dexlib2.builder.Label;
+import org.jf.dexlib2.iface.instruction.formats.Instruction31t;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction31t extends BuilderOffsetInstruction implements Instruction31t {
+    public static final Format FORMAT = Format.Format31t;
+
+    protected final int registerA;
+
+    public BuilderInstruction31t(@Nonnull Opcode opcode,
+                                 int registerA,
+                                 @Nonnull Label target) {
+        super(opcode, target);
+        this.registerA = Preconditions.checkByteRegister(registerA);
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
+
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction32x.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction32x.java
new file mode 100644
index 0000000..c67f926
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction32x.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderInstruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction32x;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction32x extends BuilderInstruction implements Instruction32x {
+    public static final Format FORMAT = Format.Format32x;
+
+    protected final int registerA;
+    protected final int registerB;
+
+    public BuilderInstruction32x(@Nonnull Opcode opcode,
+                                 int registerA,
+                                 int registerB) {
+        super(opcode);
+        this.registerA = Preconditions.checkShortRegister(registerA);
+        this.registerB = Preconditions.checkShortRegister(registerB);
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public int getRegisterB() { return registerB; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction35c.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction35c.java
new file mode 100644
index 0000000..5ec58a9
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction35c.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderInstruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction35c;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction35c extends BuilderInstruction implements Instruction35c {
+    public static final Format FORMAT = Format.Format35c;
+
+    protected final int registerCount;
+    protected final int registerC;
+    protected final int registerD;
+    protected final int registerE;
+    protected final int registerF;
+    protected final int registerG;
+    @Nonnull protected final Reference reference;
+
+    public BuilderInstruction35c(@Nonnull Opcode opcode,
+                                 int registerCount,
+                                 int registerC,
+                                 int registerD,
+                                 int registerE,
+                                 int registerF,
+                                 int registerG,
+                                 @Nonnull Reference reference) {
+        super(opcode);
+        this.registerCount = Preconditions.check35cAnd45ccRegisterCount(registerCount);
+        this.registerC = (registerCount>0) ? Preconditions.checkNibbleRegister(registerC) : 0;
+        this.registerD = (registerCount>1) ? Preconditions.checkNibbleRegister(registerD) : 0;
+        this.registerE = (registerCount>2) ? Preconditions.checkNibbleRegister(registerE) : 0;
+        this.registerF = (registerCount>3) ? Preconditions.checkNibbleRegister(registerF) : 0;
+        this.registerG = (registerCount>4) ? Preconditions.checkNibbleRegister(registerG) : 0;
+        this.reference = reference;
+    }
+
+    @Override public int getRegisterCount() { return registerCount; }
+    @Override public int getRegisterC() { return registerC; }
+    @Override public int getRegisterD() { return registerD; }
+    @Override public int getRegisterE() { return registerE; }
+    @Override public int getRegisterF() { return registerF; }
+    @Override public int getRegisterG() { return registerG; }
+    @Nonnull @Override public Reference getReference() { return reference; }
+    @Override public int getReferenceType() { return opcode.referenceType; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction35mi.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction35mi.java
new file mode 100644
index 0000000..43aed78
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction35mi.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderInstruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction35mi;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction35mi extends BuilderInstruction implements Instruction35mi {
+    public static final Format FORMAT = Format.Format35mi;
+
+    protected final int registerCount;
+    protected final int registerC;
+    protected final int registerD;
+    protected final int registerE;
+    protected final int registerF;
+    protected final int registerG;
+    protected final int inlineIndex;
+
+    public BuilderInstruction35mi(@Nonnull Opcode opcode,
+                                  int registerCount,
+                                  int registerC,
+                                  int registerD,
+                                  int registerE,
+                                  int registerF,
+                                  int registerG,
+                                  int inlineIndex) {
+        super(opcode);
+        this.registerCount = Preconditions.check35cAnd45ccRegisterCount(registerCount);
+        this.registerC = (registerCount>0) ? Preconditions.checkNibbleRegister(registerC) : 0;
+        this.registerD = (registerCount>1) ? Preconditions.checkNibbleRegister(registerD) : 0;
+        this.registerE = (registerCount>2) ? Preconditions.checkNibbleRegister(registerE) : 0;
+        this.registerF = (registerCount>3) ? Preconditions.checkNibbleRegister(registerF) : 0;
+        this.registerG = (registerCount>4) ? Preconditions.checkNibbleRegister(registerG) : 0;
+        this.inlineIndex = inlineIndex;
+    }
+
+    @Override public int getRegisterCount() { return registerCount; }
+    @Override public int getRegisterC() { return registerC; }
+    @Override public int getRegisterD() { return registerD; }
+    @Override public int getRegisterE() { return registerE; }
+    @Override public int getRegisterF() { return registerF; }
+    @Override public int getRegisterG() { return registerG; }
+    @Override public int getInlineIndex() { return inlineIndex; }
+    @Override public Format getFormat() { return FORMAT; }
+
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction35ms.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction35ms.java
new file mode 100644
index 0000000..824dbd8
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction35ms.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderInstruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction35ms;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction35ms extends BuilderInstruction implements Instruction35ms {
+    public static final Format FORMAT = Format.Format35ms;
+
+    protected final int registerCount;
+    protected final int registerC;
+    protected final int registerD;
+    protected final int registerE;
+    protected final int registerF;
+    protected final int registerG;
+    protected final int vtableIndex;
+
+    public BuilderInstruction35ms(@Nonnull Opcode opcode,
+                                  int registerCount,
+                                  int registerC,
+                                  int registerD,
+                                  int registerE,
+                                  int registerF,
+                                  int registerG,
+                                  int vtableIndex) {
+        super(opcode);
+        this.registerCount = Preconditions.check35cAnd45ccRegisterCount(registerCount);
+        this.registerC = (registerCount>0) ? Preconditions.checkNibbleRegister(registerC) : 0;
+        this.registerD = (registerCount>1) ? Preconditions.checkNibbleRegister(registerD) : 0;
+        this.registerE = (registerCount>2) ? Preconditions.checkNibbleRegister(registerE) : 0;
+        this.registerF = (registerCount>3) ? Preconditions.checkNibbleRegister(registerF) : 0;
+        this.registerG = (registerCount>4) ? Preconditions.checkNibbleRegister(registerG) : 0;
+        this.vtableIndex = vtableIndex;
+    }
+
+    @Override public int getRegisterCount() { return registerCount; }
+    @Override public int getRegisterC() { return registerC; }
+    @Override public int getRegisterD() { return registerD; }
+    @Override public int getRegisterE() { return registerE; }
+    @Override public int getRegisterF() { return registerF; }
+    @Override public int getRegisterG() { return registerG; }
+    @Override public int getVtableIndex() { return vtableIndex; }
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction3rc.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction3rc.java
new file mode 100644
index 0000000..388dc37
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction3rc.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderInstruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction3rc;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction3rc extends BuilderInstruction implements Instruction3rc {
+    public static final Format FORMAT = Format.Format3rc;
+
+    protected final int startRegister;
+    protected final int registerCount;
+
+    @Nonnull protected final Reference reference;
+
+    public BuilderInstruction3rc(@Nonnull Opcode opcode,
+                                 int startRegister,
+                                 int registerCount,
+                                 @Nonnull Reference reference) {
+        super(opcode);
+        this.startRegister = Preconditions.checkShortRegister(startRegister);
+        this.registerCount = Preconditions.checkRegisterRangeCount(registerCount);
+        this.reference = reference;
+    }
+
+    @Override public int getStartRegister() { return startRegister; }
+    @Override public int getRegisterCount() { return registerCount; }
+    @Nonnull @Override public Reference getReference() { return reference; }
+    @Override public int getReferenceType() { return opcode.referenceType; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
+
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction3rmi.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction3rmi.java
new file mode 100644
index 0000000..1df7b30
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction3rmi.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderInstruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction3rmi;
+import org.jf.dexlib2.iface.instruction.formats.Instruction3rms;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction3rmi extends BuilderInstruction implements Instruction3rmi {
+    public static final Format FORMAT = Format.Format3rmi;
+
+    protected final int startRegister;
+    protected final int registerCount;
+    protected final int inlineIndex;
+
+    public BuilderInstruction3rmi(@Nonnull Opcode opcode,
+                                  int startRegister,
+                                  int registerCount,
+                                  int inlineIndex) {
+        super(opcode);
+        this.startRegister = Preconditions.checkShortRegister(startRegister);
+        this.registerCount = Preconditions.checkRegisterRangeCount(registerCount);
+        this.inlineIndex = inlineIndex;
+    }
+
+    @Override public int getStartRegister() { return startRegister; }
+    @Override public int getRegisterCount() { return registerCount; }
+    @Override public int getInlineIndex() { return inlineIndex; }
+    @Override public Format getFormat() { return FORMAT; }
+}
+
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction3rms.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction3rms.java
new file mode 100644
index 0000000..bd73901
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction3rms.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderInstruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction3rc;
+import org.jf.dexlib2.iface.instruction.formats.Instruction3rms;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction3rms extends BuilderInstruction implements Instruction3rms {
+    public static final Format FORMAT = Format.Format3rms;
+
+    protected final int startRegister;
+    protected final int registerCount;
+    protected final int vtableIndex;
+
+    public BuilderInstruction3rms(@Nonnull Opcode opcode,
+                                  int startRegister,
+                                  int registerCount,
+                                  int vtableIndex) {
+        super(opcode);
+        this.startRegister = Preconditions.checkShortRegister(startRegister);
+        this.registerCount = Preconditions.checkRegisterRangeCount(registerCount);
+        this.vtableIndex = vtableIndex;
+    }
+
+    @Override public int getStartRegister() { return startRegister; }
+    @Override public int getRegisterCount() { return registerCount; }
+    @Override public int getVtableIndex() { return vtableIndex; }
+    @Override public Format getFormat() { return FORMAT; }
+}
+
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction45cc.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction45cc.java
new file mode 100644
index 0000000..b0e3f42
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction45cc.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderInstruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction45cc;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction45cc extends BuilderInstruction implements Instruction45cc {
+    public static final Format FORMAT = Format.Format45cc;
+
+    protected final int registerCount;
+    protected final int registerC;
+    protected final int registerD;
+    protected final int registerE;
+    protected final int registerF;
+    protected final int registerG;
+    @Nonnull protected final Reference reference;
+    @Nonnull protected final Reference reference2;
+
+    public BuilderInstruction45cc(@Nonnull Opcode opcode,
+                                  int registerCount,
+                                  int registerC,
+                                  int registerD,
+                                  int registerE,
+                                  int registerF,
+                                  int registerG,
+                                  @Nonnull Reference reference,
+                                  @Nonnull Reference reference2) {
+        super(opcode);
+        this.registerCount = Preconditions.check35cAnd45ccRegisterCount(registerCount);
+        this.registerC = (registerCount>0) ? Preconditions.checkNibbleRegister(registerC) : 0;
+        this.registerD = (registerCount>1) ? Preconditions.checkNibbleRegister(registerD) : 0;
+        this.registerE = (registerCount>2) ? Preconditions.checkNibbleRegister(registerE) : 0;
+        this.registerF = (registerCount>3) ? Preconditions.checkNibbleRegister(registerF) : 0;
+        this.registerG = (registerCount>4) ? Preconditions.checkNibbleRegister(registerG) : 0;
+        this.reference = reference;
+        this.reference2 = reference2;
+    }
+
+    @Override public int getRegisterCount() { return registerCount; }
+    @Override public int getRegisterC() { return registerC; }
+    @Override public int getRegisterD() { return registerD; }
+    @Override public int getRegisterE() { return registerE; }
+    @Override public int getRegisterF() { return registerF; }
+    @Override public int getRegisterG() { return registerG; }
+    @Nonnull @Override public Reference getReference() { return reference; }
+    @Override public int getReferenceType() { return opcode.referenceType; }
+    @Nonnull @Override public Reference getReference2() { return reference2; }
+    @Override public int getReferenceType2() { return opcode.referenceType2; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction4rcc.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction4rcc.java
new file mode 100644
index 0000000..3ee7ef9
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction4rcc.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderInstruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction4rcc;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction4rcc extends BuilderInstruction implements Instruction4rcc {
+    public static final Format FORMAT = Format.Format4rcc;
+
+    protected final int startRegister;
+    protected final int registerCount;
+
+    @Nonnull protected final Reference reference;
+    @Nonnull protected final Reference reference2;
+
+    public BuilderInstruction4rcc(@Nonnull Opcode opcode,
+                                  int startRegister,
+                                  int registerCount,
+                                  @Nonnull Reference reference,
+                                  @Nonnull Reference reference2) {
+        super(opcode);
+        this.startRegister = Preconditions.checkShortRegister(startRegister);
+        this.registerCount = Preconditions.checkRegisterRangeCount(registerCount);
+        this.reference = reference;
+        this.reference2 = reference2;
+    }
+
+    @Override public int getStartRegister() { return startRegister; }
+    @Override public int getRegisterCount() { return registerCount; }
+    @Nonnull @Override public Reference getReference() { return reference; }
+    @Override public int getReferenceType() { return opcode.referenceType; }
+    @Nonnull @Override public Reference getReference2() { return reference2; }
+    @Override public int getReferenceType2() { return opcode.referenceType2; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction51l.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction51l.java
new file mode 100644
index 0000000..0dd80b7
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderInstruction51l.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderInstruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction51l;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class BuilderInstruction51l extends BuilderInstruction implements Instruction51l {
+    public static final Format FORMAT = Format.Format51l;
+
+    protected final int registerA;
+    protected final long literal;
+
+    public BuilderInstruction51l(@Nonnull Opcode opcode,
+                                 int registerA,
+                                 long literal) {
+        super(opcode);
+        this.registerA = Preconditions.checkByteRegister(registerA);
+        this.literal = literal;
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public long getWideLiteral() { return literal; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderPackedSwitchPayload.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderPackedSwitchPayload.java
new file mode 100644
index 0000000..de74e4a
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderPackedSwitchPayload.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderSwitchPayload;
+import org.jf.dexlib2.builder.Label;
+import org.jf.dexlib2.iface.instruction.formats.PackedSwitchPayload;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.List;
+
+public class BuilderPackedSwitchPayload extends BuilderSwitchPayload implements PackedSwitchPayload {
+    public static final Opcode OPCODE = Opcode.PACKED_SWITCH_PAYLOAD;
+
+    @Nonnull protected final List<BuilderSwitchElement> switchElements;
+
+    public BuilderPackedSwitchPayload(final int startKey,
+                                      @Nullable List<? extends Label> switchElements) {
+        super(OPCODE);
+        if (switchElements == null) {
+            this.switchElements = ImmutableList.of();
+        } else {
+            this.switchElements = Lists.newArrayList();
+            int key = startKey;
+            for (Label target: switchElements) {
+                this.switchElements.add(new BuilderSwitchElement(this, key++, target));
+            }
+        }
+    }
+
+    @Nonnull @Override public List<BuilderSwitchElement> getSwitchElements() { return switchElements; }
+
+    @Override public int getCodeUnits() { return 4 + switchElements.size() * 2; }
+    @Override public Format getFormat() { return OPCODE.format; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderSparseSwitchPayload.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderSparseSwitchPayload.java
new file mode 100644
index 0000000..c05f7d8
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderSparseSwitchPayload.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder.instruction;
+
+import com.google.common.base.Function;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.BuilderSwitchPayload;
+import org.jf.dexlib2.builder.SwitchLabelElement;
+import org.jf.dexlib2.iface.instruction.formats.SparseSwitchPayload;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.List;
+
+public class BuilderSparseSwitchPayload extends BuilderSwitchPayload implements SparseSwitchPayload {
+    public static final Opcode OPCODE = Opcode.SPARSE_SWITCH_PAYLOAD;
+
+    @Nonnull protected final List<BuilderSwitchElement> switchElements;
+
+    public BuilderSparseSwitchPayload(@Nullable List<? extends SwitchLabelElement> switchElements) {
+        super(OPCODE);
+        if (switchElements == null) {
+            this.switchElements = ImmutableList.of();
+        } else {
+            this.switchElements = Lists.transform(switchElements, new Function<SwitchLabelElement, BuilderSwitchElement>() {
+                @Nullable @Override public BuilderSwitchElement apply(@Nullable SwitchLabelElement element) {
+                    assert element != null;
+                    return new BuilderSwitchElement(BuilderSparseSwitchPayload.this, element.key, element.target);
+                }
+            });
+        }
+    }
+
+    @Nonnull @Override public List<BuilderSwitchElement> getSwitchElements() { return switchElements; }
+
+    @Override public int getCodeUnits() { return 2 + switchElements.size() * 4; }
+    @Override public Format getFormat() { return OPCODE.format; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderSwitchElement.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderSwitchElement.java
new file mode 100644
index 0000000..8bf9465
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderSwitchElement.java
@@ -0,0 +1,34 @@
+package org.jf.dexlib2.builder.instruction;
+
+import org.jf.dexlib2.builder.BuilderSwitchPayload;
+import org.jf.dexlib2.builder.Label;
+import org.jf.dexlib2.iface.instruction.SwitchElement;
+
+import javax.annotation.Nonnull;
+
+public class BuilderSwitchElement implements SwitchElement {
+    @Nonnull BuilderSwitchPayload parent;
+    private final int key;
+    @Nonnull private final Label target;
+
+    public BuilderSwitchElement(@Nonnull BuilderSwitchPayload parent,
+                                int key,
+                                @Nonnull Label target) {
+        this.parent = parent;
+        this.key = key;
+        this.target = target;
+    }
+
+    @Override public int getKey() {
+        return key;
+    }
+
+    @Override public int getOffset() {
+        return target.getCodeAddress() - parent.getReferrer().getCodeAddress();
+    }
+
+    @Nonnull
+    public Label getTarget() {
+        return target;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/CDexBackedDexFile.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/CDexBackedDexFile.java
new file mode 100644
index 0000000..f26abe3
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/CDexBackedDexFile.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2019, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked;
+
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.dexbacked.raw.CdexHeaderItem;
+import org.jf.dexlib2.dexbacked.raw.HeaderItem;
+import org.jf.dexlib2.util.DexUtil;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.UnsupportedEncodingException;
+
+public class CDexBackedDexFile extends DexBackedDexFile {
+    public CDexBackedDexFile(@Nullable Opcodes opcodes, @Nonnull byte[] buf, int offset, boolean verifyMagic) {
+        super(opcodes, buf, offset, verifyMagic);
+    }
+
+    public CDexBackedDexFile(@Nullable Opcodes opcodes, @Nonnull DexBuffer buf) {
+        super(opcodes, buf);
+    }
+
+    public CDexBackedDexFile(@Nullable Opcodes opcodes, @Nonnull byte[] buf, int offset) {
+        super(opcodes, buf, offset);
+    }
+
+    public CDexBackedDexFile(@Nullable Opcodes opcodes, @Nonnull byte[] buf) {
+        super(opcodes, buf);
+    }
+
+    public static boolean isCdex(byte[] buf, int offset) {
+        if (offset + 4 > buf.length) {
+            return false;
+        }
+
+        byte[] cdexMagic;
+        try {
+            cdexMagic = "cdex".getBytes("US-ASCII");
+        } catch (UnsupportedEncodingException ex) {
+            throw new RuntimeException(ex);
+        }
+        return buf[offset] == cdexMagic[0] &&
+                buf[offset+1] == cdexMagic[1] &&
+                buf[offset+2] == cdexMagic[2] &&
+                buf[offset+3] == cdexMagic[3];
+    }
+
+    @Override
+    protected int getVersion(byte[] buf, int offset, boolean verifyMagic) {
+        if (verifyMagic) {
+            return DexUtil.verifyCdexHeader(buf, offset);
+        } else {
+            return CdexHeaderItem.getVersion(buf, offset);
+        }
+    }
+
+    @Override
+    protected Opcodes getDefaultOpcodes(int version) {
+        // There is currently only 1 possible cdex version, which was introduced in api 28.
+        return Opcodes.forApi(28);
+    }
+
+    @Override
+    public int getBaseDataOffset() {
+        return getBuffer().readSmallUint(HeaderItem.DATA_START_OFFSET);
+    }
+
+    public int getDebugInfoOffsetsPos() {
+        return getBuffer().readSmallUint(CdexHeaderItem.DEBUG_INFO_OFFSETS_POS_OFFSET);
+    }
+
+    public int getDebugInfoOffsetsTableOffset() {
+        return getBuffer().readSmallUint(CdexHeaderItem.DEBUG_INFO_OFFSETS_TABLE_OFFSET);
+    }
+
+    public int getDebugInfoBase() {
+        return getBuffer().readSmallUint(CdexHeaderItem.DEBUG_INFO_BASE);
+    }
+
+    @Override
+    protected DexBackedMethodImplementation createMethodImplementation(
+            @Nonnull DexBackedDexFile dexFile, @Nonnull DexBackedMethod method, int codeOffset) {
+        return new CDexBackedMethodImplementation(dexFile, method, codeOffset);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/CDexBackedMethodImplementation.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/CDexBackedMethodImplementation.java
new file mode 100644
index 0000000..62d529e
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/CDexBackedMethodImplementation.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright 2019, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked;
+
+import javax.annotation.Nonnull;
+
+import static org.jf.dexlib2.dexbacked.raw.CodeItem.*;
+
+public class CDexBackedMethodImplementation extends DexBackedMethodImplementation {
+
+    public CDexBackedMethodImplementation(
+            @Nonnull DexBackedDexFile dexFile, @Nonnull DexBackedMethod method, int codeOffset) {
+        super(dexFile, method, codeOffset);
+    }
+
+    public int getInsCount() {
+        int insCount = (dexFile.getDataBuffer().readUshort(codeOffset) >> CDEX_INS_COUNT_SHIFT) & 0xf;
+
+        if ((getPreheaderFlags() & CDEX_PREHEADER_FLAG_INS_COUNT) != 0) {
+            int preheaderCount = 1;
+
+            if ((getPreheaderFlags() & CDEX_PREHEADER_FLAG_INSTRUCTIONS_SIZE) != 0) {
+                preheaderCount+=2;
+            }
+            if ((getPreheaderFlags() & CDEX_PREHEADER_FLAG_REGISTER_COUNT) != 0) {
+                preheaderCount++;
+            }
+            insCount += dexFile.getDataBuffer().readUshort(codeOffset - 2 * preheaderCount);
+        }
+        return insCount;
+    }
+
+    @Override
+    public int getRegisterCount() {
+        int registerCount = (dexFile.getDataBuffer().readUshort(codeOffset) >> CDEX_REGISTER_COUNT_SHIFT) & 0xf;
+
+        registerCount += getInsCount();
+        if ((getPreheaderFlags() & CDEX_PREHEADER_FLAG_REGISTER_COUNT) != 0) {
+            int preheaderCount = 1;
+            if ((getPreheaderFlags() & CDEX_PREHEADER_FLAG_INSTRUCTIONS_SIZE) > 0) {
+                preheaderCount += 2;
+            }
+            registerCount += dexFile.getDataBuffer().readUshort(codeOffset - 2 * preheaderCount);
+        }
+        return registerCount;
+    }
+
+    @Override
+    protected int getInstructionsSize() {
+        int instructionsSize = dexFile.getDataBuffer().readUshort(
+                codeOffset + CDEX_INSTRUCTIONS_SIZE_AND_PREHEADER_FLAGS_OFFSET) >>
+                CDEX_INSTRUCTIONS_SIZE_SHIFT;
+
+        if ((getPreheaderFlags() & CDEX_PREHEADER_FLAG_INSTRUCTIONS_SIZE) != 0) {
+            instructionsSize += dexFile.getDataBuffer().readUshort(codeOffset - 2);
+            instructionsSize += dexFile.getDataBuffer().readUshort(codeOffset - 4) << 16;
+        }
+        return instructionsSize;
+    }
+
+    @Override
+    protected int getInstructionsStartOffset() {
+        return codeOffset + 4;
+    }
+
+    private int getPreheaderFlags() {
+        return dexFile.getDataBuffer().readUshort(codeOffset + CDEX_INSTRUCTIONS_SIZE_AND_PREHEADER_FLAGS_OFFSET) &
+                CDEX_PREHEADER_FLAGS_MASK;
+    }
+
+    @Override
+    protected int getTriesSize() {
+        int triesCount = (dexFile.getDataBuffer().readUshort(codeOffset) >> CDEX_TRIES_SIZE_SHIFT) & 0xf;
+        if ((getPreheaderFlags() & CDEX_PREHEADER_FLAG_TRIES_COUNT) != 0) {
+            int preheaderCount = Integer.bitCount(getPreheaderFlags());
+            if ((getPreheaderFlags() & CDEX_PREHEADER_FLAG_INSTRUCTIONS_SIZE) != 0) {
+                // The instructions size preheader is 2 shorts
+                preheaderCount++;
+            }
+            triesCount += dexFile.getDataBuffer().readUshort(codeOffset - 2 * preheaderCount);
+        }
+        return triesCount;
+    }
+
+    @Override
+    protected int getDebugOffset() {
+        CDexBackedDexFile cdexFile = ((CDexBackedDexFile) dexFile);
+
+        int debugTableItemOffset = (method.methodIndex / 16) * 4;
+        int bitIndex = method.methodIndex % 16;
+
+        int debugInfoOffsetsPos = cdexFile.getDebugInfoOffsetsPos();
+        int debugTableOffset = debugInfoOffsetsPos + cdexFile.getDebugInfoOffsetsTableOffset();
+
+        int debugOffsetsOffset = cdexFile.getDataBuffer().readSmallUint(debugTableOffset + debugTableItemOffset);
+
+        DexReader reader = cdexFile.getDataBuffer().readerAt(debugInfoOffsetsPos + debugOffsetsOffset);
+
+        int bitMask = reader.readUbyte() << 8;
+        bitMask += reader.readUbyte();
+
+        if ((bitMask & (1 << bitIndex)) == 0) {
+            return 0;
+        }
+
+        int offsetCount = Integer.bitCount(bitMask & 0xFFFF >> (16-bitIndex));
+        int baseDebugOffset = cdexFile.getDebugInfoBase();
+        for (int i=0; i<offsetCount; i++) {
+            baseDebugOffset += reader.readBigUleb128();
+        }
+        baseDebugOffset += reader.readBigUleb128();
+        return baseDebugOffset;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedAnnotation.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedAnnotation.java
new file mode 100644
index 0000000..dec1816
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedAnnotation.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked;
+
+import org.jf.dexlib2.base.BaseAnnotation;
+import org.jf.dexlib2.dexbacked.util.VariableSizeSet;
+
+import javax.annotation.Nonnull;
+import java.util.Set;
+
+public class DexBackedAnnotation extends BaseAnnotation {
+    @Nonnull public final DexBackedDexFile dexFile;
+
+    public final int visibility;
+    public final int typeIndex;
+    private final int elementsOffset;
+
+    public DexBackedAnnotation(@Nonnull DexBackedDexFile dexFile,
+                               int annotationOffset) {
+        this.dexFile = dexFile;
+
+        DexReader reader = dexFile.getDataBuffer().readerAt(annotationOffset);
+        this.visibility = reader.readUbyte();
+        this.typeIndex = reader.readSmallUleb128();
+        this.elementsOffset = reader.getOffset();
+    }
+
+    @Override public int getVisibility() { return visibility; }
+    @Nonnull @Override public String getType() { return dexFile.getTypeSection().get(typeIndex); }
+
+    @Nonnull
+    @Override
+    public Set<? extends DexBackedAnnotationElement> getElements() {
+        DexReader reader = dexFile.getDataBuffer().readerAt(elementsOffset);
+        final int size = reader.readSmallUleb128();
+
+        return new VariableSizeSet<DexBackedAnnotationElement>(dexFile.getDataBuffer(), reader.getOffset(), size) {
+            @Nonnull
+            @Override
+            protected DexBackedAnnotationElement readNextItem(@Nonnull DexReader reader, int index) {
+                return new DexBackedAnnotationElement(dexFile, reader);
+            }
+        };
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedAnnotationElement.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedAnnotationElement.java
new file mode 100644
index 0000000..b575b6a
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedAnnotationElement.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked;
+
+import org.jf.dexlib2.base.BaseAnnotationElement;
+import org.jf.dexlib2.dexbacked.value.DexBackedEncodedValue;
+import org.jf.dexlib2.iface.value.EncodedValue;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedAnnotationElement extends BaseAnnotationElement {
+    @Nonnull private final DexBackedDexFile dexFile;
+    public final int nameIndex;
+    @Nonnull public final EncodedValue value;
+
+    public DexBackedAnnotationElement(@Nonnull DexBackedDexFile dexFile, @Nonnull DexReader reader) {
+        this.dexFile = dexFile;
+        this.nameIndex = reader.readSmallUleb128();
+        this.value = DexBackedEncodedValue.readFrom(dexFile, reader);
+    }
+
+    @Nonnull @Override public String getName() { return dexFile.getStringSection().get(nameIndex); }
+    @Nonnull @Override public EncodedValue getValue() { return value; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedCatchAllExceptionHandler.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedCatchAllExceptionHandler.java
new file mode 100644
index 0000000..36b309d
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedCatchAllExceptionHandler.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked;
+
+import org.jf.dexlib2.base.BaseExceptionHandler;
+import org.jf.dexlib2.iface.ExceptionHandler;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class DexBackedCatchAllExceptionHandler extends DexBackedExceptionHandler {
+    private final int handlerCodeAddress;
+
+    public DexBackedCatchAllExceptionHandler(@Nonnull DexReader reader) {
+        this.handlerCodeAddress = reader.readSmallUleb128();
+    }
+
+    @Nullable @Override public String getExceptionType() { return null; }
+    @Override public int getHandlerCodeAddress() { return handlerCodeAddress; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedClassDef.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedClassDef.java
new file mode 100644
index 0000000..0989e9d
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedClassDef.java
@@ -0,0 +1,663 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import org.jf.dexlib2.base.reference.BaseTypeReference;
+import org.jf.dexlib2.dexbacked.raw.ClassDefItem;
+import org.jf.dexlib2.dexbacked.raw.TypeIdItem;
+import org.jf.dexlib2.dexbacked.util.AnnotationsDirectory;
+import org.jf.dexlib2.dexbacked.util.EncodedArrayItemIterator;
+import org.jf.dexlib2.dexbacked.util.VariableSizeListIterator;
+import org.jf.dexlib2.dexbacked.util.VariableSizeLookaheadIterator;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.reference.FieldReference;
+import org.jf.dexlib2.iface.reference.MethodReference;
+import org.jf.dexlib2.immutable.reference.ImmutableFieldReference;
+import org.jf.dexlib2.immutable.reference.ImmutableMethodReference;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.AbstractList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import static org.jf.dexlib2.writer.DexWriter.NO_OFFSET;
+
+public class DexBackedClassDef extends BaseTypeReference implements ClassDef {
+    static final int NO_HIDDEN_API_RESTRICTIONS = 7;
+
+    @Nonnull public final DexBackedDexFile dexFile;
+    private final int classDefOffset;
+    @Nullable private final HiddenApiRestrictionsReader hiddenApiRestrictionsReader;
+
+    private final int staticFieldsOffset;
+    private int instanceFieldsOffset = 0;
+    private int directMethodsOffset = 0;
+    private int virtualMethodsOffset = 0;
+
+    private final int staticFieldCount;
+    private final int instanceFieldCount;
+    private final int directMethodCount;
+    private final int virtualMethodCount;
+
+    @Nullable private AnnotationsDirectory annotationsDirectory;
+
+    public DexBackedClassDef(@Nonnull DexBackedDexFile dexFile,
+                             int classDefOffset,
+                             int hiddenApiRestrictionsOffset) {
+        this.dexFile = dexFile;
+        this.classDefOffset = classDefOffset;
+
+        int classDataOffset = dexFile.getBuffer().readSmallUint(classDefOffset + ClassDefItem.CLASS_DATA_OFFSET);
+        if (classDataOffset == 0) {
+            staticFieldsOffset = -1;
+            staticFieldCount = 0;
+            instanceFieldCount = 0;
+            directMethodCount = 0;
+            virtualMethodCount = 0;
+        } else {
+            DexReader reader = dexFile.getDataBuffer().readerAt(classDataOffset);
+            staticFieldCount = reader.readSmallUleb128();
+            instanceFieldCount = reader.readSmallUleb128();
+            directMethodCount = reader.readSmallUleb128();
+            virtualMethodCount = reader.readSmallUleb128();
+            staticFieldsOffset = reader.getOffset();
+        }
+
+        if (hiddenApiRestrictionsOffset != NO_OFFSET) {
+            hiddenApiRestrictionsReader = new HiddenApiRestrictionsReader(hiddenApiRestrictionsOffset);
+        } else {
+            hiddenApiRestrictionsReader = null;
+        }
+    }
+
+    @Nonnull
+    @Override
+    public String getType() {
+        return dexFile.getTypeSection().get(
+                dexFile.getBuffer().readSmallUint(classDefOffset + ClassDefItem.CLASS_OFFSET));
+    }
+
+    @Nullable
+    @Override
+    public String getSuperclass() {
+        return dexFile.getTypeSection().getOptional(
+                dexFile.getBuffer().readOptionalUint(classDefOffset + ClassDefItem.SUPERCLASS_OFFSET));
+    }
+
+    @Override
+    public int getAccessFlags() {
+        return dexFile.getBuffer().readSmallUint(classDefOffset + ClassDefItem.ACCESS_FLAGS_OFFSET);
+    }
+
+    @Nullable
+    @Override
+    public String getSourceFile() {
+        return dexFile.getStringSection().getOptional(
+                dexFile.getBuffer().readOptionalUint(classDefOffset + ClassDefItem.SOURCE_FILE_OFFSET));
+    }
+
+    @Nonnull
+    @Override
+    public List<String> getInterfaces() {
+        final int interfacesOffset =
+                dexFile.getBuffer().readSmallUint(classDefOffset + ClassDefItem.INTERFACES_OFFSET);
+        if (interfacesOffset > 0) {
+            final int size = dexFile.getDataBuffer().readSmallUint(interfacesOffset);
+            return new AbstractList<String>() {
+                @Override
+                @Nonnull
+                public String get(int index) {
+                    return dexFile.getTypeSection().get(
+                            dexFile.getDataBuffer().readUshort(interfacesOffset + 4 + (2*index)));
+                }
+
+                @Override public int size() { return size; }
+            };
+        }
+        return ImmutableList.of();
+    }
+
+    @Nonnull
+    @Override
+    public Set<? extends DexBackedAnnotation> getAnnotations() {
+        return getAnnotationsDirectory().getClassAnnotations();
+    }
+
+    @Nonnull
+    @Override
+    public Iterable<? extends DexBackedField> getStaticFields() {
+        return getStaticFields(true);
+    }
+
+    @Nonnull
+    public Iterable<? extends DexBackedField> getStaticFields(final boolean skipDuplicates) {
+        if (staticFieldCount > 0) {
+            DexReader<? extends DexBuffer> reader = dexFile.getDataBuffer().readerAt(staticFieldsOffset);
+
+            final AnnotationsDirectory annotationsDirectory = getAnnotationsDirectory();
+            final int staticInitialValuesOffset =
+                    dexFile.getBuffer().readSmallUint(classDefOffset + ClassDefItem.STATIC_VALUES_OFFSET);
+            final int fieldsStartOffset = reader.getOffset();
+
+
+            Iterator<Integer> hiddenApiRestrictionIterator = hiddenApiRestrictionsReader == null ?
+                    null : hiddenApiRestrictionsReader.getRestrictionsForStaticFields();
+
+            return new Iterable<DexBackedField>() {
+                @Nonnull
+                @Override
+                public Iterator<DexBackedField> iterator() {
+                    final AnnotationsDirectory.AnnotationIterator annotationIterator =
+                            annotationsDirectory.getFieldAnnotationIterator();
+                    final EncodedArrayItemIterator staticInitialValueIterator =
+                            EncodedArrayItemIterator.newOrEmpty(dexFile, staticInitialValuesOffset);
+
+                    return new VariableSizeLookaheadIterator<DexBackedField>(
+                            dexFile.getDataBuffer(), fieldsStartOffset) {
+                        private int count;
+                        @Nullable private FieldReference previousField;
+                        private int previousIndex;
+
+                        @Nullable
+                        @Override
+                        protected DexBackedField readNextItem(@Nonnull DexReader reader) {
+                            while (true) {
+                                if (++count > staticFieldCount) {
+                                    instanceFieldsOffset = reader.getOffset();
+                                    return endOfData();
+                                }
+
+                                int hiddenApiRestrictions = NO_HIDDEN_API_RESTRICTIONS;
+                                if (hiddenApiRestrictionIterator != null) {
+                                    hiddenApiRestrictions = hiddenApiRestrictionIterator.next();
+                                }
+
+                                DexBackedField item = new DexBackedField(dexFile, reader, DexBackedClassDef.this,
+                                        previousIndex, staticInitialValueIterator, annotationIterator,
+                                        hiddenApiRestrictions);
+                                FieldReference currentField = previousField;
+                                FieldReference nextField = ImmutableFieldReference.of(item);
+
+                                previousField = nextField;
+                                previousIndex = item.fieldIndex;
+
+                                if (skipDuplicates && currentField != null && currentField.equals(nextField)) {
+                                    continue;
+                                }
+
+                                return item;
+                            }
+                        }
+                    };
+                }
+            };
+        } else {
+            instanceFieldsOffset = staticFieldsOffset;
+            return ImmutableSet.of();
+        }
+    }
+
+    @Nonnull
+    @Override
+    public Iterable<? extends DexBackedField> getInstanceFields() {
+        return getInstanceFields(true);
+    }
+
+    @Nonnull
+    public Iterable<? extends DexBackedField> getInstanceFields(final boolean skipDuplicates) {
+        if (instanceFieldCount > 0) {
+            DexReader reader = dexFile.getDataBuffer().readerAt(getInstanceFieldsOffset());
+
+            final AnnotationsDirectory annotationsDirectory = getAnnotationsDirectory();
+            final int fieldsStartOffset = reader.getOffset();
+
+            Iterator<Integer> hiddenApiRestrictionIterator = hiddenApiRestrictionsReader == null ?
+                    null : hiddenApiRestrictionsReader.getRestrictionsForInstanceFields();
+
+            return new Iterable<DexBackedField>() {
+                @Nonnull
+                @Override
+                public Iterator<DexBackedField> iterator() {
+                    final AnnotationsDirectory.AnnotationIterator annotationIterator =
+                            annotationsDirectory.getFieldAnnotationIterator();
+
+                    return new VariableSizeLookaheadIterator<DexBackedField>(
+                            dexFile.getDataBuffer(), fieldsStartOffset) {
+                        private int count;
+                        @Nullable private FieldReference previousField;
+                        private int previousIndex;
+
+                        @Nullable
+                        @Override
+                        protected DexBackedField readNextItem(@Nonnull DexReader reader) {
+                            while (true) {
+                                if (++count > instanceFieldCount) {
+                                    directMethodsOffset = reader.getOffset();
+                                    return endOfData();
+                                }
+
+                                int hiddenApiRestrictions = NO_HIDDEN_API_RESTRICTIONS;
+                                if (hiddenApiRestrictionIterator != null) {
+                                    hiddenApiRestrictions = hiddenApiRestrictionIterator.next();
+                                }
+
+                                DexBackedField item = new DexBackedField(dexFile, reader, DexBackedClassDef.this,
+                                        previousIndex, annotationIterator, hiddenApiRestrictions);
+                                FieldReference currentField = previousField;
+                                FieldReference nextField = ImmutableFieldReference.of(item);
+
+                                previousField = nextField;
+                                previousIndex = item.fieldIndex;
+
+                                if (skipDuplicates && currentField != null && currentField.equals(nextField)) {
+                                    continue;
+                                }
+
+                                return item;
+                            }
+                        }
+                    };
+                }
+            };
+        } else {
+            if (instanceFieldsOffset > 0) {
+                directMethodsOffset = instanceFieldsOffset;
+            }
+            return ImmutableSet.of();
+        }
+    }
+
+    @Nonnull
+    @Override
+    public Iterable<? extends DexBackedField> getFields() {
+        return Iterables.concat(getStaticFields(), getInstanceFields());
+    }
+
+    @Nonnull
+    @Override
+    public Iterable<? extends DexBackedMethod> getDirectMethods() {
+        return getDirectMethods(true);
+    }
+
+    @Nonnull
+    public Iterable<? extends DexBackedMethod> getDirectMethods(final boolean skipDuplicates) {
+        if (directMethodCount > 0) {
+            DexReader reader = dexFile.getDataBuffer().readerAt(getDirectMethodsOffset());
+
+            final AnnotationsDirectory annotationsDirectory = getAnnotationsDirectory();
+            final int methodsStartOffset = reader.getOffset();
+
+            Iterator<Integer> hiddenApiRestrictionIterator = hiddenApiRestrictionsReader == null ?
+                    null : hiddenApiRestrictionsReader.getRestrictionsForDirectMethods();
+
+            return new Iterable<DexBackedMethod>() {
+                @Nonnull
+                @Override
+                public Iterator<DexBackedMethod> iterator() {
+                    final AnnotationsDirectory.AnnotationIterator methodAnnotationIterator =
+                            annotationsDirectory.getMethodAnnotationIterator();
+                    final AnnotationsDirectory.AnnotationIterator parameterAnnotationIterator =
+                            annotationsDirectory.getParameterAnnotationIterator();
+
+                    return new VariableSizeLookaheadIterator<DexBackedMethod>(
+                            dexFile.getDataBuffer(), methodsStartOffset) {
+                        private int count;
+                        @Nullable private MethodReference previousMethod;
+                        private int previousIndex;
+
+                        @Nullable
+                        @Override
+                        protected DexBackedMethod readNextItem(@Nonnull DexReader reader) {
+                            while (true) {
+                                if (++count > directMethodCount) {
+                                    virtualMethodsOffset = reader.getOffset();
+                                    return endOfData();
+                                }
+
+                                int hiddenApiRestrictions = NO_HIDDEN_API_RESTRICTIONS;
+                                if (hiddenApiRestrictionIterator != null) {
+                                    hiddenApiRestrictions = hiddenApiRestrictionIterator.next();
+                                }
+
+                                DexBackedMethod item = new DexBackedMethod(dexFile, reader, DexBackedClassDef.this,
+                                        previousIndex, methodAnnotationIterator, parameterAnnotationIterator,
+                                        hiddenApiRestrictions);
+                                MethodReference currentMethod = previousMethod;
+                                MethodReference nextMethod = ImmutableMethodReference.of(item);
+
+                                previousMethod = nextMethod;
+                                previousIndex = item.methodIndex;
+
+                                if (skipDuplicates && currentMethod != null && currentMethod.equals(nextMethod)) {
+                                    continue;
+
+                                }
+                                return item;
+                            }
+                        }
+                    };
+                }
+            };
+        } else {
+            if (directMethodsOffset > 0) {
+                virtualMethodsOffset = directMethodsOffset;
+            }
+            return ImmutableSet.of();
+        }
+    }
+
+    @Nonnull
+    public Iterable<? extends DexBackedMethod> getVirtualMethods(final boolean skipDuplicates) {
+        if (virtualMethodCount > 0) {
+            DexReader reader = dexFile.getDataBuffer().readerAt(getVirtualMethodsOffset());
+
+            final AnnotationsDirectory annotationsDirectory = getAnnotationsDirectory();
+            final int methodsStartOffset = reader.getOffset();
+
+            Iterator<Integer> hiddenApiRestrictionIterator = hiddenApiRestrictionsReader == null ?
+                    null : hiddenApiRestrictionsReader.getRestrictionsForVirtualMethods();
+
+            return new Iterable<DexBackedMethod>() {
+                final AnnotationsDirectory.AnnotationIterator methodAnnotationIterator =
+                        annotationsDirectory.getMethodAnnotationIterator();
+                final AnnotationsDirectory.AnnotationIterator parameterAnnotationIterator =
+                        annotationsDirectory.getParameterAnnotationIterator();
+
+                @Nonnull
+                @Override
+                public Iterator<DexBackedMethod> iterator() {
+                    return new VariableSizeLookaheadIterator<DexBackedMethod>(
+                            dexFile.getDataBuffer(), methodsStartOffset) {
+                        private int count;
+                        @Nullable private MethodReference previousMethod;
+                        private int previousIndex;
+
+                        @Nullable
+                        @Override
+                        protected DexBackedMethod readNextItem(@Nonnull DexReader reader) {
+                            while (true) {
+                                if (++count > virtualMethodCount) {
+                                    return endOfData();
+                                }
+
+                                int hiddenApiRestrictions = NO_HIDDEN_API_RESTRICTIONS;
+                                if (hiddenApiRestrictionIterator != null) {
+                                    hiddenApiRestrictions = hiddenApiRestrictionIterator.next();
+                                }
+
+                                DexBackedMethod item = new DexBackedMethod(dexFile, reader, DexBackedClassDef.this,
+                                        previousIndex, methodAnnotationIterator, parameterAnnotationIterator,
+                                        hiddenApiRestrictions);
+                                MethodReference currentMethod = previousMethod;
+                                MethodReference nextMethod = ImmutableMethodReference.of(item);
+
+                                previousMethod = nextMethod;
+                                previousIndex = item.methodIndex;
+
+                                if (skipDuplicates && currentMethod != null && currentMethod.equals(nextMethod)) {
+                                    continue;
+                                }
+                                return item;
+                            }
+                        }
+                    };
+                }
+            };
+        } else {
+            return ImmutableSet.of();
+        }
+    }
+
+    @Nonnull
+    @Override
+    public Iterable<? extends DexBackedMethod> getVirtualMethods() {
+        return getVirtualMethods(true);
+    }
+
+    @Nonnull
+    @Override
+    public Iterable<? extends DexBackedMethod> getMethods() {
+        return Iterables.concat(getDirectMethods(), getVirtualMethods());
+    }
+
+    private AnnotationsDirectory getAnnotationsDirectory() {
+        if (annotationsDirectory == null) {
+            int annotationsDirectoryOffset =
+                    dexFile.getBuffer().readSmallUint(classDefOffset + ClassDefItem.ANNOTATIONS_OFFSET);
+            annotationsDirectory = AnnotationsDirectory.newOrEmpty(dexFile, annotationsDirectoryOffset);
+        }
+        return annotationsDirectory;
+    }
+
+    private int getInstanceFieldsOffset() {
+        if (instanceFieldsOffset > 0) {
+            return instanceFieldsOffset;
+        }
+        DexReader reader = dexFile.getDataBuffer().readerAt(staticFieldsOffset);
+        DexBackedField.skipFields(reader, staticFieldCount);
+        instanceFieldsOffset = reader.getOffset();
+        return instanceFieldsOffset;
+    }
+
+    private int getDirectMethodsOffset() {
+        if (directMethodsOffset > 0) {
+            return directMethodsOffset;
+        }
+        DexReader reader = dexFile.getDataBuffer().readerAt(getInstanceFieldsOffset());
+        DexBackedField.skipFields(reader, instanceFieldCount);
+        directMethodsOffset = reader.getOffset();
+        return directMethodsOffset;
+    }
+
+    private int getVirtualMethodsOffset() {
+        if (virtualMethodsOffset > 0) {
+            return virtualMethodsOffset;
+        }
+        DexReader reader = dexFile.getDataBuffer().readerAt(getDirectMethodsOffset());
+        DexBackedMethod.skipMethods(reader, directMethodCount);
+        virtualMethodsOffset = reader.getOffset();
+        return virtualMethodsOffset;
+    }
+
+    /**
+     * Calculate and return the private size of a class definition.
+     *
+     * Calculated as: class_def_item size + type_id size + interfaces type_list +
+     * annotations_directory_item overhead + class_data_item + static values overhead +
+     * methods size + fields size
+     *
+     * @return size in bytes
+     */
+    public int getSize() {
+        int size = 8 * 4; //class_def_item has 8 uint fields in dex files
+        size += TypeIdItem.ITEM_SIZE; //type_ids size
+
+        //add interface list size if any
+        int interfacesLength = getInterfaces().size();
+        if (interfacesLength > 0) {
+            //add size of the type_list
+            size += 4; //uint for size
+            size += interfacesLength * 2; //ushort per type_item
+        }
+
+        //annotations directory size if it exists
+        AnnotationsDirectory directory = getAnnotationsDirectory();
+        if (!AnnotationsDirectory.EMPTY.equals(directory)) {
+            size += 4 * 4; //4 uints in annotations_directory_item
+            Set<? extends DexBackedAnnotation> classAnnotations = directory.getClassAnnotations();
+            if (!classAnnotations.isEmpty()) {
+                size += 4; //uint for size
+                size += classAnnotations.size() * 4; //uint per annotation_off
+                //TODO: should we add annotation_item size? what if it's shared?
+            }
+        }
+
+        //static values and/or metadata
+        int staticInitialValuesOffset =
+            dexFile.getBuffer().readSmallUint(classDefOffset + ClassDefItem.STATIC_VALUES_OFFSET);
+        if (staticInitialValuesOffset != 0) {
+            DexReader reader = dexFile.getDataBuffer().readerAt(staticInitialValuesOffset);
+            size += reader.peekSmallUleb128Size(); //encoded_array size field
+        }
+
+        //class_data_item
+        int classDataOffset = dexFile.getBuffer().readSmallUint(classDefOffset + ClassDefItem.CLASS_DATA_OFFSET);
+        if (classDataOffset > 0) {
+            DexReader reader = dexFile.getDataBuffer().readerAt(classDataOffset);
+            reader.readSmallUleb128(); //staticFieldCount
+            reader.readSmallUleb128(); //instanceFieldCount
+            reader.readSmallUleb128(); //directMethodCount
+            reader.readSmallUleb128(); //virtualMethodCount
+            size += reader.getOffset() - classDataOffset;
+        }
+
+        for (DexBackedField dexBackedField : getFields()) {
+            size += dexBackedField.getSize();
+        }
+
+        for (DexBackedMethod dexBackedMethod : getMethods()) {
+            size += dexBackedMethod.getSize();
+        }
+        return size;
+    }
+
+    private class HiddenApiRestrictionsReader {
+        private final int startOffset;
+
+        private int instanceFieldsStartOffset;
+        private int directMethodsStartOffset;
+        private int virtualMethodsStartOffset;
+
+        public HiddenApiRestrictionsReader(int startOffset) {
+            this.startOffset = startOffset;
+        }
+
+        private VariableSizeListIterator<Integer> getRestrictionsForStaticFields() {
+            return new VariableSizeListIterator<Integer>(
+                    dexFile.getDataBuffer(), startOffset, staticFieldCount) {
+                @Override protected Integer readNextItem(
+                        @Nonnull DexReader<? extends DexBuffer> reader, int index) {
+                    return reader.readSmallUleb128();
+                }
+
+                @Override public Integer next() {
+                    if (nextIndex() == staticFieldCount) {
+                        instanceFieldsStartOffset = getReaderOffset();
+                    }
+                    return super.next();
+                }
+            };
+        }
+
+        private int getInstanceFieldsStartOffset() {
+            if (instanceFieldsStartOffset == NO_OFFSET) {
+                DexReader<? extends DexBuffer> reader = dexFile.getDataBuffer().readerAt(startOffset);
+                for (int i = 0; i < staticFieldCount; i++) {
+                    reader.readSmallUleb128();
+                }
+                instanceFieldsStartOffset = reader.getOffset();
+            }
+            return instanceFieldsStartOffset;
+        }
+
+        private Iterator<Integer> getRestrictionsForInstanceFields() {
+            return new VariableSizeListIterator<Integer>(
+                    dexFile.getDataBuffer(), getInstanceFieldsStartOffset(), instanceFieldCount) {
+                @Override protected Integer readNextItem(
+                        @Nonnull DexReader<? extends DexBuffer> reader, int index) {
+                    return reader.readSmallUleb128();
+                }
+
+                @Override public Integer next() {
+                    if (nextIndex() == instanceFieldCount) {
+                        directMethodsStartOffset = getReaderOffset();
+                    }
+                    return super.next();
+                }
+            };
+        }
+
+        private int getDirectMethodsStartOffset() {
+            if (directMethodsStartOffset == NO_OFFSET) {
+                DexReader<? extends DexBuffer> reader = dexFile.getDataBuffer().readerAt(getInstanceFieldsStartOffset());
+                for (int i = 0; i < instanceFieldCount; i++) {
+                    reader.readSmallUleb128();
+                }
+                directMethodsStartOffset = reader.getOffset();
+            }
+            return directMethodsStartOffset;
+        }
+
+        private Iterator<Integer> getRestrictionsForDirectMethods() {
+            return new VariableSizeListIterator<Integer>(
+                    dexFile.getDataBuffer(), getDirectMethodsStartOffset(), directMethodCount) {
+                @Override protected Integer readNextItem(
+                        @Nonnull DexReader<? extends DexBuffer> reader, int index) {
+                    return reader.readSmallUleb128();
+                }
+
+                @Override public Integer next() {
+                    if (nextIndex() == directMethodCount) {
+                        virtualMethodsStartOffset = getReaderOffset();
+                    }
+                    return super.next();
+                }
+            };
+        }
+
+        private int getVirtualMethodsStartOffset() {
+            if (virtualMethodsStartOffset == NO_OFFSET) {
+                DexReader<? extends DexBuffer> reader = dexFile.getDataBuffer().readerAt(getDirectMethodsStartOffset());
+                for (int i = 0; i < directMethodCount; i++) {
+                    reader.readSmallUleb128();
+                }
+                virtualMethodsStartOffset = reader.getOffset();
+            }
+            return virtualMethodsStartOffset;
+        }
+
+        private Iterator<Integer> getRestrictionsForVirtualMethods() {
+            return new VariableSizeListIterator<Integer>(
+                    dexFile.getDataBuffer(), getVirtualMethodsStartOffset(), virtualMethodCount) {
+                @Override protected Integer readNextItem(
+                        @Nonnull DexReader<? extends DexBuffer> reader, int index) {
+                    return reader.readSmallUleb128();
+                }
+            };
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedDexFile.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedDexFile.java
new file mode 100644
index 0000000..4bede40
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedDexFile.java
@@ -0,0 +1,588 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked;
+
+import com.google.common.io.ByteStreams;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.ReferenceType;
+import org.jf.dexlib2.dexbacked.raw.*;
+import org.jf.dexlib2.dexbacked.reference.*;
+import org.jf.dexlib2.dexbacked.util.FixedSizeList;
+import org.jf.dexlib2.dexbacked.util.FixedSizeSet;
+import org.jf.dexlib2.iface.DexFile;
+import org.jf.dexlib2.iface.reference.*;
+import org.jf.dexlib2.util.DexUtil;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.AbstractList;
+import java.util.List;
+import java.util.Set;
+
+import static org.jf.dexlib2.writer.DexWriter.NO_OFFSET;
+
+public class DexBackedDexFile implements DexFile {
+
+    private final DexBuffer dexBuffer;
+    private final DexBuffer dataBuffer;
+
+    @Nonnull private final Opcodes opcodes;
+
+    private final int stringCount;
+    private final int stringStartOffset;
+    private final int typeCount;
+    private final int typeStartOffset;
+    private final int protoCount;
+    private final int protoStartOffset;
+    private final int fieldCount;
+    private final int fieldStartOffset;
+    private final int methodCount;
+    private final int methodStartOffset;
+    private final int classCount;
+    private final int classStartOffset;
+    private final int mapOffset;
+    private final int hiddenApiRestrictionsOffset;
+
+    protected DexBackedDexFile(@Nullable Opcodes opcodes, @Nonnull byte[] buf, int offset, boolean verifyMagic) {
+        dexBuffer = new DexBuffer(buf, offset);
+        dataBuffer = new DexBuffer(buf, offset + getBaseDataOffset());
+
+        int dexVersion = getVersion(buf, offset, verifyMagic);
+
+        if (opcodes == null) {
+            this.opcodes = getDefaultOpcodes(dexVersion);
+        } else {
+            this.opcodes = opcodes;
+        }
+
+        stringCount = dexBuffer.readSmallUint(HeaderItem.STRING_COUNT_OFFSET);
+        stringStartOffset = dexBuffer.readSmallUint(HeaderItem.STRING_START_OFFSET);
+        typeCount = dexBuffer.readSmallUint(HeaderItem.TYPE_COUNT_OFFSET);
+        typeStartOffset = dexBuffer.readSmallUint(HeaderItem.TYPE_START_OFFSET);
+        protoCount = dexBuffer.readSmallUint(HeaderItem.PROTO_COUNT_OFFSET);
+        protoStartOffset = dexBuffer.readSmallUint(HeaderItem.PROTO_START_OFFSET);
+        fieldCount = dexBuffer.readSmallUint(HeaderItem.FIELD_COUNT_OFFSET);
+        fieldStartOffset = dexBuffer.readSmallUint(HeaderItem.FIELD_START_OFFSET);
+        methodCount = dexBuffer.readSmallUint(HeaderItem.METHOD_COUNT_OFFSET);
+        methodStartOffset = dexBuffer.readSmallUint(HeaderItem.METHOD_START_OFFSET);
+        classCount = dexBuffer.readSmallUint(HeaderItem.CLASS_COUNT_OFFSET);
+        classStartOffset = dexBuffer.readSmallUint(HeaderItem.CLASS_START_OFFSET);
+        mapOffset = dexBuffer.readSmallUint(HeaderItem.MAP_OFFSET);
+
+        MapItem mapItem = getMapItemForSection(ItemType.HIDDENAPI_CLASS_DATA_ITEM);
+        if (mapItem != null) {
+            hiddenApiRestrictionsOffset = mapItem.getOffset();
+        } else {
+            hiddenApiRestrictionsOffset = NO_OFFSET;
+        }
+    }
+
+    protected DexBackedDexFile(@Nullable Opcodes opcodes, @Nonnull DexBuffer dexBuffer, @Nonnull DexBuffer dataBuffer, int offset, boolean verifyMagic) {
+        this.dexBuffer = dexBuffer;
+        this.dataBuffer = dataBuffer;
+
+        byte[] headerBuf = dexBuffer.readByteRange(offset, HeaderItem.ITEM_SIZE);
+
+        int dexVersion = getVersion(headerBuf, offset, verifyMagic);
+
+        if (opcodes == null) {
+            this.opcodes = getDefaultOpcodes(dexVersion);
+        } else {
+            this.opcodes = opcodes;
+        }
+
+        stringCount = dexBuffer.readSmallUint(HeaderItem.STRING_COUNT_OFFSET);
+        stringStartOffset = dexBuffer.readSmallUint(HeaderItem.STRING_START_OFFSET);
+        typeCount = dexBuffer.readSmallUint(HeaderItem.TYPE_COUNT_OFFSET);
+        typeStartOffset = dexBuffer.readSmallUint(HeaderItem.TYPE_START_OFFSET);
+        protoCount = dexBuffer.readSmallUint(HeaderItem.PROTO_COUNT_OFFSET);
+        protoStartOffset = dexBuffer.readSmallUint(HeaderItem.PROTO_START_OFFSET);
+        fieldCount = dexBuffer.readSmallUint(HeaderItem.FIELD_COUNT_OFFSET);
+        fieldStartOffset = dexBuffer.readSmallUint(HeaderItem.FIELD_START_OFFSET);
+        methodCount = dexBuffer.readSmallUint(HeaderItem.METHOD_COUNT_OFFSET);
+        methodStartOffset = dexBuffer.readSmallUint(HeaderItem.METHOD_START_OFFSET);
+        classCount = dexBuffer.readSmallUint(HeaderItem.CLASS_COUNT_OFFSET);
+        classStartOffset = dexBuffer.readSmallUint(HeaderItem.CLASS_START_OFFSET);
+        mapOffset = dexBuffer.readSmallUint(HeaderItem.MAP_OFFSET);
+
+        MapItem mapItem = getMapItemForSection(ItemType.HIDDENAPI_CLASS_DATA_ITEM);
+        if (mapItem != null) {
+            hiddenApiRestrictionsOffset = mapItem.getOffset();
+        } else {
+            hiddenApiRestrictionsOffset = NO_OFFSET;
+        }
+    }
+
+    /**
+     * @return The offset that various data offsets are relative to. This is always 0 for a dex file, but may be
+     * different for other related formats (e.g. cdex).
+     */
+    public int getBaseDataOffset() {
+        return 0;
+    }
+
+    protected int getVersion(byte[] buf, int offset, boolean verifyMagic) {
+        if (verifyMagic) {
+            return DexUtil.verifyDexHeader(buf, offset);
+        } else {
+            return HeaderItem.getVersion(buf, offset);
+        }
+    }
+
+    protected Opcodes getDefaultOpcodes(int version) {
+        return Opcodes.forDexVersion(version);
+    }
+
+    public DexBuffer getBuffer() {
+        return dexBuffer;
+    }
+
+    public DexBuffer getDataBuffer() {
+        return dataBuffer;
+    }
+
+    public DexBackedDexFile(@Nullable Opcodes opcodes, @Nonnull DexBuffer buf) {
+        this(opcodes, buf.buf, buf.baseOffset);
+    }
+
+    public DexBackedDexFile(@Nullable Opcodes opcodes, @Nonnull byte[] buf, int offset) {
+        this(opcodes, buf, offset, false);
+    }
+
+    public DexBackedDexFile(@Nullable Opcodes opcodes, @Nonnull byte[] buf) {
+        this(opcodes, buf, 0, true);
+    }
+
+    @Nonnull
+    public static DexBackedDexFile fromInputStream(@Nullable Opcodes opcodes, @Nonnull InputStream is)
+            throws IOException {
+        DexUtil.verifyDexHeader(is);
+
+        byte[] buf = ByteStreams.toByteArray(is);
+        return new DexBackedDexFile(opcodes, buf, 0, false);
+    }
+
+    @Nonnull public Opcodes getOpcodes() {
+        return opcodes;
+    }
+
+    public boolean supportsOptimizedOpcodes() {
+        return false;
+    }
+
+    @Nonnull
+    public Set<? extends DexBackedClassDef> getClasses() {
+        return new FixedSizeSet<DexBackedClassDef>() {
+            @Nonnull
+            @Override
+            public DexBackedClassDef readItem(int index) {
+                return getClassSection().get(index);
+            }
+
+            @Override
+            public int size() {
+                return classCount;
+            }
+        };
+    }
+
+    public List<DexBackedStringReference> getStringReferences() {
+        return new AbstractList<DexBackedStringReference>() {
+            @Override public DexBackedStringReference get(int index) {
+                if (index < 0 || index >= getStringSection().size()) {
+                    throw new IndexOutOfBoundsException();
+                }
+                return new DexBackedStringReference(DexBackedDexFile.this, index);
+            }
+
+            @Override public int size() {
+                return getStringSection().size();
+            }
+        };
+    }
+
+    public List<DexBackedTypeReference> getTypeReferences() {
+        return new AbstractList<DexBackedTypeReference>() {
+            @Override public DexBackedTypeReference get(int index) {
+                if (index < 0 || index >= getTypeSection().size()) {
+                    throw new IndexOutOfBoundsException();
+                }
+                return new DexBackedTypeReference(DexBackedDexFile.this, index);
+            }
+
+            @Override public int size() {
+                return getTypeSection().size();
+            }
+        };
+    }
+
+    public List<? extends Reference> getReferences(int referenceType) {
+        switch (referenceType) {
+            case ReferenceType.STRING:
+                return getStringReferences();
+            case ReferenceType.TYPE:
+                return getTypeReferences();
+            case ReferenceType.METHOD:
+                return getMethodSection();
+            case ReferenceType.FIELD:
+                return getFieldSection();
+            default:
+                throw new IllegalArgumentException(String.format("Invalid reference type: %d", referenceType));
+        }
+    }
+
+    public List<MapItem> getMapItems() {
+        final int mapSize = dataBuffer.readSmallUint(mapOffset);
+
+        return new FixedSizeList<MapItem>() {
+            @Override
+            public MapItem readItem(int index) {
+                int mapItemOffset = mapOffset + 4 + index * MapItem.ITEM_SIZE;
+                return new MapItem(DexBackedDexFile.this, mapItemOffset);
+            }
+
+            @Override public int size() {
+                return mapSize;
+            }
+        };
+    }
+
+    @Nullable
+    public MapItem getMapItemForSection(int itemType) {
+        for (MapItem mapItem: getMapItems()) {
+            if (mapItem.getType() == itemType) {
+                return mapItem;
+            }
+        }
+        return null;
+    }
+
+    public static class NotADexFile extends RuntimeException {
+        public NotADexFile() {
+        }
+
+        public NotADexFile(Throwable cause) {
+            super(cause);
+        }
+
+        public NotADexFile(String message) {
+            super(message);
+        }
+
+        public NotADexFile(String message, Throwable cause) {
+            super(message, cause);
+        }
+    }
+
+    private OptionalIndexedSection<String> stringSection = new OptionalIndexedSection<String>() {
+        @Override
+        public String get(int index) {
+            int stringOffset = getOffset(index);
+            int stringDataOffset = dexBuffer.readSmallUint(stringOffset);
+            DexReader reader = dataBuffer.readerAt(stringDataOffset);
+            int utf16Length = reader.readSmallUleb128();
+            return reader.readString(utf16Length);
+        }
+
+        @Override
+        public int size() {
+            return stringCount;
+        }
+
+        @Nullable
+        @Override
+        public String getOptional(int index) {
+            if (index == -1) {
+                return null;
+            }
+            return get(index);
+        }
+
+        @Override
+        public int getOffset(int index) {
+            if (index < 0 || index >= size()) {
+                throw new IndexOutOfBoundsException(
+                        String.format("Invalid string index %d, not in [0, %d)", index, size()));
+            }
+            return stringStartOffset + index*StringIdItem.ITEM_SIZE;
+        }
+    };
+
+    public OptionalIndexedSection<String> getStringSection() {
+        return stringSection;
+    }
+
+    private OptionalIndexedSection<String> typeSection = new OptionalIndexedSection<String>() {
+        @Override
+        public String get(int index) {
+            int typeOffset = getOffset(index);
+            int stringIndex = dexBuffer.readSmallUint(typeOffset);
+            return getStringSection().get(stringIndex);
+        }
+
+        @Override
+        public int size() {
+            return typeCount;
+        }
+
+        @Nullable
+        @Override
+        public String getOptional(int index) {
+            if (index == -1) {
+                return null;
+            }
+            return get(index);
+        }
+
+        @Override
+        public int getOffset(int index) {
+            if (index < 0 || index >= size()) {
+                throw new IndexOutOfBoundsException(
+                        String.format("Invalid type index %d, not in [0, %d)", index, size()));
+            }
+            return typeStartOffset + index * TypeIdItem.ITEM_SIZE;
+        }
+    };
+
+    public OptionalIndexedSection<String> getTypeSection() {
+        return typeSection;
+    }
+
+    private IndexedSection<DexBackedFieldReference> fieldSection = new IndexedSection<DexBackedFieldReference>() {
+        @Override
+        public DexBackedFieldReference get(int index) {
+            return new DexBackedFieldReference(DexBackedDexFile.this, index);
+        }
+
+        @Override
+        public int size() {
+            return fieldCount;
+        }
+
+        @Override
+        public int getOffset(int index) {
+            if (index < 0 || index >= size()) {
+                throw new IndexOutOfBoundsException(
+                        String.format("Invalid field index %d, not in [0, %d)", index, size()));
+            }
+
+            return fieldStartOffset + index * FieldIdItem.ITEM_SIZE;
+        }
+    };
+
+    public IndexedSection<DexBackedFieldReference> getFieldSection() {
+        return fieldSection;
+    }
+
+    private IndexedSection<DexBackedMethodReference> methodSection = new IndexedSection<DexBackedMethodReference>() {
+        @Override
+        public DexBackedMethodReference get(int index) {
+            return new DexBackedMethodReference(DexBackedDexFile.this, index);
+        }
+
+        @Override
+        public int size() {
+            return methodCount;
+        }
+
+        @Override
+        public int getOffset(int index) {
+            if (index < 0 || index >= size()) {
+                throw new IndexOutOfBoundsException(
+                        String.format("Invalid method index %d, not in [0, %d)", index, size()));
+            }
+
+            return methodStartOffset + index * MethodIdItem.ITEM_SIZE;
+        }
+    };
+
+    public IndexedSection<DexBackedMethodReference> getMethodSection() {
+        return methodSection;
+    }
+
+    private IndexedSection<DexBackedMethodProtoReference> protoSection =
+            new IndexedSection<DexBackedMethodProtoReference>() {
+                @Override
+                public DexBackedMethodProtoReference get(int index) {
+                    return new DexBackedMethodProtoReference(DexBackedDexFile.this, index);
+                }
+
+                @Override
+                public int size() {
+                    return protoCount;
+                }
+
+                @Override
+                public int getOffset(int index) {
+                    if (index < 0 || index >= size()) {
+                        throw new IndexOutOfBoundsException(
+                                String.format("Invalid proto index %d, not in [0, %d)", index, size()));
+                    }
+
+                    return protoStartOffset + index * ProtoIdItem.ITEM_SIZE;
+                }
+            };
+
+    public IndexedSection<DexBackedMethodProtoReference> getProtoSection() {
+        return protoSection;
+    }
+
+    private IndexedSection<DexBackedClassDef> classSection = new IndexedSection<DexBackedClassDef>() {
+        @Override
+        public DexBackedClassDef get(int index) {
+            return new DexBackedClassDef(DexBackedDexFile.this, getOffset(index),
+                    readHiddenApiRestrictionsOffset(index));
+        }
+
+        @Override
+        public int size() {
+            return classCount;
+        }
+
+        @Override
+        public int getOffset(int index) {
+            if (index < 0 || index >= size()) {
+                throw new IndexOutOfBoundsException(
+                        String.format("Invalid class index %d, not in [0, %d)", index, size()));
+            }
+
+            return classStartOffset + index * ClassDefItem.ITEM_SIZE;
+        }
+    };
+
+    public IndexedSection<DexBackedClassDef> getClassSection() {
+        return classSection;
+    }
+
+    private IndexedSection<DexBackedCallSiteReference> callSiteSection =
+            new IndexedSection<DexBackedCallSiteReference>() {
+                @Override
+                public DexBackedCallSiteReference get(int index) {
+                    return new DexBackedCallSiteReference(DexBackedDexFile.this, index);
+                }
+
+                @Override
+                public int size() {
+                    MapItem mapItem = getMapItemForSection(ItemType.CALL_SITE_ID_ITEM);
+                    if (mapItem == null) {
+                        return 0;
+                    }
+                    return mapItem.getItemCount();
+                }
+
+                @Override
+                public int getOffset(int index) {
+                    MapItem mapItem = getMapItemForSection(ItemType.CALL_SITE_ID_ITEM);
+                    if (index < 0 || index >= size()) {
+                        throw new IndexOutOfBoundsException(
+                                String.format("Invalid callsite index %d, not in [0, %d)", index, size()));
+                    }
+                    return mapItem.getOffset() + index * CallSiteIdItem.ITEM_SIZE;
+                }
+            };
+
+    public IndexedSection<DexBackedCallSiteReference> getCallSiteSection() {
+        return callSiteSection;
+    }
+
+    private IndexedSection<DexBackedMethodHandleReference> methodHandleSection =
+            new IndexedSection<DexBackedMethodHandleReference>() {
+                @Override
+                public DexBackedMethodHandleReference get(int index) {
+                    return new DexBackedMethodHandleReference(DexBackedDexFile.this, index);
+                }
+
+                @Override
+                public int size() {
+                    MapItem mapItem = getMapItemForSection(ItemType.METHOD_HANDLE_ITEM);
+                    if (mapItem == null) {
+                        return 0;
+                    }
+                    return mapItem.getItemCount();
+                }
+
+                @Override
+                public int getOffset(int index) {
+                    MapItem mapItem = getMapItemForSection(ItemType.METHOD_HANDLE_ITEM);
+                    if (index < 0 || index >= size()) {
+                        throw new IndexOutOfBoundsException(
+                                String.format("Invalid method handle index %d, not in [0, %d)", index, size()));
+                    }
+                    return mapItem.getOffset() + index * MethodHandleItem.ITEM_SIZE;
+                }
+            };
+
+    public IndexedSection<DexBackedMethodHandleReference> getMethodHandleSection() {
+        return methodHandleSection;
+    }
+
+    protected DexBackedMethodImplementation createMethodImplementation(
+            @Nonnull DexBackedDexFile dexFile, @Nonnull DexBackedMethod method, int codeOffset) {
+        return new DexBackedMethodImplementation(dexFile, method, codeOffset);
+    }
+
+    private int readHiddenApiRestrictionsOffset(int classIndex) {
+        if (hiddenApiRestrictionsOffset == NO_OFFSET) {
+            return NO_OFFSET;
+        }
+
+        int offset = dexBuffer.readInt(
+                hiddenApiRestrictionsOffset +
+                        HiddenApiClassDataItem.OFFSETS_LIST_OFFSET +
+                        classIndex * HiddenApiClassDataItem.OFFSET_ITEM_SIZE);
+        if (offset == NO_OFFSET) {
+            return NO_OFFSET;
+        }
+
+        return hiddenApiRestrictionsOffset + offset;
+    }
+
+    public static abstract class OptionalIndexedSection<T> extends IndexedSection<T> {
+        /**
+         * @param index The index of the item, or -1 for a null item.
+         * @return The value at the given index, or null if index is -1.
+         * @throws IndexOutOfBoundsException if the index is out of bounds and is not -1.
+         */
+        @Nullable public abstract T getOptional(int index);
+    }
+
+    public static abstract class IndexedSection<T> extends AbstractList<T> {
+        /**
+         * @param index The index of the item to get the offset for.
+         * @return The offset from the beginning of the dex file to the specified item.
+         * @throws IndexOutOfBoundsException if the index is out of bounds.
+         */
+        public abstract int getOffset(int index);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedExceptionHandler.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedExceptionHandler.java
new file mode 100644
index 0000000..c38a0f4
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedExceptionHandler.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked;
+
+import org.jf.dexlib2.base.BaseExceptionHandler;
+
+public abstract class DexBackedExceptionHandler extends BaseExceptionHandler {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedField.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedField.java
new file mode 100644
index 0000000..175b4c9
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedField.java
@@ -0,0 +1,198 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked;
+
+import com.google.common.collect.ImmutableSet;
+import org.jf.dexlib2.HiddenApiRestriction;
+import org.jf.dexlib2.base.reference.BaseFieldReference;
+import org.jf.dexlib2.dexbacked.raw.FieldIdItem;
+import org.jf.dexlib2.dexbacked.reference.DexBackedFieldReference;
+import org.jf.dexlib2.dexbacked.util.AnnotationsDirectory;
+import org.jf.dexlib2.dexbacked.util.EncodedArrayItemIterator;
+import org.jf.dexlib2.dexbacked.value.DexBackedEncodedValue;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.Field;
+import org.jf.dexlib2.iface.value.EncodedValue;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.EnumSet;
+import java.util.Set;
+
+public class DexBackedField extends BaseFieldReference implements Field {
+    @Nonnull public final DexBackedDexFile dexFile;
+    @Nonnull public final ClassDef classDef;
+
+    public final int accessFlags;
+    @Nullable public final EncodedValue initialValue;
+    public final int annotationSetOffset;
+
+    public final int fieldIndex;
+    private final int startOffset;
+    private final int initialValueOffset;
+    private final int hiddenApiRestrictions;
+
+    private int fieldIdItemOffset;
+
+    public DexBackedField(@Nonnull DexBackedDexFile dexFile,
+                          @Nonnull DexReader reader,
+                          @Nonnull DexBackedClassDef classDef,
+                          int previousFieldIndex,
+                          @Nonnull EncodedArrayItemIterator staticInitialValueIterator,
+                          @Nonnull AnnotationsDirectory.AnnotationIterator annotationIterator,
+                          int hiddenApiRestrictions) {
+        this.dexFile = dexFile;
+        this.classDef = classDef;
+
+        // large values may be used for the index delta, which cause the cumulative index to overflow upon
+        // addition, effectively allowing out of order entries.
+        startOffset = reader.getOffset();
+        int fieldIndexDiff = reader.readLargeUleb128();
+        this.fieldIndex = fieldIndexDiff + previousFieldIndex;
+        this.accessFlags = reader.readSmallUleb128();
+
+        this.annotationSetOffset = annotationIterator.seekTo(fieldIndex);
+        initialValueOffset = staticInitialValueIterator.getReaderOffset();
+        this.initialValue = staticInitialValueIterator.getNextOrNull();
+        this.hiddenApiRestrictions = hiddenApiRestrictions;
+    }
+
+    public DexBackedField(@Nonnull DexBackedDexFile dexFile,
+                          @Nonnull DexReader reader,
+                          @Nonnull DexBackedClassDef classDef,
+                          int previousFieldIndex,
+                          @Nonnull AnnotationsDirectory.AnnotationIterator annotationIterator,
+                          int hiddenApiRestrictions) {
+        this.dexFile = dexFile;
+        this.classDef = classDef;
+
+        // large values may be used for the index delta, which cause the cumulative index to overflow upon
+        // addition, effectively allowing out of order entries.
+        startOffset = reader.getOffset();
+        int fieldIndexDiff = reader.readLargeUleb128();
+        this.fieldIndex = fieldIndexDiff + previousFieldIndex;
+        this.accessFlags = reader.readSmallUleb128();
+
+        this.annotationSetOffset = annotationIterator.seekTo(fieldIndex);
+        initialValueOffset = 0;
+        this.initialValue = null;
+        this.hiddenApiRestrictions = hiddenApiRestrictions;
+    }
+
+    @Nonnull
+    @Override
+    public String getName() {
+        return dexFile.getStringSection().get(
+                dexFile.getBuffer().readSmallUint(getFieldIdItemOffset() + FieldIdItem.NAME_OFFSET));
+    }
+
+    @Nonnull
+    @Override
+    public String getType() {
+        return dexFile.getTypeSection().get(
+                dexFile.getBuffer().readUshort(getFieldIdItemOffset() + FieldIdItem.TYPE_OFFSET));
+    }
+
+    @Nonnull @Override public String getDefiningClass() { return classDef.getType(); }
+    @Override public int getAccessFlags() { return accessFlags; }
+    @Nullable @Override public EncodedValue getInitialValue() { return initialValue; }
+
+    @Nonnull
+    @Override
+    public Set<? extends DexBackedAnnotation> getAnnotations() {
+        return AnnotationsDirectory.getAnnotations(dexFile, annotationSetOffset);
+    }
+
+    @Nonnull
+    @Override
+    public Set<HiddenApiRestriction> getHiddenApiRestrictions() {
+        if (hiddenApiRestrictions == DexBackedClassDef.NO_HIDDEN_API_RESTRICTIONS) {
+            return ImmutableSet.of();
+        } else {
+            return EnumSet.copyOf(HiddenApiRestriction.getAllFlags(hiddenApiRestrictions));
+        }
+    }
+
+    /**
+     * Skips the reader over the specified number of encoded_field structures
+     *
+     * @param reader The reader to skip
+     * @param count The number of encoded_field structures to skip over
+     */
+    public static void skipFields(@Nonnull DexReader reader, int count) {
+        for (int i=0; i<count; i++) {
+            reader.skipUleb128();
+            reader.skipUleb128();
+        }
+    }
+
+    private int getFieldIdItemOffset() {
+        if (fieldIdItemOffset == 0) {
+            fieldIdItemOffset = dexFile.getFieldSection().getOffset(fieldIndex);
+        }
+        return fieldIdItemOffset;
+    }
+
+    /**
+     * Calculate and return the private size of a field definition.
+     *
+     * Calculated as: field_idx_diff + access_flags + annotations overhead +
+     * initial value size + field reference size
+     *
+     * @return size in bytes
+     */
+    public int getSize() {
+        int size = 0;
+        DexReader reader = dexFile.getBuffer().readerAt(startOffset);
+        reader.readLargeUleb128(); //field_idx_diff
+        reader.readSmallUleb128(); //access_flags
+        size += reader.getOffset() - startOffset;
+
+        Set<? extends DexBackedAnnotation> annotations = getAnnotations();
+        if (!annotations.isEmpty()) {
+            size += 2 * 4; //2 * uint overhead from field_annotation
+        }
+
+        if (initialValueOffset > 0) {
+            reader.setOffset(initialValueOffset);
+            if (initialValue != null) {
+                DexBackedEncodedValue.skipFrom(reader);
+                size += reader.getOffset() - initialValueOffset;
+            }
+        }
+
+        DexBackedFieldReference fieldRef = new DexBackedFieldReference(dexFile, fieldIndex);
+        size += fieldRef.getSize();
+
+        return size;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethod.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethod.java
new file mode 100644
index 0000000..f9ba78d
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethod.java
@@ -0,0 +1,281 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import org.jf.dexlib2.HiddenApiRestriction;
+import org.jf.dexlib2.base.reference.BaseMethodReference;
+import org.jf.dexlib2.dexbacked.raw.MethodIdItem;
+import org.jf.dexlib2.dexbacked.raw.ProtoIdItem;
+import org.jf.dexlib2.dexbacked.raw.TypeListItem;
+import org.jf.dexlib2.dexbacked.reference.DexBackedMethodReference;
+import org.jf.dexlib2.dexbacked.util.AnnotationsDirectory;
+import org.jf.dexlib2.dexbacked.util.FixedSizeList;
+import org.jf.dexlib2.dexbacked.util.ParameterIterator;
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.iface.Method;
+import org.jf.dexlib2.iface.MethodParameter;
+import org.jf.util.AbstractForwardSequentialList;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.EnumSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+public class DexBackedMethod extends BaseMethodReference implements Method {
+    @Nonnull public final DexBackedDexFile dexFile;
+    @Nonnull public final DexBackedClassDef classDef;
+
+    public final int accessFlags;
+
+    private final int codeOffset;
+    private final int parameterAnnotationSetListOffset;
+    private final int methodAnnotationSetOffset;
+    private final int hiddenApiRestrictions;
+
+    public final int methodIndex;
+    private final int startOffset;
+
+    private int methodIdItemOffset;
+    private int protoIdItemOffset;
+    private int parametersOffset = -1;
+
+    public DexBackedMethod(@Nonnull DexBackedDexFile dexFile,
+                           @Nonnull DexReader reader,
+                           @Nonnull DexBackedClassDef classDef,
+                           int previousMethodIndex,
+                           int hiddenApiRestrictions) {
+        this.dexFile = dexFile;
+        this.classDef = classDef;
+        startOffset = reader.getOffset();
+
+        // large values may be used for the index delta, which cause the cumulative index to overflow upon
+        // addition, effectively allowing out of order entries.
+        int methodIndexDiff = reader.readLargeUleb128();
+        this.methodIndex = methodIndexDiff + previousMethodIndex;
+        this.accessFlags = reader.readSmallUleb128();
+        this.codeOffset = reader.readSmallUleb128();
+        this.hiddenApiRestrictions = hiddenApiRestrictions;
+
+        this.methodAnnotationSetOffset = 0;
+        this.parameterAnnotationSetListOffset = 0;
+    }
+
+    public DexBackedMethod(@Nonnull DexBackedDexFile dexFile,
+                           @Nonnull DexReader reader,
+                           @Nonnull DexBackedClassDef classDef,
+                           int previousMethodIndex,
+                           @Nonnull AnnotationsDirectory.AnnotationIterator methodAnnotationIterator,
+                           @Nonnull AnnotationsDirectory.AnnotationIterator paramaterAnnotationIterator,
+                           int hiddenApiRestrictions) {
+        this.dexFile = dexFile;
+        this.classDef = classDef;
+        startOffset = reader.getOffset();
+
+        // large values may be used for the index delta, which cause the cumulative index to overflow upon
+        // addition, effectively allowing out of order entries.
+        int methodIndexDiff = reader.readLargeUleb128();
+        this.methodIndex = methodIndexDiff + previousMethodIndex;
+        this.accessFlags = reader.readSmallUleb128();
+        this.codeOffset = reader.readSmallUleb128();
+        this.hiddenApiRestrictions = hiddenApiRestrictions;
+
+        this.methodAnnotationSetOffset = methodAnnotationIterator.seekTo(methodIndex);
+        this.parameterAnnotationSetListOffset = paramaterAnnotationIterator.seekTo(methodIndex);
+    }
+
+    public int getMethodIndex() { return methodIndex; }
+    @Nonnull @Override public String getDefiningClass() { return classDef.getType(); }
+    @Override public int getAccessFlags() { return accessFlags; }
+
+    @Nonnull
+    @Override
+    public String getName() {
+        return dexFile.getStringSection().get(
+                dexFile.getBuffer().readSmallUint(getMethodIdItemOffset() + MethodIdItem.NAME_OFFSET));
+    }
+
+    @Nonnull
+    @Override
+    public String getReturnType() {
+        return dexFile.getTypeSection().get(
+                dexFile.getBuffer().readSmallUint(getProtoIdItemOffset() + ProtoIdItem.RETURN_TYPE_OFFSET));
+    }
+
+    @Nonnull
+    @Override
+    public List<? extends MethodParameter> getParameters() {
+        int parametersOffset = getParametersOffset();
+        if (parametersOffset > 0) {
+            final List<String> parameterTypes = getParameterTypes();
+
+            return new AbstractForwardSequentialList<MethodParameter>() {
+                @Nonnull @Override public Iterator<MethodParameter> iterator() {
+                    return new ParameterIterator(parameterTypes,
+                            getParameterAnnotations(),
+                            getParameterNames());
+                }
+
+                @Override public int size() {
+                    return parameterTypes.size();
+                }
+            };
+        }
+        return ImmutableList.of();
+    }
+
+    @Nonnull
+    public List<? extends Set<? extends DexBackedAnnotation>> getParameterAnnotations() {
+        return AnnotationsDirectory.getParameterAnnotations(dexFile, parameterAnnotationSetListOffset);
+    }
+
+    @Nonnull
+    public Iterator<String> getParameterNames() {
+        DexBackedMethodImplementation methodImpl = getImplementation();
+        if (methodImpl != null) {
+            return methodImpl.getParameterNames(null);
+        }
+        return ImmutableSet.<String>of().iterator();
+    }
+
+    @Nonnull
+    @Override
+    public List<String> getParameterTypes() {
+        final int parametersOffset = getParametersOffset();
+        if (parametersOffset > 0) {
+            final int parameterCount = dexFile.getDataBuffer().readSmallUint(parametersOffset + TypeListItem.SIZE_OFFSET);
+            final int paramListStart = parametersOffset + TypeListItem.LIST_OFFSET;
+            return new FixedSizeList<String>() {
+                @Nonnull
+                @Override
+                public String readItem(final int index) {
+                    return dexFile.getTypeSection().get(dexFile.getDataBuffer().readUshort(paramListStart + 2*index));
+                }
+                @Override public int size() { return parameterCount; }
+            };
+        }
+        return ImmutableList.of();
+    }
+
+    @Nonnull
+    @Override
+    public Set<? extends Annotation> getAnnotations() {
+        return AnnotationsDirectory.getAnnotations(dexFile, methodAnnotationSetOffset);
+    }
+
+    @Nonnull
+    @Override
+    public Set<HiddenApiRestriction> getHiddenApiRestrictions() {
+        if (hiddenApiRestrictions == DexBackedClassDef.NO_HIDDEN_API_RESTRICTIONS) {
+            return ImmutableSet.of();
+        } else {
+            return EnumSet.copyOf(HiddenApiRestriction.getAllFlags(hiddenApiRestrictions));
+        }
+    }
+
+    @Nullable
+    @Override
+    public DexBackedMethodImplementation getImplementation() {
+        if (codeOffset > 0) {
+            return dexFile.createMethodImplementation(dexFile, this, codeOffset);
+        }
+        return null;
+    }
+
+    private int getMethodIdItemOffset() {
+        if (methodIdItemOffset == 0) {
+            methodIdItemOffset = dexFile.getMethodSection().getOffset(methodIndex);
+        }
+        return methodIdItemOffset;
+    }
+
+    private int getProtoIdItemOffset() {
+        if (protoIdItemOffset == 0) {
+            int protoIndex = dexFile.getBuffer().readUshort(getMethodIdItemOffset() + MethodIdItem.PROTO_OFFSET);
+            protoIdItemOffset = dexFile.getProtoSection().getOffset(protoIndex);
+        }
+        return protoIdItemOffset;
+    }
+
+    private int getParametersOffset() {
+        if (parametersOffset == -1) {
+            parametersOffset = dexFile.getBuffer().readSmallUint(
+                    getProtoIdItemOffset() + ProtoIdItem.PARAMETERS_OFFSET);
+        }
+        return parametersOffset;
+    }
+
+    /**
+     * Skips the reader over the specified number of encoded_method structures
+     *
+     * @param reader The reader to skip
+     * @param count The number of encoded_method structures to skip over
+     */
+    public static void skipMethods(@Nonnull DexReader reader, int count) {
+        for (int i=0; i<count; i++) {
+            reader.skipUleb128();
+            reader.skipUleb128();
+            reader.skipUleb128();
+        }
+    }
+
+    /**
+     * Calculate and return the private size of a method definition.
+     *
+     * Calculated as: method_idx_diff + access_flags + code_off +
+     * implementation size + reference size
+     *
+     * @return size in bytes
+     */
+    public int getSize() {
+        int size = 0;
+
+        DexReader reader = dexFile.getDataBuffer().readerAt(startOffset);
+        reader.readLargeUleb128(); //method_idx_diff
+        reader.readSmallUleb128(); //access_flags
+        reader.readSmallUleb128(); //code_off
+        size += reader.getOffset() - startOffset;
+
+        DexBackedMethodImplementation impl = getImplementation();
+        if (impl != null) {
+            size += impl.getSize();
+        }
+
+        DexBackedMethodReference methodRef = new DexBackedMethodReference(dexFile, methodIndex);
+        size += methodRef.getSize();
+
+        return size;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethodImplementation.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethodImplementation.java
new file mode 100644
index 0000000..3fabe10
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethodImplementation.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked;
+
+import com.google.common.collect.ImmutableList;
+import org.jf.dexlib2.dexbacked.instruction.DexBackedInstruction;
+import org.jf.dexlib2.dexbacked.raw.CodeItem;
+import org.jf.dexlib2.dexbacked.util.DebugInfo;
+import org.jf.dexlib2.dexbacked.util.FixedSizeList;
+import org.jf.dexlib2.dexbacked.util.VariableSizeListIterator;
+import org.jf.dexlib2.dexbacked.util.VariableSizeLookaheadIterator;
+import org.jf.dexlib2.iface.MethodImplementation;
+import org.jf.dexlib2.iface.debug.DebugItem;
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.dexlib2.util.AlignmentUtils;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Iterator;
+import java.util.List;
+
+public class DexBackedMethodImplementation implements MethodImplementation {
+    @Nonnull public final DexBackedDexFile dexFile;
+    @Nonnull public final DexBackedMethod method;
+    protected final int codeOffset;
+
+    protected DexBackedMethodImplementation(@Nonnull DexBackedDexFile dexFile,
+                                  @Nonnull DexBackedMethod method,
+                                  int codeOffset) {
+        this.dexFile = dexFile;
+        this.method = method;
+        this.codeOffset = codeOffset;
+    }
+
+    @Override public int getRegisterCount() {
+        return dexFile.getDataBuffer().readUshort(codeOffset);
+    }
+
+    protected int getInstructionsSize() {
+        return dexFile.getDataBuffer().readSmallUint(codeOffset + CodeItem.INSTRUCTION_COUNT_OFFSET);
+    }
+
+    protected int getInstructionsStartOffset() {
+        return codeOffset + CodeItem.INSTRUCTION_START_OFFSET;
+    }
+
+    @Nonnull @Override public Iterable<? extends Instruction> getInstructions() {
+        // instructionsSize is the number of 16-bit code units in the instruction list, not the number of instructions
+        int instructionsSize = getInstructionsSize();
+
+        final int instructionsStartOffset = getInstructionsStartOffset();
+        final int endOffset = instructionsStartOffset + (instructionsSize*2);
+        return new Iterable<Instruction>() {
+            @Override
+            public Iterator<Instruction> iterator() {
+                return new VariableSizeLookaheadIterator<Instruction>(
+                        dexFile.getDataBuffer(), instructionsStartOffset) {
+                    @Override
+                    protected Instruction readNextItem(@Nonnull DexReader reader) {
+                        if (reader.getOffset() >= endOffset) {
+                            return endOfData();
+                        }
+
+                        Instruction instruction = DexBackedInstruction.readFrom(dexFile, reader);
+
+                        // Does the instruction extend past the end of the method?
+                        int offset = reader.getOffset();
+                        if (offset > endOffset || offset < 0) {
+                            throw new ExceptionWithContext("The last instruction in method %s is truncated", method);
+                        }
+                        return instruction;
+                    }
+                };
+            }
+        };
+    }
+
+    protected int getTriesSize() {
+        return dexFile.getDataBuffer().readUshort(codeOffset + CodeItem.TRIES_SIZE_OFFSET);
+    }
+
+    @Nonnull
+    @Override
+    public List<? extends DexBackedTryBlock> getTryBlocks() {
+        final int triesSize = getTriesSize();
+        if (triesSize > 0) {
+            int instructionsSize = getInstructionsSize();
+            final int triesStartOffset = AlignmentUtils.alignOffset(
+                    getInstructionsStartOffset() + (instructionsSize*2), 4);
+            final int handlersStartOffset = triesStartOffset + triesSize*CodeItem.TryItem.ITEM_SIZE;
+
+            return new FixedSizeList<DexBackedTryBlock>() {
+                @Nonnull
+                @Override
+                public DexBackedTryBlock readItem(int index) {
+                    return new DexBackedTryBlock(dexFile,
+                            triesStartOffset + index*CodeItem.TryItem.ITEM_SIZE,
+                            handlersStartOffset);
+                }
+
+                @Override
+                public int size() {
+                    return triesSize;
+                }
+            };
+        }
+        return ImmutableList.of();
+    }
+
+    protected int getDebugOffset() {
+        return dexFile.getDataBuffer().readInt(codeOffset + CodeItem.DEBUG_INFO_OFFSET);
+    }
+
+    @Nonnull
+    private DebugInfo getDebugInfo() {
+        int debugOffset = getDebugOffset();
+
+        if (debugOffset == -1 || debugOffset == 0) {
+            return DebugInfo.newOrEmpty(dexFile, 0, this);
+        }
+        if (debugOffset < 0) {
+            System.err.println(String.format("%s: Invalid debug offset", method));
+            return DebugInfo.newOrEmpty(dexFile, 0, this);
+        }
+        if ((debugOffset + dexFile.getBaseDataOffset()) >= dexFile.getBuffer().buf.length) {
+            System.err.println(String.format("%s: Invalid debug offset", method));
+            return DebugInfo.newOrEmpty(dexFile, 0, this);
+        }
+        return DebugInfo.newOrEmpty(dexFile, debugOffset, this);
+    }
+
+    @Nonnull @Override
+    public Iterable<? extends DebugItem> getDebugItems() {
+        return getDebugInfo();
+    }
+
+    @Nonnull
+    public Iterator<String> getParameterNames(@Nullable DexReader dexReader) {
+        return getDebugInfo().getParameterNames(dexReader);
+    }
+
+    /**
+     * Calculate and return the private size of a method implementation.
+     *
+     * Calculated as: debug info size + instructions size + try-catch size
+     *
+     * @return size in bytes
+     */
+    public int getSize() {
+        int debugSize = getDebugInfo().getSize();
+
+        //set last offset just before bytecode instructions (after insns_size)
+        int lastOffset = getInstructionsStartOffset();
+
+        //set code_item ending offset to the end of instructions list (insns_size * ushort)
+        lastOffset += getInstructionsSize() * 2;
+
+        //read any exception handlers and move code_item offset to the end
+        for (DexBackedTryBlock tryBlock: getTryBlocks()) {
+            Iterator<? extends DexBackedExceptionHandler> tryHandlerIter =
+                tryBlock.getExceptionHandlers().iterator();
+            while (tryHandlerIter.hasNext()) {
+                tryHandlerIter.next();
+            }
+            lastOffset = ((VariableSizeListIterator)tryHandlerIter).getReaderOffset();
+        }
+
+        //method impl size = debug block size + code_item size
+        return debugSize + (lastOffset - codeOffset);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedOdexFile.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedOdexFile.java
new file mode 100644
index 0000000..eb38853
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedOdexFile.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked;
+
+import com.google.common.io.ByteStreams;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.dexbacked.raw.OdexHeaderItem;
+import org.jf.dexlib2.dexbacked.util.VariableSizeList;
+import org.jf.dexlib2.util.DexUtil;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.List;
+
+public class DexBackedOdexFile extends DexBackedDexFile {
+    private static final int DEPENDENCY_COUNT_OFFSET = 12;
+    private static final int DEPENDENCY_START_OFFSET = 16;
+
+    private final byte[] odexBuf;
+
+    public DexBackedOdexFile(@Nonnull Opcodes opcodes, @Nonnull byte[] odexBuf, byte[] dexBuf) {
+        super(opcodes, dexBuf);
+
+        this.odexBuf = odexBuf;
+    }
+
+    @Override public boolean supportsOptimizedOpcodes() {
+        return true;
+    }
+
+    @Nonnull public List<String> getDependencies() {
+        final int dexOffset = OdexHeaderItem.getDexOffset(odexBuf);
+        final int dependencyOffset = OdexHeaderItem.getDependenciesOffset(odexBuf) - dexOffset;
+
+        DexBuffer fromStartBuffer = new DexBuffer(getBuffer().buf, 0);
+        int dependencyCount = fromStartBuffer.readInt(dependencyOffset + DEPENDENCY_COUNT_OFFSET);
+
+        return new VariableSizeList<String>(
+                this.getDataBuffer(), dependencyOffset + DEPENDENCY_START_OFFSET, dependencyCount) {
+            @Override protected String readNextItem(@Nonnull DexReader reader, int index) {
+                int length = reader.readInt();
+                int offset = reader.getOffset();
+                reader.moveRelative(length + 20);
+                try {
+                    return new String(fromStartBuffer.buf, offset, length-1, "US-ASCII");
+                } catch (UnsupportedEncodingException ex) {
+                    throw new RuntimeException(ex);
+                }
+            }
+        };
+    }
+
+    @Nonnull public static DexBackedOdexFile fromInputStream(@Nonnull Opcodes opcodes, @Nonnull InputStream is)
+            throws IOException {
+        DexUtil.verifyOdexHeader(is);
+
+        is.reset();
+        byte[] odexBuf = new byte[OdexHeaderItem.ITEM_SIZE];
+        ByteStreams.readFully(is, odexBuf);
+        int dexOffset = OdexHeaderItem.getDexOffset(odexBuf);
+        if (dexOffset > OdexHeaderItem.ITEM_SIZE) {
+            ByteStreams.skipFully(is, dexOffset - OdexHeaderItem.ITEM_SIZE);
+        }
+
+        byte[] dexBuf = ByteStreams.toByteArray(is);
+
+        return new DexBackedOdexFile(opcodes, odexBuf, dexBuf);
+    }
+
+    public int getOdexVersion() {
+        return OdexHeaderItem.getVersion(odexBuf, 0);
+    }
+
+    public static class NotAnOdexFile extends RuntimeException {
+        public NotAnOdexFile() {
+        }
+
+        public NotAnOdexFile(Throwable cause) {
+            super(cause);
+        }
+
+        public NotAnOdexFile(String message) {
+            super(message);
+        }
+
+        public NotAnOdexFile(String message, Throwable cause) {
+            super(message, cause);
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedTryBlock.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedTryBlock.java
new file mode 100644
index 0000000..c9cf21f
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedTryBlock.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked;
+
+import org.jf.dexlib2.base.BaseTryBlock;
+import org.jf.dexlib2.dexbacked.raw.CodeItem;
+import org.jf.dexlib2.dexbacked.util.VariableSizeList;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+public class DexBackedTryBlock extends BaseTryBlock<DexBackedExceptionHandler> {
+    @Nonnull public final DexBackedDexFile dexFile;
+    private final int tryItemOffset;
+    private final int handlersStartOffset;
+
+    public DexBackedTryBlock(@Nonnull DexBackedDexFile dexFile,
+                             int tryItemOffset,
+                             int handlersStartOffset) {
+        this.dexFile = dexFile;
+        this.tryItemOffset = tryItemOffset;
+        this.handlersStartOffset = handlersStartOffset;
+    }
+
+    @Override public int getStartCodeAddress() {
+        return dexFile.getDataBuffer().readSmallUint(tryItemOffset + CodeItem.TryItem.START_ADDRESS_OFFSET);
+    }
+
+    @Override public int getCodeUnitCount() {
+        return dexFile.getDataBuffer().readUshort(tryItemOffset + CodeItem.TryItem.CODE_UNIT_COUNT_OFFSET);
+    }
+
+    @Nonnull
+    @Override
+    public List<? extends DexBackedExceptionHandler> getExceptionHandlers() {
+        DexReader reader = dexFile.getDataBuffer().readerAt(
+                handlersStartOffset + dexFile.getDataBuffer().readUshort(tryItemOffset + CodeItem.TryItem.HANDLER_OFFSET));
+        final int encodedSize = reader.readSleb128();
+
+        if (encodedSize > 0) {
+            //no catch-all
+            return new VariableSizeList<DexBackedTypedExceptionHandler>(
+                    dexFile.getDataBuffer(), reader.getOffset(), encodedSize) {
+                @Nonnull
+                @Override
+                protected DexBackedTypedExceptionHandler readNextItem(@Nonnull DexReader reader, int index) {
+                    return new DexBackedTypedExceptionHandler(dexFile, reader);
+                }
+            };
+        } else {
+            //with catch-all
+            final int sizeWithCatchAll = (-1 * encodedSize) + 1;
+            return new VariableSizeList<DexBackedExceptionHandler>(
+                    dexFile.getDataBuffer(), reader.getOffset(), sizeWithCatchAll) {
+                @Nonnull
+                @Override
+                protected DexBackedExceptionHandler readNextItem(@Nonnull DexReader dexReader, int index) {
+                    if (index == sizeWithCatchAll-1) {
+                        return new DexBackedCatchAllExceptionHandler(dexReader);
+                    } else {
+                        return new DexBackedTypedExceptionHandler(dexFile, dexReader);
+                    }
+                }
+            };
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedTypedExceptionHandler.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedTypedExceptionHandler.java
new file mode 100644
index 0000000..af82309
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedTypedExceptionHandler.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedTypedExceptionHandler extends DexBackedExceptionHandler {
+    @Nonnull private final DexBackedDexFile dexFile;
+    private final int typeId;
+    private final int handlerCodeAddress;
+
+    public DexBackedTypedExceptionHandler(@Nonnull DexBackedDexFile dexFile, @Nonnull DexReader reader) {
+        this.dexFile = dexFile;
+        this.typeId = reader.readSmallUleb128();
+        this.handlerCodeAddress = reader.readSmallUleb128();
+    }
+
+    @Nonnull @Override public String getExceptionType() { return dexFile.getTypeSection().get(typeId); }
+    @Override public int getHandlerCodeAddress() { return handlerCodeAddress; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBuffer.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBuffer.java
new file mode 100644
index 0000000..50c45ca
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBuffer.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked;
+
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+import java.util.Arrays;
+
+public class DexBuffer {
+    @Nonnull final byte[] buf;
+    final int baseOffset;
+
+    public DexBuffer(@Nonnull byte[] buf) {
+        this(buf, 0);
+    }
+    public DexBuffer(@Nonnull byte[] buf, int offset) {
+        this.buf = buf;
+        this.baseOffset = offset;
+    }
+
+    public int readSmallUint(int offset) {
+        byte[] buf = this.buf;
+        offset += baseOffset;
+        int result = (buf[offset] & 0xff) |
+                ((buf[offset+1] & 0xff) << 8) |
+                ((buf[offset+2] & 0xff) << 16) |
+                ((buf[offset+3]) << 24);
+        if (result < 0) {
+            throw new ExceptionWithContext("Encountered small uint that is out of range at offset 0x%x", offset);
+        }
+        return result;
+    }
+
+    public int readOptionalUint(int offset) {
+        byte[] buf = this.buf;
+        offset += baseOffset;
+        int result = (buf[offset] & 0xff) |
+                ((buf[offset+1] & 0xff) << 8) |
+                ((buf[offset+2] & 0xff) << 16) |
+                ((buf[offset+3]) << 24);
+        if (result < -1) {
+            throw new ExceptionWithContext("Encountered optional uint that is out of range at offset 0x%x", offset);
+        }
+        return result;
+    }
+
+    public int readUshort(int offset) {
+        byte[] buf = this.buf;
+        offset += baseOffset;
+        return (buf[offset] & 0xff) |
+                ((buf[offset+1] & 0xff) << 8);
+    }
+
+    public int readUbyte(int offset) {
+        return buf[offset + baseOffset] & 0xff;
+    }
+
+    public long readLong(int offset) {
+        byte[] buf = this.buf;
+        offset += baseOffset;
+        return (buf[offset] & 0xff) |
+                ((buf[offset+1] & 0xff) << 8) |
+                ((buf[offset+2] & 0xff) << 16) |
+                ((buf[offset+3] & 0xffL) << 24) |
+                ((buf[offset+4] & 0xffL) << 32) |
+                ((buf[offset+5] & 0xffL) << 40) |
+                ((buf[offset+6] & 0xffL) << 48) |
+                (((long)buf[offset+7]) << 56);
+    }
+
+    public int readLongAsSmallUint(int offset) {
+        byte[] buf = this.buf;
+        offset += baseOffset;
+        long result = (buf[offset] & 0xff) |
+                ((buf[offset+1] & 0xff) << 8) |
+                ((buf[offset+2] & 0xff) << 16) |
+                ((buf[offset+3] & 0xffL) << 24) |
+                ((buf[offset+4] & 0xffL) << 32) |
+                ((buf[offset+5] & 0xffL) << 40) |
+                ((buf[offset+6] & 0xffL) << 48) |
+                (((long)buf[offset+7]) << 56);
+        if (result < 0 || result > Integer.MAX_VALUE) {
+            throw new ExceptionWithContext("Encountered out-of-range ulong at offset 0x%x", offset);
+        }
+        return (int)result;
+    }
+
+    public int readInt(int offset) {
+        byte[] buf = this.buf;
+        offset += baseOffset;
+        return (buf[offset] & 0xff) |
+                ((buf[offset+1] & 0xff) << 8) |
+                ((buf[offset+2] & 0xff) << 16) |
+                (buf[offset+3] << 24);
+    }
+
+    public int readShort(int offset) {
+        byte[] buf = this.buf;
+        offset += baseOffset;
+        return (buf[offset] & 0xff) |
+                (buf[offset+1] << 8);
+    }
+
+    public int readByte(int offset) {
+        return buf[baseOffset + offset];
+    }
+
+    @Nonnull
+    public byte[] readByteRange(int start, int length) {
+        return Arrays.copyOfRange(buf, baseOffset + start, baseOffset + start + length);
+    }
+
+    @Nonnull
+    public DexReader<? extends DexBuffer> readerAt(int offset) {
+        return new DexReader<DexBuffer>(this, offset);
+    }
+
+    @Nonnull
+    public byte[] getBuf() {
+        return buf;
+    }
+
+    public int getBaseOffset() {
+        return baseOffset;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexReader.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexReader.java
new file mode 100644
index 0000000..a880b6d
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexReader.java
@@ -0,0 +1,623 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked;
+
+import org.jf.util.ExceptionWithContext;
+import org.jf.util.Utf8Utils;
+
+import javax.annotation.Nonnull;
+
+public class DexReader<T extends DexBuffer> {
+    @Nonnull public final T dexBuf;
+    private int offset;
+
+    public DexReader(@Nonnull T dexBuf, int offset) {
+        this.dexBuf = dexBuf;
+        this.offset = offset;
+    }
+
+    public int getOffset() { return offset; }
+    public void setOffset(int offset) { this.offset = offset; }
+
+    public int readSleb128() {
+        int end = dexBuf.baseOffset + offset;
+        int currentByteValue;
+        int result;
+        byte[] buf = dexBuf.buf;
+
+        result = buf[end++] & 0xff;
+        if (result <= 0x7f) {
+            result = (result << 25) >> 25;
+        } else {
+            currentByteValue = buf[end++] & 0xff;
+            result = (result & 0x7f) | ((currentByteValue & 0x7f) << 7);
+            if (currentByteValue <= 0x7f) {
+                result = (result << 18) >> 18;
+            } else {
+                currentByteValue = buf[end++] & 0xff;
+                result |= (currentByteValue & 0x7f) << 14;
+                if (currentByteValue <= 0x7f) {
+                    result = (result << 11) >> 11;
+                } else {
+                    currentByteValue = buf[end++] & 0xff;
+                    result |= (currentByteValue & 0x7f) << 21;
+                    if (currentByteValue <= 0x7f) {
+                        result = (result << 4) >> 4;
+                    } else {
+                        currentByteValue = buf[end++] & 0xff;
+                        if (currentByteValue > 0x7f) {
+                            throw new ExceptionWithContext(
+                                    "Invalid sleb128 integer encountered at offset 0x%x", offset);
+                        }
+                        result |= currentByteValue << 28;
+                    }
+                }
+            }
+        }
+
+        offset = end - dexBuf.baseOffset;
+        return result;
+    }
+
+    public int peekSleb128Size() {
+        int end = dexBuf.baseOffset + offset;
+        int currentByteValue;
+        int result;
+        byte[] buf = dexBuf.buf;
+
+        result = buf[end++] & 0xff;
+        if (result > 0x7f) {
+            currentByteValue = buf[end++] & 0xff;
+            if (currentByteValue > 0x7f) {
+                currentByteValue = buf[end++] & 0xff;
+                if (currentByteValue > 0x7f) {
+                    currentByteValue = buf[end++] & 0xff;
+                    if (currentByteValue > 0x7f) {
+                        currentByteValue = buf[end++] & 0xff;
+                        if (currentByteValue > 0x7f) {
+                            throw new ExceptionWithContext(
+                                "Invalid sleb128 integer encountered at offset 0x%x", offset);
+                        }
+                    }
+                }
+            }
+        }
+
+        return end - (dexBuf.baseOffset + offset);
+    }
+
+    public int readSmallUleb128() {
+        return readUleb128(false);
+    }
+
+    public int peekSmallUleb128Size() {
+        return peekUleb128Size(false);
+    }
+
+    private int readUleb128(boolean allowLarge) {
+        int end = dexBuf.baseOffset + offset;
+        int currentByteValue;
+        int result;
+        byte[] buf = dexBuf.buf;
+
+        result = buf[end++] & 0xff;
+        if (result > 0x7f) {
+            currentByteValue = buf[end++] & 0xff;
+            result = (result & 0x7f) | ((currentByteValue & 0x7f) << 7);
+            if (currentByteValue > 0x7f) {
+                currentByteValue = buf[end++] & 0xff;
+                result |= (currentByteValue & 0x7f) << 14;
+                if (currentByteValue > 0x7f) {
+                    currentByteValue = buf[end++] & 0xff;
+                    result |= (currentByteValue & 0x7f) << 21;
+                    if (currentByteValue > 0x7f) {
+                        currentByteValue = buf[end++];
+
+                        // MSB shouldn't be set on last byte
+                        if (currentByteValue < 0) {
+                            throw new ExceptionWithContext(
+                                    "Invalid uleb128 integer encountered at offset 0x%x", offset);
+                        } else if ((currentByteValue & 0xf) > 0x07) {
+                            if (!allowLarge) {
+                                // for non-large uleb128s, we assume most significant bit of the result will not be
+                                // set, so that it can fit into a signed integer without wrapping
+                                throw new ExceptionWithContext(
+                                        "Encountered valid uleb128 that is out of range at offset 0x%x", offset);
+                            }
+                        }
+                        result |= currentByteValue << 28;
+                    }
+                }
+            }
+        }
+
+        offset = end - dexBuf.baseOffset;
+        return result;
+    }
+
+    private int peekUleb128Size(boolean allowLarge) {
+        int end = dexBuf.baseOffset + offset;
+        int currentByteValue;
+        int result;
+        byte[] buf = dexBuf.buf;
+
+        result = buf[end++] & 0xff;
+        if (result > 0x7f) {
+            currentByteValue = buf[end++] & 0xff;
+            if (currentByteValue > 0x7f) {
+                currentByteValue = buf[end++] & 0xff;
+                if (currentByteValue > 0x7f) {
+                    currentByteValue = buf[end++] & 0xff;
+                    if (currentByteValue > 0x7f) {
+                        currentByteValue = buf[end++];
+
+                        // MSB shouldn't be set on last byte
+                        if (currentByteValue < 0) {
+                            throw new ExceptionWithContext(
+                                "Invalid uleb128 integer encountered at offset 0x%x", offset);
+                        } else if ((currentByteValue & 0xf) > 0x07) {
+                            if (!allowLarge) {
+                                // for non-large uleb128s, we assume most significant bit of the result will not be
+                                // set, so that it can fit into a signed integer without wrapping
+                                throw new ExceptionWithContext(
+                                    "Encountered valid uleb128 that is out of range at offset 0x%x", offset);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        return end - (dexBuf.baseOffset + offset);
+    }
+
+
+    /**
+     * Reads a "large" uleb128. That is, one that may legitimately be greater than a signed int.
+     *
+     * The value is returned as if it were signed. i.e. a value of 0xFFFFFFFF would be returned as -1. It is up to the
+     * caller to handle the value appropriately.
+     */
+    public int readLargeUleb128() {
+       return readUleb128(true);
+    }
+
+    /**
+     * Reads a "big" uleb128 that can legitimately be > 2^31. The value is returned as a signed integer, with the
+     * expected semantics of re-interpreting an unsigned value as a signed value.
+     *
+     * @return The unsigned value, reinterpreted as a signed int
+     */
+    public int readBigUleb128() {
+        int end = dexBuf.baseOffset + offset;
+        int currentByteValue;
+        int result;
+        byte[] buf = dexBuf.buf;
+
+        result = buf[end++] & 0xff;
+        if (result > 0x7f) {
+            currentByteValue = buf[end++] & 0xff;
+            result = (result & 0x7f) | ((currentByteValue & 0x7f) << 7);
+            if (currentByteValue > 0x7f) {
+                currentByteValue = buf[end++] & 0xff;
+                result |= (currentByteValue & 0x7f) << 14;
+                if (currentByteValue > 0x7f) {
+                    currentByteValue = buf[end++] & 0xff;
+                    result |= (currentByteValue & 0x7f) << 21;
+                    if (currentByteValue > 0x7f) {
+                        currentByteValue = buf[end++];
+
+                        // MSB shouldn't be set on last byte
+                        if (currentByteValue < 0) {
+                            throw new ExceptionWithContext(
+                                    "Invalid uleb128 integer encountered at offset 0x%x", offset);
+                        }
+                        result |= currentByteValue << 28;
+                    }
+                }
+            }
+        }
+
+        offset = end - dexBuf.baseOffset;
+        return result;
+    }
+
+    public int peekBigUleb128Size() {
+        int end = dexBuf.baseOffset + offset;
+        int currentByteValue;
+        int result;
+        byte[] buf = dexBuf.buf;
+
+        result = buf[end++] & 0xff;
+        if (result > 0x7f) {
+            currentByteValue = buf[end++] & 0xff;
+            if (currentByteValue > 0x7f) {
+                currentByteValue = buf[end++] & 0xff;
+                if (currentByteValue > 0x7f) {
+                    currentByteValue = buf[end++] & 0xff;
+                    if (currentByteValue > 0x7f) {
+                        currentByteValue = buf[end++];
+
+                        // MSB shouldn't be set on last byte
+                        if (currentByteValue < 0) {
+                            throw new ExceptionWithContext(
+                                "Invalid uleb128 integer encountered at offset 0x%x", offset);
+                        }
+                    }
+                }
+            }
+        }
+
+        return end - (dexBuf.baseOffset + offset);
+    }
+
+    public void skipUleb128() {
+        int end = dexBuf.baseOffset + offset;
+        byte currentByteValue;
+        byte[] buf = dexBuf.buf;
+
+        currentByteValue = buf[end++];
+        if (currentByteValue < 0) { // if the MSB is set
+            currentByteValue = buf[end++];
+            if (currentByteValue < 0) { // if the MSB is set
+                currentByteValue = buf[end++];
+                if (currentByteValue < 0) { // if the MSB is set
+                    currentByteValue = buf[end++];
+                    if (currentByteValue < 0) { // if the MSB is set
+                        currentByteValue = buf[end++];
+                        if (currentByteValue < 0) {
+                            throw new ExceptionWithContext(
+                                    "Invalid uleb128 integer encountered at offset 0x%x", offset);
+                        }
+                    }
+                }
+            }
+        }
+
+        offset = end - dexBuf.baseOffset;
+    }
+
+    public int readSmallUint() {
+        int o = offset;
+        int result = dexBuf.readSmallUint(o);
+        offset = o + 4;
+        return result;
+    }
+
+    public int readOptionalUint() {
+        int o = offset;
+        int result = dexBuf.readOptionalUint(o);
+        offset = o + 4;
+        return result;
+    }
+
+    public int peekUshort() {
+        return dexBuf.readUshort(offset);
+    }
+
+    public int readUshort() {
+        int o = offset;
+        int result = dexBuf.readUshort(offset);
+        offset = o + 2;
+        return result;
+    }
+
+    public int peekUbyte() {
+        return dexBuf.readUbyte(offset);
+    }
+
+    public int readUbyte() {
+        int o = offset;
+        int result = dexBuf.readUbyte(offset);
+        offset = o + 1;
+        return result;
+    }
+
+    public long readLong() {
+        int o = offset;
+        long result = dexBuf.readLong(offset);
+        offset = o + 8;
+        return result;
+    }
+
+    public int readInt() {
+        int o = offset;
+        int result = dexBuf.readInt(offset);
+        offset = o + 4;
+        return result;
+    }
+
+    public int readShort() {
+        int o = offset;
+        int result = dexBuf.readShort(offset);
+        offset = o + 2;
+        return result;
+    }
+
+    public int readByte() {
+        int o = offset;
+        int result = dexBuf.readByte(offset);
+        offset = o + 1;
+        return result;
+    }
+
+    public void skipByte() { offset++; }
+    public void moveRelative(int i) { offset += i; }
+
+    public int readSmallUint(int offset) { return dexBuf.readSmallUint(offset); }
+    public int readUshort(int offset) { return dexBuf.readUshort(offset); }
+    public int readUbyte(int offset) { return dexBuf.readUbyte(offset); }
+    public long readLong(int offset) { return dexBuf.readLong(offset); }
+    public int readInt(int offset) { return dexBuf.readInt(offset); }
+    public int readShort(int offset) { return dexBuf.readShort(offset); }
+    public int readByte(int offset) { return dexBuf.readByte(offset); }
+
+    public int readSizedInt(int bytes) {
+        int o = dexBuf.baseOffset + offset;
+        byte[] buf = dexBuf.buf;
+
+        int result;
+        switch (bytes) {
+            case 4:
+                result = (buf[o] & 0xff) |
+                        ((buf[o+1] & 0xff) << 8) |
+                        ((buf[o+2] & 0xff) << 16) |
+                        (buf[o+3] << 24);
+                break;
+            case 3:
+                result = (buf[o] & 0xff) |
+                        ((buf[o+1] & 0xff) << 8) |
+                        ((buf[o+2]) << 16);
+                break;
+            case 2:
+                result = (buf[o] & 0xff) |
+                        ((buf[o+1]) << 8);
+                break;
+            case 1:
+                result = buf[o];
+                break;
+            default:
+                throw new ExceptionWithContext("Invalid size %d for sized int at offset 0x%x", bytes, offset);
+        }
+        offset = o + bytes - dexBuf.baseOffset;
+        return result;
+    }
+
+    public int readSizedSmallUint(int bytes) {
+        int o = dexBuf.baseOffset + offset;
+        byte[] buf = dexBuf.buf;
+
+        int result = 0;
+        switch (bytes) {
+            case 4:
+                int b = buf[o+3];
+                if (b < 0) {
+                    throw new ExceptionWithContext(
+                            "Encountered valid sized uint that is out of range at offset 0x%x", offset);
+                }
+                result = b << 24;
+                // fall-through
+            case 3:
+                result |= (buf[o+2] & 0xff) << 16;
+                // fall-through
+            case 2:
+                result |= (buf[o+1] & 0xff) << 8;
+                // fall-through
+            case 1:
+                result |= (buf[o] & 0xff);
+                break;
+            default:
+                throw new ExceptionWithContext("Invalid size %d for sized uint at offset 0x%x", bytes, offset);
+        }
+        offset = o + bytes - dexBuf.baseOffset;
+        return result;
+    }
+
+    public int readSizedRightExtendedInt(int bytes) {
+        int o = dexBuf.baseOffset + offset;
+        byte[] buf = dexBuf.buf;
+
+        int result;
+        switch (bytes) {
+            case 4:
+                result = (buf[o] & 0xff) |
+                        ((buf[o+1] & 0xff) << 8) |
+                        ((buf[o+2] & 0xff) << 16) |
+                        (buf[o+3] << 24);
+                break;
+            case 3:
+                result = (buf[o] & 0xff) << 8 |
+                        ((buf[o+1] & 0xff) << 16) |
+                        (buf[o+2] << 24);
+                break;
+            case 2:
+                result = (buf[o] & 0xff) << 16 |
+                        (buf[o+1] << 24);
+                break;
+            case 1:
+                result = buf[o] << 24;
+                break;
+            default:
+                throw new ExceptionWithContext(
+                        "Invalid size %d for sized, right extended int at offset 0x%x", bytes, offset);
+        }
+        offset = o + bytes - dexBuf.baseOffset;
+        return result;
+    }
+
+    public long readSizedRightExtendedLong(int bytes) {
+        int o = dexBuf.baseOffset + offset;
+        byte[] buf = dexBuf.buf;
+
+        long result;
+        switch (bytes) {
+            case 8:
+                result = (buf[o] & 0xff) |
+                        ((buf[o+1] & 0xff) << 8) |
+                        ((buf[o+2] & 0xff) << 16) |
+                        ((buf[o+3] & 0xffL) << 24) |
+                        ((buf[o+4] & 0xffL) << 32) |
+                        ((buf[o+5] & 0xffL) << 40) |
+                        ((buf[o+6] & 0xffL) << 48) |
+                        (((long)buf[o+7]) << 56);
+                break;
+            case 7:
+                result = ((buf[o] & 0xff)) << 8 |
+                        ((buf[o+1] & 0xff) << 16) |
+                        ((buf[o+2] & 0xffL) << 24) |
+                        ((buf[o+3] & 0xffL) << 32) |
+                        ((buf[o+4] & 0xffL) << 40) |
+                        ((buf[o+5] & 0xffL) << 48) |
+                        (((long)buf[o+6]) << 56);
+                break;
+            case 6:
+                result = ((buf[o] & 0xff)) << 16 |
+                        ((buf[o+1] & 0xffL) << 24) |
+                        ((buf[o+2] & 0xffL) << 32) |
+                        ((buf[o+3] & 0xffL) << 40) |
+                        ((buf[o+4] & 0xffL) << 48) |
+                        (((long)buf[o+5]) << 56);
+                break;
+            case 5:
+                result = ((buf[o] & 0xffL)) << 24 |
+                        ((buf[o+1] & 0xffL) << 32) |
+                        ((buf[o+2] & 0xffL) << 40) |
+                        ((buf[o+3] & 0xffL) << 48) |
+                        (((long)buf[o+4]) << 56);
+                break;
+            case 4:
+                result = ((buf[o] & 0xffL)) << 32 |
+                        ((buf[o+1] & 0xffL) << 40) |
+                        ((buf[o+2] & 0xffL) << 48) |
+                        (((long)buf[o+3]) << 56);
+                break;
+            case 3:
+                result = ((buf[o] & 0xffL)) << 40 |
+                        ((buf[o+1] & 0xffL) << 48) |
+                        (((long)buf[o+2]) << 56);
+                break;
+            case 2:
+                result = ((buf[o] & 0xffL)) << 48 |
+                        (((long)buf[o+1]) << 56);
+                break;
+            case 1:
+                result = ((long)buf[o]) << 56;
+                break;
+            default:
+                throw new ExceptionWithContext(
+                        "Invalid size %d for sized, right extended long at offset 0x%x", bytes, offset);
+        }
+        offset = o + bytes - dexBuf.baseOffset;
+        return result;
+    }
+
+    public long readSizedLong(int bytes) {
+        int o = dexBuf.baseOffset + offset;
+        byte[] buf = dexBuf.buf;
+
+        long result;
+        switch (bytes) {
+            case 8:
+                result = (buf[o] & 0xff) |
+                        ((buf[o+1] & 0xff) << 8) |
+                        ((buf[o+2] & 0xff) << 16) |
+                        ((buf[o+3] & 0xffL) << 24) |
+                        ((buf[o+4] & 0xffL) << 32) |
+                        ((buf[o+5] & 0xffL) << 40) |
+                        ((buf[o+6] & 0xffL) << 48) |
+                        (((long)buf[o+7]) << 56);
+                break;
+            case 7:
+                result = (buf[o] & 0xff) |
+                        ((buf[o+1] & 0xff) << 8) |
+                        ((buf[o+2] & 0xff) << 16) |
+                        ((buf[o+3] & 0xffL) << 24) |
+                        ((buf[o+4] & 0xffL) << 32) |
+                        ((buf[o+5] & 0xffL) << 40) |
+                        ((long)(buf[o+6]) << 48);
+                break;
+            case 6:
+                result = (buf[o] & 0xff) |
+                        ((buf[o+1] & 0xff) << 8) |
+                        ((buf[o+2] & 0xff) << 16) |
+                        ((buf[o+3] & 0xffL) << 24) |
+                        ((buf[o+4] & 0xffL) << 32) |
+                        ((long)(buf[o+5]) << 40);
+                break;
+            case 5:
+                result = (buf[o] & 0xff) |
+                        ((buf[o+1] & 0xff) << 8) |
+                        ((buf[o+2] & 0xff) << 16) |
+                        ((buf[o+3] & 0xffL) << 24) |
+                        ((long)(buf[o+4]) << 32);
+                break;
+            case 4:
+                result = (buf[o] & 0xff) |
+                        ((buf[o+1] & 0xff) << 8) |
+                        ((buf[o+2] & 0xff) << 16) |
+                        (((long)buf[o+3]) << 24);
+                break;
+            case 3:
+                result = (buf[o] & 0xff) |
+                        ((buf[o+1] & 0xff) << 8) |
+                        (buf[o+2] << 16);
+                break;
+            case 2:
+                result = (buf[o] & 0xff) |
+                        (buf[o+1] << 8);
+                break;
+            case 1:
+                result = buf[o];
+                break;
+            default:
+                throw new ExceptionWithContext("Invalid size %d for sized long at offset 0x%x", bytes, offset);
+        }
+
+        offset = o + bytes - dexBuf.baseOffset;
+        return result;
+    }
+
+    public String readString(int utf16Length) {
+        int[] ret = new int[1];
+        String value = Utf8Utils.utf8BytesWithUtf16LengthToString(
+                dexBuf.buf, dexBuf.baseOffset + offset, utf16Length, ret);
+        offset += ret[0];
+        return value;
+    }
+
+    public int peekStringLength(int utf16Length) {
+        int[] ret = new int[1];
+        Utf8Utils.utf8BytesWithUtf16LengthToString(
+            dexBuf.buf, dexBuf.baseOffset + offset, utf16Length, ret);
+        return ret[0];
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/OatFile.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/OatFile.java
new file mode 100644
index 0000000..389c46f
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/OatFile.java
@@ -0,0 +1,693 @@
+/*
+ * Copyright 2014, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked;
+
+import com.google.common.base.Function;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterators;
+import com.google.common.io.ByteStreams;
+import org.jf.dexlib2.DexFileFactory;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.dexbacked.OatFile.SymbolTable.Symbol;
+import org.jf.dexlib2.dexbacked.raw.HeaderItem;
+import org.jf.dexlib2.iface.MultiDexContainer;
+import org.jf.dexlib2.util.DexUtil;
+import org.jf.util.AbstractForwardSequentialList;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.EOFException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.Charset;
+import java.util.*;
+
+public class OatFile extends DexBuffer implements MultiDexContainer<DexBackedDexFile> {
+    private static final byte[] ELF_MAGIC = new byte[] { 0x7f, 'E', 'L', 'F' };
+    private static final byte[] OAT_MAGIC = new byte[] { 'o', 'a', 't', '\n' };
+    private static final int MIN_ELF_HEADER_SIZE = 52;
+
+    // These are the "known working" versions that I have manually inspected the source for.
+    // Later version may or may not work, depending on what changed.
+    private static final int MIN_OAT_VERSION = 56;
+    private static final int MAX_OAT_VERSION = 178;
+
+    public static final int UNSUPPORTED = 0;
+    public static final int SUPPORTED = 1;
+    public static final int UNKNOWN = 2;
+
+    private final boolean is64bit;
+    @Nonnull private final OatHeader oatHeader;
+    @Nonnull private final Opcodes opcodes;
+    @Nullable private final VdexProvider vdexProvider;
+
+    public OatFile(@Nonnull byte[] buf) {
+        this(buf, null);
+    }
+
+    public OatFile(@Nonnull byte[] buf, @Nullable VdexProvider vdexProvider) {
+        super(buf);
+
+        if (buf.length < MIN_ELF_HEADER_SIZE) {
+            throw new NotAnOatFileException();
+        }
+
+        verifyMagic(buf);
+
+        if (buf[4] == 1) {
+            is64bit = false;
+        } else if (buf[4] == 2) {
+            is64bit = true;
+        } else {
+            throw new InvalidOatFileException(String.format("Invalid word-size value: %x", buf[5]));
+        }
+
+        OatHeader oatHeader = null;
+        SymbolTable symbolTable = getSymbolTable();
+        for (Symbol symbol: symbolTable.getSymbols()) {
+            if (symbol.getName().equals("oatdata")) {
+                oatHeader = new OatHeader(symbol.getFileOffset());
+                break;
+            }
+        }
+
+        if (oatHeader == null) {
+            throw new InvalidOatFileException("Oat file has no oatdata symbol");
+        }
+        this.oatHeader = oatHeader;
+
+        if (!oatHeader.isValid()) {
+            throw new InvalidOatFileException("Invalid oat magic value");
+        }
+
+        this.opcodes = Opcodes.forArtVersion(oatHeader.getVersion());
+        this.vdexProvider = vdexProvider;
+    }
+
+    private static void verifyMagic(byte[] buf) {
+        for (int i = 0; i < ELF_MAGIC.length; i++) {
+            if (buf[i] != ELF_MAGIC[i]) {
+                throw new NotAnOatFileException();
+            }
+        }
+    }
+
+    public static OatFile fromInputStream(@Nonnull InputStream is) throws IOException {
+        return fromInputStream(is, null);
+    }
+
+    public static OatFile fromInputStream(@Nonnull InputStream is, @Nullable VdexProvider vdexProvider)
+            throws IOException {
+        if (!is.markSupported()) {
+            throw new IllegalArgumentException("InputStream must support mark");
+        }
+        is.mark(4);
+        byte[] partialHeader = new byte[4];
+        try {
+            ByteStreams.readFully(is, partialHeader);
+        } catch (EOFException ex) {
+            throw new NotAnOatFileException();
+        } finally {
+            is.reset();
+        }
+
+        verifyMagic(partialHeader);
+
+        is.reset();
+
+        byte[] buf = ByteStreams.toByteArray(is);
+        return new OatFile(buf, vdexProvider);
+    }
+
+    public int getOatVersion() {
+        return oatHeader.getVersion();
+    }
+
+    public int isSupportedVersion() {
+        int version = getOatVersion();
+        if (version < MIN_OAT_VERSION) {
+            return UNSUPPORTED;
+        }
+        if (version <= MAX_OAT_VERSION) {
+            return SUPPORTED;
+        }
+        return UNKNOWN;
+    }
+
+    @Nonnull
+    public List<String> getBootClassPath() {
+        if (getOatVersion() < 75) {
+            return ImmutableList.of();
+        }
+        String bcp = oatHeader.getKeyValue("bootclasspath");
+        if (bcp == null) {
+            return ImmutableList.of();
+        }
+        return Arrays.asList(bcp.split(":"));
+    }
+
+    @Nonnull
+    public List<DexBackedDexFile> getDexFiles() {
+        return new AbstractForwardSequentialList<DexBackedDexFile>() {
+            @Override public int size() {
+                return Iterators.size(Iterators.filter(new DexEntryIterator(), Objects::nonNull));
+            }
+
+            @Nonnull @Override public Iterator<DexBackedDexFile> iterator() {
+                return Iterators.transform(
+                    Iterators.filter(new DexEntryIterator(), Objects::nonNull),
+                        new Function<OatDexEntry, DexBackedDexFile>() {
+                            @Nullable @Override public DexBackedDexFile apply(OatDexEntry dexEntry) {
+                                return dexEntry.getDexFile();
+                            }
+                        });
+            }
+        };
+    }
+
+    @Nonnull @Override public List<String> getDexEntryNames() throws IOException {
+        return new AbstractForwardSequentialList<String>() {
+            @Override public int size() {
+                return Iterators.size(Iterators.filter(new DexEntryIterator(), Objects::nonNull));
+            }
+
+            @Nonnull @Override public Iterator<String> iterator() {
+                return Iterators.transform(
+                    Iterators.filter(new DexEntryIterator(), Objects::nonNull),
+                        new Function<OatDexEntry, String>() {
+                            @Nullable @Override public String apply(OatDexEntry dexEntry) {
+                                return dexEntry.entryName;
+                            }
+                        });
+            }
+        };
+    }
+
+    @Nullable
+    @Override
+    public OatDexEntry getEntry(@Nonnull String entryName) throws IOException {
+        DexEntryIterator iterator = new DexEntryIterator();
+        while (iterator.hasNext()) {
+            OatDexEntry entry = iterator.next();
+            if (entry != null && entry.getEntryName().equals(entryName)) {
+                return entry;
+            }
+        }
+        return null;
+    }
+
+    public class OatDexFile extends DexBackedDexFile {
+        public OatDexFile(@Nonnull byte[] buf, int offset) {
+            super(opcodes, buf, offset);
+        }
+
+        @Override public boolean supportsOptimizedOpcodes() {
+            return true;
+        }
+    }
+
+    public class OatCDexFile extends CDexBackedDexFile {
+        public OatCDexFile(byte[] buf, int offset) {
+            super(opcodes, buf, offset);
+        }
+
+        @Override public boolean supportsOptimizedOpcodes() {
+            return true;
+        }
+    }
+
+    private class OatHeader {
+        private final int headerOffset;
+        private final int keyValueStoreOffset;
+
+        public OatHeader(int offset) {
+            this.headerOffset = offset;
+            if (getVersion() >= 170) {
+                this.keyValueStoreOffset = 14 * 4;
+            } else if (getVersion() >= 166) {
+                this.keyValueStoreOffset = 16 * 4;
+            } else if (getVersion() >= 162) {
+                this.keyValueStoreOffset = 17 * 4;
+            } else if (getVersion() >= 127) {
+                this.keyValueStoreOffset = 19 * 4;
+            } else {
+                this.keyValueStoreOffset = 18 * 4;
+            }
+        }
+
+        public boolean isValid() {
+            for (int i=0; i<OAT_MAGIC.length; i++) {
+                if (buf[headerOffset + i] != OAT_MAGIC[i]) {
+                    return false;
+                }
+            }
+
+            for (int i=4; i<7; i++) {
+                if (buf[headerOffset + i] < '0' || buf[headerOffset + i] > '9') {
+                    return false;
+                }
+            }
+
+            return buf[headerOffset + 7] == 0;
+        }
+
+        public int getVersion() {
+            return Integer.valueOf(new String(buf, headerOffset + 4, 3));
+        }
+
+        public int getDexFileCount() {
+            return readSmallUint(headerOffset + 20);
+        }
+
+        public int getKeyValueStoreSize() {
+            if (getVersion() < MIN_OAT_VERSION) {
+                throw new IllegalStateException("Unsupported oat version");
+            }
+            int fieldOffset = keyValueStoreOffset - 4;
+            return readSmallUint(headerOffset + fieldOffset);
+        }
+
+        public int getHeaderSize() {
+            if (getVersion() < MIN_OAT_VERSION) {
+                throw new IllegalStateException("Unsupported oat version");
+            }
+            return keyValueStoreOffset + getKeyValueStoreSize();
+        }
+
+        @Nullable
+        public String getKeyValue(@Nonnull String key) {
+            int size = getKeyValueStoreSize();
+
+            int offset = headerOffset + keyValueStoreOffset;
+            int endOffset = offset + size;
+
+            while (offset < endOffset) {
+                int keyStartOffset = offset;
+                while (offset < endOffset && buf[offset] != '\0') {
+                    offset++;
+                }
+                if (offset >= endOffset) {
+                    throw new InvalidOatFileException("Oat file contains truncated key value store");
+                }
+                int keyEndOffset = offset;
+
+                String k = new String(buf, keyStartOffset, keyEndOffset - keyStartOffset);
+                if (k.equals(key)) {
+                    int valueStartOffset = ++offset;
+                    while (offset < endOffset && buf[offset] != '\0') {
+                        offset++;
+                    }
+                    if (offset >= endOffset) {
+                        throw new InvalidOatFileException("Oat file contains truncated key value store");
+                    }
+                    int valueEndOffset = offset;
+                    return new String(buf, valueStartOffset, valueEndOffset - valueStartOffset);
+                }
+                offset++;
+            }
+            return null;
+        }
+
+        public int getDexListStart() {
+            if (getVersion() >= 127) {
+                return headerOffset + readSmallUint(headerOffset + (6 * 4));
+            } else {
+                return headerOffset + getHeaderSize();
+            }
+        }
+    }
+
+    @Nonnull
+    private List<SectionHeader> getSections() {
+        final int offset;
+        final int entrySize;
+        final int entryCount;
+        if (is64bit) {
+            offset = readLongAsSmallUint(40);
+            entrySize = readUshort(58);
+            entryCount = readUshort(60);
+        } else {
+            offset = readSmallUint(32);
+            entrySize = readUshort(46);
+            entryCount = readUshort(48);
+        }
+
+        if (offset + (entrySize * entryCount) > buf.length) {
+            throw new InvalidOatFileException("The ELF section headers extend past the end of the file");
+        }
+
+        return new AbstractList<SectionHeader>() {
+            @Override public SectionHeader get(int index) {
+                if (index < 0 || index >= entryCount) {
+                    throw new IndexOutOfBoundsException();
+                }
+                if (is64bit) {
+                    return new SectionHeader64Bit(offset + (index * entrySize));
+                } else {
+                    return new SectionHeader32Bit(offset + (index * entrySize));
+                }
+            }
+
+            @Override public int size() {
+                return entryCount;
+            }
+        };
+    }
+
+    @Nonnull
+    private SymbolTable getSymbolTable() {
+        for (SectionHeader header: getSections()) {
+            if (header.getType() == SectionHeader.TYPE_DYNAMIC_SYMBOL_TABLE) {
+                return new SymbolTable(header);
+            }
+        }
+        throw new InvalidOatFileException("Oat file has no symbol table");
+    }
+
+    @Nonnull
+    private StringTable getSectionNameStringTable() {
+        int index = readUshort(50);
+        if (index == 0) {
+            throw new InvalidOatFileException("There is no section name string table");
+        }
+
+        try {
+            return new StringTable(getSections().get(index));
+        } catch (IndexOutOfBoundsException ex) {
+            throw new InvalidOatFileException("The section index for the section name string table is invalid");
+        }
+    }
+
+    private abstract class SectionHeader {
+        protected final int offset;
+        public static final int TYPE_DYNAMIC_SYMBOL_TABLE = 11;
+        public SectionHeader(int offset) { this.offset = offset; }
+        @Nonnull public String getName() { return getSectionNameStringTable().getString(readSmallUint(offset)); }
+        public int getType() { return readInt(offset + 4); }
+        public abstract long getAddress();
+        public abstract int getOffset();
+        public abstract int getSize();
+        public abstract int getLink();
+        public abstract int getEntrySize();
+    }
+
+    private class SectionHeader32Bit extends SectionHeader {
+        public SectionHeader32Bit(int offset) { super(offset); }
+        @Override public long getAddress() { return readInt(offset + 12) & 0xFFFFFFFFL; }
+        @Override public int getOffset() { return readSmallUint(offset + 16); }
+        @Override public int getSize() { return readSmallUint(offset + 20); }
+        @Override public int getLink() { return readSmallUint(offset + 24); }
+        @Override public int getEntrySize() { return readSmallUint(offset + 36); }
+    }
+
+    private class SectionHeader64Bit extends SectionHeader {
+        public SectionHeader64Bit(int offset) { super(offset); }
+        @Override public long getAddress() { return readLong(offset + 16); }
+        @Override public int getOffset() { return readLongAsSmallUint(offset + 24); }
+        @Override public int getSize() { return readLongAsSmallUint(offset + 32); }
+        @Override public int getLink() { return readSmallUint(offset + 40); }
+        @Override public int getEntrySize() { return readLongAsSmallUint(offset + 56); }
+    }
+
+    class SymbolTable {
+        @Nonnull private final StringTable stringTable;
+        private final int offset;
+        private final int entryCount;
+        private final int entrySize;
+
+        public SymbolTable(@Nonnull SectionHeader header) {
+            try {
+                this.stringTable = new StringTable(getSections().get(header.getLink()));
+            } catch (IndexOutOfBoundsException ex) {
+                throw new InvalidOatFileException("String table section index is invalid");
+            }
+            this.offset = header.getOffset();
+            this.entrySize = header.getEntrySize();
+            this.entryCount = header.getSize() / entrySize;
+
+            if (offset + entryCount * entrySize > buf.length) {
+                throw new InvalidOatFileException("Symbol table extends past end of file");
+            }
+        }
+
+        @Nonnull
+        public List<Symbol> getSymbols() {
+            return new AbstractList<Symbol>() {
+                @Override public Symbol get(int index) {
+                    if (index < 0 || index >= entryCount) {
+                        throw new IndexOutOfBoundsException();
+                    }
+                    if (is64bit) {
+                        return new Symbol64(offset + index * entrySize);
+                    } else {
+                        return new Symbol32(offset + index * entrySize);
+                    }
+                }
+
+                @Override public int size() {
+                    return entryCount;
+                }
+            };
+        }
+
+        public abstract class Symbol {
+            protected final int offset;
+            public Symbol(int offset) { this.offset = offset; }
+            @Nonnull public abstract String getName();
+            public abstract long getValue();
+            public abstract int getSize();
+            public abstract int getSectionIndex();
+
+            public int getFileOffset() {
+                SectionHeader sectionHeader;
+                try {
+                    sectionHeader = getSections().get(getSectionIndex());
+                } catch (IndexOutOfBoundsException ex) {
+                    throw new InvalidOatFileException("Section index for symbol is out of bounds");
+                }
+
+                long sectionAddress = sectionHeader.getAddress();
+                int sectionOffset = sectionHeader.getOffset();
+                int sectionSize = sectionHeader.getSize();
+
+                long symbolAddress = getValue();
+
+                if (symbolAddress < sectionAddress || symbolAddress >= sectionAddress + sectionSize) {
+                    throw new InvalidOatFileException("symbol address lies outside it's associated section");
+                }
+
+                long fileOffset = (sectionOffset + (getValue() - sectionAddress));
+                assert fileOffset <= Integer.MAX_VALUE;
+                return (int)fileOffset;
+            }
+        }
+
+        public class Symbol32 extends Symbol {
+            public Symbol32(int offset) { super(offset); }
+
+            @Nonnull
+            public String getName() { return stringTable.getString(readSmallUint(offset)); }
+            public long getValue() { return readSmallUint(offset + 4); }
+            public int getSize() { return readSmallUint(offset + 8); }
+            public int getSectionIndex() { return readUshort(offset + 14); }
+        }
+
+        public class Symbol64 extends Symbol {
+            public Symbol64(int offset) { super(offset); }
+
+            @Nonnull
+            public String getName() { return stringTable.getString(readSmallUint(offset)); }
+            public long getValue() { return readLong(offset + 8); }
+            public int getSize() { return readLongAsSmallUint(offset + 16); }
+            public int getSectionIndex() { return readUshort(offset + 6); }
+        }
+    }
+
+    private class StringTable {
+        private final int offset;
+        private final int size;
+
+        public StringTable(@Nonnull SectionHeader header) {
+            this.offset = header.getOffset();
+            this.size = header.getSize();
+
+            if (offset + size > buf.length) {
+                throw new InvalidOatFileException("String table extends past end of file");
+            }
+        }
+
+        @Nonnull
+        public String getString(int index) {
+            if (index >= size) {
+                throw new InvalidOatFileException("String index is out of bounds");
+            }
+
+            int start = offset + index;
+            int end = start;
+            while (buf[end] != 0) {
+                end++;
+                if (end >= offset + size) {
+                    throw new InvalidOatFileException("String extends past end of string table");
+                }
+            }
+
+            return new String(buf, start, end-start, Charset.forName("US-ASCII"));
+        }
+    }
+
+    private class OatDexEntry implements MultiDexContainer.DexEntry<DexBackedDexFile> {
+        public final String entryName;
+        public final byte[] buf;
+        public final int dexOffset;
+
+        public OatDexEntry(String entryName, byte[] buf, int dexOffset) {
+            this.entryName = entryName;
+            this.buf = buf;
+            this.dexOffset = dexOffset;
+        }
+
+        public DexBackedDexFile getDexFile() {
+            if (CDexBackedDexFile.isCdex(buf, dexOffset)) {
+                return new OatCDexFile(buf, dexOffset);
+            } else {
+                try {
+                    DexUtil.verifyDexHeader(buf, dexOffset);
+                } catch (DexBackedDexFile.NotADexFile ex) {
+                    if (getOatVersion() >= 87) {
+                        throw new DexFileFactory.DexFileNotFoundException(ex,
+                                "Could not locate the embedded dex file %s. Is the vdex file missing?", entryName);
+                    } else {
+                        throw new DexFileFactory.DexFileNotFoundException(ex,
+                                "The embedded dex file %s does not appear to be a valid dex file.", entryName);
+                    }
+                }
+                return new OatDexFile(buf, dexOffset);
+            }
+        }
+
+        @Nonnull
+        @Override
+        public String getEntryName() {
+            return entryName;
+        }
+
+        @Nonnull
+        @Override
+        public MultiDexContainer<? extends DexBackedDexFile> getContainer() {
+            return OatFile.this;
+        }
+    }
+
+    private class DexEntryIterator implements Iterator<OatDexEntry> {
+        int index = 0;
+        int offset = oatHeader.getDexListStart();
+
+        @Override public boolean hasNext() {
+            return index < oatHeader.getDexFileCount();
+        }
+
+        @Override public OatDexEntry next() {
+
+            while (hasNext()) {
+                int filenameLength = readSmallUint(offset);
+                offset += 4;
+
+                // TODO: what is the correct character encoding?
+                String filename = new String(buf, offset, filenameLength, Charset.forName("US-ASCII"));
+                offset += filenameLength;
+
+                offset += 4; // checksum
+
+                int dexOffset = readSmallUint(offset);
+                offset += 4;
+
+                byte[] buf;
+                if (getOatVersion() >= 87 && vdexProvider != null && vdexProvider.getVdex() != null) {
+                    buf = vdexProvider.getVdex();
+                } else {
+                    buf = OatFile.this.buf;
+                    dexOffset += oatHeader.headerOffset;
+                }
+
+                if (getOatVersion() >= 75) {
+                    offset += 4; // offset to class offsets table
+                }
+                if (getOatVersion() >= 73) {
+                    offset += 4; // lookup table offset
+                }
+                if (getOatVersion() >= 131) {
+                    offset += 4; // dex sections layout offset
+                }
+                if (getOatVersion() >= 127) {
+                    offset += 4; // method bss mapping offset
+                }
+                if (getOatVersion() >= 135) {
+                    offset += 8; // type bss mapping and string bss mapping offsets
+                }
+                if (getOatVersion() < 75) {
+                    // prior to 75, the class offsets are included here directly
+                    int classCount = readSmallUint(dexOffset + HeaderItem.CLASS_COUNT_OFFSET);
+                    offset += 4 * classCount;
+                }
+
+                index++;
+
+                if (getOatVersion() >= 138 && dexOffset == 0) {
+                    // An offset of 0 indicates that the dex file remains in the apk. So we treat it as not a part of
+                    // the oat file.
+                    continue;
+                }
+                return new OatDexEntry(filename, buf, dexOffset);
+            }
+            return null;
+        }
+
+        @Override public void remove() {
+            throw new UnsupportedOperationException();
+        }
+    }
+
+    public static class InvalidOatFileException extends RuntimeException {
+        public InvalidOatFileException(String message) {
+            super(message);
+        }
+    }
+
+    public static class NotAnOatFileException extends RuntimeException {
+        public NotAnOatFileException() {}
+    }
+
+    public interface VdexProvider {
+        @Nullable
+        byte[] getVdex();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/ZipDexContainer.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/ZipDexContainer.java
new file mode 100644
index 0000000..7f1d897
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/ZipDexContainer.java
@@ -0,0 +1,197 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked;
+
+import com.google.common.collect.Lists;
+import com.google.common.io.ByteStreams;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile.NotADexFile;
+import org.jf.dexlib2.iface.DexFile;
+import org.jf.dexlib2.iface.MultiDexContainer;
+import org.jf.dexlib2.util.DexUtil;
+import org.jf.dexlib2.util.DexUtil.InvalidFile;
+import org.jf.dexlib2.util.DexUtil.UnsupportedFile;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+/**
+ * Represents a zip file that contains dex files (i.e. an apk or jar file)
+ */
+public class ZipDexContainer implements MultiDexContainer<DexBackedDexFile> {
+
+    private final File zipFilePath;
+    @Nullable private final Opcodes opcodes;
+
+    /**
+     * Constructs a new ZipDexContainer for the given zip file
+     *
+     * @param zipFilePath The path to the zip file
+     */
+    public ZipDexContainer(@Nonnull File zipFilePath, @Nullable Opcodes opcodes) {
+        this.zipFilePath = zipFilePath;
+        this.opcodes = opcodes;
+    }
+
+    /**
+     * Gets a list of the names of dex files in this zip file.
+     *
+     * @return A list of the names of dex files in this zip file
+     */
+    @Nonnull @Override public List<String> getDexEntryNames() throws IOException {
+        List<String> entryNames = Lists.newArrayList();
+        ZipFile zipFile = getZipFile();
+        try {
+            Enumeration<? extends ZipEntry> entriesEnumeration = zipFile.entries();
+
+            while (entriesEnumeration.hasMoreElements()) {
+                ZipEntry entry = entriesEnumeration.nextElement();
+
+                if (!isDex(zipFile, entry)) {
+                    continue;
+                }
+
+                entryNames.add(entry.getName());
+            }
+
+            return entryNames;
+        } finally {
+            zipFile.close();
+        }
+    }
+
+    /**
+     * Loads a dex file from a specific named entry.
+     *
+     * @param entryName The name of the entry
+     * @return A ZipDexFile, or null if there is no entry with the given name
+     * @throws NotADexFile If the entry isn't a dex file
+     */
+    @Nullable @Override public DexEntry<DexBackedDexFile> getEntry(@Nonnull String entryName) throws IOException {
+        ZipFile zipFile = getZipFile();
+        try {
+            ZipEntry entry = zipFile.getEntry(entryName);
+            if (entry == null) {
+                return null;
+            }
+
+            return loadEntry(zipFile, entry);
+        } finally {
+            zipFile.close();
+        }
+    }
+
+    public boolean isZipFile() {
+        ZipFile zipFile = null;
+        try {
+            zipFile = getZipFile();
+            return true;
+        } catch (IOException ex) {
+            return false;
+        } catch (NotAZipFileException ex) {
+            return false;
+        } finally {
+            if(zipFile != null) {
+                try {
+                    zipFile.close();
+                } catch (IOException ex) {
+                    // just eat it
+                }
+            }
+        }
+    }
+
+    protected boolean isDex(@Nonnull ZipFile zipFile, @Nonnull ZipEntry zipEntry) throws IOException {
+        InputStream inputStream = new BufferedInputStream(zipFile.getInputStream(zipEntry));
+        try {
+            DexUtil.verifyDexHeader(inputStream);
+        } catch (NotADexFile ex) {
+            return false;
+        } catch (InvalidFile ex) {
+            return false;
+        } catch (UnsupportedFile ex) {
+            return false;
+        } finally {
+            inputStream.close();
+        }
+        return true;
+    }
+
+    protected ZipFile getZipFile() throws IOException {
+        try {
+            return new ZipFile(zipFilePath);
+        } catch (IOException ex) {
+            throw new NotAZipFileException();
+        }
+    }
+
+    @Nonnull
+    protected DexEntry loadEntry(@Nonnull ZipFile zipFile, @Nonnull ZipEntry zipEntry) throws IOException {
+        InputStream inputStream = zipFile.getInputStream(zipEntry);
+        try {
+            byte[] buf = ByteStreams.toByteArray(inputStream);
+
+            return new DexEntry() {
+                @Nonnull
+                @Override
+                public String getEntryName() {
+                    return zipEntry.getName();
+                }
+
+                @Nonnull
+                @Override
+                public DexFile getDexFile() {
+                    return new DexBackedDexFile(opcodes, buf);
+                }
+
+                @Nonnull
+                @Override
+                public MultiDexContainer getContainer() {
+                    return ZipDexContainer.this;
+                }
+            };
+        } finally {
+            inputStream.close();
+        }
+    }
+
+    public static class NotAZipFileException extends RuntimeException {
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedArrayPayload.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedArrayPayload.java
new file mode 100644
index 0000000..dddb212
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedArrayPayload.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import com.google.common.collect.ImmutableList;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.util.FixedSizeList;
+import org.jf.dexlib2.iface.instruction.formats.ArrayPayload;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+public class DexBackedArrayPayload extends DexBackedInstruction implements ArrayPayload {
+    public static final Opcode OPCODE = Opcode.ARRAY_PAYLOAD;
+
+    public final int elementWidth;
+    public final int elementCount;
+
+    private static final int ELEMENT_WIDTH_OFFSET = 2;
+    private static final int ELEMENT_COUNT_OFFSET = 4;
+    private static final int ELEMENTS_OFFSET = 8;
+
+    public DexBackedArrayPayload(@Nonnull DexBackedDexFile dexFile,
+                                 int instructionStart) {
+        super(dexFile, OPCODE, instructionStart);
+
+        int localElementWidth = dexFile.getDataBuffer().readUshort(instructionStart + ELEMENT_WIDTH_OFFSET);
+
+        if (localElementWidth == 0) {
+            elementWidth = 1;
+            elementCount = 0;
+        } else {
+            elementWidth = localElementWidth;
+
+            elementCount = dexFile.getDataBuffer().readSmallUint(instructionStart + ELEMENT_COUNT_OFFSET);
+            if (((long) elementWidth) * elementCount > Integer.MAX_VALUE) {
+                throw new ExceptionWithContext("Invalid array-payload instruction: element width*count overflows");
+            }
+        }
+    }
+
+    @Override public int getElementWidth() { return elementWidth; }
+
+    @Nonnull
+    @Override
+    public List<Number> getArrayElements() {
+        final int elementsStart = instructionStart + ELEMENTS_OFFSET;
+
+        abstract class ReturnedList extends FixedSizeList<Number> {
+            @Override public int size() { return elementCount; }
+        }
+
+        if (elementCount == 0) {
+            return ImmutableList.of();
+        }
+
+        switch (elementWidth) {
+            case 1:
+                return new ReturnedList() {
+                    @Nonnull
+                    @Override
+                    public Number readItem(int index) {
+                        return dexFile.getDataBuffer().readByte(elementsStart + index);
+                    }
+                };
+            case 2:
+                return new ReturnedList() {
+                    @Nonnull
+                    @Override
+                    public Number readItem(int index) {
+                        return dexFile.getDataBuffer().readShort(elementsStart + index*2);
+                    }
+                };
+            case 4:
+                return new ReturnedList() {
+                    @Nonnull
+                    @Override
+                    public Number readItem(int index) {
+                        return dexFile.getDataBuffer().readInt(elementsStart + index*4);
+                    }
+                };
+            case 8:
+                return new ReturnedList() {
+                    @Nonnull
+                    @Override
+                    public Number readItem(int index) {
+                        return dexFile.getDataBuffer().readLong(elementsStart + index*8);
+                    }
+                };
+            default:
+                throw new ExceptionWithContext("Invalid element width: %d", elementWidth);
+        }
+    }
+
+    @Override
+    public int getCodeUnits() {
+        return 4 + (elementWidth*elementCount + 1) / 2;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction.java
new file mode 100644
index 0000000..b4abb05
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.DexReader;
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public abstract class DexBackedInstruction implements Instruction {
+    @Nonnull public final DexBackedDexFile dexFile;
+    @Nonnull public final Opcode opcode;
+    public final int instructionStart;
+
+    public DexBackedInstruction(@Nonnull DexBackedDexFile dexFile,
+                                @Nonnull Opcode opcode,
+                                int instructionStart) {
+        this.dexFile = dexFile;
+        this.opcode = opcode;
+        this.instructionStart = instructionStart;
+    }
+
+    @Nonnull public Opcode getOpcode() { return opcode; }
+    @Override public int getCodeUnits() { return opcode.format.size / 2; }
+
+    @Nonnull
+    public static Instruction readFrom(DexBackedDexFile dexFile, @Nonnull DexReader reader) {
+        int opcodeValue = reader.peekUbyte();
+
+        if (opcodeValue == 0) {
+            opcodeValue = reader.peekUshort();
+        }
+
+        Opcode opcode = dexFile.getOpcodes().getOpcodeByValue(opcodeValue);
+
+        Instruction instruction = buildInstruction(dexFile, opcode,
+                reader.getOffset() + reader.dexBuf.getBaseOffset() -
+                        dexFile.getBuffer().getBaseOffset() - dexFile.getBaseDataOffset());
+        reader.moveRelative(instruction.getCodeUnits()*2);
+        return instruction;
+    }
+    
+    private static DexBackedInstruction buildInstruction(@Nonnull DexBackedDexFile dexFile, @Nullable Opcode opcode,
+                                                         int instructionStartOffset) {
+        if (opcode == null) {
+            return new DexBackedUnknownInstruction(dexFile, instructionStartOffset);
+        }
+        switch (opcode.format) {
+            case Format10t:
+                return new DexBackedInstruction10t(dexFile, opcode, instructionStartOffset);
+            case Format10x:
+                return new DexBackedInstruction10x(dexFile, opcode, instructionStartOffset);
+            case Format11n:
+                return new DexBackedInstruction11n(dexFile, opcode, instructionStartOffset);
+            case Format11x:
+                return new DexBackedInstruction11x(dexFile, opcode, instructionStartOffset);
+            case Format12x:
+                return new DexBackedInstruction12x(dexFile, opcode, instructionStartOffset);
+            case Format20bc:
+                return new DexBackedInstruction20bc(dexFile, opcode, instructionStartOffset);
+            case Format20t:
+                return new DexBackedInstruction20t(dexFile, opcode, instructionStartOffset);
+            case Format21c:
+                return new DexBackedInstruction21c(dexFile, opcode, instructionStartOffset);
+            case Format21ih:
+                return new DexBackedInstruction21ih(dexFile, opcode, instructionStartOffset);
+            case Format21lh:
+                return new DexBackedInstruction21lh(dexFile, opcode, instructionStartOffset);
+            case Format21s:
+                return new DexBackedInstruction21s(dexFile, opcode, instructionStartOffset);
+            case Format21t:
+                return new DexBackedInstruction21t(dexFile, opcode, instructionStartOffset);
+            case Format22b:
+                return new DexBackedInstruction22b(dexFile, opcode, instructionStartOffset);
+            case Format22c:
+                return new DexBackedInstruction22c(dexFile, opcode, instructionStartOffset);
+            case Format22cs:
+                return new DexBackedInstruction22cs(dexFile, opcode, instructionStartOffset);
+            case Format22s:
+                return new DexBackedInstruction22s(dexFile, opcode, instructionStartOffset);
+            case Format22t:
+                return new DexBackedInstruction22t(dexFile, opcode, instructionStartOffset);
+            case Format22x:
+                return new DexBackedInstruction22x(dexFile, opcode, instructionStartOffset);
+            case Format23x:
+                return new DexBackedInstruction23x(dexFile, opcode, instructionStartOffset);
+            case Format30t:
+                return new DexBackedInstruction30t(dexFile, opcode, instructionStartOffset);
+            case Format31c:
+                return new DexBackedInstruction31c(dexFile, opcode, instructionStartOffset);
+            case Format31i:
+                return new DexBackedInstruction31i(dexFile, opcode, instructionStartOffset);
+            case Format31t:
+                return new DexBackedInstruction31t(dexFile, opcode, instructionStartOffset);
+            case Format32x:
+                return new DexBackedInstruction32x(dexFile, opcode, instructionStartOffset);
+            case Format35c:
+                return new DexBackedInstruction35c(dexFile, opcode, instructionStartOffset);
+            case Format35ms:
+                return new DexBackedInstruction35ms(dexFile, opcode, instructionStartOffset);
+            case Format35mi:
+                return new DexBackedInstruction35mi(dexFile, opcode, instructionStartOffset);
+            case Format3rc:
+                return new DexBackedInstruction3rc(dexFile, opcode, instructionStartOffset);
+            case Format3rmi:
+                return new DexBackedInstruction3rmi(dexFile, opcode, instructionStartOffset);
+            case Format3rms:
+                return new DexBackedInstruction3rms(dexFile, opcode, instructionStartOffset);
+            case Format45cc:
+                return new DexBackedInstruction45cc(dexFile, opcode, instructionStartOffset);
+            case Format4rcc:
+                return new DexBackedInstruction4rcc(dexFile, opcode, instructionStartOffset);
+            case Format51l:
+                return new DexBackedInstruction51l(dexFile, opcode, instructionStartOffset);
+            case PackedSwitchPayload:
+                return new DexBackedPackedSwitchPayload(dexFile, instructionStartOffset);
+            case SparseSwitchPayload:
+                return new DexBackedSparseSwitchPayload(dexFile, instructionStartOffset);
+            case ArrayPayload:
+                return new DexBackedArrayPayload(dexFile, instructionStartOffset);
+            default:
+                throw new ExceptionWithContext("Unexpected opcode format: %s", opcode.format.toString());
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction10t.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction10t.java
new file mode 100644
index 0000000..a228530
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction10t.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.instruction.formats.Instruction10t;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction10t extends DexBackedInstruction implements Instruction10t {
+    public DexBackedInstruction10t(@Nonnull DexBackedDexFile dexFile,
+                                   @Nonnull Opcode opcode,
+                                   int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override public int getCodeOffset() { return dexFile.getDataBuffer().readByte(instructionStart + 1); }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction10x.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction10x.java
new file mode 100644
index 0000000..a19f858
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction10x.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.instruction.formats.Instruction10x;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction10x extends DexBackedInstruction implements Instruction10x {
+    public DexBackedInstruction10x(@Nonnull DexBackedDexFile dexFile,
+                                   @Nonnull Opcode opcode,
+                                   int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction11n.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction11n.java
new file mode 100644
index 0000000..d36642c
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction11n.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.instruction.formats.Instruction11n;
+import org.jf.util.NibbleUtils;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction11n extends DexBackedInstruction implements Instruction11n {
+    public DexBackedInstruction11n(@Nonnull DexBackedDexFile dexFile,
+                                   @Nonnull Opcode opcode,
+                                   int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override
+    public int getRegisterA() {
+        return NibbleUtils.extractLowUnsignedNibble(dexFile.getDataBuffer().readByte(instructionStart + 1));
+    }
+
+    @Override
+    public int getNarrowLiteral() {
+        return NibbleUtils.extractHighSignedNibble(dexFile.getDataBuffer().readByte(instructionStart + 1));
+    }
+
+    @Override public long getWideLiteral() { return getNarrowLiteral(); }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction11x.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction11x.java
new file mode 100644
index 0000000..2111e82
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction11x.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.instruction.formats.Instruction11x;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction11x extends DexBackedInstruction implements Instruction11x {
+    public DexBackedInstruction11x(@Nonnull DexBackedDexFile dexFile,
+                                   @Nonnull Opcode opcode,
+                                   int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override public int getRegisterA() { return dexFile.getDataBuffer().readUbyte(instructionStart + 1); }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction12x.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction12x.java
new file mode 100644
index 0000000..ddd2687
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction12x.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.instruction.formats.Instruction12x;
+import org.jf.util.NibbleUtils;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction12x extends DexBackedInstruction implements Instruction12x {
+    public DexBackedInstruction12x(@Nonnull DexBackedDexFile dexFile,
+                                   @Nonnull Opcode opcode,
+                                   int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override
+    public int getRegisterA() {
+        return NibbleUtils.extractLowUnsignedNibble(dexFile.getDataBuffer().readByte(instructionStart + 1));
+    }
+
+    @Override
+    public int getRegisterB() {
+        return NibbleUtils.extractHighUnsignedNibble(dexFile.getDataBuffer().readByte(instructionStart + 1));
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction20bc.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction20bc.java
new file mode 100644
index 0000000..dad4c57
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction20bc.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.ReferenceType;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.reference.DexBackedReference;
+import org.jf.dexlib2.iface.instruction.formats.Instruction20bc;
+import org.jf.dexlib2.iface.reference.Reference;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction20bc extends DexBackedInstruction implements Instruction20bc {
+    public DexBackedInstruction20bc(@Nonnull DexBackedDexFile dexFile,
+                                    @Nonnull Opcode opcode,
+                                    int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override public int getVerificationError() {
+        return dexFile.getDataBuffer().readUbyte(instructionStart + 1) & 0x3f;
+    }
+
+    @Nonnull
+    @Override
+    public Reference getReference() {
+        int referenceIndex = dexFile.getDataBuffer().readUshort(instructionStart + 2);
+        try {
+            int referenceType = getReferenceType();
+            return DexBackedReference.makeReference(dexFile, referenceType, referenceIndex);
+        } catch (ReferenceType.InvalidReferenceTypeException ex) {
+            return new Reference() {
+                @Override
+                public void validateReference() throws InvalidReferenceException {
+                    throw new InvalidReferenceException(String.format("%d@%d", ex.getReferenceType(), referenceIndex),
+                            ex);
+                }
+            };
+        }
+    }
+
+    @Override public int getReferenceType() {
+        int referenceType = (dexFile.getDataBuffer().readUbyte(instructionStart + 1) >>> 6) + 1;
+        ReferenceType.validateReferenceType(referenceType);
+        return referenceType;
+    }
+}
\ No newline at end of file
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction20t.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction20t.java
new file mode 100644
index 0000000..57b61b2
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction20t.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.instruction.formats.Instruction20t;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction20t extends DexBackedInstruction implements Instruction20t {
+    public DexBackedInstruction20t(@Nonnull DexBackedDexFile dexFile,
+                                   @Nonnull Opcode opcode,
+                                   int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override public int getCodeOffset() { return dexFile.getDataBuffer().readShort(instructionStart + 2); }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction21c.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction21c.java
new file mode 100644
index 0000000..65df418
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction21c.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.reference.DexBackedReference;
+import org.jf.dexlib2.iface.instruction.formats.Instruction21c;
+import org.jf.dexlib2.iface.reference.Reference;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction21c extends DexBackedInstruction implements Instruction21c {
+    public DexBackedInstruction21c(@Nonnull DexBackedDexFile dexFile,
+                                   @Nonnull Opcode opcode,
+                                   int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override public int getRegisterA() { return dexFile.getDataBuffer().readUbyte(instructionStart + 1); }
+
+    @Nonnull
+    @Override
+    public Reference getReference() {
+        return DexBackedReference.makeReference(
+                dexFile, opcode.referenceType, dexFile.getDataBuffer().readUshort(instructionStart + 2));
+    }
+
+    @Override
+    public int getReferenceType() {
+        return opcode.referenceType;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction21ih.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction21ih.java
new file mode 100644
index 0000000..e104ee9
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction21ih.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.instruction.formats.Instruction21ih;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction21ih extends DexBackedInstruction implements Instruction21ih {
+    public DexBackedInstruction21ih(@Nonnull DexBackedDexFile dexFile,
+                                    @Nonnull Opcode opcode,
+                                    int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override public int getRegisterA() { return dexFile.getDataBuffer().readUbyte(instructionStart + 1); }
+    @Override public int getNarrowLiteral() { return getHatLiteral() << 16; }
+    @Override public long getWideLiteral() { return getNarrowLiteral(); }
+    @Override public short getHatLiteral() { return (short)dexFile.getDataBuffer().readShort(instructionStart + 2); }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction21lh.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction21lh.java
new file mode 100644
index 0000000..b0b9a93
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction21lh.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.instruction.formats.Instruction21lh;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction21lh extends DexBackedInstruction implements Instruction21lh {
+    public DexBackedInstruction21lh(@Nonnull DexBackedDexFile dexFile,
+                                    @Nonnull Opcode opcode,
+                                    int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override public int getRegisterA() { return dexFile.getDataBuffer().readUbyte(instructionStart + 1); }
+    @Override public long getWideLiteral() { return ((long)getHatLiteral()) << 48; }
+    @Override public short getHatLiteral() { return (short)dexFile.getDataBuffer().readShort(instructionStart + 2); }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction21s.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction21s.java
new file mode 100644
index 0000000..12d6d85
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction21s.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.instruction.formats.Instruction21s;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction21s extends DexBackedInstruction implements Instruction21s {
+    public DexBackedInstruction21s(@Nonnull DexBackedDexFile dexFile,
+                                   @Nonnull Opcode opcode,
+                                   int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override public int getRegisterA() { return dexFile.getDataBuffer().readUbyte(instructionStart + 1); }
+    @Override public int getNarrowLiteral() { return dexFile.getDataBuffer().readShort(instructionStart + 2); }
+    @Override public long getWideLiteral() { return getNarrowLiteral(); }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction21t.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction21t.java
new file mode 100644
index 0000000..98445ef
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction21t.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.instruction.formats.Instruction21t;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction21t extends DexBackedInstruction implements Instruction21t {
+    public DexBackedInstruction21t(@Nonnull DexBackedDexFile dexFile,
+                                   @Nonnull Opcode opcode,
+                                   int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override public int getRegisterA() { return dexFile.getDataBuffer().readUbyte(instructionStart + 1); }
+    @Override public int getCodeOffset() { return dexFile.getDataBuffer().readShort(instructionStart + 2); }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction22b.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction22b.java
new file mode 100644
index 0000000..8a502f6
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction22b.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.instruction.formats.Instruction22b;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction22b extends DexBackedInstruction implements Instruction22b {
+    public DexBackedInstruction22b(@Nonnull DexBackedDexFile dexFile,
+                                   @Nonnull Opcode opcode,
+                                   int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override public int getRegisterA() { return dexFile.getDataBuffer().readUbyte(instructionStart + 1); }
+    @Override public int getRegisterB() { return dexFile.getDataBuffer().readUbyte(instructionStart + 2); }
+    @Override public int getNarrowLiteral() { return dexFile.getDataBuffer().readByte(instructionStart + 3); }
+    @Override public long getWideLiteral() { return getNarrowLiteral(); }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction22c.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction22c.java
new file mode 100644
index 0000000..f21dd3b
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction22c.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.reference.DexBackedReference;
+import org.jf.dexlib2.iface.instruction.formats.Instruction22c;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.util.NibbleUtils;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction22c extends DexBackedInstruction implements Instruction22c {
+    public DexBackedInstruction22c(@Nonnull DexBackedDexFile dexFile,
+                                   @Nonnull Opcode opcode,
+                                   int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override
+    public int getRegisterA() {
+        return NibbleUtils.extractLowUnsignedNibble(dexFile.getDataBuffer().readByte(instructionStart + 1));
+    }
+
+    @Override
+    public int getRegisterB() {
+        return NibbleUtils.extractHighUnsignedNibble(dexFile.getDataBuffer().readByte(instructionStart + 1));
+    }
+
+    @Nonnull
+    @Override
+    public Reference getReference() {
+        return DexBackedReference.makeReference(
+                dexFile, opcode.referenceType, dexFile.getDataBuffer().readUshort(instructionStart + 2));
+    }
+
+    @Override
+    public int getReferenceType() {
+        return opcode.referenceType;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction22cs.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction22cs.java
new file mode 100644
index 0000000..ca77953
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction22cs.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.instruction.formats.Instruction22cs;
+import org.jf.util.NibbleUtils;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction22cs extends DexBackedInstruction implements Instruction22cs {
+    public DexBackedInstruction22cs(@Nonnull DexBackedDexFile dexFile,
+                                    @Nonnull Opcode opcode,
+                                    int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override
+    public int getRegisterA() {
+        return NibbleUtils.extractLowUnsignedNibble(dexFile.getDataBuffer().readByte(instructionStart + 1));
+    }
+
+    @Override
+    public int getRegisterB() {
+        return NibbleUtils.extractHighUnsignedNibble(dexFile.getDataBuffer().readByte(instructionStart + 1));
+    }
+
+    @Override
+    public int getFieldOffset() {
+        return dexFile.getDataBuffer().readUshort(instructionStart + 2);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction22s.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction22s.java
new file mode 100644
index 0000000..e9f064d
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction22s.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.instruction.formats.Instruction22s;
+import org.jf.util.NibbleUtils;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction22s extends DexBackedInstruction implements Instruction22s {
+    public DexBackedInstruction22s(@Nonnull DexBackedDexFile dexFile,
+                                   @Nonnull Opcode opcode,
+                                   int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override
+    public int getRegisterA() {
+        return NibbleUtils.extractLowUnsignedNibble(dexFile.getDataBuffer().readByte(instructionStart + 1));
+    }
+
+    @Override
+    public int getRegisterB() {
+        return NibbleUtils.extractHighUnsignedNibble(dexFile.getDataBuffer().readByte(instructionStart + 1));
+    }
+
+    @Override public int getNarrowLiteral() { return dexFile.getDataBuffer().readShort(instructionStart + 2); }
+    @Override public long getWideLiteral() { return getNarrowLiteral(); }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction22t.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction22t.java
new file mode 100644
index 0000000..01b7f37
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction22t.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.instruction.formats.Instruction22t;
+import org.jf.util.NibbleUtils;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction22t extends DexBackedInstruction implements Instruction22t {
+    public DexBackedInstruction22t(@Nonnull DexBackedDexFile dexFile,
+                                   @Nonnull Opcode opcode,
+                                   int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override
+    public int getRegisterA() {
+        return NibbleUtils.extractLowUnsignedNibble(dexFile.getDataBuffer().readByte(instructionStart + 1));
+    }
+
+    @Override
+    public int getRegisterB() {
+        return NibbleUtils.extractHighUnsignedNibble(dexFile.getDataBuffer().readByte(instructionStart + 1));
+    }
+
+    @Override public int getCodeOffset() { return dexFile.getDataBuffer().readShort(instructionStart + 2); }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction22x.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction22x.java
new file mode 100644
index 0000000..799c538
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction22x.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.instruction.formats.Instruction22x;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction22x extends DexBackedInstruction implements Instruction22x {
+    public DexBackedInstruction22x(@Nonnull DexBackedDexFile dexFile,
+                                   @Nonnull Opcode opcode,
+                                   int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override public int getRegisterA() { return dexFile.getDataBuffer().readUbyte(instructionStart + 1); }
+    @Override public int getRegisterB() { return dexFile.getDataBuffer().readUshort(instructionStart + 2); }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction23x.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction23x.java
new file mode 100644
index 0000000..867c7f3
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction23x.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.instruction.formats.Instruction23x;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction23x extends DexBackedInstruction implements Instruction23x {
+    public DexBackedInstruction23x(@Nonnull DexBackedDexFile dexFile,
+                                   @Nonnull Opcode opcode,
+                                   int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override public int getRegisterA() { return dexFile.getDataBuffer().readUbyte(instructionStart + 1); }
+    @Override public int getRegisterB() { return dexFile.getDataBuffer().readUbyte(instructionStart + 2); }
+    @Override public int getRegisterC() { return dexFile.getDataBuffer().readUbyte(instructionStart + 3); }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction30t.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction30t.java
new file mode 100644
index 0000000..dd6f6cc
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction30t.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.instruction.formats.Instruction30t;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction30t extends DexBackedInstruction implements Instruction30t {
+    public DexBackedInstruction30t(@Nonnull DexBackedDexFile dexFile,
+                                   @Nonnull Opcode opcode,
+                                   int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override public int getCodeOffset() { return dexFile.getDataBuffer().readInt(instructionStart + 2); }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction31c.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction31c.java
new file mode 100644
index 0000000..a2dabfb
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction31c.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.reference.DexBackedReference;
+import org.jf.dexlib2.iface.instruction.formats.Instruction31c;
+import org.jf.dexlib2.iface.reference.Reference;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction31c extends DexBackedInstruction implements Instruction31c {
+    public DexBackedInstruction31c(@Nonnull DexBackedDexFile dexFile,
+                                   @Nonnull Opcode opcode,
+                                   int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override public int getRegisterA() { return dexFile.getDataBuffer().readUbyte(instructionStart + 1); }
+
+    @Nonnull
+    @Override
+    public Reference getReference() {
+        return DexBackedReference.makeReference(dexFile, opcode.referenceType,
+                dexFile.getDataBuffer().readSmallUint(instructionStart + 2));
+    }
+
+    @Override
+    public int getReferenceType() {
+        return opcode.referenceType;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction31i.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction31i.java
new file mode 100644
index 0000000..20e443f
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction31i.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.instruction.formats.Instruction31i;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction31i extends DexBackedInstruction implements Instruction31i {
+    public DexBackedInstruction31i(@Nonnull DexBackedDexFile dexFile,
+                                   @Nonnull Opcode opcode,
+                                   int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override public int getRegisterA() { return dexFile.getDataBuffer().readUbyte(instructionStart + 1); }
+    @Override public int getNarrowLiteral() { return dexFile.getDataBuffer().readInt(instructionStart + 2); }
+    @Override public long getWideLiteral() { return getNarrowLiteral(); }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction31t.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction31t.java
new file mode 100644
index 0000000..5410f22
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction31t.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.instruction.formats.Instruction31t;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction31t extends DexBackedInstruction implements Instruction31t {
+    public DexBackedInstruction31t(@Nonnull DexBackedDexFile dexFile,
+                                   @Nonnull Opcode opcode,
+                                   int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override public int getRegisterA() { return dexFile.getDataBuffer().readUbyte(instructionStart + 1); }
+    @Override public int getCodeOffset() { return dexFile.getDataBuffer().readInt(instructionStart + 2); }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction32x.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction32x.java
new file mode 100644
index 0000000..b0dc892
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction32x.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.instruction.formats.Instruction32x;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction32x extends DexBackedInstruction implements Instruction32x {
+    public DexBackedInstruction32x(@Nonnull DexBackedDexFile dexFile,
+                                   @Nonnull Opcode opcode,
+                                   int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override public int getRegisterA() { return dexFile.getDataBuffer().readUshort(instructionStart + 2); }
+    @Override public int getRegisterB() { return dexFile.getDataBuffer().readUshort(instructionStart + 4); }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction35c.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction35c.java
new file mode 100644
index 0000000..b2c9065
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction35c.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.reference.DexBackedReference;
+import org.jf.dexlib2.iface.instruction.formats.Instruction35c;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.util.NibbleUtils;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction35c extends DexBackedInstruction implements Instruction35c {
+    public DexBackedInstruction35c(@Nonnull DexBackedDexFile dexFile,
+                                   @Nonnull Opcode opcode,
+                                   int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override public int getRegisterCount() {
+        return NibbleUtils.extractHighUnsignedNibble(dexFile.getDataBuffer().readUbyte(instructionStart + 1));
+    }
+
+    @Override
+    public int getRegisterC() {
+        return NibbleUtils.extractLowUnsignedNibble(dexFile.getDataBuffer().readUbyte(instructionStart + 4));
+    }
+
+    @Override
+    public int getRegisterD() {
+        return NibbleUtils.extractHighUnsignedNibble(dexFile.getDataBuffer().readUbyte(instructionStart + 4));
+    }
+
+    @Override
+    public int getRegisterE() {
+        return NibbleUtils.extractLowUnsignedNibble(dexFile.getDataBuffer().readUbyte(instructionStart + 5));
+    }
+
+    @Override
+    public int getRegisterF() {
+        return NibbleUtils.extractHighUnsignedNibble(dexFile.getDataBuffer().readUbyte(instructionStart + 5));
+    }
+
+    @Override
+    public int getRegisterG() {
+        return NibbleUtils.extractLowUnsignedNibble(dexFile.getDataBuffer().readUbyte(instructionStart + 1));
+    }
+
+    @Nonnull
+    @Override
+    public Reference getReference() {
+        return DexBackedReference.makeReference(dexFile, opcode.referenceType,
+                dexFile.getDataBuffer().readUshort(instructionStart + 2));
+    }
+
+    @Override
+    public int getReferenceType() {
+        return opcode.referenceType;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction35mi.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction35mi.java
new file mode 100644
index 0000000..b9f268b
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction35mi.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.instruction.formats.Instruction35mi;
+import org.jf.util.NibbleUtils;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction35mi extends DexBackedInstruction implements Instruction35mi {
+    public DexBackedInstruction35mi(@Nonnull DexBackedDexFile dexFile,
+                                    @Nonnull Opcode opcode,
+                                    int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override public int getRegisterCount() {
+        return NibbleUtils.extractHighUnsignedNibble(dexFile.getDataBuffer().readUbyte(instructionStart + 1));
+    }
+
+    @Override
+    public int getRegisterC() {
+        return NibbleUtils.extractLowUnsignedNibble(dexFile.getDataBuffer().readUbyte(instructionStart + 4));
+    }
+
+    @Override
+    public int getRegisterD() {
+        return NibbleUtils.extractHighUnsignedNibble(dexFile.getDataBuffer().readUbyte(instructionStart + 4));
+    }
+
+    @Override
+    public int getRegisterE() {
+        return NibbleUtils.extractLowUnsignedNibble(dexFile.getDataBuffer().readUbyte(instructionStart + 5));
+    }
+
+    @Override
+    public int getRegisterF() {
+        return NibbleUtils.extractHighUnsignedNibble(dexFile.getDataBuffer().readUbyte(instructionStart + 5));
+    }
+
+    @Override
+    public int getRegisterG() {
+        return NibbleUtils.extractLowUnsignedNibble(dexFile.getDataBuffer().readUbyte(instructionStart + 1));
+    }
+
+    @Override
+    public int getInlineIndex() {
+        return dexFile.getDataBuffer().readUshort(instructionStart + 2);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction35ms.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction35ms.java
new file mode 100644
index 0000000..d306de0
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction35ms.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.instruction.formats.Instruction35ms;
+import org.jf.util.NibbleUtils;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction35ms extends DexBackedInstruction implements Instruction35ms {
+    public DexBackedInstruction35ms(@Nonnull DexBackedDexFile dexFile,
+                                    @Nonnull Opcode opcode,
+                                    int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override public int getRegisterCount() {
+        return NibbleUtils.extractHighUnsignedNibble(dexFile.getDataBuffer().readUbyte(instructionStart + 1));
+    }
+
+    @Override
+    public int getRegisterC() {
+        return NibbleUtils.extractLowUnsignedNibble(dexFile.getDataBuffer().readUbyte(instructionStart + 4));
+    }
+
+    @Override
+    public int getRegisterD() {
+        return NibbleUtils.extractHighUnsignedNibble(dexFile.getDataBuffer().readUbyte(instructionStart + 4));
+    }
+
+    @Override
+    public int getRegisterE() {
+        return NibbleUtils.extractLowUnsignedNibble(dexFile.getDataBuffer().readUbyte(instructionStart + 5));
+    }
+
+    @Override
+    public int getRegisterF() {
+        return NibbleUtils.extractHighUnsignedNibble(dexFile.getDataBuffer().readUbyte(instructionStart + 5));
+    }
+
+    @Override
+    public int getRegisterG() {
+        return NibbleUtils.extractLowUnsignedNibble(dexFile.getDataBuffer().readUbyte(instructionStart + 1));
+    }
+
+    @Override
+    public int getVtableIndex() {
+        return dexFile.getDataBuffer().readUshort(instructionStart + 2);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction3rc.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction3rc.java
new file mode 100644
index 0000000..8281018
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction3rc.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.reference.DexBackedReference;
+import org.jf.dexlib2.iface.instruction.formats.Instruction3rc;
+import org.jf.dexlib2.iface.reference.Reference;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction3rc extends DexBackedInstruction implements Instruction3rc {
+    public DexBackedInstruction3rc(@Nonnull DexBackedDexFile dexFile,
+                                   @Nonnull Opcode opcode,
+                                   int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override public int getRegisterCount() {
+        return dexFile.getDataBuffer().readUbyte(instructionStart + 1);
+    }
+
+    @Override
+    public int getStartRegister() {
+        return dexFile.getDataBuffer().readUshort(instructionStart + 4);
+    }
+
+    @Nonnull
+    @Override
+    public Reference getReference() {
+        return DexBackedReference.makeReference(dexFile, opcode.referenceType,
+                dexFile.getDataBuffer().readUshort(instructionStart + 2));
+    }
+
+    @Override
+    public int getReferenceType() {
+        return opcode.referenceType;
+    }
+}
+
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction3rmi.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction3rmi.java
new file mode 100644
index 0000000..de8e31f
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction3rmi.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.instruction.formats.Instruction3rmi;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction3rmi extends DexBackedInstruction implements Instruction3rmi {
+    public DexBackedInstruction3rmi(@Nonnull DexBackedDexFile dexFile,
+                                    @Nonnull Opcode opcode,
+                                    int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override public int getRegisterCount() {
+        return dexFile.getDataBuffer().readUbyte(instructionStart + 1);
+    }
+
+    @Override
+    public int getStartRegister() {
+        return dexFile.getDataBuffer().readUshort(instructionStart + 4);
+    }
+
+    @Override
+    public int getInlineIndex() {
+        return dexFile.getDataBuffer().readUshort(instructionStart + 2);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction3rms.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction3rms.java
new file mode 100644
index 0000000..3902309
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction3rms.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.instruction.formats.Instruction3rms;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction3rms extends DexBackedInstruction implements Instruction3rms {
+    public DexBackedInstruction3rms(@Nonnull DexBackedDexFile dexFile,
+                                    @Nonnull Opcode opcode,
+                                    int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override public int getRegisterCount() {
+        return dexFile.getDataBuffer().readUbyte(instructionStart + 1);
+    }
+
+    @Override
+    public int getStartRegister() {
+        return dexFile.getDataBuffer().readUshort(instructionStart + 4);
+    }
+
+    @Override
+    public int getVtableIndex() {
+        return dexFile.getDataBuffer().readUshort(instructionStart + 2);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction45cc.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction45cc.java
new file mode 100644
index 0000000..e9201f0
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction45cc.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.reference.DexBackedReference;
+import org.jf.dexlib2.iface.instruction.formats.Instruction45cc;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.util.NibbleUtils;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction45cc extends DexBackedInstruction implements Instruction45cc {
+    public DexBackedInstruction45cc(@Nonnull DexBackedDexFile dexFile,
+                                    @Nonnull Opcode opcode,
+                                    int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override public int getRegisterCount() {
+        return NibbleUtils.extractHighUnsignedNibble(dexFile.getDataBuffer().readUbyte(instructionStart + 1));
+    }
+
+    @Override
+    public int getRegisterC() {
+        return NibbleUtils.extractLowUnsignedNibble(dexFile.getDataBuffer().readUbyte(instructionStart + 4));
+    }
+
+    @Override
+    public int getRegisterD() {
+        return NibbleUtils.extractHighUnsignedNibble(dexFile.getDataBuffer().readUbyte(instructionStart + 4));
+    }
+
+    @Override
+    public int getRegisterE() {
+        return NibbleUtils.extractLowUnsignedNibble(dexFile.getDataBuffer().readUbyte(instructionStart + 5));
+    }
+
+    @Override
+    public int getRegisterF() {
+        return NibbleUtils.extractHighUnsignedNibble(dexFile.getDataBuffer().readUbyte(instructionStart + 5));
+    }
+
+    @Override
+    public int getRegisterG() {
+        return NibbleUtils.extractLowUnsignedNibble(dexFile.getDataBuffer().readUbyte(instructionStart + 1));
+    }
+
+    @Nonnull
+    @Override
+    public Reference getReference() {
+        return DexBackedReference.makeReference(dexFile, opcode.referenceType,
+                dexFile.getDataBuffer().readUshort(instructionStart + 2));
+    }
+
+    @Override
+    public int getReferenceType() {
+        return opcode.referenceType;
+    }
+
+    @Override
+    public Reference getReference2() {
+        return DexBackedReference.makeReference(dexFile, opcode.referenceType2,
+                dexFile.getDataBuffer().readUshort(instructionStart + 6));
+    }
+
+    @Override
+    public int getReferenceType2() {
+        return opcode.referenceType2;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction4rcc.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction4rcc.java
new file mode 100644
index 0000000..314dd19
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction4rcc.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.reference.DexBackedReference;
+import org.jf.dexlib2.iface.instruction.formats.Instruction4rcc;
+import org.jf.dexlib2.iface.reference.Reference;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction4rcc extends DexBackedInstruction implements Instruction4rcc {
+    public DexBackedInstruction4rcc(@Nonnull DexBackedDexFile dexFile,
+                                    @Nonnull Opcode opcode,
+                                    int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override public int getRegisterCount() {
+        return dexFile.getDataBuffer().readUbyte(instructionStart + 1);
+    }
+
+    @Override
+    public int getStartRegister() {
+        return dexFile.getDataBuffer().readUshort(instructionStart + 4);
+    }
+
+    @Nonnull
+    @Override
+    public Reference getReference() {
+        return DexBackedReference.makeReference(dexFile, opcode.referenceType,
+                dexFile.getDataBuffer().readUshort(instructionStart + 2));
+    }
+
+    @Override
+    public int getReferenceType() {
+        return opcode.referenceType;
+    }
+
+    @Override
+    public Reference getReference2() {
+        return DexBackedReference.makeReference(dexFile, opcode.referenceType2,
+                dexFile.getDataBuffer().readUshort(instructionStart + 6));
+    }
+
+    @Override
+    public int getReferenceType2() {
+        return opcode.referenceType2;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction51l.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction51l.java
new file mode 100644
index 0000000..a0d88ff
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedInstruction51l.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.instruction.formats.Instruction51l;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedInstruction51l extends DexBackedInstruction implements Instruction51l {
+    public DexBackedInstruction51l(@Nonnull DexBackedDexFile dexFile,
+                                   @Nonnull Opcode opcode,
+                                   int instructionStart) {
+        super(dexFile, opcode, instructionStart);
+    }
+
+    @Override public int getRegisterA() { return dexFile.getDataBuffer().readUbyte(instructionStart + 1); }
+    @Override public long getWideLiteral() { return dexFile.getDataBuffer().readLong(instructionStart + 2); }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedPackedSwitchPayload.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedPackedSwitchPayload.java
new file mode 100644
index 0000000..cd5c34d
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedPackedSwitchPayload.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.util.FixedSizeList;
+import org.jf.dexlib2.iface.instruction.SwitchElement;
+import org.jf.dexlib2.iface.instruction.formats.PackedSwitchPayload;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+public class DexBackedPackedSwitchPayload extends DexBackedInstruction implements PackedSwitchPayload {
+    public final int elementCount;
+
+    private static final int ELEMENT_COUNT_OFFSET = 2;
+    private static final int FIRST_KEY_OFFSET = 4;
+    private static final int TARGETS_OFFSET = 8;
+
+    public DexBackedPackedSwitchPayload(@Nonnull DexBackedDexFile dexFile,
+                                        int instructionStart) {
+        super(dexFile, Opcode.PACKED_SWITCH_PAYLOAD, instructionStart);
+
+        elementCount = dexFile.getDataBuffer().readUshort(instructionStart + ELEMENT_COUNT_OFFSET);
+    }
+
+    @Nonnull
+    @Override
+    public List<? extends SwitchElement> getSwitchElements() {
+        final int firstKey = dexFile.getDataBuffer().readInt(instructionStart + FIRST_KEY_OFFSET);
+        return new FixedSizeList<SwitchElement>() {
+            @Nonnull
+            @Override
+            public SwitchElement readItem(final int index) {
+                return new SwitchElement() {
+                    @Override
+                    public int getKey() {
+                        return firstKey + index;
+                    }
+
+                    @Override
+                    public int getOffset() {
+                        return dexFile.getDataBuffer().readInt(instructionStart + TARGETS_OFFSET + index*4);
+                    }
+                };
+            }
+
+            @Override public int size() { return elementCount; }
+        };
+    }
+
+    @Override public int getCodeUnits() { return 4 + elementCount*2; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedSparseSwitchPayload.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedSparseSwitchPayload.java
new file mode 100644
index 0000000..4d6e960
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedSparseSwitchPayload.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.util.FixedSizeList;
+import org.jf.dexlib2.iface.instruction.SwitchElement;
+import org.jf.dexlib2.iface.instruction.formats.SparseSwitchPayload;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+public class DexBackedSparseSwitchPayload extends DexBackedInstruction implements SparseSwitchPayload {
+    public final int elementCount;
+
+    private static final int ELEMENT_COUNT_OFFSET = 2;
+    private static final int KEYS_OFFSET = 4;
+
+    public DexBackedSparseSwitchPayload(@Nonnull DexBackedDexFile dexFile,
+                                        int instructionStart) {
+        super(dexFile, Opcode.SPARSE_SWITCH_PAYLOAD, instructionStart);
+
+        elementCount = dexFile.getDataBuffer().readUshort(instructionStart + ELEMENT_COUNT_OFFSET);
+    }
+
+    @Nonnull
+    @Override
+    public List<? extends SwitchElement> getSwitchElements() {
+        return new FixedSizeList<SwitchElement>() {
+            @Nonnull
+            @Override
+            public SwitchElement readItem(final int index) {
+                return new SwitchElement() {
+                    @Override
+                    public int getKey() {
+                        return dexFile.getDataBuffer().readInt(instructionStart + KEYS_OFFSET + index*4);
+                    }
+
+                    @Override
+                    public int getOffset() {
+                        return dexFile.getDataBuffer().readInt(instructionStart + KEYS_OFFSET + elementCount*4 + index*4);
+                    }
+                };
+            }
+
+            @Override public int size() { return elementCount; }
+        };
+    }
+
+    @Override public int getCodeUnits() { return 2 + elementCount*4; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedUnknownInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedUnknownInstruction.java
new file mode 100644
index 0000000..02f0dc5
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/instruction/DexBackedUnknownInstruction.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.instruction.formats.UnknownInstruction;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedUnknownInstruction extends DexBackedInstruction implements UnknownInstruction {
+    public DexBackedUnknownInstruction(@Nonnull DexBackedDexFile dexFile,
+                                       int instructionStart) {
+        super(dexFile, Opcode.NOP, instructionStart);
+    }
+
+    @Override public int getOriginalOpcode() {
+        int opcode = dexFile.getDataBuffer().readUbyte(instructionStart);
+        if (opcode == 0) {
+            opcode = dexFile.getDataBuffer().readUshort(instructionStart);
+        }
+
+        return opcode;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/AnnotationDirectoryItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/AnnotationDirectoryItem.java
new file mode 100644
index 0000000..ef59a7b
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/AnnotationDirectoryItem.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.raw;
+
+import org.jf.dexlib2.dexbacked.raw.util.DexAnnotator;
+import org.jf.dexlib2.util.AnnotatedBytes;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class AnnotationDirectoryItem {
+    public static final int CLASS_ANNOTATIONS_OFFSET  = 0;
+    public static final int FIELD_SIZE_OFFSET = 4;
+    public static final int ANNOTATED_METHOD_SIZE_OFFSET = 8;
+    public static final int ANNOTATED_PARAMETERS_SIZE = 12;
+
+    @Nonnull
+    public static SectionAnnotator makeAnnotator(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) {
+        return new SectionAnnotator(annotator, mapItem) {
+            @Nonnull @Override public String getItemName() {
+                return "annotation_directory_item";
+            }
+
+            @Override public int getItemAlignment() {
+                return 4;
+            }
+
+            @Override
+            protected void annotateItem(@Nonnull AnnotatedBytes out, int itemIndex, @Nullable String itemIdentity) {
+                int classAnnotationsOffset = dexFile.getBuffer().readSmallUint(out.getCursor());
+                out.annotate(4, "class_annotations_off = %s",
+                        AnnotationSetItem.getReferenceAnnotation(dexFile, classAnnotationsOffset));
+
+                int fieldsSize = dexFile.getBuffer().readSmallUint(out.getCursor());
+                out.annotate(4, "fields_size = %d", fieldsSize);
+
+                int annotatedMethodsSize = dexFile.getBuffer().readSmallUint(out.getCursor());
+                out.annotate(4, "annotated_methods_size = %d", annotatedMethodsSize);
+
+                int annotatedParameterSize = dexFile.getBuffer().readSmallUint(out.getCursor());
+                out.annotate(4, "annotated_parameters_size = %d", annotatedParameterSize);
+
+                if (fieldsSize > 0) {
+                    out.annotate(0, "field_annotations:");
+                    out.indent();
+                    for (int i=0; i<fieldsSize; i++) {
+                        out.annotate(0, "field_annotation[%d]", i);
+                        out.indent();
+                        int fieldIndex = dexFile.getBuffer().readSmallUint(out.getCursor());
+                        out.annotate(4, "%s", FieldIdItem.getReferenceAnnotation(dexFile, fieldIndex));
+                        int annotationOffset = dexFile.getBuffer().readSmallUint(out.getCursor());
+                        out.annotate(4, "%s", AnnotationSetItem.getReferenceAnnotation(dexFile, annotationOffset));
+                        out.deindent();
+                    }
+                    out.deindent();
+                }
+
+                if (annotatedMethodsSize > 0) {
+                    out.annotate(0, "method_annotations:");
+                    out.indent();
+                    for (int i=0; i<annotatedMethodsSize; i++) {
+                        out.annotate(0, "method_annotation[%d]", i);
+                        out.indent();
+                        int methodIndex = dexFile.getBuffer().readSmallUint(out.getCursor());
+                        out.annotate(4, "%s", MethodIdItem.getReferenceAnnotation(dexFile, methodIndex));
+                        int annotationOffset = dexFile.getBuffer().readSmallUint(out.getCursor());
+                        out.annotate(4, "%s", AnnotationSetItem.getReferenceAnnotation(dexFile, annotationOffset));
+                        out.deindent();
+                    }
+                    out.deindent();
+                }
+
+                if (annotatedParameterSize > 0) {
+                    out.annotate(0, "parameter_annotations:");
+                    out.indent();
+                    for (int i=0; i<annotatedParameterSize; i++) {
+                        out.annotate(0, "parameter_annotation[%d]", i);
+                        out.indent();
+                        int methodIndex = dexFile.getBuffer().readSmallUint(out.getCursor());
+                        out.annotate(4, "%s", MethodIdItem.getReferenceAnnotation(dexFile, methodIndex));
+                        int annotationOffset = dexFile.getBuffer().readSmallUint(out.getCursor());
+                        out.annotate(4, "%s", AnnotationSetRefList.getReferenceAnnotation(dexFile, annotationOffset));
+                        out.deindent();
+                    }
+                    out.deindent();
+                }
+            }
+        };
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/AnnotationItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/AnnotationItem.java
new file mode 100644
index 0000000..6d0cd86
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/AnnotationItem.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.raw;
+
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.DexReader;
+import org.jf.dexlib2.dexbacked.raw.util.DexAnnotator;
+import org.jf.dexlib2.util.AnnotatedBytes;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class AnnotationItem {
+    public static final int VISIBILITY_OFFSET = 0;
+    public static final int ANNOTATION_OFFSET = 1;
+
+    @Nonnull
+    public static SectionAnnotator makeAnnotator(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) {
+        return new SectionAnnotator(annotator, mapItem) {
+            @Nonnull @Override public String getItemName() {
+                return "annotation_item";
+            }
+
+            @Override
+            protected void annotateItem(@Nonnull AnnotatedBytes out, int itemIndex, @Nullable String itemIdentity) {
+                int visibility = dexFile.getBuffer().readUbyte(out.getCursor());
+                out.annotate(1, "visibility = %d: %s", visibility, getAnnotationVisibility(visibility));
+
+                DexReader reader = dexFile.getBuffer().readerAt(out.getCursor());
+
+                EncodedValue.annotateEncodedAnnotation(dexFile, out, reader);
+            }
+        };
+    }
+
+    private static String getAnnotationVisibility(int visibility) {
+        switch (visibility) {
+            case 0:
+                return "build";
+            case 1:
+                return "runtime";
+            case 2:
+                return "system";
+            default:
+                return "invalid visibility";
+        }
+    }
+
+    public static String getReferenceAnnotation(@Nonnull DexBackedDexFile dexFile, int annotationItemOffset) {
+        try {
+            DexReader reader = dexFile.getDataBuffer().readerAt(annotationItemOffset);
+            reader.readUbyte();
+            int typeIndex = reader.readSmallUleb128();
+            String annotationType = dexFile.getTypeSection().get(typeIndex);
+            return String.format("annotation_item[0x%x]: %s", annotationItemOffset, annotationType);
+        } catch (Exception ex) {
+            ex.printStackTrace(System.err);
+        }
+        return String.format("annotation_item[0x%x]", annotationItemOffset);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/AnnotationSetItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/AnnotationSetItem.java
new file mode 100644
index 0000000..3a9c1b8
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/AnnotationSetItem.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.raw;
+
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.raw.util.DexAnnotator;
+import org.jf.dexlib2.util.AnnotatedBytes;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class AnnotationSetItem {
+    public static final int SIZE_OFFSET = 0;
+    public static final int LIST_OFFSET = 4;
+
+    @Nonnull
+    public static SectionAnnotator makeAnnotator(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) {
+        return new SectionAnnotator(annotator, mapItem) {
+            @Nonnull @Override public String getItemName() {
+                return "annotation_set_item";
+            }
+
+            @Override
+            public void annotateItem(@Nonnull AnnotatedBytes out, int itemIndex, @Nullable String itemIdentity) {
+                int size = dexFile.getBuffer().readSmallUint(out.getCursor());
+                out.annotate(4, "size = %d", size);
+
+                for (int i=0; i<size; i++) {
+                    int annotationOffset = dexFile.getBuffer().readSmallUint(out.getCursor());
+                    out.annotate(4, AnnotationItem.getReferenceAnnotation(dexFile, annotationOffset));
+                }
+            }
+
+            @Override public int getItemAlignment() {
+                return 4;
+            }
+        };
+    }
+
+    @Nonnull
+    public static String getReferenceAnnotation(@Nonnull DexBackedDexFile dexFile, int annotationSetOffset) {
+        if (annotationSetOffset == 0) {
+            return "annotation_set_item[NO_OFFSET]";
+        }
+        return String.format("annotation_set_item[0x%x]", annotationSetOffset);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/AnnotationSetRefList.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/AnnotationSetRefList.java
new file mode 100644
index 0000000..91d63a5
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/AnnotationSetRefList.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.raw;
+
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.raw.util.DexAnnotator;
+import org.jf.dexlib2.util.AnnotatedBytes;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class AnnotationSetRefList {
+    public static final int SIZE_OFFSET = 0;
+    public static final int LIST_OFFSET = 4;
+
+    @Nonnull
+    public static SectionAnnotator makeAnnotator(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) {
+        return new SectionAnnotator(annotator, mapItem) {
+            @Nonnull @Override public String getItemName() {
+                return "annotation_set_ref_list";
+            }
+
+            @Override
+            protected void annotateItem(@Nonnull AnnotatedBytes out, int itemIndex, @Nullable String itemIdentity) {
+                int size = dexFile.getBuffer().readSmallUint(out.getCursor());
+                out.annotate(4, "size = %d", size);
+
+                for (int i=0; i<size; i++) {
+                    int annotationSetOffset = dexFile.getBuffer().readSmallUint(out.getCursor());
+                    out.annotate(4, "annotation_set_item[0x%x]", annotationSetOffset);
+                }
+            }
+
+            @Override public int getItemAlignment() {
+                return 4;
+            }
+        };
+    }
+
+    @Nonnull
+    public static String getReferenceAnnotation(@Nonnull DexBackedDexFile dexFile, int annotationSetRefListOffset) {
+        if (annotationSetRefListOffset == 0) {
+            return "annotation_set_ref_list[NO_OFFSET]";
+        }
+        return String.format("annotation_set_ref_list[0x%x]", annotationSetRefListOffset);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/CallSiteIdItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/CallSiteIdItem.java
new file mode 100644
index 0000000..ff18914
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/CallSiteIdItem.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.raw;
+
+import org.jf.dexlib2.dexbacked.raw.util.DexAnnotator;
+import org.jf.dexlib2.dexbacked.value.DexBackedArrayEncodedValue;
+import org.jf.dexlib2.util.AnnotatedBytes;
+import org.jf.dexlib2.util.EncodedValueUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.IOException;
+import java.io.StringWriter;
+
+public class CallSiteIdItem {
+    public static final int ITEM_SIZE = 4;
+
+    @Nonnull
+    public static SectionAnnotator makeAnnotator(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) {
+        return new SectionAnnotator(annotator, mapItem) {
+            @Nonnull @Override public String getItemName() {
+                return "call_site_id_item";
+            }
+
+            @Override
+            protected void annotateItem(@Nonnull AnnotatedBytes out, int itemIndex, @Nullable String itemIdentity) {
+                int callSiteOffset = dexFile.getBuffer().readSmallUint(out.getCursor());
+
+                StringWriter writer = new StringWriter();
+                try {
+                    EncodedValueUtils.writeEncodedValue(writer,
+                            new DexBackedArrayEncodedValue(dexFile, dexFile.getDataBuffer().readerAt(callSiteOffset)));
+                } catch (IOException ex) {
+                    // Shouldn't get an IOException from a StringWriter..
+                    throw new RuntimeException(ex);
+                }
+
+                out.annotate(4, "call_site_id_item[0x%x] = %s", callSiteOffset, writer.toString());
+            }
+        };
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/CdexDebugOffsetTable.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/CdexDebugOffsetTable.java
new file mode 100644
index 0000000..2247f2f
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/CdexDebugOffsetTable.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2019, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.raw;
+
+import org.jf.dexlib2.dexbacked.CDexBackedDexFile;
+import org.jf.dexlib2.dexbacked.DexBuffer;
+import org.jf.dexlib2.dexbacked.DexReader;
+import org.jf.dexlib2.dexbacked.raw.util.DexAnnotator;
+
+import javax.annotation.Nonnull;
+
+/**
+ * This table maps a method index to the offset to the debug_info_item associated with that method.
+ *
+ * There are 2 sections in the table. Each section is 32-bit aligned.
+ *
+ * The first section is arranged into chunks of data. Each chunk represents 16 method indices, starting at 0.
+ *
+ * The first two bytes of a chunk contain a 16-bit bitmask, encoded as a big-endian unsigned short. The least
+ * significant bit corresponds with the first index in the chunk of 16 method indexes, with each bit being the next
+ * index.
+ *
+ * Next, there are a series of uleb128 values, one for each set bit in the bitmask. Nothing is written for bits that are
+ * not set. The first uleb128 value is associated with the least significant set bit in the mask.
+ *
+ * Each uleb128 value is the offset from the start of the data section to the debug_info_item that is associated with
+ * the method having that method_index. It is encoded as the difference in offset from the previously encoded offset,
+ * with the first offset in that chunk being relative to the first debug_info_item (e.g. the debug_info_base field in
+ * the cdex header).
+ *
+ * It's worth noting that the offsets in each chunk of 16 are not necessarily in order. If a later offset is smaller
+ * than an earlier offset, the uleb128 is a large value that, when added to the previous offset, causes integer
+ * overflow, and wraps back around to the lower offset. Or, to put it another way, the uleb128 should actually be
+ * interpreted as a signed number, even though it's encoded in a format that is nominally for unsigned values.
+ *
+ * The second part of the table contains a simple list of 32-bit offsets to each chunk. The offsets are relative to
+ * the beginning of the debug offset table.
+ */
+public class CdexDebugOffsetTable {
+    @Nonnull
+    public static void annotate(@Nonnull DexAnnotator annotator, DexBuffer buffer) {
+        DexReader reader = buffer.readerAt(annotator.getCursor());
+
+        SectionAnnotator debugInfoAnnotator = annotator.getAnnotator(ItemType.DEBUG_INFO_ITEM);
+
+        int methodCount = annotator.dexFile.getMethodSection().size();
+
+        for (int methodIndex = 0; methodIndex < methodCount; methodIndex += 16) {
+            annotator.annotate(0, "Offset chuck for methods %d-%d", methodIndex, Math.min(methodIndex+16, methodCount));
+            annotator.indent();
+
+            int bitmask = reader.readUbyte() << 8;
+            bitmask |= reader.readUbyte();
+            StringBuilder sb = new StringBuilder();
+            for (int i=0; i<16; i++) {
+                sb.append((bitmask >> i) & 1);
+            }
+            annotator.annotate(2, "bitmask: 0b%s", sb.reverse());
+
+            int debugOffset = ((CDexBackedDexFile) annotator.dexFile).getDebugInfoBase();
+            for (int i=0; i<16; i++) {
+                if ((bitmask & 1) != 0) {
+                    int offsetDelta = reader.readBigUleb128();
+
+                    debugOffset += offsetDelta;
+
+                    annotator.annotateTo(reader.getOffset(), "[method_id: %d]: offset_delta: %d  (offset=0x%x)",
+                            methodIndex + i,
+                            offsetDelta, debugOffset);
+
+                    debugInfoAnnotator.setItemIdentity(debugOffset,
+                            annotator.dexFile.getMethodSection().get(methodIndex + i).toString());
+                }
+
+                bitmask >>= 1;
+            }
+
+            annotator.deindent();
+        }
+
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/CdexHeaderItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/CdexHeaderItem.java
new file mode 100644
index 0000000..e8d566e
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/CdexHeaderItem.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2019, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.raw;
+
+import org.jf.dexlib2.dexbacked.DexBuffer;
+import org.jf.dexlib2.util.AnnotatedBytes;
+
+import javax.annotation.Nonnull;
+
+public class CdexHeaderItem {
+
+    private static final byte[] MAGIC_VALUE = new byte[] { 0x63, 0x64, 0x65, 0x78, 0x00, 0x00, 0x00, 0x00 };
+    private static final int[] SUPPORTED_CDEX_VERSIONS = new int[] { 1 };
+
+    public static final int FEATURE_FLAGS_OFFSET = 112;
+    public static final int DEBUG_INFO_OFFSETS_POS_OFFSET = 116;
+    public static final int DEBUG_INFO_OFFSETS_TABLE_OFFSET = 120;
+    public static final int DEBUG_INFO_BASE = 124;
+
+    /**
+     * Verifies the magic value at the beginning of a cdex file
+     *
+     * @param buf A byte array containing at least the first 8 bytes of a cdex file
+     * @param offset The offset within the buffer to the beginning of the cdex header
+     * @return True if the magic value is valid
+     */
+    public static boolean verifyMagic(byte[] buf, int offset) {
+        if (buf.length - offset < 8) {
+            return false;
+        }
+
+        for (int i=0; i<4; i++) {
+            if (buf[offset + i] != MAGIC_VALUE[i]) {
+                return false;
+            }
+        }
+        for (int i=4; i<7; i++) {
+            if (buf[offset + i] < '0' ||
+                    buf[offset + i] > '9') {
+                return false;
+            }
+        }
+        if (buf[offset + 7] != MAGIC_VALUE[7]) {
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * Gets the dex version from an odex header
+     *
+     * @param buf A byte array containing at least the first 7 bytes of an odex file
+     * @param offset The offset within the buffer to the beginning of the odex header
+     * @return The odex version if the header is valid or -1 if the header is invalid
+     */
+    public static int getVersion(byte[] buf, int offset) {
+        if (!verifyMagic(buf, offset)) {
+            return -1;
+        }
+
+        return getVersionUnchecked(buf, offset);
+    }
+
+    private static int getVersionUnchecked(byte[] buf, int offset) {
+        int version = (buf[offset + 4] - '0') * 100;
+        version += (buf[offset + 5] - '0') * 10;
+        version += buf[offset + 6] - '0';
+
+        return version;
+    }
+
+    public static boolean isSupportedCdexVersion(int version) {
+        for (int i=0; i<SUPPORTED_CDEX_VERSIONS.length; i++) {
+            if (SUPPORTED_CDEX_VERSIONS[i] == version) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public static void annotateCdexHeaderFields(@Nonnull AnnotatedBytes out, DexBuffer buf) {
+        out.annotate(4, "feature_flags: 0x%x", buf.readInt(out.getCursor()));
+        out.annotate(4, "debug_info_offsets_pos: 0x%x", buf.readInt(out.getCursor()));
+        out.annotate(4, "debug_info_offsets_table_offset: 0x%x", buf.readInt(out.getCursor()));
+        out.annotate(4, "debug_info_base: 0x%x", buf.readInt(out.getCursor()));
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/ClassDataItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/ClassDataItem.java
new file mode 100644
index 0000000..57a3ab6
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/ClassDataItem.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.raw;
+
+import com.google.common.base.Joiner;
+import org.jf.dexlib2.AccessFlags;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.DexReader;
+import org.jf.dexlib2.dexbacked.raw.util.DexAnnotator;
+import org.jf.dexlib2.util.AnnotatedBytes;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class ClassDataItem {
+    @Nonnull
+    public static SectionAnnotator makeAnnotator(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) {
+        return new SectionAnnotator(annotator, mapItem) {
+            private SectionAnnotator codeItemAnnotator = null;
+
+            @Override public void annotateSection(@Nonnull AnnotatedBytes out) {
+                codeItemAnnotator = annotator.getAnnotator(ItemType.CODE_ITEM);
+                super.annotateSection(out);
+            }
+
+            @Nonnull @Override public String getItemName() {
+                return "class_data_item";
+            }
+
+            @Override
+            protected void annotateItem(@Nonnull AnnotatedBytes out, int itemIndex, @Nullable String itemIdentity) {
+                DexReader reader = dexFile.getBuffer().readerAt(out.getCursor());
+
+                int staticFieldsSize = reader.readSmallUleb128();
+                out.annotateTo(reader.getOffset(), "static_fields_size = %d", staticFieldsSize);
+
+                int instanceFieldsSize = reader.readSmallUleb128();
+                out.annotateTo(reader.getOffset(), "instance_fields_size = %d", instanceFieldsSize);
+
+                int directMethodsSize = reader.readSmallUleb128();
+                out.annotateTo(reader.getOffset(), "direct_methods_size = %d", directMethodsSize);
+
+                int virtualMethodsSize = reader.readSmallUleb128();
+                out.annotateTo(reader.getOffset(), "virtual_methods_size = %d", virtualMethodsSize);
+
+                int previousIndex = 0;
+                if (staticFieldsSize > 0) {
+                    out.annotate(0, "static_fields:");
+                    out.indent();
+                    for (int i=0; i<staticFieldsSize; i++) {
+                        out.annotate(0, "static_field[%d]", i);
+                        out.indent();
+                        previousIndex = annotateEncodedField(out, dexFile, reader, previousIndex);
+                        out.deindent();
+                    }
+                    out.deindent();
+                }
+
+                if (instanceFieldsSize > 0) {
+                    out.annotate(0, "instance_fields:");
+                    out.indent();
+                    previousIndex = 0;
+                    for (int i=0; i<instanceFieldsSize; i++) {
+                        out.annotate(0, "instance_field[%d]", i);
+                        out.indent();
+                        previousIndex = annotateEncodedField(out, dexFile, reader, previousIndex);
+                        out.deindent();
+                    }
+                    out.deindent();
+                }
+
+                if (directMethodsSize > 0) {
+                    out.annotate(0, "direct_methods:");
+                    out.indent();
+                    previousIndex = 0;
+                    for (int i=0; i<directMethodsSize; i++) {
+                        out.annotate(0, "direct_method[%d]", i);
+                        out.indent();
+                        previousIndex = annotateEncodedMethod(out, dexFile, reader, previousIndex);
+                        out.deindent();
+                    }
+                    out.deindent();
+                }
+
+                if (virtualMethodsSize > 0) {
+                    out.annotate(0, "virtual_methods:");
+                    out.indent();
+                    previousIndex = 0;
+                    for (int i=0; i<virtualMethodsSize; i++) {
+                        out.annotate(0, "virtual_method[%d]", i);
+                        out.indent();
+                        previousIndex = annotateEncodedMethod(out, dexFile, reader, previousIndex);
+                        out.deindent();
+                    }
+                    out.deindent();
+                }
+            }
+
+            private int annotateEncodedField(@Nonnull AnnotatedBytes out, @Nonnull DexBackedDexFile dexFile,
+                                             @Nonnull DexReader reader, int previousIndex) {
+                // large values may be used for the index delta, which cause the cumulative index to overflow upon
+                // addition, effectively allowing out of order entries.
+                int indexDelta = reader.readLargeUleb128();
+                int fieldIndex = previousIndex + indexDelta;
+                out.annotateTo(reader.getOffset(), "field_idx_diff = %d: %s", indexDelta,
+                        FieldIdItem.getReferenceAnnotation(dexFile, fieldIndex));
+
+                int accessFlags = reader.readSmallUleb128();
+                out.annotateTo(reader.getOffset(), "access_flags = 0x%x: %s", accessFlags,
+                        Joiner.on('|').join(AccessFlags.getAccessFlagsForField(accessFlags)));
+
+                return fieldIndex;
+            }
+
+            private int annotateEncodedMethod(@Nonnull AnnotatedBytes out, @Nonnull DexBackedDexFile dexFile,
+                                              @Nonnull DexReader reader, int previousIndex) {
+                // large values may be used for the index delta, which cause the cumulative index to overflow upon
+                // addition, effectively allowing out of order entries.
+                int indexDelta = reader.readLargeUleb128();
+                int methodIndex = previousIndex + indexDelta;
+                out.annotateTo(reader.getOffset(), "method_idx_diff = %d: %s", indexDelta,
+                        MethodIdItem.getReferenceAnnotation(dexFile, methodIndex));
+
+                int accessFlags = reader.readSmallUleb128();
+                out.annotateTo(reader.getOffset(), "access_flags = 0x%x: %s", accessFlags,
+                        Joiner.on('|').join(AccessFlags.getAccessFlagsForMethod(accessFlags)));
+
+                int codeOffset = reader.readSmallUleb128();
+                if (codeOffset == 0) {
+                    out.annotateTo(reader.getOffset(), "code_off = code_item[NO_OFFSET]");
+                } else {
+                    out.annotateTo(reader.getOffset(), "code_off = code_item[0x%x]", codeOffset);
+                    addCodeItemIdentity(codeOffset, MethodIdItem.asString(dexFile, methodIndex));
+                }
+
+                return methodIndex;
+            }
+
+            private void addCodeItemIdentity(int codeItemOffset, String methodString) {
+                if (codeItemAnnotator != null) {
+                    codeItemAnnotator.setItemIdentity(codeItemOffset, methodString);
+                }
+            }
+        };
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/ClassDefItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/ClassDefItem.java
new file mode 100644
index 0000000..f14c880
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/ClassDefItem.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.raw;
+
+import com.google.common.base.Joiner;
+import org.jf.dexlib2.AccessFlags;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.raw.util.DexAnnotator;
+import org.jf.dexlib2.util.AnnotatedBytes;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class ClassDefItem {
+    public static final int ITEM_SIZE = 32;
+
+    public static final int CLASS_OFFSET = 0;
+    public static final int ACCESS_FLAGS_OFFSET = 4;
+    public static final int SUPERCLASS_OFFSET = 8;
+    public static final int INTERFACES_OFFSET = 12;
+    public static final int SOURCE_FILE_OFFSET = 16;
+    public static final int ANNOTATIONS_OFFSET = 20;
+    public static final int CLASS_DATA_OFFSET = 24;
+    public static final int STATIC_VALUES_OFFSET = 28;
+
+    @Nonnull
+    public static SectionAnnotator makeAnnotator(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) {
+        return new SectionAnnotator(annotator, mapItem) {
+            private SectionAnnotator classDataAnnotator = null;
+
+            @Override public void annotateSection(@Nonnull AnnotatedBytes out) {
+                classDataAnnotator = annotator.getAnnotator(ItemType.CLASS_DATA_ITEM);
+                super.annotateSection(out);
+            }
+
+            @Nonnull @Override public String getItemName() {
+                return "class_def_item";
+            }
+
+            @Override
+            protected void annotateItem(@Nonnull AnnotatedBytes out, int itemIndex, @Nullable String itemIdentity) {
+                int classIndex = dexFile.getBuffer().readSmallUint(out.getCursor());
+                out.annotate(4, "class_idx = %s", TypeIdItem.getReferenceAnnotation(dexFile, classIndex));
+
+                int accessFlags = dexFile.getBuffer().readInt(out.getCursor());
+                out.annotate(4, "access_flags = 0x%x: %s", accessFlags,
+                        Joiner.on('|').join(AccessFlags.getAccessFlagsForClass(accessFlags)));
+
+                int superclassIndex = dexFile.getBuffer().readOptionalUint(out.getCursor());
+                out.annotate(4, "superclass_idx = %s",
+                        TypeIdItem.getOptionalReferenceAnnotation(dexFile, superclassIndex));
+
+                int interfacesOffset = dexFile.getBuffer().readSmallUint(out.getCursor());
+                out.annotate(4, "interfaces_off = %s", TypeListItem.getReferenceAnnotation(dexFile, interfacesOffset));
+
+                int sourceFileIdx = dexFile.getBuffer().readOptionalUint(out.getCursor());
+                out.annotate(4, "source_file_idx = %s", StringIdItem.getOptionalReferenceAnnotation(dexFile,
+                        sourceFileIdx));
+
+                int annotationsOffset = dexFile.getBuffer().readSmallUint(out.getCursor());
+                if (annotationsOffset == 0) {
+                    out.annotate(4, "annotations_off = annotations_directory_item[NO_OFFSET]");
+                } else {
+                    out.annotate(4, "annotations_off = annotations_directory_item[0x%x]", annotationsOffset);
+                }
+
+                int classDataOffset = dexFile.getBuffer().readSmallUint(out.getCursor());
+                if (classDataOffset == 0) {
+                    out.annotate(4, "class_data_off = class_data_item[NO_OFFSET]");
+                } else {
+                    out.annotate(4, "class_data_off = class_data_item[0x%x]", classDataOffset);
+                    addClassDataIdentity(classDataOffset, dexFile.getTypeSection().get(classIndex));
+                }
+
+                int staticValuesOffset = dexFile.getBuffer().readSmallUint(out.getCursor());
+                if (staticValuesOffset == 0) {
+                    out.annotate(4, "static_values_off = encoded_array_item[NO_OFFSET]");
+                } else {
+                    out.annotate(4, "static_values_off = encoded_array_item[0x%x]", staticValuesOffset);
+                }
+            }
+
+            private void addClassDataIdentity(int classDataOffset, String classType) {
+                if (classDataAnnotator != null) {
+                    classDataAnnotator.setItemIdentity(classDataOffset, classType);
+                }
+            }
+        };
+    }
+
+    @Nonnull
+    public static String asString(@Nonnull DexBackedDexFile dexFile, int classIndex) {
+        int offset = dexFile.getClassSection().getOffset(classIndex);
+        int typeIndex = dexFile.getBuffer().readSmallUint(offset + CLASS_OFFSET);
+        return dexFile.getTypeSection().get(typeIndex);
+    }
+
+    public static String[] getClasses(@Nonnull DexBackedDexFile dexFile) {
+        MapItem mapItem = dexFile.getMapItemForSection(ItemType.CLASS_DEF_ITEM);
+        if (mapItem == null) {
+            return new String[0];
+        }
+
+        int classCount = mapItem.getItemCount();
+        String[] ret = new String[classCount];
+        for (int i=0; i<classCount; i++) {
+            ret[i] = asString(dexFile, i);
+        }
+        return ret;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/CodeItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/CodeItem.java
new file mode 100644
index 0000000..50d22f0
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/CodeItem.java
@@ -0,0 +1,625 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.raw;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.Lists;
+import org.jf.dexlib2.VerificationError;
+import org.jf.dexlib2.dexbacked.CDexBackedDexFile;
+import org.jf.dexlib2.dexbacked.DexReader;
+import org.jf.dexlib2.dexbacked.instruction.DexBackedInstruction;
+import org.jf.dexlib2.dexbacked.raw.util.DexAnnotator;
+import org.jf.dexlib2.iface.instruction.*;
+import org.jf.dexlib2.iface.instruction.formats.*;
+import org.jf.dexlib2.util.AnnotatedBytes;
+import org.jf.dexlib2.util.ReferenceUtil;
+import org.jf.util.ExceptionWithContext;
+import org.jf.util.NumberUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.ArrayList;
+import java.util.List;
+
+public class CodeItem {
+    public static final int REGISTERS_OFFSET = 0;
+    public static final int INS_OFFSET = 2;
+    public static final int OUTS_OFFSET = 4;
+    public static final int TRIES_SIZE_OFFSET = 6;
+    public static final int DEBUG_INFO_OFFSET = 8;
+    public static final int INSTRUCTION_COUNT_OFFSET = 12;
+    public static final int INSTRUCTION_START_OFFSET = 16;
+
+    public static int CDEX_TRIES_SIZE_SHIFT = 0;
+    public static int CDEX_OUTS_COUNT_SHIFT = 4;
+    public static int CDEX_INS_COUNT_SHIFT = 8;
+    public static int CDEX_REGISTER_COUNT_SHIFT = 12;
+
+    public static int CDEX_INSTRUCTIONS_SIZE_AND_PREHEADER_FLAGS_OFFSET = 2;
+    public static int CDEX_INSTRUCTIONS_SIZE_SHIFT = 5;
+    public static int CDEX_PREHEADER_FLAGS_MASK = 0x1f;
+    public static int CDEX_PREHEADER_FLAG_REGISTER_COUNT = 1 << 0;
+    public static int CDEX_PREHEADER_FLAG_INS_COUNT = 1 << 1;
+    public static int CDEX_PREHEADER_FLAG_OUTS_COUNT = 1 << 2;
+    public static int CDEX_PREHEADER_FLAG_TRIES_COUNT = 1 << 3;
+    public static int CDEX_PREHEADER_FLAG_INSTRUCTIONS_SIZE = 1 << 4;
+
+    public static class TryItem {
+        public static final int ITEM_SIZE = 8;
+
+        public static final int START_ADDRESS_OFFSET = 0;
+        public static final int CODE_UNIT_COUNT_OFFSET = 4;
+        public static final int HANDLER_OFFSET = 6;
+    }
+
+    public static SectionAnnotator makeAnnotator(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) {
+        if (annotator.dexFile instanceof CDexBackedDexFile) {
+            return makeAnnotatorForCDex(annotator, mapItem);
+        } else {
+            return makeAnnotatorForDex(annotator, mapItem);
+        }
+    }
+
+    @Nonnull
+    private static SectionAnnotator makeAnnotatorForDex(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) {
+        return new CodeItemAnnotator(annotator, mapItem);
+    }
+
+    @Nonnull
+    private static SectionAnnotator makeAnnotatorForCDex(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) {
+        return new CodeItemAnnotator(annotator, mapItem) {
+
+            private List<Integer> sortedItems;
+
+            @Override public void annotateSection(@Nonnull AnnotatedBytes out) {
+                sortedItems = new ArrayList<>(itemIdentities.keySet());
+                sortedItems.sort(Integer::compareTo);
+
+                //debugInfoAnnotator = annotator.getAnnotator(ItemType.DEBUG_INFO_ITEM);
+                out.moveTo(sectionOffset);
+                annotateSectionInner(out, itemIdentities.size());
+            }
+
+            @Override
+            protected int getItemOffset(int itemIndex, int currentOffset) {
+                return sortedItems.get(itemIndex);
+            }
+
+            @Override
+            protected PreInstructionInfo annotatePreInstructionFields(
+                    @Nonnull AnnotatedBytes out, @Nonnull DexReader reader, @Nullable String itemIdentity) {
+                int sizeFields = reader.readUshort();
+
+                int triesCount = (sizeFields >> CDEX_TRIES_SIZE_SHIFT) & 0xf;
+                int outsCount = (sizeFields >> CDEX_OUTS_COUNT_SHIFT) & 0xf;
+                int insCount = (sizeFields >> CDEX_INS_COUNT_SHIFT) & 0xf;
+                int registerCount = (sizeFields >> CDEX_REGISTER_COUNT_SHIFT) & 0xf;
+
+                int startOffset = out.getCursor();
+
+                out.annotate(2, "tries_size = %d", triesCount);
+                out.annotate(0, "outs_size = %d", outsCount);
+                out.annotate(0, "ins_size = %d", insCount);
+                out.annotate(0, "registers_size = %d", registerCount);
+
+                int instructionsSizeAndPreheaderFlags = reader.readUshort();
+
+                int instructionsSize = instructionsSizeAndPreheaderFlags >> CDEX_INSTRUCTIONS_SIZE_SHIFT;
+
+                out.annotate(2, "insns_size = %d", instructionsSize);
+
+                int instructionsStartOffset = out.getCursor();
+                int preheaderOffset = startOffset;
+
+                int totalTriesCount = triesCount;
+                int totalInstructionsSize = instructionsSize;
+
+                if ((instructionsSizeAndPreheaderFlags & CDEX_PREHEADER_FLAGS_MASK) != 0) {
+                    int preheaderCount = Integer.bitCount(
+                            instructionsSizeAndPreheaderFlags & CDEX_PREHEADER_FLAGS_MASK);
+                    if ((instructionsSizeAndPreheaderFlags & CDEX_PREHEADER_FLAG_INSTRUCTIONS_SIZE) != 0) {
+                        // The instructions size preheader is 2 shorts
+                        preheaderCount++;
+                    }
+
+                    out.moveTo((startOffset - 2 * preheaderCount));
+                    out.deindent();
+                    out.annotate(0, "[preheader for next code_item]");
+                    out.indent();
+                    out.moveTo(instructionsStartOffset);
+                }
+
+                if ((instructionsSizeAndPreheaderFlags & CDEX_PREHEADER_FLAG_INSTRUCTIONS_SIZE) != 0) {
+                    out.annotate(0, "insns_size_preheader_flag=1");
+                    preheaderOffset -= 2;
+                    reader.setOffset(preheaderOffset);
+                    int extraInstructionsSize = reader.readUshort();
+                    preheaderOffset -= 2;
+                    reader.setOffset(preheaderOffset);
+                    extraInstructionsSize += reader.readUshort();
+
+                    out.moveTo(preheaderOffset);
+                    totalInstructionsSize += extraInstructionsSize;
+                    out.annotate(2, "insns_size = %d + %d = %d",
+                            instructionsSize, extraInstructionsSize, instructionsSize + extraInstructionsSize);
+                    out.moveTo(instructionsStartOffset);
+                }
+
+                if ((instructionsSizeAndPreheaderFlags & CDEX_PREHEADER_FLAG_REGISTER_COUNT) != 0) {
+                    out.annotate(0, "registers_size_preheader_flag=1");
+                    preheaderOffset -= 2;
+                    out.moveTo(preheaderOffset);
+                    reader.setOffset(preheaderOffset);
+                    int extraRegisterCount = reader.readUshort();
+                    out.annotate(2, "registers_size = %d + %d = %d",
+                            registerCount, extraRegisterCount, registerCount + extraRegisterCount);
+                    out.moveTo(instructionsStartOffset);
+                }
+                if ((instructionsSizeAndPreheaderFlags & CDEX_PREHEADER_FLAG_INS_COUNT) != 0) {
+                    out.annotate(0, "ins_size_preheader_flag=1");
+                    preheaderOffset -= 2;
+                    out.moveTo(preheaderOffset);
+                    reader.setOffset(preheaderOffset);
+                    int extraInsCount = reader.readUshort();
+                    out.annotate(2, "ins_size = %d + %d = %d",
+                            insCount, extraInsCount, insCount + extraInsCount);
+                    out.moveTo(instructionsStartOffset);
+                }
+                if ((instructionsSizeAndPreheaderFlags & CDEX_PREHEADER_FLAG_OUTS_COUNT) != 0) {
+                    out.annotate(0, "outs_size_preheader_flag=1");
+                    preheaderOffset -= 2;
+                    out.moveTo(preheaderOffset);
+                    reader.setOffset(preheaderOffset);
+                    int extraOutsCount = reader.readUshort();
+                    out.annotate(2, "outs_size = %d + %d = %d",
+                            outsCount, extraOutsCount, outsCount + extraOutsCount);
+                    out.moveTo(instructionsStartOffset);
+                }
+                if ((instructionsSizeAndPreheaderFlags & CDEX_PREHEADER_FLAG_TRIES_COUNT) != 0) {
+                    out.annotate(0, "tries_size_preheader_flag=1");
+                    preheaderOffset -= 2;
+                    out.moveTo(preheaderOffset);
+                    reader.setOffset(preheaderOffset);
+                    int extraTriesCount = reader.readUshort();
+                    totalTriesCount += extraTriesCount;
+                    out.annotate(2, "tries_size = %d + %d = %d",
+                            triesCount, extraTriesCount, triesCount + extraTriesCount);
+                    out.moveTo(instructionsStartOffset);
+                }
+
+                reader.setOffset(instructionsStartOffset);
+
+                return new PreInstructionInfo(totalTriesCount, totalInstructionsSize);
+            }
+        };
+    }
+
+    private static class CodeItemAnnotator extends SectionAnnotator {
+        private SectionAnnotator debugInfoAnnotator;
+
+        public CodeItemAnnotator(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) {
+            super(annotator, mapItem);
+        }
+
+        @Nonnull @Override public String getItemName() {
+            return "code_item";
+        }
+
+        @Override public int getItemAlignment() {
+            return 4;
+        }
+
+        protected class PreInstructionInfo {
+            public int triesCount;
+            public int instructionSize;
+
+            public PreInstructionInfo(int triesCount, int instructionSize) {
+                this.triesCount = triesCount;
+                this.instructionSize = instructionSize;
+            }
+        }
+
+        protected PreInstructionInfo annotatePreInstructionFields(
+                @Nonnull AnnotatedBytes out, @Nonnull DexReader reader, @Nullable String itemIdentity) {
+
+            int registers = reader.readUshort();
+            out.annotate(2, "registers_size = %d", registers);
+
+            int inSize = reader.readUshort();
+            out.annotate(2, "ins_size = %d", inSize);
+
+            int outSize = reader.readUshort();
+            out.annotate(2, "outs_size = %d", outSize);
+
+            int triesCount = reader.readUshort();
+            out.annotate(2, "tries_size = %d", triesCount);
+
+            int debugInfoOffset = reader.readInt();
+            out.annotate(4, "debug_info_off = 0x%x", debugInfoOffset);
+
+            if (debugInfoOffset > 0) {
+                addDebugInfoIdentity(debugInfoOffset, itemIdentity);
+            }
+
+            int instructionSize = reader.readSmallUint();
+            out.annotate(4, "insns_size = 0x%x", instructionSize);
+
+            return new PreInstructionInfo(triesCount, instructionSize);
+        }
+
+        protected void annotateInstructions(
+                @Nonnull AnnotatedBytes out,
+                @Nonnull DexReader reader,
+                int instructionSize) {
+
+            out.annotate(0, "instructions:");
+            out.indent();
+
+            out.setLimit(out.getCursor(), out.getCursor() + instructionSize * 2);
+
+            int end = reader.getOffset() + instructionSize*2;
+            try {
+                while (reader.getOffset() < end) {
+                    Instruction instruction = DexBackedInstruction.readFrom(dexFile, reader);
+
+                    // if we read past the end of the instruction list
+                    if (reader.getOffset() > end) {
+                        out.annotateTo(end, "truncated instruction");
+                        reader.setOffset(end);
+                    } else {
+                        switch (instruction.getOpcode().format) {
+                            case Format10x:
+                                annotateInstruction10x(out, instruction);
+                                break;
+                            case Format35c:
+                                annotateInstruction35c(out, (Instruction35c)instruction);
+                                break;
+                            case Format3rc:
+                                annotateInstruction3rc(out, (Instruction3rc)instruction);
+                                break;
+                            case ArrayPayload:
+                                annotateArrayPayload(out, (ArrayPayload)instruction);
+                                break;
+                            case PackedSwitchPayload:
+                                annotatePackedSwitchPayload(out, (PackedSwitchPayload)instruction);
+                                break;
+                            case SparseSwitchPayload:
+                                annotateSparseSwitchPayload(out, (SparseSwitchPayload)instruction);
+                                break;
+                            default:
+                                annotateDefaultInstruction(out, instruction);
+                                break;
+                        }
+                    }
+
+                    assert reader.getOffset() == out.getCursor();
+                }
+            } catch (ExceptionWithContext ex) {
+                ex.printStackTrace(System.err);
+                out.annotate(0, "annotation error: %s", ex.getMessage());
+                out.moveTo(end);
+                reader.setOffset(end);
+            } finally {
+                out.clearLimit();
+                out.deindent();
+            }
+        }
+
+        protected void annotatePostInstructionFields(@Nonnull AnnotatedBytes out,
+                                                     @Nonnull DexReader reader,
+                                                     int triesCount) {
+            if (triesCount > 0) {
+                if ((reader.getOffset() % 4) != 0) {
+                    reader.readUshort();
+                    out.annotate(2, "padding");
+                }
+
+                out.annotate(0, "try_items:");
+                out.indent();
+                try {
+                    for (int i = 0; i < triesCount; i++) {
+                        out.annotate(0, "try_item[%d]:", i);
+                        out.indent();
+                        try {
+                            int startAddr = reader.readSmallUint();
+                            out.annotate(4, "start_addr = 0x%x", startAddr);
+
+                            int instructionCount = reader.readUshort();
+                            out.annotate(2, "insn_count = 0x%x", instructionCount);
+
+                            int handlerOffset = reader.readUshort();
+                            out.annotate(2, "handler_off = 0x%x", handlerOffset);
+                        } finally {
+                            out.deindent();
+                        }
+                    }
+                } finally {
+                    out.deindent();
+                }
+
+                int handlerListCount = reader.readSmallUleb128();
+                out.annotate(0, "encoded_catch_handler_list:");
+                out.annotateTo(reader.getOffset(), "size = %d", handlerListCount);
+                out.indent();
+                try {
+                    for (int i = 0; i < handlerListCount; i++) {
+                        out.annotate(0, "encoded_catch_handler[%d]", i);
+                        out.indent();
+                        try {
+                            int handlerCount = reader.readSleb128();
+                            out.annotateTo(reader.getOffset(), "size = %d", handlerCount);
+                            boolean hasCatchAll = handlerCount <= 0;
+                            handlerCount = Math.abs(handlerCount);
+                            if (handlerCount != 0) {
+                                out.annotate(0, "handlers:");
+                                out.indent();
+                                try {
+                                    for (int j = 0; j < handlerCount; j++) {
+                                        out.annotate(0, "encoded_type_addr_pair[%d]", i);
+                                        out.indent();
+                                        try {
+                                            int typeIndex = reader.readSmallUleb128();
+                                            out.annotateTo(reader.getOffset(), TypeIdItem.getReferenceAnnotation(dexFile, typeIndex));
+
+                                            int handlerAddress = reader.readSmallUleb128();
+                                            out.annotateTo(reader.getOffset(), "addr = 0x%x", handlerAddress);
+                                        } finally {
+                                            out.deindent();
+                                        }
+                                    }
+                                } finally {
+                                    out.deindent();
+                                }
+                            }
+                            if (hasCatchAll) {
+                                int catchAllAddress = reader.readSmallUleb128();
+                                out.annotateTo(reader.getOffset(), "catch_all_addr = 0x%x", catchAllAddress);
+                            }
+                        } finally {
+                            out.deindent();
+                        }
+                    }
+                } finally {
+                    out.deindent();
+                }
+            }
+        }
+
+        @Override
+        public void annotateItem(@Nonnull AnnotatedBytes out, int itemIndex, @Nullable String itemIdentity) {
+            try {
+                DexReader reader = dexFile.getBuffer().readerAt(out.getCursor());
+
+                PreInstructionInfo info = annotatePreInstructionFields(out, reader, itemIdentity);
+                annotateInstructions(out, reader, info.instructionSize);
+                annotatePostInstructionFields(out, reader, info.triesCount);
+            } catch (ExceptionWithContext ex) {
+                out.annotate(0, "annotation error: %s", ex.getMessage());
+            }
+        }
+
+        private String formatRegister(int registerNum) {
+            return String.format("v%d", registerNum);
+        }
+
+        private void annotateInstruction10x(@Nonnull AnnotatedBytes out, @Nonnull Instruction instruction) {
+            out.annotate(2, instruction.getOpcode().name);
+        }
+
+        private void annotateInstruction35c(@Nonnull AnnotatedBytes out, @Nonnull Instruction35c instruction) {
+            List<String> args = Lists.newArrayList();
+
+            int registerCount = instruction.getRegisterCount();
+            if (registerCount == 1) {
+                args.add(formatRegister(instruction.getRegisterC()));
+            } else if (registerCount == 2) {
+                args.add(formatRegister(instruction.getRegisterC()));
+                args.add(formatRegister(instruction.getRegisterD()));
+            } else if (registerCount == 3) {
+                args.add(formatRegister(instruction.getRegisterC()));
+                args.add(formatRegister(instruction.getRegisterD()));
+                args.add(formatRegister(instruction.getRegisterE()));
+            } else if (registerCount == 4) {
+                args.add(formatRegister(instruction.getRegisterC()));
+                args.add(formatRegister(instruction.getRegisterD()));
+                args.add(formatRegister(instruction.getRegisterE()));
+                args.add(formatRegister(instruction.getRegisterF()));
+            } else if (registerCount == 5) {
+                args.add(formatRegister(instruction.getRegisterC()));
+                args.add(formatRegister(instruction.getRegisterD()));
+                args.add(formatRegister(instruction.getRegisterE()));
+                args.add(formatRegister(instruction.getRegisterF()));
+                args.add(formatRegister(instruction.getRegisterG()));
+            }
+
+            String reference = ReferenceUtil.getReferenceString(instruction.getReference());
+
+            out.annotate(6, String.format("%s {%s}, %s",
+                    instruction.getOpcode().name, Joiner.on(", ").join(args), reference));
+        }
+
+        private void annotateInstruction3rc(@Nonnull AnnotatedBytes out, @Nonnull Instruction3rc instruction) {
+            int startRegister = instruction.getStartRegister();
+            int endRegister = startRegister + instruction.getRegisterCount() - 1;
+            String reference = ReferenceUtil.getReferenceString(instruction.getReference());
+            out.annotate(6, String.format("%s {%s .. %s}, %s",
+                    instruction.getOpcode().name, formatRegister(startRegister), formatRegister(endRegister),
+                    reference));
+        }
+
+        private void annotateDefaultInstruction(@Nonnull AnnotatedBytes out, @Nonnull Instruction instruction) {
+            List<String> args = Lists.newArrayList();
+
+            if (instruction instanceof OneRegisterInstruction) {
+                args.add(formatRegister(((OneRegisterInstruction)instruction).getRegisterA()));
+                if (instruction instanceof TwoRegisterInstruction) {
+                    args.add(formatRegister(((TwoRegisterInstruction)instruction).getRegisterB()));
+                    if (instruction instanceof ThreeRegisterInstruction) {
+                        args.add(formatRegister(((ThreeRegisterInstruction)instruction).getRegisterC()));
+                    }
+                }
+            }  else if (instruction instanceof VerificationErrorInstruction) {
+                String verificationError = VerificationError.getVerificationErrorName(
+                        ((VerificationErrorInstruction) instruction).getVerificationError());
+                if (verificationError != null) {
+                    args.add(verificationError);
+                } else {
+                    args.add("invalid verification error type");
+                }
+            }
+
+            if (instruction instanceof ReferenceInstruction) {
+                args.add(ReferenceUtil.getReferenceString(((ReferenceInstruction)instruction).getReference()));
+            } else if (instruction instanceof OffsetInstruction) {
+                int offset = ((OffsetInstruction)instruction).getCodeOffset();
+                String sign = offset>=0?"+":"-";
+                args.add(String.format("%s0x%x", sign, Math.abs(offset)));
+            } else if (instruction instanceof NarrowLiteralInstruction) {
+                int value = ((NarrowLiteralInstruction)instruction).getNarrowLiteral();
+                if (NumberUtils.isLikelyFloat(value)) {
+                    args.add(String.format("%d # %f", value, Float.intBitsToFloat(value)));
+                } else {
+                    args.add(String.format("%d", value));
+                }
+            } else if (instruction instanceof WideLiteralInstruction) {
+                long value = ((WideLiteralInstruction)instruction).getWideLiteral();
+                if (NumberUtils.isLikelyDouble(value)) {
+                    args.add(String.format("%d # %f", value, Double.longBitsToDouble(value)));
+                } else {
+                    args.add(String.format("%d", value));
+                }
+            } else if (instruction instanceof FieldOffsetInstruction) {
+                int fieldOffset = ((FieldOffsetInstruction)instruction).getFieldOffset();
+                args.add(String.format("field@0x%x", fieldOffset));
+            } else if (instruction instanceof VtableIndexInstruction) {
+                int vtableIndex = ((VtableIndexInstruction)instruction).getVtableIndex();
+                args.add(String.format("vtable@%d", vtableIndex));
+            } else if (instruction instanceof InlineIndexInstruction) {
+                int inlineIndex = ((InlineIndexInstruction)instruction).getInlineIndex();
+                args.add(String.format("inline@%d", inlineIndex));
+            }
+
+            out.annotate(instruction.getCodeUnits()*2, "%s %s",
+                    instruction.getOpcode().name, Joiner.on(", ").join(args));
+        }
+
+        private void annotateArrayPayload(@Nonnull AnnotatedBytes out, @Nonnull ArrayPayload instruction) {
+            List<Number> elements = instruction.getArrayElements();
+            int elementWidth = instruction.getElementWidth();
+
+            out.annotate(2, instruction.getOpcode().name);
+            out.indent();
+            out.annotate(2, "element_width = %d", elementWidth);
+            out.annotate(4, "size = %d", elements.size());
+            if (elements.size() > 0) {
+                out.annotate(0, "elements:");
+            }
+            out.indent();
+            if (elements.size() > 0) {
+                for (int i = 0; i < elements.size(); i++) {
+                    if (elementWidth == 8) {
+                        long value = elements.get(i).longValue();
+                        if (NumberUtils.isLikelyDouble(value)) {
+                            out.annotate(elementWidth, "element[%d] = %d # %f", i, value, Double.longBitsToDouble(value));
+                        } else {
+                            out.annotate(elementWidth, "element[%d] = %d", i, value);
+                        }
+                    } else {
+                        int value = elements.get(i).intValue();
+                        if (NumberUtils.isLikelyFloat(value)) {
+                            out.annotate(elementWidth, "element[%d] = %d # %f", i, value, Float.intBitsToFloat(value));
+                        } else {
+                            out.annotate(elementWidth, "element[%d] = %d", i, value);
+                        }
+                    }
+                }
+            }
+            if (out.getCursor() % 2 != 0) {
+                out.annotate(1, "padding");
+            }
+            out.deindent();
+            out.deindent();
+        }
+
+        private void annotatePackedSwitchPayload(@Nonnull AnnotatedBytes out,
+                                                 @Nonnull PackedSwitchPayload instruction) {
+            List<? extends SwitchElement> elements = instruction.getSwitchElements();
+
+            out.annotate(2, instruction.getOpcode().name);
+            out.indent();
+
+            out.annotate(2, "size = %d", elements.size());
+            if (elements.size() == 0) {
+                out.annotate(4, "first_key");
+            } else {
+                out.annotate(4, "first_key = %d", elements.get(0).getKey());
+                out.annotate(0, "targets:");
+                out.indent();
+                for (int i=0; i<elements.size(); i++) {
+                    out.annotate(4, "target[%d] = %d", i, elements.get(i).getOffset());
+                }
+                out.deindent();
+            }
+            out.deindent();
+        }
+
+        private void annotateSparseSwitchPayload(@Nonnull AnnotatedBytes out,
+                                                 @Nonnull SparseSwitchPayload instruction) {
+            List<? extends SwitchElement> elements = instruction.getSwitchElements();
+
+            out.annotate(2, instruction.getOpcode().name);
+            out.indent();
+            out.annotate(2, "size = %d", elements.size());
+            if (elements.size() > 0) {
+                out.annotate(0, "keys:");
+                out.indent();
+                for (int i=0; i<elements.size(); i++) {
+                    out.annotate(4, "key[%d] = %d", i, elements.get(i).getKey());
+                }
+                out.deindent();
+                out.annotate(0, "targets:");
+                out.indent();
+                for (int i=0; i<elements.size(); i++) {
+                    out.annotate(4, "target[%d] = %d", i, elements.get(i).getOffset());
+                }
+                out.deindent();
+            }
+            out.deindent();
+        }
+
+        private void addDebugInfoIdentity(int debugInfoOffset, String methodString) {
+            if (debugInfoAnnotator != null) {
+                debugInfoAnnotator.setItemIdentity(debugInfoOffset, methodString);
+            }
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/DebugInfoItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/DebugInfoItem.java
new file mode 100644
index 0000000..ef4d858
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/DebugInfoItem.java
@@ -0,0 +1,183 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.raw;
+
+import org.jf.dexlib2.DebugItemType;
+import org.jf.dexlib2.dexbacked.DexReader;
+import org.jf.dexlib2.dexbacked.raw.util.DexAnnotator;
+import org.jf.dexlib2.util.AnnotatedBytes;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class DebugInfoItem {
+
+    @Nonnull
+    public static SectionAnnotator makeAnnotator(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) {
+        return new SectionAnnotator(annotator, mapItem) {
+            @Nonnull @Override public String getItemName() {
+                return "debug_info_item";
+            }
+
+            @Override
+            public void annotateItem(@Nonnull AnnotatedBytes out, int itemIndex, @Nullable String itemIdentity) {
+                DexReader reader = dexFile.getBuffer().readerAt(out.getCursor());
+
+                int lineStart = reader.readBigUleb128();
+                out.annotateTo(reader.getOffset(), "line_start = %d", lineStart & 0xFFFFFFFFL);
+
+                int parametersSize = reader.readSmallUleb128();
+                out.annotateTo(reader.getOffset(), "parameters_size = %d", parametersSize);
+
+                if (parametersSize > 0) {
+                    out.annotate(0, "parameters:");
+                    out.indent();
+                    for (int i=0; i<parametersSize; i++) {
+                        int paramaterIndex = reader.readSmallUleb128() - 1;
+                        out.annotateTo(reader.getOffset(), "%s",
+                                StringIdItem.getOptionalReferenceAnnotation(dexFile, paramaterIndex, true));
+                    }
+                    out.deindent();
+                }
+
+                out.annotate(0, "debug opcodes:");
+                out.indent();
+
+                int codeAddress = 0;
+                int lineNumber = lineStart;
+
+                loop: while (true) {
+                    int opcode = reader.readUbyte();
+                    switch (opcode) {
+                        case DebugItemType.END_SEQUENCE: {
+                            out.annotateTo(reader.getOffset(), "DBG_END_SEQUENCE");
+                            break loop;
+                        }
+                        case DebugItemType.ADVANCE_PC: {
+                            out.annotateTo(reader.getOffset(), "DBG_ADVANCE_PC");
+                            out.indent();
+                            int addressDiff = reader.readSmallUleb128();
+                            codeAddress += addressDiff;
+                            out.annotateTo(reader.getOffset(), "addr_diff = +0x%x: 0x%x", addressDiff,
+                                    codeAddress);
+                            out.deindent();
+                            break;
+                        }
+                        case DebugItemType.ADVANCE_LINE: {
+                            out.annotateTo(reader.getOffset(), "DBG_ADVANCE_LINE");
+                            out.indent();
+                            int lineDiff = reader.readSleb128();
+                            lineNumber += lineDiff;
+                            out.annotateTo(reader.getOffset(), "line_diff = +%d: %d", Math.abs(lineDiff), lineNumber);
+                            out.deindent();
+                            break;
+                        }
+                        case DebugItemType.START_LOCAL: {
+                            out.annotateTo(reader.getOffset(), "DBG_START_LOCAL");
+                            out.indent();
+                            int registerNum = reader.readSmallUleb128();
+                            out.annotateTo(reader.getOffset(), "register_num = v%d", registerNum);
+                            int nameIndex = reader.readSmallUleb128() - 1;
+                            out.annotateTo(reader.getOffset(), "name_idx = %s",
+                                    StringIdItem.getOptionalReferenceAnnotation(dexFile, nameIndex, true));
+                            int typeIndex = reader.readSmallUleb128() - 1;
+                            out.annotateTo(reader.getOffset(), "type_idx = %s",
+                                    TypeIdItem.getOptionalReferenceAnnotation(dexFile, typeIndex));
+                            out.deindent();
+                            break;
+                        }
+                        case DebugItemType.START_LOCAL_EXTENDED: {
+                            out.annotateTo(reader.getOffset(), "DBG_START_LOCAL_EXTENDED");
+                            out.indent();
+                            int registerNum = reader.readSmallUleb128();
+                            out.annotateTo(reader.getOffset(), "register_num = v%d", registerNum);
+                            int nameIndex = reader.readSmallUleb128() - 1;
+                            out.annotateTo(reader.getOffset(), "name_idx = %s",
+                                    StringIdItem.getOptionalReferenceAnnotation(dexFile, nameIndex, true));
+                            int typeIndex = reader.readSmallUleb128() - 1;
+                            out.annotateTo(reader.getOffset(), "type_idx = %s",
+                                    TypeIdItem.getOptionalReferenceAnnotation(dexFile, typeIndex));
+                            int sigIndex = reader.readSmallUleb128() - 1;
+                            out.annotateTo(reader.getOffset(), "sig_idx = %s",
+                                    StringIdItem.getOptionalReferenceAnnotation(dexFile, sigIndex, true));
+                            out.deindent();
+                            break;
+                        }
+                        case DebugItemType.END_LOCAL: {
+                            out.annotateTo(reader.getOffset(), "DBG_END_LOCAL");
+                            out.indent();
+                            int registerNum = reader.readSmallUleb128();
+                            out.annotateTo(reader.getOffset(), "register_num = v%d", registerNum);
+                            out.deindent();
+                            break;
+                        }
+                        case DebugItemType.RESTART_LOCAL: {
+                            out.annotateTo(reader.getOffset(), "DBG_RESTART_LOCAL");
+                            out.indent();
+                            int registerNum = reader.readSmallUleb128();
+                            out.annotateTo(reader.getOffset(), "register_num = v%d", registerNum);
+                            out.deindent();
+                            break;
+                        }
+                        case DebugItemType.PROLOGUE_END: {
+                            out.annotateTo(reader.getOffset(), "DBG_SET_PROLOGUE_END");
+                            break;
+                        }
+                        case DebugItemType.EPILOGUE_BEGIN: {
+                            out.annotateTo(reader.getOffset(), "DBG_SET_EPILOGUE_BEGIN");
+                            break;
+                        }
+                        case DebugItemType.SET_SOURCE_FILE: {
+                            out.annotateTo(reader.getOffset(), "DBG_SET_FILE");
+                            out.indent();
+                            int nameIdx = reader.readSmallUleb128() - 1;
+                            out.annotateTo(reader.getOffset(), "name_idx = %s",
+                                    StringIdItem.getOptionalReferenceAnnotation(dexFile, nameIdx));
+                            out.deindent();
+                            break;
+                        }
+                        default:
+                            int adjusted = opcode - 0x0A;
+                            int addressDiff = adjusted / 15;
+                            int lineDiff = (adjusted % 15) - 4;
+                            codeAddress += addressDiff;
+                            lineNumber += lineDiff;
+                            out.annotateTo(reader.getOffset(), "address_diff = +0x%x:0x%x, line_diff = +%d:%d, ",
+                                    addressDiff, codeAddress, lineDiff, lineNumber);
+                            break;
+                    }
+                }
+                out.deindent();
+            }
+        };
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/EncodedArrayItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/EncodedArrayItem.java
new file mode 100644
index 0000000..25fc21a
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/EncodedArrayItem.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.raw;
+
+import org.jf.dexlib2.dexbacked.DexReader;
+import org.jf.dexlib2.dexbacked.raw.util.DexAnnotator;
+import org.jf.dexlib2.util.AnnotatedBytes;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class EncodedArrayItem {
+    @Nonnull
+    public static SectionAnnotator makeAnnotator(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) {
+        return new SectionAnnotator(annotator, mapItem) {
+            @Nonnull @Override public String getItemName() {
+                return "encoded_array_item";
+            }
+
+            @Override
+            protected void annotateItem(@Nonnull AnnotatedBytes out, int itemIndex, @Nullable String itemIdentity) {
+                DexReader reader = dexFile.getBuffer().readerAt(out.getCursor());
+                EncodedValue.annotateEncodedArray(dexFile, out, reader);
+            }
+        };
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/EncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/EncodedValue.java
new file mode 100644
index 0000000..bad6d6b
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/EncodedValue.java
@@ -0,0 +1,207 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.raw;
+
+import org.jf.dexlib2.ValueType;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.DexReader;
+import org.jf.dexlib2.dexbacked.value.DexBackedEncodedValue;
+import org.jf.dexlib2.util.AnnotatedBytes;
+import org.jf.dexlib2.util.EncodedValueUtils;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.io.StringWriter;
+
+public class EncodedValue {
+    public static void annotateEncodedValue(
+            @Nonnull DexBackedDexFile dexFile,
+            @Nonnull AnnotatedBytes out,
+            @Nonnull DexReader reader) {
+        int valueArgType = reader.readUbyte();
+
+        int valueArg = valueArgType >>> 5;
+        int valueType = valueArgType & 0x1f;
+
+        switch (valueType) {
+            case ValueType.BYTE:
+            case ValueType.SHORT:
+            case ValueType.CHAR:
+            case ValueType.INT:
+            case ValueType.LONG:
+            case ValueType.FLOAT:
+            case ValueType.DOUBLE:
+            case ValueType.METHOD_TYPE:
+            case ValueType.METHOD_HANDLE:
+            case ValueType.STRING:
+            case ValueType.TYPE:
+            case ValueType.FIELD:
+            case ValueType.METHOD:
+            case ValueType.ENUM:
+                out.annotate(1, "valueArg = %d, valueType = 0x%x: %s", valueArg, valueType,
+                        ValueType.getValueTypeName(valueType));
+                reader.setOffset(reader.getOffset() - 1);
+                out.annotate(valueArg + 1, "value = %s", asString(dexFile, reader));
+                break;
+            case ValueType.ARRAY:
+                out.annotate(1, "valueArg = %d, valueType = 0x%x: array", valueArg, valueType);
+                annotateEncodedArray(dexFile, out, reader);
+                break;
+            case ValueType.ANNOTATION:
+                out.annotate(1, "valueArg = %d, valueType = 0x%x: annotation", valueArg, valueType);
+                annotateEncodedAnnotation(dexFile, out, reader);
+                break;
+            case ValueType.NULL:
+                out.annotate(1, "valueArg = %d, valueType = 0x%x: null", valueArg, valueType);
+                break;
+            case ValueType.BOOLEAN:
+                out.annotate(1, "valueArg = %d, valueType = 0x%x: boolean, value=%s", valueArg, valueType, valueArg==1);
+                break;
+            default:
+                throw new IllegalArgumentException(String.format("Invalid encoded value type 0x%x at offset 0x%x", valueType,
+                        reader.getOffset()));
+        }
+    }
+
+    public static void annotateEncodedAnnotation(
+            @Nonnull DexBackedDexFile dexFile,
+            @Nonnull AnnotatedBytes out,
+            @Nonnull DexReader reader) {
+        assert out.getCursor() == reader.getOffset();
+
+        int typeIndex = reader.readSmallUleb128();
+        out.annotateTo(reader.getOffset(), TypeIdItem.getReferenceAnnotation(dexFile, typeIndex));
+
+        int size = reader.readSmallUleb128();
+        out.annotateTo(reader.getOffset(), "size: %d", size);
+
+        for (int i=0; i<size; i++) {
+            out.annotate(0, "element[%d]", i);
+            out.indent();
+
+            int nameIndex = reader.readSmallUleb128();
+            out.annotateTo(reader.getOffset(), "name = %s",
+                    StringIdItem.getReferenceAnnotation(dexFile, nameIndex));
+
+            annotateEncodedValue(dexFile, out, reader);
+
+            out.deindent();
+        }
+    }
+
+    public static void annotateEncodedArray(
+            @Nonnull DexBackedDexFile dexFile,
+            @Nonnull AnnotatedBytes out,
+            @Nonnull DexReader reader) {
+        assert out.getCursor() == reader.getOffset();
+
+        int size = reader.readSmallUleb128();
+        out.annotateTo(reader.getOffset(), "size: %d", size);
+
+        for (int i=0; i<size; i++) {
+            out.annotate(0, "element[%d]", i);
+            out.indent();
+
+            annotateEncodedValue(dexFile, out, reader);
+
+            out.deindent();
+        }
+    }
+
+    public static String asString(@Nonnull DexBackedDexFile dexFile, @Nonnull DexReader reader) {
+        int valueArgType = reader.readUbyte();
+
+        int valueArg = valueArgType >>> 5;
+        int valueType = valueArgType & 0x1f;
+
+        switch (valueType) {
+            case ValueType.BYTE:
+                int intValue = reader.readByte();
+                return String.format("0x%x", intValue);
+            case ValueType.SHORT:
+                intValue = reader.readSizedInt(valueArg+1);
+                return String.format("0x%x", intValue);
+            case ValueType.CHAR:
+                intValue = reader.readSizedSmallUint(valueArg+1);
+                return String.format("0x%x", intValue);
+            case ValueType.INT:
+                intValue = reader.readSizedInt(valueArg+1);
+                return String.format("0x%x", intValue);
+            case ValueType.LONG:
+                long longValue = reader.readSizedLong(valueArg+1);
+                return String.format("0x%x", longValue);
+            case ValueType.FLOAT:
+                float floatValue = Float.intBitsToFloat(reader.readSizedRightExtendedInt(valueArg + 1));
+                return String.format("%f", floatValue);
+            case ValueType.DOUBLE:
+                double doubleValue = Double.longBitsToDouble(reader.readSizedRightExtendedLong(valueArg + 1));
+                return String.format("%f", doubleValue);
+            case ValueType.METHOD_TYPE:
+                int protoIndex = reader.readSizedSmallUint(valueArg + 1);
+                return ProtoIdItem.getReferenceAnnotation(dexFile, protoIndex);
+            case ValueType.STRING:
+                int stringIndex = reader.readSizedSmallUint(valueArg + 1);
+                return StringIdItem.getReferenceAnnotation(dexFile, stringIndex, true);
+            case ValueType.TYPE:
+                int typeIndex = reader.readSizedSmallUint(valueArg+1);
+                return TypeIdItem.getReferenceAnnotation(dexFile, typeIndex);
+            case ValueType.FIELD:
+                int fieldIndex = reader.readSizedSmallUint(valueArg+1);
+                return FieldIdItem.getReferenceAnnotation(dexFile, fieldIndex);
+            case ValueType.METHOD:
+                int methodIndex = reader.readSizedSmallUint(valueArg+1);
+                return MethodIdItem.getReferenceAnnotation(dexFile, methodIndex);
+            case ValueType.ENUM:
+                fieldIndex = reader.readSizedSmallUint(valueArg+1);
+                return FieldIdItem.getReferenceAnnotation(dexFile, fieldIndex);
+            case ValueType.ARRAY:
+            case ValueType.ANNOTATION:
+            case ValueType.METHOD_HANDLE:
+                StringWriter writer = new StringWriter();
+                reader.setOffset(reader.getOffset() - 1);
+                try {
+                    EncodedValueUtils.writeEncodedValue(writer, DexBackedEncodedValue.readFrom(dexFile, reader));
+                } catch (IOException ex) {
+                    // Shouldn't happen with a StringWriter...
+                    throw new RuntimeException(ex);
+                }
+                return writer.toString();
+            case ValueType.NULL:
+                return "null";
+            case ValueType.BOOLEAN:
+                return Boolean.toString(valueArg == 1);
+            default:
+                throw new IllegalArgumentException(String.format("Invalid encoded value type 0x%x at offset 0x%x",
+                        valueType, reader.getOffset()));
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/FieldIdItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/FieldIdItem.java
new file mode 100644
index 0000000..3334258
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/FieldIdItem.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.raw;
+
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.raw.util.DexAnnotator;
+import org.jf.dexlib2.util.AnnotatedBytes;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class FieldIdItem {
+    public static final int ITEM_SIZE = 8;
+
+    public static final int CLASS_OFFSET = 0;
+    public static final int TYPE_OFFSET = 2;
+    public static final int NAME_OFFSET = 4;
+
+    @Nonnull
+    public static SectionAnnotator makeAnnotator(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) {
+        return new SectionAnnotator(annotator, mapItem) {
+            @Nonnull @Override public String getItemName() {
+                return "field_id_item";
+            }
+
+            @Override
+            protected void annotateItem(@Nonnull AnnotatedBytes out, int itemIndex, @Nullable String itemIdentity) {
+                int classIndex = dexFile.getBuffer().readUshort(out.getCursor());
+                out.annotate(2, "class_idx = %s", TypeIdItem.getReferenceAnnotation(dexFile, classIndex));
+
+                int typeIndex = dexFile.getBuffer().readUshort(out.getCursor());
+                out.annotate(2, "return_type_idx = %s", TypeIdItem.getReferenceAnnotation(dexFile, typeIndex));
+
+                int nameIndex = dexFile.getBuffer().readSmallUint(out.getCursor());
+                out.annotate(4, "name_idx = %s", StringIdItem.getReferenceAnnotation(dexFile, nameIndex));
+            }
+        };
+    }
+
+    @Nonnull
+    public static String asString(@Nonnull DexBackedDexFile dexFile, int fieldIndex) {
+        int fieldOffset = dexFile.getFieldSection().getOffset(fieldIndex);
+        int classIndex = dexFile.getBuffer().readUshort(fieldOffset + CLASS_OFFSET);
+        String classType = dexFile.getTypeSection().get(classIndex);
+
+        int typeIndex = dexFile.getBuffer().readUshort(fieldOffset + TYPE_OFFSET);
+        String fieldType = dexFile.getTypeSection().get(typeIndex);
+
+        int nameIndex = dexFile.getBuffer().readSmallUint(fieldOffset + NAME_OFFSET);
+        String fieldName = dexFile.getStringSection().get(nameIndex);
+
+        return String.format("%s->%s:%s", classType, fieldName, fieldType);
+    }
+
+    @Nonnull
+    public static String getReferenceAnnotation(@Nonnull DexBackedDexFile dexFile, int fieldIndex) {
+        try {
+            String fieldString = asString(dexFile, fieldIndex);
+            return String.format("field_id_item[%d]: %s", fieldIndex, fieldString);
+        } catch (Exception ex) {
+            ex.printStackTrace(System.err);
+        }
+        return String.format("field_id_item[%d]", fieldIndex);
+    }
+
+    public static String[] getFields(@Nonnull DexBackedDexFile dexFile) {
+        MapItem mapItem = dexFile.getMapItemForSection(ItemType.FIELD_ID_ITEM);
+        if (mapItem == null) {
+            return new String[0];
+        }
+
+        int fieldCount = mapItem.getItemCount();
+        String[] ret = new String[fieldCount];
+        for (int i=0; i<fieldCount; i++) {
+            ret[i] = asString(dexFile, i);
+        }
+        return ret;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/HeaderItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/HeaderItem.java
new file mode 100644
index 0000000..9915061
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/HeaderItem.java
@@ -0,0 +1,321 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.raw;
+
+import org.jf.dexlib2.VersionMap;
+import org.jf.dexlib2.dexbacked.CDexBackedDexFile;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.DexBuffer;
+import org.jf.dexlib2.dexbacked.raw.util.DexAnnotator;
+import org.jf.dexlib2.util.AnnotatedBytes;
+import org.jf.util.StringUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class HeaderItem {
+    public static final int ITEM_SIZE = 0x70;
+
+    private static final byte[] MAGIC_VALUE = new byte[] { 0x64, 0x65, 0x78, 0x0a, 0x00, 0x00, 0x00, 0x00 };
+
+    public static final int LITTLE_ENDIAN_TAG = 0x12345678;
+    public static final int BIG_ENDIAN_TAG = 0x78563412;
+
+    public static final int CHECKSUM_OFFSET = 8;
+
+    // this is the start of the checksumed data
+    public static final int CHECKSUM_DATA_START_OFFSET = 12;
+    public static final int SIGNATURE_OFFSET = 12;
+    public static final int SIGNATURE_SIZE = 20;
+
+    // this is the start of the sha-1 hashed data
+    public static final int SIGNATURE_DATA_START_OFFSET = 32;
+    public static final int FILE_SIZE_OFFSET = 32;
+
+    public static final int HEADER_SIZE_OFFSET = 36;
+
+    public static final int ENDIAN_TAG_OFFSET = 40;
+
+    public static final int MAP_OFFSET = 52;
+
+    public static final int STRING_COUNT_OFFSET = 56;
+    public static final int STRING_START_OFFSET = 60;
+
+    public static final int TYPE_COUNT_OFFSET = 64;
+    public static final int TYPE_START_OFFSET = 68;
+
+    public static final int PROTO_COUNT_OFFSET = 72;
+    public static final int PROTO_START_OFFSET = 76;
+
+    public static final int FIELD_COUNT_OFFSET = 80;
+    public static final int FIELD_START_OFFSET = 84;
+
+    public static final int METHOD_COUNT_OFFSET = 88;
+    public static final int METHOD_START_OFFSET = 92;
+
+    public static final int CLASS_COUNT_OFFSET = 96;
+    public static final int CLASS_START_OFFSET = 100;
+
+    public static final int DATA_SIZE_OFFSET = 104;
+    public static final int DATA_START_OFFSET = 108;
+
+    @Nonnull private DexBackedDexFile dexFile;
+
+    public HeaderItem(@Nonnull DexBackedDexFile dexFile) {
+        this.dexFile = dexFile;
+    }
+
+    public int getChecksum() {
+        return dexFile.getBuffer().readSmallUint(CHECKSUM_OFFSET);
+    }
+
+    @Nonnull public byte[] getSignature() {
+        return dexFile.getBuffer().readByteRange(SIGNATURE_OFFSET, SIGNATURE_SIZE);
+    }
+
+    public int getMapOffset() {
+        return dexFile.getBuffer().readSmallUint(MAP_OFFSET);
+    }
+
+    public int getHeaderSize() {
+        return dexFile.getBuffer().readSmallUint(HEADER_SIZE_OFFSET);
+    }
+
+    public int getStringCount() {
+        return dexFile.getBuffer().readSmallUint(STRING_COUNT_OFFSET);
+    }
+
+    public int getStringOffset() {
+        return dexFile.getBuffer().readSmallUint(STRING_START_OFFSET);
+    }
+
+    public int getTypeCount() {
+        return dexFile.getBuffer().readSmallUint(TYPE_COUNT_OFFSET);
+    }
+
+    public int getTypeOffset() {
+        return dexFile.getBuffer().readSmallUint(TYPE_START_OFFSET);
+    }
+
+    public int getProtoCount() {
+        return dexFile.getBuffer().readSmallUint(PROTO_COUNT_OFFSET);
+    }
+
+    public int getProtoOffset() {
+        return dexFile.getBuffer().readSmallUint(PROTO_START_OFFSET);
+    }
+
+    public int getFieldCount() {
+        return dexFile.getBuffer().readSmallUint(FIELD_COUNT_OFFSET);
+    }
+
+    public int getFieldOffset() {
+        return dexFile.getBuffer().readSmallUint(FIELD_START_OFFSET);
+    }
+
+    public int getMethodCount() {
+        return dexFile.getBuffer().readSmallUint(METHOD_COUNT_OFFSET);
+    }
+
+    public int getMethodOffset() {
+        return dexFile.getBuffer().readSmallUint(METHOD_START_OFFSET);
+    }
+
+    public int getClassCount() {
+        return dexFile.getBuffer().readSmallUint(CLASS_COUNT_OFFSET);
+    }
+
+    public int getClassOffset() {
+        return dexFile.getBuffer().readSmallUint(CLASS_START_OFFSET);
+    }
+
+    @Nonnull
+    public static SectionAnnotator makeAnnotator(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) {
+        return new SectionAnnotator(annotator, mapItem) {
+            @Nonnull @Override public String getItemName() {
+                return "header_item";
+            }
+
+            @Override
+            protected void annotateItem(@Nonnull AnnotatedBytes out, int itemIndex, @Nullable String itemIdentity) {
+                int startOffset = out.getCursor();
+                int headerSize;
+
+                StringBuilder magicBuilder = new StringBuilder();
+                for (int i=0; i<8; i++) {
+                    magicBuilder.append((char)dexFile.getBuffer().readUbyte(startOffset + i));
+                }
+
+                out.annotate(8, "magic: %s", StringUtils.escapeString(magicBuilder.toString()));
+                out.annotate(4, "checksum");
+                out.annotate(20, "signature");
+                out.annotate(4, "file_size: %d", dexFile.getBuffer().readInt(out.getCursor()));
+
+                headerSize = dexFile.getBuffer().readInt(out.getCursor());
+                out.annotate(4, "header_size: %d", headerSize);
+
+                int endianTag = dexFile.getBuffer().readInt(out.getCursor());
+                out.annotate(4, "endian_tag: 0x%x (%s)", endianTag, getEndianText(endianTag));
+
+                out.annotate(4, "link_size: %d", dexFile.getBuffer().readInt(out.getCursor()));
+                out.annotate(4, "link_offset: 0x%x", dexFile.getBuffer().readInt(out.getCursor()));
+
+                out.annotate(4, "map_off: 0x%x", dexFile.getBuffer().readInt(out.getCursor()));
+
+                out.annotate(4, "string_ids_size: %d", dexFile.getBuffer().readInt(out.getCursor()));
+                out.annotate(4, "string_ids_off: 0x%x", dexFile.getBuffer().readInt(out.getCursor()));
+
+                out.annotate(4, "type_ids_size: %d", dexFile.getBuffer().readInt(out.getCursor()));
+                out.annotate(4, "type_ids_off: 0x%x", dexFile.getBuffer().readInt(out.getCursor()));
+
+                out.annotate(4, "proto_ids_size: %d", dexFile.getBuffer().readInt(out.getCursor()));
+                out.annotate(4, "proto_ids_off: 0x%x", dexFile.getBuffer().readInt(out.getCursor()));
+
+                out.annotate(4, "field_ids_size: %d", dexFile.getBuffer().readInt(out.getCursor()));
+                out.annotate(4, "field_ids_off: 0x%x", dexFile.getBuffer().readInt(out.getCursor()));
+
+                out.annotate(4, "method_ids_size: %d", dexFile.getBuffer().readInt(out.getCursor()));
+                out.annotate(4, "method_ids_off: 0x%x", dexFile.getBuffer().readInt(out.getCursor()));
+
+                out.annotate(4, "class_defs_size: %d", dexFile.getBuffer().readInt(out.getCursor()));
+                out.annotate(4, "class_defs_off: 0x%x", dexFile.getBuffer().readInt(out.getCursor()));
+
+                out.annotate(4, "data_size: %d", dexFile.getBuffer().readInt(out.getCursor()));
+                out.annotate(4, "data_off: 0x%x", dexFile.getBuffer().readInt(out.getCursor()));
+
+                if (annotator.dexFile instanceof CDexBackedDexFile) {
+                    CdexHeaderItem.annotateCdexHeaderFields(out, dexFile.getBuffer());
+                }
+
+                if (headerSize > ITEM_SIZE) {
+                    out.annotateTo(headerSize, "header padding");
+                }
+            }
+        };
+    }
+
+    private static String getEndianText(int endianTag) {
+        if (endianTag == LITTLE_ENDIAN_TAG) {
+            return "Little Endian";
+        }
+        if (endianTag == BIG_ENDIAN_TAG) {
+            return "Big Endian";
+        }
+        return "Invalid";
+    }
+
+    /**
+     * Get the highest magic number supported by Android for this api level.
+     * @return The dex file magic number
+     */
+    public static byte[] getMagicForApi(int api) {
+        return getMagicForDexVersion(VersionMap.mapApiToDexVersion(api));
+    }
+
+    public static byte[] getMagicForDexVersion(int dexVersion) {
+        byte[] magic = MAGIC_VALUE.clone();
+
+        if (dexVersion < 0 || dexVersion > 999) {
+            throw new IllegalArgumentException("dexVersion must be within [0, 999]");
+        }
+
+        for (int i=6; i>=4; i--) {
+            int digit = dexVersion % 10;
+            magic[i] = (byte)('0' + digit);
+            dexVersion /= 10;
+        }
+
+        return magic;
+    }
+
+    /**
+     * Verifies the magic value at the beginning of a dex file
+     *
+     * @param buf A byte array containing at least the first 8 bytes of a dex file
+     * @param offset The offset within the buffer to the beginning of the dex header
+     * @return True if the magic value is valid
+     */
+    public static boolean verifyMagic(byte[] buf, int offset) {
+        if (buf.length - offset < 8) {
+            return false;
+        }
+
+        for (int i=0; i<4; i++) {
+            if (buf[offset + i] != MAGIC_VALUE[i]) {
+                return false;
+            }
+        }
+        for (int i=4; i<7; i++) {
+            if (buf[offset + i] < '0' ||
+                    buf[offset + i] > '9') {
+                return false;
+            }
+        }
+        if (buf[offset + 7] != MAGIC_VALUE[7]) {
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * Gets the dex version from a dex header
+     *
+     * @param buf A byte array containing at least the first 7 bytes of a dex file
+     * @param offset The offset within the buffer to the beginning of the dex header
+     * @return The dex version if the header is valid or -1 if the header is invalid
+     */
+    public static int getVersion(byte[] buf, int offset) {
+        if (!verifyMagic(buf, offset)) {
+            return -1;
+        }
+
+        return getVersionUnchecked(buf, offset);
+    }
+
+    private static int getVersionUnchecked(byte[] buf, int offset) {
+        int version = (buf[offset + 4] - '0') * 100;
+        version += (buf[offset + 5] - '0') * 10;
+        version += buf[offset + 6] - '0';
+
+        return version;
+    }
+
+    public static boolean isSupportedDexVersion(int version) {
+        return VersionMap.mapDexVersionToApi(version) != VersionMap.NO_VERSION;
+    }
+
+    public static int getEndian(byte[] buf, int offset) {
+        DexBuffer bdb = new DexBuffer(buf);
+        return bdb.readInt(offset + ENDIAN_TAG_OFFSET);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/HiddenApiClassDataItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/HiddenApiClassDataItem.java
new file mode 100644
index 0000000..898f4d5
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/HiddenApiClassDataItem.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.raw;
+
+import org.jf.dexlib2.HiddenApiRestriction;
+import org.jf.dexlib2.dexbacked.DexBuffer;
+import org.jf.dexlib2.dexbacked.DexReader;
+import org.jf.dexlib2.dexbacked.raw.util.DexAnnotator;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.Field;
+import org.jf.dexlib2.iface.Method;
+import org.jf.dexlib2.util.AnnotatedBytes;
+import org.jf.dexlib2.util.ReferenceUtil;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class HiddenApiClassDataItem {
+    public static final int SIZE_OFFSET = 0x0;
+    public static final int OFFSETS_LIST_OFFSET = 0x4;
+
+    public static final int OFFSET_ITEM_SIZE = 0x4;
+
+
+    @Nonnull
+    public static SectionAnnotator makeAnnotator(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) {
+        return new SectionAnnotator(annotator, mapItem) {
+            @Nonnull @Override public String getItemName() {
+                return "hiddenapi_class_data_item";
+            }
+
+            @Override
+            protected void annotateItem(@Nonnull AnnotatedBytes out, int itemIndex, @Nullable String itemIdentity) {
+                int startOffset = out.getCursor();
+
+                out.annotate(4, "size = 0x%x", dexFile.getDataBuffer().readSmallUint(out.getCursor()));
+
+                int index = 0;
+                for (ClassDef classDef : dexFile.getClasses()) {
+                    out.annotate(0, "[%d] %s", index, ReferenceUtil.getReferenceString(classDef));
+                    out.indent();
+
+                    int offset = dexFile.getDataBuffer().readSmallUint(out.getCursor());
+                    if (offset == 0) {
+                        out.annotate(4, "offset = 0x%x", offset);
+                    } else {
+                        out.annotate(4, "offset = 0x%x (absolute offset: 0x%x)", offset, startOffset + offset);
+                    }
+
+                    int nextOffset = out.getCursor();
+                    if (offset > 0) {
+                        out.deindent();
+
+                        out.moveTo(startOffset + offset);
+
+                        DexReader<? extends DexBuffer> reader = dexFile.getBuffer().readerAt(out.getCursor());
+
+                        for (Field field : classDef.getStaticFields()) {
+                            out.annotate(0, "%s:", ReferenceUtil.getReferenceString(field));
+                            out.indent();
+                            int restrictions = reader.readSmallUleb128();
+                            out.annotateTo(reader.getOffset(), "restriction = 0x%x: %s",
+                                    restrictions,
+                                    HiddenApiRestriction.formatHiddenRestrictions(restrictions));
+                            out.deindent();
+                        }
+                        for (Field field : classDef.getInstanceFields()) {
+                            out.annotate(0, "%s:", ReferenceUtil.getReferenceString(field));
+                            out.indent();
+                            int restrictions = reader.readSmallUleb128();
+                            out.annotateTo(reader.getOffset(), "restriction = 0x%x: %s",
+                                    restrictions,
+                                    HiddenApiRestriction.formatHiddenRestrictions(restrictions));
+                            out.deindent();
+                        }
+                        for (Method method : classDef.getDirectMethods()) {
+                            out.annotate(0, "%s:", ReferenceUtil.getReferenceString(method));
+                            out.indent();
+                            int restrictions = reader.readSmallUleb128();
+                            out.annotateTo(reader.getOffset(), "restriction = 0x%x: %s",
+                                    restrictions,
+                                    HiddenApiRestriction.formatHiddenRestrictions(restrictions));
+                            out.deindent();
+                        }
+                        for (Method method : classDef.getVirtualMethods()) {
+                            out.annotate(0, "%s:", ReferenceUtil.getReferenceString(method));
+                            out.indent();
+                            int restrictions = reader.readSmallUleb128();
+                            out.annotateTo(reader.getOffset(), "restriction = 0x%x: %s",
+                                    restrictions,
+                                    HiddenApiRestriction.formatHiddenRestrictions(restrictions));
+                            out.deindent();
+                        }
+
+                        out.indent();
+                    }
+
+                    out.moveTo(nextOffset);
+
+                    out.deindent();
+
+                    index++;
+                }
+            }
+        };
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/ItemType.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/ItemType.java
new file mode 100644
index 0000000..0f9a5df
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/ItemType.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.raw;
+
+import javax.annotation.Nonnull;
+
+public class ItemType {
+    public static final int HEADER_ITEM = 0x0000;
+    public static final int STRING_ID_ITEM = 0x0001;
+    public static final int TYPE_ID_ITEM = 0x0002;
+    public static final int PROTO_ID_ITEM = 0x0003;
+    public static final int FIELD_ID_ITEM = 0x0004;
+    public static final int METHOD_ID_ITEM = 0x0005;
+    public static final int CLASS_DEF_ITEM = 0x0006;
+    public static final int CALL_SITE_ID_ITEM = 0x0007;
+    public static final int METHOD_HANDLE_ITEM = 0x0008;
+    public static final int MAP_LIST = 0x1000;
+    public static final int TYPE_LIST = 0x1001;
+    public static final int ANNOTATION_SET_REF_LIST = 0x1002;
+    public static final int ANNOTATION_SET_ITEM = 0x1003;
+    public static final int CLASS_DATA_ITEM = 0x2000;
+    public static final int CODE_ITEM = 0x2001;
+    public static final int STRING_DATA_ITEM = 0x2002;
+    public static final int DEBUG_INFO_ITEM = 0x2003;
+    public static final int ANNOTATION_ITEM = 0x2004;
+    public static final int ENCODED_ARRAY_ITEM = 0x2005;
+    public static final int ANNOTATION_DIRECTORY_ITEM = 0x2006;
+    public static final int HIDDENAPI_CLASS_DATA_ITEM = 0xF000;
+
+    @Nonnull
+    public static String getItemTypeName(int itemType) {
+        switch (itemType) {
+            case HEADER_ITEM: return "header_item";
+            case STRING_ID_ITEM: return "string_id_item";
+            case TYPE_ID_ITEM: return "type_id_item";
+            case PROTO_ID_ITEM: return "proto_id_item";
+            case FIELD_ID_ITEM: return "field_id_item";
+            case METHOD_ID_ITEM: return "method_id_item";
+            case CLASS_DEF_ITEM: return "class_def_item";
+            case CALL_SITE_ID_ITEM: return "call_site_id_item";
+            case METHOD_HANDLE_ITEM: return "method_handle_item";
+            case MAP_LIST: return "map_list";
+            case TYPE_LIST: return "type_list";
+            case ANNOTATION_SET_REF_LIST: return "annotation_set_ref_list";
+            case ANNOTATION_SET_ITEM: return "annotation_set_item";
+            case CLASS_DATA_ITEM: return "class_data_item";
+            case CODE_ITEM: return "code_item";
+            case STRING_DATA_ITEM: return "string_data_item";
+            case DEBUG_INFO_ITEM: return "debug_info_item";
+            case ANNOTATION_ITEM: return "annotation_item";
+            case ENCODED_ARRAY_ITEM: return "encoded_array_item";
+            case ANNOTATION_DIRECTORY_ITEM: return "annotation_directory_item";
+            case HIDDENAPI_CLASS_DATA_ITEM: return "hiddenapi_class_data_item";
+            default: return "unknown dex item type";
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/MapItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/MapItem.java
new file mode 100644
index 0000000..4e76997
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/MapItem.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.raw;
+
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.raw.util.DexAnnotator;
+import org.jf.dexlib2.util.AnnotatedBytes;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class MapItem {
+    public static final int ITEM_SIZE = 12;
+
+    public static final int TYPE_OFFSET = 0;
+    public static final int SIZE_OFFSET = 4;
+    public static final int OFFSET_OFFSET = 8;
+
+    private final DexBackedDexFile dexFile;
+    private final int offset;
+
+    public MapItem(DexBackedDexFile dexFile, int offset) {
+        this.dexFile = dexFile;
+        this.offset = offset;
+    }
+
+    public int getType() {
+        return dexFile.getDataBuffer().readUshort(offset + TYPE_OFFSET);
+    }
+
+    @Nonnull
+    public String getName() {
+        return ItemType.getItemTypeName(getType());
+    }
+
+    public int getItemCount() {
+        return dexFile.getDataBuffer().readSmallUint(offset + SIZE_OFFSET);
+    }
+
+    public int getOffset() {
+        return dexFile.getDataBuffer().readSmallUint(offset + OFFSET_OFFSET);
+    }
+
+    @Nonnull
+    public static SectionAnnotator makeAnnotator(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) {
+        return new SectionAnnotator(annotator, mapItem) {
+            @Nonnull @Override public String getItemName() {
+                return "map_item";
+            }
+
+            @Override
+            protected void annotateItem(@Nonnull AnnotatedBytes out, int itemIndex, @Nullable String itemIdentity) {
+                int itemType = dexFile.getBuffer().readUshort(out.getCursor());
+                out.annotate(2, "type = 0x%x: %s", itemType, ItemType.getItemTypeName(itemType));
+
+                out.annotate(2, "unused");
+
+                int size = dexFile.getBuffer().readSmallUint(out.getCursor());
+                out.annotate(4, "size = %d", size);
+
+                int offset = dexFile.getBuffer().readSmallUint(out.getCursor());
+                out.annotate(4, "offset = 0x%x", offset);
+            }
+
+            @Override public void annotateSection(@Nonnull AnnotatedBytes out) {
+                out.moveTo(sectionOffset);
+                int mapItemCount = dexFile.getBuffer().readSmallUint(out.getCursor());
+                out.annotate(4, "size = %d", mapItemCount);
+
+                super.annotateSectionInner(out, mapItemCount);
+            }
+        };
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/MethodHandleItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/MethodHandleItem.java
new file mode 100644
index 0000000..1866af9
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/MethodHandleItem.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.raw;
+
+import org.jf.dexlib2.MethodHandleType;
+import org.jf.dexlib2.dexbacked.raw.util.DexAnnotator;
+import org.jf.dexlib2.util.AnnotatedBytes;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class MethodHandleItem {
+    public static final int ITEM_SIZE = 8;
+
+    public static final int METHOD_HANDLE_TYPE_OFFSET = 0;
+    public static final int MEMBER_ID_OFFSET = 4;
+
+    @Nonnull
+    public static SectionAnnotator makeAnnotator(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) {
+        return new SectionAnnotator(annotator, mapItem) {
+            @Nonnull @Override public String getItemName() {
+                return "method_handle_item";
+            }
+
+            @Override
+            protected void annotateItem(@Nonnull AnnotatedBytes out, int itemIndex, @Nullable String itemIdentity) {
+                int methodHandleType = dexFile.getBuffer().readUshort(out.getCursor());
+                out.annotate(2, "type = %s", MethodHandleType.toString(methodHandleType));
+                out.annotate(2, "unused");
+
+                int fieldOrMethodId = dexFile.getBuffer().readUshort(out.getCursor());
+                String fieldOrMethodDescriptor;
+                switch (methodHandleType) {
+                    case MethodHandleType.STATIC_PUT:
+                    case MethodHandleType.STATIC_GET:
+                    case MethodHandleType.INSTANCE_PUT:
+                    case MethodHandleType.INSTANCE_GET:
+                        fieldOrMethodDescriptor = FieldIdItem.getReferenceAnnotation(dexFile, fieldOrMethodId);
+                        break;
+                    case MethodHandleType.INVOKE_STATIC:
+                    case MethodHandleType.INVOKE_INSTANCE:
+                    case MethodHandleType.INVOKE_CONSTRUCTOR:
+                    case MethodHandleType.INVOKE_DIRECT:
+                    case MethodHandleType.INVOKE_INTERFACE:
+                        fieldOrMethodDescriptor = MethodIdItem.getReferenceAnnotation(dexFile, fieldOrMethodId);
+                        break;
+                    default:
+                        throw new ExceptionWithContext("Invalid method handle type: %d", methodHandleType);
+                }
+
+                out.annotate(2, "field_or_method_id = %s", fieldOrMethodDescriptor);
+                out.annotate(2, "unused");
+            }
+        };
+    }
+
+
+
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/MethodIdItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/MethodIdItem.java
new file mode 100644
index 0000000..025416f
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/MethodIdItem.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.raw;
+
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.raw.util.DexAnnotator;
+import org.jf.dexlib2.util.AnnotatedBytes;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class MethodIdItem {
+    public static final int ITEM_SIZE = 8;
+
+    public static final int CLASS_OFFSET = 0;
+    public static final int PROTO_OFFSET = 2;
+    public static final int NAME_OFFSET = 4;
+
+    @Nonnull
+    public static SectionAnnotator makeAnnotator(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) {
+        return new SectionAnnotator(annotator, mapItem) {
+            @Nonnull @Override public String getItemName() {
+                return "method_id_item";
+            }
+
+            @Override
+            public void annotateItem(@Nonnull AnnotatedBytes out, int itemIndex, @Nullable String itemIdentity) {
+                int classIndex = dexFile.getBuffer().readUshort(out.getCursor());
+                out.annotate(2, "class_idx = %s", TypeIdItem.getReferenceAnnotation(dexFile, classIndex));
+
+                int protoIndex = dexFile.getBuffer().readUshort(out.getCursor());
+                out.annotate(2, "proto_idx = %s", ProtoIdItem.getReferenceAnnotation(dexFile, protoIndex));
+
+                int nameIndex = dexFile.getBuffer().readSmallUint(out.getCursor());
+                out.annotate(4, "name_idx = %s", StringIdItem.getReferenceAnnotation(dexFile, nameIndex));
+            }
+        };
+    }
+
+    @Nonnull
+    public static String asString(@Nonnull DexBackedDexFile dexFile, int methodIndex) {
+        int methodOffset = dexFile.getMethodSection().getOffset(methodIndex);
+        int classIndex = dexFile.getBuffer().readUshort(methodOffset + CLASS_OFFSET);
+        String classType = dexFile.getTypeSection().get(classIndex);
+
+        int protoIndex = dexFile.getBuffer().readUshort(methodOffset + PROTO_OFFSET);
+        String protoString = ProtoIdItem.asString(dexFile, protoIndex);
+
+        int nameIndex = dexFile.getBuffer().readSmallUint(methodOffset + NAME_OFFSET);
+        String methodName = dexFile.getStringSection().get(nameIndex);
+
+        return String.format("%s->%s%s", classType, methodName, protoString);
+    }
+
+    @Nonnull
+    public static String getReferenceAnnotation(@Nonnull DexBackedDexFile dexFile, int methodIndex) {
+        try {
+            String methodString = asString(dexFile, methodIndex);
+            return String.format("method_id_item[%d]: %s", methodIndex, methodString);
+        } catch (Exception ex) {
+            ex.printStackTrace(System.err);
+        }
+        return String.format("method_id_item[%d]", methodIndex);
+    }
+
+    public static String[] getMethods(@Nonnull DexBackedDexFile dexFile) {
+        MapItem mapItem = dexFile.getMapItemForSection(ItemType.METHOD_ID_ITEM);
+        if (mapItem == null) {
+            return new String[0];
+        }
+
+        int methodCount = mapItem.getItemCount();
+        String[] ret = new String[methodCount];
+        for (int i=0; i<methodCount; i++) {
+            ret[i] = asString(dexFile, i);
+        }
+        return ret;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/OdexHeaderItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/OdexHeaderItem.java
new file mode 100644
index 0000000..5bca367
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/OdexHeaderItem.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.raw;
+
+import org.jf.dexlib2.dexbacked.DexBuffer;
+
+public class OdexHeaderItem {
+    public static final int ITEM_SIZE = 40;
+
+    private static final byte[] MAGIC_VALUE = new byte[] { 0x64, 0x65, 0x79, 0x0A, 0x00, 0x00, 0x00, 0x00 };
+    private static final int[] SUPPORTED_ODEX_VERSIONS = new int[] { 35, 36 };
+
+    public static final int MAGIC_OFFSET = 0;
+    public static final int MAGIC_LENGTH = 8;
+    public static final int DEX_OFFSET = 8;
+    public static final int DEX_LENGTH_OFFSET = 12;
+    public static final int DEPENDENCIES_OFFSET = 16;
+    public static final int DEPENDENCIES_LENGTH_OFFSET = 20;
+    public static final int AUX_OFFSET = 24;
+    public static final int AUX_LENGTH_OFFSET = 28;
+    public static final int FLAGS_OFFSET = 32;
+
+    /**
+     * Verifies the magic value at the beginning of an odex file
+     *
+     * @param buf A byte array containing at least the first 8 bytes of an odex file
+     * @param offset The offset within the buffer to the beginning of the odex header
+     * @return True if the magic value is valid
+     */
+    public static boolean verifyMagic(byte[] buf, int offset) {
+        if (buf.length - offset < 8) {
+            return false;
+        }
+
+        for (int i=0; i<4; i++) {
+            if (buf[offset + i] != MAGIC_VALUE[i]) {
+                return false;
+            }
+        }
+        for (int i=4; i<7; i++) {
+            if (buf[offset + i] < '0' ||
+                    buf[offset + i] > '9') {
+                return false;
+            }
+        }
+        if (buf[offset + 7] != MAGIC_VALUE[7]) {
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * Gets the dex version from an odex header
+     *
+     * @param buf A byte array containing at least the first 7 bytes of an odex file
+     * @param offset The offset within the buffer to the beginning of the odex header
+     * @return The odex version if the header is valid or -1 if the header is invalid
+     */
+    public static int getVersion(byte[] buf, int offset) {
+        if (!verifyMagic(buf, offset)) {
+            return -1;
+        }
+
+        return getVersionUnchecked(buf, offset);
+    }
+
+    private static int getVersionUnchecked(byte[] buf, int offset) {
+        int version = (buf[offset + 4] - '0') * 100;
+        version += (buf[offset + 5] - '0') * 10;
+        version += buf[offset + 6] - '0';
+
+        return version;
+    }
+
+    public static boolean isSupportedOdexVersion(int version) {
+        for (int i=0; i<SUPPORTED_ODEX_VERSIONS.length; i++) {
+            if (SUPPORTED_ODEX_VERSIONS[i] == version) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public static int getDexOffset(byte[] buf) {
+        DexBuffer bdb = new DexBuffer(buf);
+        return bdb.readSmallUint(DEX_OFFSET);
+    }
+
+    public static int getDependenciesOffset(byte[] buf) {
+        DexBuffer bdb = new DexBuffer(buf);
+        return bdb.readSmallUint(DEPENDENCIES_OFFSET);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/ProtoIdItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/ProtoIdItem.java
new file mode 100644
index 0000000..2e605bd
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/ProtoIdItem.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.raw;
+
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.raw.util.DexAnnotator;
+import org.jf.dexlib2.util.AnnotatedBytes;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class ProtoIdItem {
+    public static final int ITEM_SIZE = 12;
+
+    public static final int SHORTY_OFFSET = 0;
+    public static final int RETURN_TYPE_OFFSET = 4;
+    public static final int PARAMETERS_OFFSET = 8;
+
+    @Nonnull
+    public static SectionAnnotator makeAnnotator(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) {
+        return new SectionAnnotator(annotator, mapItem) {
+            @Nonnull @Override public String getItemName() {
+                return "proto_id_item";
+            }
+
+            @Override
+            protected void annotateItem(@Nonnull AnnotatedBytes out, int itemIndex, @Nullable String itemIdentity) {
+                int shortyIndex = dexFile.getBuffer().readSmallUint(out.getCursor());
+                out.annotate(4, "shorty_idx = %s", StringIdItem.getReferenceAnnotation(dexFile, shortyIndex));
+
+                int returnTypeIndex = dexFile.getBuffer().readSmallUint(out.getCursor());
+                out.annotate(4, "return_type_idx = %s", TypeIdItem.getReferenceAnnotation(dexFile, returnTypeIndex));
+
+                int parametersOffset = dexFile.getBuffer().readSmallUint(out.getCursor());
+                out.annotate(4, "parameters_off = %s", TypeListItem.getReferenceAnnotation(dexFile, parametersOffset));
+            }
+        };
+    }
+
+    @Nonnull
+    public static String getReferenceAnnotation(@Nonnull DexBackedDexFile dexFile, int protoIndex) {
+        try {
+            String protoString = asString(dexFile, protoIndex);
+            return String.format("proto_id_item[%d]: %s", protoIndex, protoString);
+        } catch (Exception ex) {
+            ex.printStackTrace(System.err);
+        }
+        return String.format("proto_id_item[%d]", protoIndex);
+    }
+
+    @Nonnull
+    public static String asString(@Nonnull DexBackedDexFile dexFile, int protoIndex) {
+        int offset = dexFile.getProtoSection().getOffset(protoIndex);
+
+        StringBuilder sb = new StringBuilder();
+        sb.append("(");
+
+        int parametersOffset = dexFile.getBuffer().readSmallUint(offset + PARAMETERS_OFFSET);
+        sb.append(TypeListItem.asString(dexFile, parametersOffset));
+        sb.append(")");
+
+        int returnTypeIndex = dexFile.getBuffer().readSmallUint(offset + RETURN_TYPE_OFFSET);
+        String returnType = dexFile.getTypeSection().get(returnTypeIndex);
+        sb.append(returnType);
+
+        return sb.toString();
+    }
+
+    public static String[] getProtos(@Nonnull DexBackedDexFile dexFile) {
+        MapItem mapItem = dexFile.getMapItemForSection(ItemType.PROTO_ID_ITEM);
+        if (mapItem == null) {
+            return new String[0];
+        }
+
+        int protoCount = mapItem.getItemCount();
+        String[] ret = new String[protoCount];
+        for (int i=0; i<protoCount; i++) {
+            ret[i] = asString(dexFile, i);
+        }
+        return ret;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/SectionAnnotator.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/SectionAnnotator.java
new file mode 100644
index 0000000..b303f9b
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/SectionAnnotator.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.raw;
+
+import com.google.common.collect.Maps;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.raw.util.DexAnnotator;
+import org.jf.dexlib2.util.AlignmentUtils;
+import org.jf.dexlib2.util.AnnotatedBytes;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Map;
+
+public abstract class SectionAnnotator {
+    @Nonnull public final DexAnnotator annotator;
+    @Nonnull public final DexBackedDexFile dexFile;
+    public final int itemType;
+    public final int sectionOffset;
+    public final int itemCount;
+
+    protected Map<Integer, String> itemIdentities = Maps.newHashMap();
+
+    public SectionAnnotator(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) {
+        this.annotator = annotator;
+        this.dexFile = annotator.dexFile;
+        this.itemType = mapItem.getType();
+
+        if (mapItem.getType() >= ItemType.MAP_LIST) {
+            this.sectionOffset = mapItem.getOffset() + dexFile.getBaseDataOffset();
+        } else {
+            this.sectionOffset = mapItem.getOffset();
+        }
+
+        this.itemCount = mapItem.getItemCount();
+    }
+
+    @Nonnull public abstract String getItemName();
+    protected abstract void annotateItem(@Nonnull AnnotatedBytes out, int itemIndex, @Nullable String itemIdentity);
+
+    /**
+     * Write out annotations for this section
+     *
+     * @param out The AnnotatedBytes object to annotate to
+     */
+    public void annotateSection(@Nonnull AnnotatedBytes out) {
+        out.moveTo(sectionOffset);
+        annotateSectionInner(out, itemCount);
+    }
+
+    protected int getItemOffset(int itemIndex, int currentOffset) {
+        return AlignmentUtils.alignOffset(currentOffset, getItemAlignment());
+    }
+
+    protected void annotateSectionInner(@Nonnull AnnotatedBytes out, int itemCount) {
+        String itemName = getItemName();
+        if (itemCount > 0) {
+            out.annotate(0, "");
+            out.annotate(0, "-----------------------------");
+            out.annotate(0, "%s section", itemName);
+            out.annotate(0, "-----------------------------");
+            out.annotate(0, "");
+
+            for (int i=0; i<itemCount; i++) {
+                out.moveTo(getItemOffset(i, out.getCursor()));
+
+                String itemIdentity = getItemIdentity(out.getCursor());
+                if (itemIdentity != null) {
+                    out.annotate(0, "[%d] %s: %s", i, itemName, itemIdentity);
+                } else {
+                    out.annotate(0, "[%d] %s", i, itemName);
+                }
+                out.indent();
+                annotateItem(out, i, itemIdentity);
+                out.deindent();
+            }
+        }
+    }
+
+    @Nullable private String getItemIdentity(int itemOffset) {
+        return itemIdentities.get(itemOffset);
+    }
+
+    public void setItemIdentity(int itemOffset, String identity) {
+        itemIdentities.put(itemOffset + dexFile.getBaseDataOffset(), identity);
+    }
+
+    public int getItemAlignment() {
+        return 1;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/StringDataItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/StringDataItem.java
new file mode 100644
index 0000000..d9cd053
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/StringDataItem.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.raw;
+
+import org.jf.dexlib2.dexbacked.DexReader;
+import org.jf.dexlib2.dexbacked.raw.util.DexAnnotator;
+import org.jf.dexlib2.util.AnnotatedBytes;
+import org.jf.util.StringUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class StringDataItem {
+    @Nonnull
+    public static SectionAnnotator makeAnnotator(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) {
+        return new SectionAnnotator(annotator, mapItem) {
+            @Nonnull @Override public String getItemName() {
+                return "string_data_item";
+            }
+
+            @Override
+            protected void annotateItem(@Nonnull AnnotatedBytes out, int itemIndex, @Nullable String itemIdentity) {
+                DexReader reader = dexFile.getBuffer().readerAt(out.getCursor());
+                int utf16Length = reader.readSmallUleb128();
+                out.annotateTo(reader.getOffset(), "utf16_size = %d", utf16Length);
+
+                String value = reader.readString(utf16Length);
+                out.annotateTo(reader.getOffset() + 1, "data = \"%s\"", StringUtils.escapeString(value));
+            }
+        };
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/StringIdItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/StringIdItem.java
new file mode 100644
index 0000000..f8db2f8
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/StringIdItem.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.raw;
+
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.raw.util.DexAnnotator;
+import org.jf.dexlib2.util.AnnotatedBytes;
+import org.jf.util.StringUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class StringIdItem {
+    public static final int ITEM_SIZE = 4;
+
+    @Nonnull
+    public static SectionAnnotator makeAnnotator(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) {
+        return new SectionAnnotator(annotator, mapItem) {
+            @Nonnull @Override public String getItemName() {
+                return "string_id_item";
+            }
+
+            @Override
+            public void annotateItem(@Nonnull AnnotatedBytes out, int itemIndex, @Nullable String itemIdentity) {
+                int stringDataOffset = dexFile.getBuffer().readSmallUint(out.getCursor());
+                try {
+                    String stringValue = dexFile.getStringSection().get(itemIndex);
+                    out.annotate(4, "string_data_item[0x%x]: \"%s\"", stringDataOffset,
+                            StringUtils.escapeString(stringValue));
+                    return;
+                } catch (Exception ex) {
+                    System.err.print("Error while resolving string value at index: ");
+                    System.err.print(itemIndex);
+                    ex.printStackTrace(System.err);
+                }
+
+                out.annotate(4, "string_id_item[0x%x]", stringDataOffset);
+            }
+        };
+    }
+
+    @Nonnull
+    public static String getReferenceAnnotation(@Nonnull DexBackedDexFile dexFile, int stringIndex) {
+        return getReferenceAnnotation(dexFile, stringIndex, false);
+    }
+
+    public static String getReferenceAnnotation(@Nonnull DexBackedDexFile dexFile, int stringIndex, boolean quote) {
+        try {
+            String string = dexFile.getStringSection().get(stringIndex);
+            if (quote) {
+                string = String.format("\"%s\"", StringUtils.escapeString(string));
+            }
+            return String.format("string_id_item[%d]: %s", stringIndex, string);
+        } catch (Exception ex) {
+            ex.printStackTrace(System.err);
+        }
+        return String.format("string_id_item[%d]", stringIndex);
+    }
+
+
+    @Nonnull
+    public static String getOptionalReferenceAnnotation(@Nonnull DexBackedDexFile dexFile, int stringIndex) {
+        return getOptionalReferenceAnnotation(dexFile, stringIndex, false);
+    }
+
+    public static String getOptionalReferenceAnnotation(@Nonnull DexBackedDexFile dexFile, int stringIndex,
+                                                        boolean quote) {
+        if (stringIndex == -1) {
+            return "string_id_item[NO_INDEX]";
+        }
+        return getReferenceAnnotation(dexFile, stringIndex, quote);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/TypeIdItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/TypeIdItem.java
new file mode 100644
index 0000000..24a7c67
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/TypeIdItem.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.raw;
+
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.raw.util.DexAnnotator;
+import org.jf.dexlib2.util.AnnotatedBytes;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class TypeIdItem {
+    public static final int ITEM_SIZE = 4;
+
+    @Nonnull
+    public static SectionAnnotator makeAnnotator(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) {
+        return new SectionAnnotator(annotator, mapItem) {
+            @Nonnull @Override public String getItemName() {
+                return "type_id_item";
+            }
+
+            @Override
+            protected void annotateItem(@Nonnull AnnotatedBytes out, int itemIndex, @Nullable String itemIdentity) {
+                int stringIndex = dexFile.getBuffer().readSmallUint(out.getCursor());
+                out.annotate(4, StringIdItem.getReferenceAnnotation(dexFile, stringIndex));
+            }
+        };
+    }
+
+    @Nonnull
+    public static String getReferenceAnnotation(@Nonnull DexBackedDexFile dexFile, int typeIndex) {
+        try {
+            String typeString = dexFile.getTypeSection().get(typeIndex);
+            return String.format("type_id_item[%d]: %s", typeIndex, typeString);
+        } catch (Exception ex) {
+            ex.printStackTrace(System.err);
+        }
+        return String.format("type_id_item[%d]", typeIndex);
+    }
+
+    @Nonnull
+    public static String getOptionalReferenceAnnotation(@Nonnull DexBackedDexFile dexFile, int typeIndex) {
+        if (typeIndex == -1) {
+            return "type_id_item[NO_INDEX]";
+        }
+        return getReferenceAnnotation(dexFile, typeIndex);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/TypeListItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/TypeListItem.java
new file mode 100644
index 0000000..bdb6a4d
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/TypeListItem.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.raw;
+
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.raw.util.DexAnnotator;
+import org.jf.dexlib2.util.AnnotatedBytes;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class TypeListItem {
+    public static final int SIZE_OFFSET = 0;
+    public static final int LIST_OFFSET = 4;
+
+    @Nonnull
+    public static SectionAnnotator makeAnnotator(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) {
+        return new SectionAnnotator(annotator, mapItem) {
+            @Nonnull @Override public String getItemName() {
+                return "type_list";
+            }
+
+            @Override
+            protected void annotateItem(@Nonnull AnnotatedBytes out, int itemIndex, @Nullable String itemIdentity) {
+                int size = dexFile.getBuffer().readSmallUint(out.getCursor());
+                out.annotate(4, "size: %d", size);
+
+                for (int i=0; i<size; i++) {
+                    int typeIndex = dexFile.getBuffer().readUshort(out.getCursor());
+                    out.annotate(2, TypeIdItem.getReferenceAnnotation(dexFile, typeIndex));
+                }
+            }
+
+            @Override public int getItemAlignment() {
+                return 4;
+            }
+        };
+    }
+
+    @Nonnull
+    public static String getReferenceAnnotation(@Nonnull DexBackedDexFile dexFile, int typeListOffset) {
+        if (typeListOffset == 0) {
+            return "type_list_item[NO_OFFSET]";
+        }
+
+        try {
+            String typeList = asString(dexFile, typeListOffset);
+            return String.format("type_list_item[0x%x]: %s", typeListOffset, typeList);
+        } catch (Exception ex) {
+            ex.printStackTrace(System.err);
+        }
+        return String.format("type_list_item[0x%x]", typeListOffset);
+    }
+
+    @Nonnull
+    public static String asString(@Nonnull DexBackedDexFile dexFile, int typeListOffset) {
+        if (typeListOffset == 0) {
+            return "";
+        }
+
+        StringBuilder sb = new StringBuilder();
+
+        int size = dexFile.getDataBuffer().readSmallUint(typeListOffset);
+        for (int i=0; i<size; i++) {
+            int typeIndex = dexFile.getDataBuffer().readUshort(typeListOffset + 4 + i*2);
+            String type = dexFile.getTypeSection().get(typeIndex);
+            sb.append(type);
+        }
+        return sb.toString();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/util/DexAnnotator.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/util/DexAnnotator.java
new file mode 100644
index 0000000..f463c71
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/util/DexAnnotator.java
@@ -0,0 +1,204 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.raw.util;
+
+import com.google.common.collect.Maps;
+import com.google.common.collect.Ordering;
+import com.google.common.primitives.Ints;
+import org.jf.dexlib2.dexbacked.CDexBackedDexFile;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.raw.*;
+import org.jf.dexlib2.util.AnnotatedBytes;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+
+public class DexAnnotator extends AnnotatedBytes {
+    @Nonnull public final DexBackedDexFile dexFile;
+
+    private final Map<Integer, SectionAnnotator> annotators = Maps.newHashMap();
+    private static final Map<Integer, Integer> sectionAnnotationOrder = Maps.newHashMap();
+
+    static {
+        int[] sectionOrder = new int[] {
+                ItemType.MAP_LIST,
+
+                ItemType.HEADER_ITEM,
+                ItemType.STRING_ID_ITEM,
+                ItemType.TYPE_ID_ITEM,
+                ItemType.PROTO_ID_ITEM,
+                ItemType.FIELD_ID_ITEM,
+                ItemType.METHOD_ID_ITEM,
+                ItemType.CALL_SITE_ID_ITEM,
+                ItemType.METHOD_HANDLE_ITEM,
+
+                // these need to be ordered like this, so the item identities can be propagated
+                ItemType.CLASS_DEF_ITEM,
+                ItemType.CLASS_DATA_ITEM,
+                ItemType.CODE_ITEM,
+                ItemType.DEBUG_INFO_ITEM,
+
+                ItemType.TYPE_LIST,
+                ItemType.ANNOTATION_SET_REF_LIST,
+                ItemType.ANNOTATION_SET_ITEM,
+                ItemType.STRING_DATA_ITEM,
+                ItemType.ANNOTATION_ITEM,
+                ItemType.ENCODED_ARRAY_ITEM,
+                ItemType.ANNOTATION_DIRECTORY_ITEM,
+
+                ItemType.HIDDENAPI_CLASS_DATA_ITEM
+        };
+
+        for (int i=0; i<sectionOrder.length; i++) {
+            sectionAnnotationOrder.put(sectionOrder[i], i);
+        }
+    }
+
+    public DexAnnotator(@Nonnull DexBackedDexFile dexFile, int width) {
+        super(width);
+
+        this.dexFile = dexFile;
+
+        for (MapItem mapItem: dexFile.getMapItems()) {
+            switch (mapItem.getType()) {
+                case ItemType.HEADER_ITEM:
+                    annotators.put(mapItem.getType(), HeaderItem.makeAnnotator(this, mapItem));
+                    break;
+                case ItemType.STRING_ID_ITEM:
+                    annotators.put(mapItem.getType(), StringIdItem.makeAnnotator(this, mapItem));
+                    break;
+                case ItemType.TYPE_ID_ITEM:
+                    annotators.put(mapItem.getType(), TypeIdItem.makeAnnotator(this, mapItem));
+                    break;
+                case ItemType.PROTO_ID_ITEM:
+                    annotators.put(mapItem.getType(), ProtoIdItem.makeAnnotator(this, mapItem));
+                    break;
+                case ItemType.FIELD_ID_ITEM:
+                    annotators.put(mapItem.getType(), FieldIdItem.makeAnnotator(this, mapItem));
+                    break;
+                case ItemType.METHOD_ID_ITEM:
+                    annotators.put(mapItem.getType(), MethodIdItem.makeAnnotator(this, mapItem));
+                    break;
+                case ItemType.CLASS_DEF_ITEM:
+                    annotators.put(mapItem.getType(), ClassDefItem.makeAnnotator(this, mapItem));
+                    break;
+                case ItemType.MAP_LIST:
+                    annotators.put(mapItem.getType(), MapItem.makeAnnotator(this, mapItem));
+                    break;
+                case ItemType.TYPE_LIST:
+                    annotators.put(mapItem.getType(), TypeListItem.makeAnnotator(this, mapItem));
+                    break;
+                case ItemType.ANNOTATION_SET_REF_LIST:
+                    annotators.put(mapItem.getType(), AnnotationSetRefList.makeAnnotator(this, mapItem));
+                    break;
+                case ItemType.ANNOTATION_SET_ITEM:
+                    annotators.put(mapItem.getType(), AnnotationSetItem.makeAnnotator(this, mapItem));
+                    break;
+                case ItemType.CLASS_DATA_ITEM:
+                    annotators.put(mapItem.getType(), ClassDataItem.makeAnnotator(this, mapItem));
+                    break;
+                case ItemType.CODE_ITEM:
+                    annotators.put(mapItem.getType(), CodeItem.makeAnnotator(this, mapItem));
+                    break;
+                case ItemType.STRING_DATA_ITEM:
+                    annotators.put(mapItem.getType(), StringDataItem.makeAnnotator(this, mapItem));
+                    break;
+                case ItemType.DEBUG_INFO_ITEM:
+                    annotators.put(mapItem.getType(), DebugInfoItem.makeAnnotator(this, mapItem));
+                    break;
+                case ItemType.ANNOTATION_ITEM:
+                    annotators.put(mapItem.getType(), AnnotationItem.makeAnnotator(this, mapItem));
+                    break;
+                case ItemType.ENCODED_ARRAY_ITEM:
+                    annotators.put(mapItem.getType(), EncodedArrayItem.makeAnnotator(this, mapItem));
+                    break;
+                case ItemType.ANNOTATION_DIRECTORY_ITEM:
+                    annotators.put(mapItem.getType(), AnnotationDirectoryItem.makeAnnotator(this, mapItem));
+                    break;
+                case ItemType.CALL_SITE_ID_ITEM:
+                    annotators.put(mapItem.getType(), CallSiteIdItem.makeAnnotator(this, mapItem));
+                    break;
+                case ItemType.METHOD_HANDLE_ITEM:
+                    annotators.put(mapItem.getType(), MethodHandleItem.makeAnnotator(this, mapItem));
+                    break;
+                case ItemType.HIDDENAPI_CLASS_DATA_ITEM:
+                    annotators.put(mapItem.getType(), HiddenApiClassDataItem.makeAnnotator(this, mapItem));
+                    break;
+                default:
+                    throw new RuntimeException(String.format("Unrecognized item type: 0x%x", mapItem.getType()));
+            }
+        }
+    }
+
+    public void writeAnnotations(Writer out) throws IOException {
+        List<MapItem> mapItems = dexFile.getMapItems();
+        // sort the map items based on the order defined by sectionAnnotationOrder
+        Ordering<MapItem> ordering = Ordering.from(new Comparator<MapItem>() {
+            @Override public int compare(MapItem o1, MapItem o2) {
+                return Ints.compare(sectionAnnotationOrder.get(o1.getType()), sectionAnnotationOrder.get(o2.getType()));
+            }
+        });
+
+        mapItems = ordering.immutableSortedCopy(mapItems);
+
+        try {
+            // Need to annotate the debug info offset table first, to propagate the debug info identities
+            if (dexFile instanceof CDexBackedDexFile) {
+                moveTo(dexFile.getBaseDataOffset() + ((CDexBackedDexFile) dexFile).getDebugInfoOffsetsPos());
+                CdexDebugOffsetTable.annotate(this, dexFile.getBuffer());
+            }
+
+            for (MapItem mapItem: mapItems) {
+                try {
+                    SectionAnnotator annotator = annotators.get(mapItem.getType());
+                    annotator.annotateSection(this);
+                } catch (Exception ex) {
+                    System.err.println(String.format("There was an error while dumping the %s section",
+                            ItemType.getItemTypeName(mapItem.getType())));
+                    ex.printStackTrace(System.err);
+                }
+            }
+        } finally {
+            writeAnnotations(out, dexFile.getBuffer().getBuf(), dexFile.getBuffer().getBaseOffset());
+        }
+    }
+
+    @Nullable
+    public SectionAnnotator getAnnotator(int itemType) {
+        return annotators.get(itemType);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/reference/DexBackedCallSiteReference.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/reference/DexBackedCallSiteReference.java
new file mode 100644
index 0000000..fcdf9f9
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/reference/DexBackedCallSiteReference.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.reference;
+
+import com.google.common.collect.Lists;
+import org.jf.dexlib2.ValueType;
+import org.jf.dexlib2.base.reference.BaseCallSiteReference;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.util.EncodedArrayItemIterator;
+import org.jf.dexlib2.iface.reference.MethodHandleReference;
+import org.jf.dexlib2.iface.reference.MethodProtoReference;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.dexlib2.iface.value.MethodHandleEncodedValue;
+import org.jf.dexlib2.iface.value.MethodTypeEncodedValue;
+import org.jf.dexlib2.iface.value.StringEncodedValue;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+public class DexBackedCallSiteReference extends BaseCallSiteReference {
+    @Nonnull public final DexBackedDexFile dexFile;
+    public final int callSiteIndex;
+    public final int callSiteIdOffset;
+    private int callSiteOffset = -1;
+
+    public DexBackedCallSiteReference(DexBackedDexFile dexFile, int callSiteIndex) {
+        this.dexFile = dexFile;
+        this.callSiteIndex = callSiteIndex;
+        this.callSiteIdOffset = dexFile.getCallSiteSection().getOffset(callSiteIndex);
+    }
+
+    @Nonnull
+    @Override
+    public String getName() {
+        return String.format("call_site_%d", callSiteIndex);
+    }
+
+    @Nonnull
+    @Override
+    public MethodHandleReference getMethodHandle() {
+        EncodedArrayItemIterator iter = getCallSiteIterator();
+        if (iter.getItemCount() < 3) {
+            throw new ExceptionWithContext("Invalid call site item: must contain at least 3 entries.");
+        }
+
+        EncodedValue encodedValue = getCallSiteIterator().getNextOrNull();
+        assert encodedValue != null;
+        if (encodedValue.getValueType() != ValueType.METHOD_HANDLE) {
+            throw new ExceptionWithContext(
+                    "Invalid encoded value type (%d) for the first item in call site %d",
+                    encodedValue.getValueType(), callSiteIndex);
+        }
+        return ((MethodHandleEncodedValue) encodedValue).getValue();
+    }
+
+    @Nonnull
+    @Override
+    public String getMethodName() {
+        EncodedArrayItemIterator iter = getCallSiteIterator();
+        if (iter.getItemCount() < 3) {
+            throw new ExceptionWithContext("Invalid call site item: must contain at least 3 entries.");
+        }
+
+        iter.skipNext();
+        EncodedValue encodedValue = iter.getNextOrNull();
+        assert encodedValue != null;
+        if (encodedValue.getValueType() != ValueType.STRING) {
+            throw new ExceptionWithContext(
+                    "Invalid encoded value type (%d) for the second item in call site %d",
+                    encodedValue.getValueType(), callSiteIndex);
+        }
+        return ((StringEncodedValue) encodedValue).getValue();
+    }
+
+    @Nonnull
+    @Override
+    public MethodProtoReference getMethodProto() {
+        EncodedArrayItemIterator iter = getCallSiteIterator();
+        if (iter.getItemCount() < 3) {
+            throw new ExceptionWithContext("Invalid call site item: must contain at least 3 entries.");
+        }
+
+        iter.skipNext();
+        iter.skipNext();
+        EncodedValue encodedValue = iter.getNextOrNull();
+        assert encodedValue != null;
+        if (encodedValue.getValueType() != ValueType.METHOD_TYPE) {
+            throw new ExceptionWithContext(
+                    "Invalid encoded value type (%d) for the second item in call site %d",
+                    encodedValue.getValueType(), callSiteIndex);
+        }
+        return ((MethodTypeEncodedValue) encodedValue).getValue();
+    }
+
+    @Nonnull
+    @Override
+    public List<? extends EncodedValue> getExtraArguments() {
+        List<EncodedValue> values = Lists.newArrayList();
+
+        EncodedArrayItemIterator iter = getCallSiteIterator();
+        if (iter.getItemCount() < 3) {
+            throw new ExceptionWithContext("Invalid call site item: must contain at least 3 entries.");
+        }
+        if (iter.getItemCount() == 3) {
+            return values;
+        }
+
+        iter.skipNext();
+        iter.skipNext();
+        iter.skipNext();
+
+        EncodedValue item = iter.getNextOrNull();
+        while (item != null) {
+            values.add(item);
+            item = iter.getNextOrNull();
+        }
+        return values;
+    }
+
+    private EncodedArrayItemIterator getCallSiteIterator() {
+        return EncodedArrayItemIterator.newOrEmpty(dexFile, getCallSiteOffset());
+    }
+
+    private int getCallSiteOffset() {
+        if (callSiteOffset < 0) {
+            callSiteOffset = dexFile.getBuffer().readSmallUint(callSiteIdOffset);
+        }
+        return callSiteOffset;
+    }
+
+    @Override
+    public void validateReference() throws InvalidReferenceException {
+        if (callSiteIndex < 0 || callSiteIndex >= dexFile.getCallSiteSection().size()) {
+            throw new InvalidReferenceException("callsite@" + callSiteIndex);
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/reference/DexBackedFieldReference.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/reference/DexBackedFieldReference.java
new file mode 100644
index 0000000..00c9c95
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/reference/DexBackedFieldReference.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.reference;
+
+import org.jf.dexlib2.base.reference.BaseFieldReference;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.raw.FieldIdItem;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedFieldReference extends BaseFieldReference {
+    @Nonnull public final DexBackedDexFile dexFile;
+    private final int fieldIndex;
+
+    public DexBackedFieldReference(@Nonnull DexBackedDexFile dexFile, int fieldIndex) {
+        this.dexFile = dexFile;
+        this.fieldIndex = fieldIndex;
+    }
+
+    @Nonnull
+    @Override
+    public String getDefiningClass() {
+        return dexFile.getTypeSection().get(
+                dexFile.getBuffer().readUshort(
+                        dexFile.getFieldSection().getOffset(fieldIndex) + FieldIdItem.CLASS_OFFSET));
+    }
+
+    @Nonnull
+    @Override
+    public String getName() {
+        return dexFile.getStringSection().get(dexFile.getBuffer().readSmallUint(
+                dexFile.getFieldSection().getOffset(fieldIndex) + FieldIdItem.NAME_OFFSET));
+    }
+
+    @Nonnull
+    @Override
+    public String getType() {
+        return dexFile.getTypeSection().get(dexFile.getBuffer().readUshort(
+                dexFile.getFieldSection().getOffset(fieldIndex) + FieldIdItem.TYPE_OFFSET));
+    }
+
+    /**
+     * Calculate and return the private size of a field reference.
+     *
+     * Calculated as: class_idx + type_idx + name_idx
+     *
+     * @return size in bytes
+     */
+    public int getSize() {
+        return FieldIdItem.ITEM_SIZE;
+    }
+
+    @Override
+    public void validateReference() throws InvalidReferenceException {
+        if (fieldIndex < 0 || fieldIndex >= dexFile.getFieldSection().size()) {
+            throw new InvalidReferenceException("field@" + fieldIndex);
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/reference/DexBackedMethodHandleReference.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/reference/DexBackedMethodHandleReference.java
new file mode 100644
index 0000000..3dcc348
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/reference/DexBackedMethodHandleReference.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.reference;
+
+import org.jf.dexlib2.MethodHandleType;
+import org.jf.dexlib2.base.reference.BaseMethodHandleReference;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.raw.MethodHandleItem;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedMethodHandleReference extends BaseMethodHandleReference {
+    @Nonnull public final DexBackedDexFile dexFile;
+    public final int methodHandleIndex;
+    public final int methodHandleOffset;
+
+    public DexBackedMethodHandleReference(DexBackedDexFile dexFile, int methodHandleIndex) {
+        this.dexFile = dexFile;
+        this.methodHandleIndex = methodHandleIndex;
+        this.methodHandleOffset = dexFile.getMethodHandleSection().getOffset(methodHandleIndex);
+    }
+
+    @Override
+    public int getMethodHandleType() {
+        return dexFile.getBuffer().readUshort(methodHandleOffset + MethodHandleItem.METHOD_HANDLE_TYPE_OFFSET);
+    }
+
+    @Nonnull
+    @Override
+    public Reference getMemberReference() {
+        int memberIndex = dexFile.getBuffer().readUshort(methodHandleOffset + MethodHandleItem.MEMBER_ID_OFFSET);
+        switch (getMethodHandleType()) {
+            case MethodHandleType.STATIC_PUT:
+            case MethodHandleType.STATIC_GET:
+            case MethodHandleType.INSTANCE_PUT:
+            case MethodHandleType.INSTANCE_GET:
+                return new DexBackedFieldReference(dexFile, memberIndex);
+            case MethodHandleType.INVOKE_STATIC:
+            case MethodHandleType.INVOKE_INSTANCE:
+            case MethodHandleType.INVOKE_CONSTRUCTOR:
+            case MethodHandleType.INVOKE_DIRECT:
+            case MethodHandleType.INVOKE_INTERFACE:
+                return new DexBackedMethodReference(dexFile, memberIndex);
+            default:
+                throw new ExceptionWithContext("Invalid method handle type: %d", getMethodHandleType());
+        }
+    }
+
+    @Override
+    public void validateReference() throws InvalidReferenceException {
+        if (methodHandleIndex < 0 || methodHandleIndex >= dexFile.getMethodHandleSection().size()) {
+            throw new InvalidReferenceException("methodhandle@" + methodHandleIndex);
+        }
+
+        try {
+            getMemberReference();
+        } catch (ExceptionWithContext ex) {
+            throw new InvalidReferenceException("methodhandle@" + methodHandleIndex, ex);
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/reference/DexBackedMethodProtoReference.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/reference/DexBackedMethodProtoReference.java
new file mode 100644
index 0000000..35f890e
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/reference/DexBackedMethodProtoReference.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.reference;
+
+import com.google.common.collect.ImmutableList;
+import org.jf.dexlib2.base.reference.BaseMethodProtoReference;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.raw.ProtoIdItem;
+import org.jf.dexlib2.dexbacked.raw.TypeListItem;
+import org.jf.dexlib2.dexbacked.util.FixedSizeList;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+public class DexBackedMethodProtoReference extends BaseMethodProtoReference {
+    @Nonnull public final DexBackedDexFile dexFile;
+    private final int protoIndex;
+
+    public DexBackedMethodProtoReference(@Nonnull DexBackedDexFile dexFile, int protoIndex) {
+        this.dexFile = dexFile;
+        this.protoIndex = protoIndex;
+    }
+
+    @Nonnull
+    @Override
+    public List<String> getParameterTypes() {
+        final int parametersOffset = dexFile.getBuffer().readSmallUint(dexFile.getProtoSection().getOffset(protoIndex) +
+                ProtoIdItem.PARAMETERS_OFFSET);
+        if (parametersOffset > 0) {
+            final int parameterCount = dexFile.getDataBuffer().readSmallUint(
+                    parametersOffset + TypeListItem.SIZE_OFFSET);
+            final int paramListStart = parametersOffset + TypeListItem.LIST_OFFSET;
+            return new FixedSizeList<String>() {
+                @Nonnull
+                @Override
+                public String readItem(final int index) {
+                    return dexFile.getTypeSection().get(dexFile.getDataBuffer().readUshort(paramListStart + 2*index));
+                }
+                @Override public int size() { return parameterCount; }
+            };
+        }
+        return ImmutableList.of();
+    }
+
+    @Nonnull
+    @Override
+    public String getReturnType() {
+        return dexFile.getTypeSection().get(dexFile.getBuffer().readSmallUint(
+                dexFile.getProtoSection().getOffset(protoIndex) + ProtoIdItem.RETURN_TYPE_OFFSET));
+    }
+
+    /**
+     * Calculate and return the private size of a method proto.
+     *
+     * Calculated as: shorty_idx + return_type_idx + parameters_off + type_list size
+     *
+     * @return size in bytes
+     */
+    public int getSize() {
+        int size = ProtoIdItem.ITEM_SIZE; //3 * uint
+        List<String> parameters = getParameterTypes();
+        if (!parameters.isEmpty()) {
+            size += 4 + parameters.size() * 2; //uint + size * ushort for type_idxs
+        }
+        return size;
+    }
+
+    @Override
+    public void validateReference() throws InvalidReferenceException {
+        if (protoIndex < 0 || protoIndex >= dexFile.getProtoSection().size()) {
+            throw new InvalidReferenceException("proto@" + protoIndex);
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/reference/DexBackedMethodReference.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/reference/DexBackedMethodReference.java
new file mode 100644
index 0000000..28427ed
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/reference/DexBackedMethodReference.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.reference;
+
+import com.google.common.collect.ImmutableList;
+import org.jf.dexlib2.base.reference.BaseMethodReference;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.raw.MethodIdItem;
+import org.jf.dexlib2.dexbacked.raw.ProtoIdItem;
+import org.jf.dexlib2.dexbacked.raw.TypeListItem;
+import org.jf.dexlib2.dexbacked.util.FixedSizeList;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+public class DexBackedMethodReference extends BaseMethodReference {
+    @Nonnull public final DexBackedDexFile dexFile;
+    private final int methodIndex;
+    private int protoIdItemOffset;
+
+    public DexBackedMethodReference(@Nonnull DexBackedDexFile dexFile, int methodIndex) {
+        this.dexFile = dexFile;
+        this.methodIndex = methodIndex;
+    }
+
+    @Nonnull
+    @Override
+    public String getDefiningClass() {
+        return dexFile.getTypeSection().get(dexFile.getBuffer().readUshort(
+                dexFile.getMethodSection().getOffset(methodIndex) + MethodIdItem.CLASS_OFFSET));
+    }
+
+    @Nonnull
+    @Override
+    public String getName() {
+        return dexFile.getStringSection().get(dexFile.getBuffer().readSmallUint(
+                dexFile.getMethodSection().getOffset(methodIndex) + MethodIdItem.NAME_OFFSET));
+    }
+
+    @Nonnull
+    @Override
+    public List<String> getParameterTypes() {
+        int protoIdItemOffset = getProtoIdItemOffset();
+        final int parametersOffset = dexFile.getBuffer().readSmallUint(
+                protoIdItemOffset + ProtoIdItem.PARAMETERS_OFFSET);
+        if (parametersOffset > 0) {
+            final int parameterCount =
+                    dexFile.getDataBuffer().readSmallUint(parametersOffset + TypeListItem.SIZE_OFFSET);
+            final int paramListStart = parametersOffset + TypeListItem.LIST_OFFSET;
+            return new FixedSizeList<String>() {
+                @Nonnull
+                @Override
+                public String readItem(final int index) {
+                    return dexFile.getTypeSection().get(dexFile.getDataBuffer().readUshort(paramListStart + 2*index));
+                }
+                @Override public int size() { return parameterCount; }
+            };
+        }
+        return ImmutableList.of();
+    }
+
+    @Nonnull
+    @Override
+    public String getReturnType() {
+        int protoIdItemOffset = getProtoIdItemOffset();
+        return dexFile.getTypeSection().get(
+                dexFile.getBuffer().readSmallUint(protoIdItemOffset + ProtoIdItem.RETURN_TYPE_OFFSET));
+    }
+
+    private int getProtoIdItemOffset() {
+        if (protoIdItemOffset == 0) {
+            protoIdItemOffset = dexFile.getProtoSection().getOffset(dexFile.getBuffer().readUshort(
+                    dexFile.getMethodSection().getOffset(methodIndex) + MethodIdItem.PROTO_OFFSET));
+        }
+        return protoIdItemOffset;
+    }
+
+    /**
+     * Calculate and return the private size of a method reference.
+     *
+     * Calculated as: class_idx + proto_idx + name_idx
+     *
+     * @return size in bytes
+     */
+    public int getSize() {
+        return MethodIdItem.ITEM_SIZE; //ushort + ushort + uint for indices
+    }
+
+    @Override
+    public void validateReference() throws InvalidReferenceException {
+        if (methodIndex < 0 || methodIndex >= dexFile.getMethodSection().size()) {
+            throw new InvalidReferenceException("method@" + methodIndex);
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/reference/DexBackedReference.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/reference/DexBackedReference.java
new file mode 100644
index 0000000..9da2830
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/reference/DexBackedReference.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.reference;
+
+import org.jf.dexlib2.ReferenceType;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+
+public abstract class DexBackedReference {
+    public static Reference makeReference(@Nonnull DexBackedDexFile dexFile, int referenceType, int referenceIndex) {
+        switch (referenceType) {
+            case ReferenceType.STRING:
+                return new DexBackedStringReference(dexFile, referenceIndex);
+            case ReferenceType.TYPE:
+                return new DexBackedTypeReference(dexFile, referenceIndex);
+            case ReferenceType.METHOD:
+                return new DexBackedMethodReference(dexFile, referenceIndex);
+            case ReferenceType.FIELD:
+                return new DexBackedFieldReference(dexFile, referenceIndex);
+            case ReferenceType.METHOD_PROTO:
+                return new DexBackedMethodProtoReference(dexFile, referenceIndex);
+            case ReferenceType.METHOD_HANDLE:
+                return new DexBackedMethodHandleReference(dexFile, referenceIndex);
+            case ReferenceType.CALL_SITE:
+                return new DexBackedCallSiteReference(dexFile, referenceIndex);
+            default:
+                throw new ExceptionWithContext("Invalid reference type: %d", referenceType);
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/reference/DexBackedStringReference.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/reference/DexBackedStringReference.java
new file mode 100644
index 0000000..0e30a88
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/reference/DexBackedStringReference.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.reference;
+
+import org.jf.dexlib2.base.reference.BaseStringReference;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.DexReader;
+import org.jf.dexlib2.dexbacked.raw.StringIdItem;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedStringReference extends BaseStringReference {
+    @Nonnull public final DexBackedDexFile dexFile;
+    public final int stringIndex;
+
+    public DexBackedStringReference(@Nonnull DexBackedDexFile dexBuf,
+                                    int stringIndex) {
+        this.dexFile = dexBuf;
+        this.stringIndex = stringIndex;
+    }
+
+    @Nonnull
+    public String getString() {
+        return dexFile.getStringSection().get(stringIndex);
+    }
+
+    /**
+     * Calculate and return the private size of a string reference.
+     *
+     * Calculated as: string_data_off + string_data_item size
+     *
+     * @return size in bytes
+     */
+    public int getSize() {
+        int size = StringIdItem.ITEM_SIZE; //uint for string_data_off
+        //add the string data length:
+        int stringOffset = dexFile.getStringSection().getOffset(stringIndex);
+        int stringDataOffset = dexFile.getBuffer().readSmallUint(stringOffset);
+        DexReader reader = dexFile.getDataBuffer().readerAt(stringDataOffset);
+        size += reader.peekSmallUleb128Size();
+        int utf16Length = reader.readSmallUleb128();
+        //and string data itself:
+        size += reader.peekStringLength(utf16Length);
+        return size;
+    }
+
+    @Override
+    public void validateReference() throws InvalidReferenceException {
+        if (stringIndex < 0 || stringIndex >= dexFile.getStringSection().size()) {
+            throw new InvalidReferenceException("string@" + stringIndex);
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/reference/DexBackedTypeReference.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/reference/DexBackedTypeReference.java
new file mode 100644
index 0000000..0c71de4
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/reference/DexBackedTypeReference.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.reference;
+
+import org.jf.dexlib2.base.reference.BaseTypeReference;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.raw.TypeIdItem;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedTypeReference extends BaseTypeReference {
+    @Nonnull public final DexBackedDexFile dexFile;
+    public final int typeIndex;
+
+    public DexBackedTypeReference(@Nonnull DexBackedDexFile dexFile,
+                                  int typeIndex) {
+        this.dexFile = dexFile;
+        this.typeIndex = typeIndex;
+    }
+
+    @Nonnull public String getType() {
+        return dexFile.getTypeSection().get(typeIndex);
+    }
+
+
+    /**
+     * Calculate and return the private size of a type reference.
+     *
+     * Calculated as: descriptor_idx
+     *
+     * @return size in bytes
+     */
+    public int getSize() {
+        return TypeIdItem.ITEM_SIZE; //uint for descriptor_idx
+    }
+
+    @Override
+    public void validateReference() throws InvalidReferenceException {
+        if (typeIndex < 0 || typeIndex >= dexFile.getTypeSection().size()) {
+            throw new InvalidReferenceException("type@" + typeIndex);
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/AnnotationsDirectory.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/AnnotationsDirectory.java
new file mode 100644
index 0000000..3f0faf2
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/AnnotationsDirectory.java
@@ -0,0 +1,242 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.util;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import org.jf.dexlib2.dexbacked.DexBackedAnnotation;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+import java.util.Set;
+
+public abstract class AnnotationsDirectory {
+    public static final AnnotationsDirectory EMPTY = new AnnotationsDirectory() {
+        @Override public int getFieldAnnotationCount() { return 0; }
+        @Nonnull @Override public Set<? extends DexBackedAnnotation> getClassAnnotations() { return ImmutableSet.of(); }
+        @Nonnull @Override public AnnotationIterator getFieldAnnotationIterator() { return AnnotationIterator.EMPTY; }
+        @Nonnull @Override public AnnotationIterator getMethodAnnotationIterator() { return AnnotationIterator.EMPTY; }
+        @Nonnull @Override public AnnotationIterator getParameterAnnotationIterator() {return AnnotationIterator.EMPTY;}
+    };
+
+    public abstract int getFieldAnnotationCount();
+    @Nonnull public abstract Set<? extends DexBackedAnnotation> getClassAnnotations();
+    @Nonnull public abstract AnnotationIterator getFieldAnnotationIterator();
+    @Nonnull public abstract AnnotationIterator getMethodAnnotationIterator();
+    @Nonnull public abstract AnnotationIterator getParameterAnnotationIterator();
+
+    @Nonnull
+    public static AnnotationsDirectory newOrEmpty(@Nonnull DexBackedDexFile dexFile,
+                                                  int directoryAnnotationsOffset) {
+        if (directoryAnnotationsOffset == 0) {
+            return EMPTY;
+        }
+        return new AnnotationsDirectoryImpl(dexFile, directoryAnnotationsOffset);
+    }
+
+    /**
+     * This provides a forward-only, skipable iteration over the field_annotation, method_annotation or
+     * parameter_annotation lists in an annotations_directory_item.
+     *
+     * These lists associate a key, either a field or method index, with an offset to where the annotation data for
+     * that field/method/parameter is stored.
+     */
+    public interface AnnotationIterator {
+        public static final AnnotationIterator EMPTY = new AnnotationIterator() {
+            @Override public int seekTo(int key) { return 0; }
+            @Override public void reset() {}
+        };
+
+        /**
+         * Seeks the iterator forward, to the first item whose key is >= the requested key. If the requested key value
+         * is less than that of the item that the iterator currently points to, it will not be moved forward.
+         *
+         * If an item with the requested key is found, the associated annotation offset is returned. Otherwise, 0 is
+         * returned.
+         *
+         * @param key The method/field index to search for
+         * @return The annotation offset associated with the requested key, or 0 if not found.
+         */
+        public int seekTo(int key);
+
+        /**
+         * Resets the iterator to the beginning of its list.
+         */
+        public void reset();
+    }
+
+    @Nonnull
+    public static Set<? extends DexBackedAnnotation> getAnnotations(@Nonnull final DexBackedDexFile dexFile,
+                                                                     final int annotationSetOffset) {
+        if (annotationSetOffset != 0) {
+            final int size = dexFile.getDataBuffer().readSmallUint(annotationSetOffset);
+            return new FixedSizeSet<DexBackedAnnotation>() {
+                @Nonnull
+                @Override
+                public DexBackedAnnotation readItem(int index) {
+                    int annotationOffset = dexFile.getDataBuffer().readSmallUint(annotationSetOffset + 4 + (4*index));
+                    return new DexBackedAnnotation(dexFile, annotationOffset);
+                }
+
+                @Override public int size() { return size; }
+            };
+        }
+
+        return ImmutableSet.of();
+    }
+
+    @Nonnull
+    public static List<Set<? extends DexBackedAnnotation>> getParameterAnnotations(
+            @Nonnull final DexBackedDexFile dexFile, final int annotationSetListOffset) {
+        if (annotationSetListOffset > 0) {
+            final int size = dexFile.getDataBuffer().readSmallUint(annotationSetListOffset);
+
+            return new FixedSizeList<Set<? extends DexBackedAnnotation>>() {
+                @Nonnull
+                @Override
+                public Set<? extends DexBackedAnnotation> readItem(int index) {
+                    int annotationSetOffset = dexFile.getDataBuffer().readSmallUint(
+                            annotationSetListOffset + 4 + index * 4);
+                    return getAnnotations(dexFile, annotationSetOffset);
+                }
+
+                @Override public int size() { return size; }
+            };
+        }
+        return ImmutableList.of();
+    }
+
+    private static class AnnotationsDirectoryImpl extends AnnotationsDirectory {
+        @Nonnull public final DexBackedDexFile dexFile;
+        private final int directoryOffset;
+
+        private static final int FIELD_COUNT_OFFSET = 4;
+        private static final int METHOD_COUNT_OFFSET = 8;
+        private static final int PARAMETER_COUNT_OFFSET = 12;
+        private static final int ANNOTATIONS_START_OFFSET = 16;
+
+        /** The size of a field_annotation structure */
+        private static final int FIELD_ANNOTATION_SIZE = 8;
+        /** The size of a method_annotation structure */
+        private static final int METHOD_ANNOTATION_SIZE = 8;
+
+        public AnnotationsDirectoryImpl(@Nonnull DexBackedDexFile dexFile,
+                                        int directoryOffset) {
+            this.dexFile = dexFile;
+            this.directoryOffset = directoryOffset;
+        }
+
+        public int getFieldAnnotationCount() {
+            return dexFile.getDataBuffer().readSmallUint(directoryOffset + FIELD_COUNT_OFFSET);
+        }
+
+        public int getMethodAnnotationCount() {
+            return dexFile.getDataBuffer().readSmallUint(directoryOffset + METHOD_COUNT_OFFSET);
+        }
+
+        public int getParameterAnnotationCount() {
+            return dexFile.getDataBuffer().readSmallUint(directoryOffset + PARAMETER_COUNT_OFFSET);
+        }
+
+        @Nonnull
+        public Set<? extends DexBackedAnnotation> getClassAnnotations() {
+            return getAnnotations(dexFile, dexFile.getDataBuffer().readSmallUint(directoryOffset));
+        }
+
+        @Nonnull
+        public AnnotationIterator getFieldAnnotationIterator() {
+            int fieldAnnotationCount = getFieldAnnotationCount();
+            if (fieldAnnotationCount == 0) {
+                return AnnotationIterator.EMPTY;
+            }
+            return new AnnotationIteratorImpl(directoryOffset + ANNOTATIONS_START_OFFSET, fieldAnnotationCount);
+        }
+
+        @Nonnull
+        public AnnotationIterator getMethodAnnotationIterator() {
+            int methodCount = getMethodAnnotationCount();
+            if (methodCount == 0) {
+                return AnnotationIterator.EMPTY;
+            }
+            int fieldCount = getFieldAnnotationCount();
+            int methodAnnotationsOffset = directoryOffset + ANNOTATIONS_START_OFFSET +
+                    fieldCount * FIELD_ANNOTATION_SIZE;
+            return new AnnotationIteratorImpl(methodAnnotationsOffset, methodCount);
+        }
+
+        @Nonnull
+        public AnnotationIterator getParameterAnnotationIterator() {
+            int parameterAnnotationCount = getParameterAnnotationCount();
+            if (parameterAnnotationCount == 0) {
+                return AnnotationIterator.EMPTY;
+            }
+            int fieldCount = getFieldAnnotationCount();
+            int methodCount = getMethodAnnotationCount();
+            int parameterAnnotationsOffset = directoryOffset + ANNOTATIONS_START_OFFSET +
+                    fieldCount * FIELD_ANNOTATION_SIZE +
+                    methodCount * METHOD_ANNOTATION_SIZE;
+            return new AnnotationIteratorImpl(parameterAnnotationsOffset, parameterAnnotationCount);
+        }
+
+        private class AnnotationIteratorImpl implements AnnotationIterator {
+            private final int startOffset;
+            private final int size;
+            private int currentIndex;
+            private int currentItemIndex;
+
+            public AnnotationIteratorImpl(int startOffset, int size) {
+                this.startOffset = startOffset;
+                this.size = size;
+                this.currentItemIndex = dexFile.getDataBuffer().readSmallUint(startOffset);
+                this.currentIndex = 0;
+            }
+
+            public int seekTo(int itemIndex) {
+                while (currentItemIndex < itemIndex && (currentIndex+1) < size) {
+                    currentIndex++;
+                    currentItemIndex = dexFile.getDataBuffer().readSmallUint(startOffset + (currentIndex*8));
+                }
+
+                if (currentItemIndex == itemIndex) {
+                    return dexFile.getDataBuffer().readSmallUint(startOffset + (currentIndex*8)+4);
+                }
+                return 0;
+            }
+
+            public void reset() {
+                this.currentItemIndex = dexFile.getDataBuffer().readSmallUint(startOffset);
+                this.currentIndex = 0;
+            }
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/DebugInfo.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/DebugInfo.java
new file mode 100644
index 0000000..cb59f68
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/DebugInfo.java
@@ -0,0 +1,306 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.util;
+
+import com.google.common.collect.ImmutableSet;
+import org.jf.dexlib2.AccessFlags;
+import org.jf.dexlib2.DebugItemType;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.DexBackedMethod;
+import org.jf.dexlib2.dexbacked.DexBackedMethodImplementation;
+import org.jf.dexlib2.dexbacked.DexReader;
+import org.jf.dexlib2.iface.MethodParameter;
+import org.jf.dexlib2.iface.debug.DebugItem;
+import org.jf.dexlib2.iface.debug.EndLocal;
+import org.jf.dexlib2.iface.debug.LocalInfo;
+import org.jf.dexlib2.immutable.debug.*;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Arrays;
+import java.util.Iterator;
+
+public abstract class DebugInfo implements Iterable<DebugItem> {
+    /**
+     * Gets an iterator that yields the parameter names from the debug_info_item
+     *
+     * @param reader Optional. If provided, the reader must be positioned at the debug_info_item.parameters_size
+     *               field, and will
+     * @return An iterator that yields the parameter names as strings
+     */
+    @Nonnull public abstract Iterator<String> getParameterNames(@Nullable DexReader reader);
+
+    /**
+     * Calculate and return the private size of debuginfo.
+     *
+     * @return size in bytes
+     */
+    public abstract int getSize();
+
+    public static DebugInfo newOrEmpty(@Nonnull DexBackedDexFile dexFile, int debugInfoOffset,
+                                       @Nonnull DexBackedMethodImplementation methodImpl) {
+        if (debugInfoOffset == 0) {
+            return EmptyDebugInfo.INSTANCE;
+        }
+        return new DebugInfoImpl(dexFile, debugInfoOffset, methodImpl);
+    }
+
+    private static class EmptyDebugInfo extends DebugInfo {
+        public static final EmptyDebugInfo INSTANCE = new EmptyDebugInfo();
+        private EmptyDebugInfo() {}
+
+        @Nonnull @Override public Iterator<DebugItem> iterator() {
+            return ImmutableSet.<DebugItem>of().iterator();
+        }
+
+        @Nonnull @Override public Iterator<String> getParameterNames(@Nullable DexReader reader) {
+            return ImmutableSet.<String>of().iterator();
+        }
+
+        @Override
+        public int getSize() {
+            return 0;
+        }
+    }
+
+    private static class DebugInfoImpl extends DebugInfo {
+        @Nonnull public final DexBackedDexFile dexFile;
+        private final int debugInfoOffset;
+        @Nonnull private final DexBackedMethodImplementation methodImpl;
+
+        public DebugInfoImpl(@Nonnull DexBackedDexFile dexFile,
+                         int debugInfoOffset,
+                         @Nonnull DexBackedMethodImplementation methodImpl) {
+            this.dexFile = dexFile;
+            this.debugInfoOffset = debugInfoOffset;
+            this.methodImpl = methodImpl;
+        }
+
+        private static final LocalInfo EMPTY_LOCAL_INFO = new LocalInfo() {
+            @Nullable @Override public String getName() { return null; }
+            @Nullable @Override public String getType() { return null; }
+            @Nullable @Override public String getSignature() { return null; }
+        };
+
+        @Nonnull
+        @Override
+        public Iterator<DebugItem> iterator() {
+            DexReader reader = dexFile.getDataBuffer().readerAt(debugInfoOffset);
+            final int lineNumberStart = reader.readBigUleb128();
+            int registerCount = methodImpl.getRegisterCount();
+
+            //TODO: does dalvik allow references to invalid registers?
+            final LocalInfo[] locals = new LocalInfo[registerCount];
+            Arrays.fill(locals, EMPTY_LOCAL_INFO);
+
+            DexBackedMethod method = methodImpl.method;
+
+            // Create a MethodParameter iterator that uses our DexReader instance to read the parameter names.
+            // After we have finished iterating over the parameters, reader will "point to" the beginning of the
+            // debug instructions
+            final Iterator<? extends MethodParameter> parameterIterator =
+                    new ParameterIterator(method.getParameterTypes(),
+                            method.getParameterAnnotations(),
+                            getParameterNames(reader));
+
+            // first, we grab all the parameters and temporarily store them at the beginning of locals,
+            // disregarding any wide types
+            int parameterIndex = 0;
+            if (!AccessFlags.STATIC.isSet(methodImpl.method.getAccessFlags())) {
+                // add the local info for the "this" parameter
+                locals[parameterIndex++] = new LocalInfo() {
+                    @Override public String getName() { return "this"; }
+                    @Override public String getType() { return methodImpl.method.getDefiningClass(); }
+                    @Override public String getSignature() { return null; }
+                };
+            }
+            while (parameterIterator.hasNext()) {
+                locals[parameterIndex++] = parameterIterator.next();
+            }
+
+            if (parameterIndex < registerCount) {
+                // now, we push the parameter locals back to their appropriate register, starting from the end
+                int localIndex = registerCount-1;
+                while(--parameterIndex > -1) {
+                    LocalInfo currentLocal = locals[parameterIndex];
+                    String type = currentLocal.getType();
+                    if (type != null && (type.equals("J") || type.equals("D"))) {
+                        localIndex--;
+                        if (localIndex == parameterIndex) {
+                            // there's no more room to push, the remaining registers are already in the correct place
+                            break;
+                        }
+                    }
+                    locals[localIndex] = currentLocal;
+                    locals[parameterIndex] = EMPTY_LOCAL_INFO;
+                    localIndex--;
+                }
+            }
+
+            return new VariableSizeLookaheadIterator<DebugItem>(dexFile.getDataBuffer(), reader.getOffset()) {
+                private int codeAddress = 0;
+                private int lineNumber = lineNumberStart;
+
+                @Nullable
+                protected DebugItem readNextItem(@Nonnull DexReader reader) {
+                    while (true) {
+                        int next = reader.readUbyte();
+                        switch (next) {
+                            case DebugItemType.END_SEQUENCE: {
+                                return endOfData();
+                            }
+                            case DebugItemType.ADVANCE_PC: {
+                                int addressDiff = reader.readSmallUleb128();
+                                codeAddress += addressDiff;
+                                continue;
+                            }
+                            case DebugItemType.ADVANCE_LINE: {
+                                int lineDiff = reader.readSleb128();
+                                lineNumber += lineDiff;
+                                continue;
+                            }
+                            case DebugItemType.START_LOCAL: {
+                                int register = reader.readSmallUleb128();
+                                String name = dexFile.getStringSection().getOptional(reader.readSmallUleb128() - 1);
+                                String type = dexFile.getTypeSection().getOptional(reader.readSmallUleb128() - 1);
+                                ImmutableStartLocal startLocal =
+                                        new ImmutableStartLocal(codeAddress, register, name, type, null);
+                                if (register >= 0 && register < locals.length) {
+                                    locals[register] = startLocal;
+                                }
+                                return startLocal;
+                            }
+                            case DebugItemType.START_LOCAL_EXTENDED: {
+                                int register = reader.readSmallUleb128();
+                                String name = dexFile.getStringSection().getOptional(reader.readSmallUleb128() - 1);
+                                String type = dexFile.getTypeSection().getOptional(reader.readSmallUleb128() - 1);
+                                String signature = dexFile.getStringSection().getOptional(
+                                        reader.readSmallUleb128() - 1);
+                                ImmutableStartLocal startLocal =
+                                        new ImmutableStartLocal(codeAddress, register, name, type, signature);
+                                if (register >= 0 && register < locals.length) {
+                                    locals[register] = startLocal;
+                                }
+                                return startLocal;
+                            }
+                            case DebugItemType.END_LOCAL: {
+                                int register = reader.readSmallUleb128();
+
+                                boolean replaceLocalInTable = true;
+                                LocalInfo localInfo;
+                                if (register >= 0 && register < locals.length) {
+                                    localInfo = locals[register];
+                                } else {
+                                    localInfo = EMPTY_LOCAL_INFO;
+                                    replaceLocalInTable = false;
+                                }
+
+                                if (localInfo instanceof EndLocal) {
+                                    localInfo = EMPTY_LOCAL_INFO;
+                                    // don't replace the local info in locals. The new EndLocal won't have any info at all,
+                                    // and we dont want to wipe out what's there, so that it is available for a subsequent
+                                    // RestartLocal
+                                    replaceLocalInTable = false;
+                                }
+                                ImmutableEndLocal endLocal =
+                                        new ImmutableEndLocal(codeAddress, register, localInfo.getName(),
+                                                localInfo.getType(), localInfo.getSignature());
+                                if (replaceLocalInTable) {
+                                    locals[register] = endLocal;
+                                }
+                                return endLocal;
+                            }
+                            case DebugItemType.RESTART_LOCAL: {
+                                int register = reader.readSmallUleb128();
+                                LocalInfo localInfo;
+                                if (register >= 0 && register < locals.length) {
+                                    localInfo = locals[register];
+                                } else {
+                                    localInfo = EMPTY_LOCAL_INFO;
+                                }
+                                ImmutableRestartLocal restartLocal =
+                                        new ImmutableRestartLocal(codeAddress, register, localInfo.getName(),
+                                                localInfo.getType(), localInfo.getSignature());
+                                if (register >= 0 && register < locals.length) {
+                                    locals[register] = restartLocal;
+                                }
+                                return restartLocal;
+                            }
+                            case DebugItemType.PROLOGUE_END: {
+                                return new ImmutablePrologueEnd(codeAddress);
+                            }
+                            case DebugItemType.EPILOGUE_BEGIN: {
+                                return new ImmutableEpilogueBegin(codeAddress);
+                            }
+                            case DebugItemType.SET_SOURCE_FILE: {
+                                String sourceFile = dexFile.getStringSection().getOptional(
+                                        reader.readSmallUleb128() - 1);
+                                return new ImmutableSetSourceFile(codeAddress, sourceFile);
+                            }
+                            default: {
+                                int adjusted = next - 0x0A;
+                                codeAddress += adjusted / 15;
+                                lineNumber += (adjusted % 15) - 4;
+                                return new ImmutableLineNumber(codeAddress, lineNumber);
+                            }
+                        }
+                    }
+                }
+            };
+        }
+
+        @Nonnull
+        @Override
+        public VariableSizeIterator<String> getParameterNames(@Nullable DexReader reader) {
+            if (reader == null) {
+                reader = dexFile.getDataBuffer().readerAt(debugInfoOffset);
+                reader.skipUleb128();
+            }
+            //TODO: make sure dalvik doesn't allow more parameter names than we have parameters
+            final int parameterNameCount = reader.readSmallUleb128();
+            return new VariableSizeIterator<String>(reader, parameterNameCount) {
+                @Override protected String readNextItem(@Nonnull DexReader reader, int index) {
+                    return dexFile.getStringSection().getOptional(reader.readSmallUleb128() - 1);
+                }
+            };
+        }
+
+        @Override
+        public int getSize() {
+            Iterator<DebugItem> iter = iterator();
+            while(iter.hasNext()) {
+                iter.next();
+            }
+            return ((VariableSizeLookaheadIterator) iter).getReaderOffset() - debugInfoOffset;
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/EncodedArrayItemIterator.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/EncodedArrayItemIterator.java
new file mode 100644
index 0000000..fbb29e6
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/EncodedArrayItemIterator.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.util;
+
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.DexReader;
+import org.jf.dexlib2.dexbacked.value.DexBackedEncodedValue;
+import org.jf.dexlib2.iface.value.EncodedValue;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public abstract class EncodedArrayItemIterator {
+    public static final EncodedArrayItemIterator EMPTY = new EncodedArrayItemIterator() {
+        @Nullable @Override public EncodedValue getNextOrNull() { return null; }
+        @Override public void skipNext() {}
+        @Override public int getReaderOffset() { return 0; }
+        @Override public int getItemCount() { return 0; }
+    };
+
+    @Nullable public abstract EncodedValue getNextOrNull();
+    public abstract void skipNext();
+    public abstract int getReaderOffset();
+    public abstract int getItemCount();
+
+    @Nonnull
+    public static EncodedArrayItemIterator newOrEmpty(@Nonnull DexBackedDexFile dexFile, int offset) {
+        if (offset == 0) {
+            return EMPTY;
+        }
+        return new EncodedArrayItemIteratorImpl(dexFile, offset);
+    }
+
+    private static class EncodedArrayItemIteratorImpl extends EncodedArrayItemIterator {
+        @Nonnull private final DexReader reader;
+        @Nonnull private final DexBackedDexFile dexFile;
+        private final int size;
+        private int index = 0;
+
+        public EncodedArrayItemIteratorImpl(@Nonnull DexBackedDexFile dexFile, int offset) {
+            this.dexFile = dexFile;
+            this.reader = dexFile.getDataBuffer().readerAt(offset);
+            this.size = reader.readSmallUleb128();
+        }
+
+        @Nullable
+        public EncodedValue getNextOrNull() {
+            if (index < size) {
+                index++;
+                return DexBackedEncodedValue.readFrom(dexFile, reader);
+            }
+            return null;
+        }
+
+        @Override
+        public void skipNext() {
+            if (index < size) {
+                index++;
+                DexBackedEncodedValue.skipFrom(reader);
+            }
+        }
+
+        @Override
+        public int getReaderOffset() {
+            return reader.getOffset();
+        }
+
+        @Override
+        public int getItemCount() {
+            return size;
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/FixedSizeList.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/FixedSizeList.java
new file mode 100644
index 0000000..b93a120
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/FixedSizeList.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.util;
+
+import javax.annotation.Nonnull;
+import java.util.AbstractList;
+
+/**
+ * This provides a thin facade over AbstractList, to take care of bounds checking.
+ * @param <T> The type of the item that this list contains
+ */
+public abstract class FixedSizeList<T> extends AbstractList<T> {
+    @Override
+    public T get(int index) {
+        if (index < 0 || index >= size()) {
+            throw new IndexOutOfBoundsException();
+        }
+        return readItem(index);
+    }
+
+    /**
+     * Reads the item at {@code index}
+     * @param index The index of the item. This is guaranteed to be in [0, size)
+     * @return The item at the given index
+     */
+    @Nonnull
+    public abstract T readItem(int index);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/FixedSizeSet.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/FixedSizeSet.java
new file mode 100644
index 0000000..c586c4d
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/FixedSizeSet.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.util;
+
+import javax.annotation.Nonnull;
+import java.util.AbstractSet;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+/**
+ * This provides a wrapper around AbstractSet to allow easy implementation when backed by a list that can be randomly
+ * accessed.
+ */
+public abstract class FixedSizeSet<T> extends AbstractSet<T> {
+    @Override
+    public Iterator<T> iterator() {
+        return new Iterator<T>() {
+            int index = 0;
+
+            @Override public boolean hasNext() { return index < size(); }
+            @Override public void remove() { throw new UnsupportedOperationException(); }
+            @Override
+            public T next() {
+                if (!hasNext()) {
+                    throw new NoSuchElementException();
+                }
+                return readItem(index++);
+            }
+        };
+    }
+
+    /**
+     * Reads the item at {@code index}
+     * @param index The index of the item. This is guaranteed to be in [0, size)
+     * @return The item at the given index
+     */
+    @Nonnull
+    public abstract T readItem(int index);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/ParameterIterator.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/ParameterIterator.java
new file mode 100644
index 0000000..333eaa7
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/ParameterIterator.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.util;
+
+import com.google.common.collect.ImmutableSet;
+import org.jf.dexlib2.base.BaseMethodParameter;
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.iface.MethodParameter;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+public class ParameterIterator implements Iterator<MethodParameter> {
+    private final Iterator<? extends CharSequence> parameterTypes;
+    private final Iterator<? extends Set<? extends Annotation>> parameterAnnotations;
+    private final Iterator<String> parameterNames;
+
+    public ParameterIterator(@Nonnull List<? extends CharSequence> parameterTypes,
+                             @Nonnull List<? extends Set<? extends Annotation>> parameterAnnotations,
+                             @Nonnull Iterator<String> parameterNames) {
+        this.parameterTypes = parameterTypes.iterator();
+        this.parameterAnnotations = parameterAnnotations.iterator();
+        this.parameterNames = parameterNames;
+    }
+
+    @Override public boolean hasNext() {
+        return parameterTypes.hasNext();
+    }
+
+    @Override public MethodParameter next() {
+        @Nonnull final String type = parameterTypes.next().toString();
+        @Nonnull final Set<? extends Annotation> annotations;
+        @Nullable final String name;
+
+        if (parameterAnnotations.hasNext()) {
+            annotations = parameterAnnotations.next();
+        } else {
+            annotations = ImmutableSet.of();
+        }
+
+        if (parameterNames.hasNext()) {
+            name = parameterNames.next();
+        } else {
+            name = null;
+        }
+
+        return new BaseMethodParameter() {
+            @Nonnull @Override public Set<? extends Annotation> getAnnotations() { return annotations; }
+            @Nullable @Override public String getName() { return name; }
+            @Nonnull @Override public String getType() { return type; }
+        };
+    }
+
+    @Override public void remove() {
+        throw new UnsupportedOperationException();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeCollection.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeCollection.java
new file mode 100644
index 0000000..50eae98
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeCollection.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.util;
+
+import org.jf.dexlib2.dexbacked.DexBuffer;
+import org.jf.dexlib2.dexbacked.DexReader;
+
+import javax.annotation.Nonnull;
+import java.util.AbstractCollection;
+
+public abstract class VariableSizeCollection<T> extends AbstractCollection<T> {
+    @Nonnull private final DexBuffer buffer;
+    private final int offset;
+    private final int size;
+
+    public VariableSizeCollection(@Nonnull DexBuffer buffer, int offset, int size) {
+        this.buffer = buffer;
+        this.offset = offset;
+        this.size = size;
+    }
+
+    protected abstract T readNextItem(@Nonnull DexReader reader, int index);
+
+    @Override
+    @Nonnull
+    public VariableSizeIterator<T> iterator() {
+        return new VariableSizeIterator<T>(buffer, offset, size) {
+            @Override
+            protected T readNextItem(@Nonnull DexReader reader, int index) {
+                return VariableSizeCollection.this.readNextItem(reader, index);
+            }
+        };
+    }
+
+    @Override public int size() { return size; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeIterator.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeIterator.java
new file mode 100644
index 0000000..b063b03
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeIterator.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.util;
+
+import org.jf.dexlib2.dexbacked.DexBuffer;
+import org.jf.dexlib2.dexbacked.DexReader;
+
+import javax.annotation.Nonnull;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+public abstract class VariableSizeIterator<T> implements Iterator<T> {
+    @Nonnull private final DexReader reader;
+    protected final int size;
+
+    private int index;
+
+    protected VariableSizeIterator(@Nonnull DexBuffer buffer, int offset, int size) {
+        this.reader = buffer.readerAt(offset);
+        this.size = size;
+    }
+
+    protected VariableSizeIterator(@Nonnull DexReader reader, int size) {
+        this.reader = reader;
+        this.size = size;
+    }
+
+    /**
+     * Reads the next item from reader.
+     *
+     * @param reader The {@code DexReader} to read the next item from
+     * @param index The index of the item being read. This is guaranteed to be less than {@code size}
+     * @return The item that was read
+     */
+    protected abstract T readNextItem(@Nonnull DexReader reader, int index);
+
+    public int getReaderOffset() {
+        return reader.getOffset();
+    }
+
+    @Override
+    public boolean hasNext() {
+        return index < size;
+    }
+
+    @Override
+    public T next() {
+        if (index >= size) {
+            throw new NoSuchElementException();
+        }
+        return readNextItem(reader, index++);
+    }
+
+    @Override public void remove() { throw new UnsupportedOperationException(); }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeList.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeList.java
new file mode 100644
index 0000000..9eecf24
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeList.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.util;
+
+import org.jf.dexlib2.dexbacked.DexBuffer;
+import org.jf.dexlib2.dexbacked.DexReader;
+
+import javax.annotation.Nonnull;
+import java.util.AbstractSequentialList;
+
+public abstract class VariableSizeList<T> extends AbstractSequentialList<T> {
+    @Nonnull private final DexBuffer buffer;
+    private final int offset;
+    private final int size;
+
+    public VariableSizeList(@Nonnull DexBuffer buffer, int offset, int size) {
+        this.buffer = buffer;
+        this.offset = offset;
+        this.size = size;
+    }
+
+    protected abstract T readNextItem(@Nonnull DexReader reader, int index);
+
+    @Override
+    @Nonnull
+    public VariableSizeListIterator<T> listIterator() {
+        return listIterator(0);
+    }
+
+    @Override public int size() { return size; }
+
+    @Nonnull
+    @Override
+    public VariableSizeListIterator<T> listIterator(int index) {
+        VariableSizeListIterator<T> iterator = new VariableSizeListIterator<T>(buffer, offset, size) {
+            @Override
+            protected T readNextItem(@Nonnull DexReader reader, int index) {
+                return VariableSizeList.this.readNextItem(reader, index);
+            }
+        };
+        for (int i=0; i<index; i++) {
+            iterator.next();
+        }
+        return iterator;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeListIterator.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeListIterator.java
new file mode 100644
index 0000000..ffab0f7
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeListIterator.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.util;
+
+import org.jf.dexlib2.dexbacked.DexBuffer;
+import org.jf.dexlib2.dexbacked.DexReader;
+
+import javax.annotation.Nonnull;
+import java.util.ListIterator;
+import java.util.NoSuchElementException;
+
+public abstract class VariableSizeListIterator<T> implements ListIterator<T> {
+    @Nonnull private DexReader<? extends DexBuffer> reader;
+    protected final int size;
+    private final int startOffset;
+
+    private int index;
+
+    protected VariableSizeListIterator(@Nonnull DexBuffer buffer, int offset, int size) {
+        this.reader = buffer.readerAt(offset);
+        this.startOffset = offset;
+        this.size = size;
+    }
+
+    /**
+     * Reads the next item from reader.
+     *
+     * @param reader The {@code DexReader} to read the next item from
+     * @param index The index of the item being read. This is guaranteed to be less than {@code size}
+     * @return The item that was read
+     */
+    protected abstract T readNextItem(@Nonnull DexReader<? extends DexBuffer> reader, int index);
+
+    public int getReaderOffset() {
+        return reader.getOffset();
+    }
+
+    @Override
+    public boolean hasNext() {
+        return index < size;
+    }
+
+    @Override
+    public T next() {
+        if (index >= size) {
+            throw new NoSuchElementException();
+        }
+        return readNextItem(reader, index++);
+    }
+
+    @Override
+    public boolean hasPrevious() {
+        return index > 0;
+    }
+
+    @Override
+    public T previous() {
+        int targetIndex = index-1;
+        reader.setOffset(startOffset);
+        index = 0;
+        while (index < targetIndex) {
+            readNextItem(reader, index++);
+        }
+        return readNextItem(reader, index++);
+    }
+
+    @Override
+    public int nextIndex() {
+        return index;
+    }
+
+    @Override
+    public int previousIndex() {
+        return index - 1;
+    }
+
+    @Override public void remove() { throw new UnsupportedOperationException(); }
+    @Override public void set(T t) { throw new UnsupportedOperationException(); }
+    @Override public void add(T t) { throw new UnsupportedOperationException(); }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeLookaheadIterator.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeLookaheadIterator.java
new file mode 100644
index 0000000..9b7e302
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeLookaheadIterator.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.util;
+
+import com.google.common.collect.AbstractIterator;
+import org.jf.dexlib2.dexbacked.DexBuffer;
+import org.jf.dexlib2.dexbacked.DexReader;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Iterator;
+
+public abstract class VariableSizeLookaheadIterator<T> extends AbstractIterator<T> implements Iterator<T> {
+    @Nonnull private final DexReader reader;
+
+    protected VariableSizeLookaheadIterator(@Nonnull DexBuffer buffer, int offset) {
+        this.reader = buffer.readerAt(offset);
+    }
+
+    /**
+     * Reads the next item from reader. If the end of the list has been reached, it should call endOfData.
+     *
+     * endOfData has a return value of T, so you can simply {@code return endOfData()}
+     *
+     * @return The item that was read. If endOfData was called, the return value is ignored.
+     */
+    @Nullable protected abstract T readNextItem(@Nonnull DexReader reader);
+
+    @Override
+    protected T computeNext() {
+        return readNextItem(reader);
+    }
+
+    public final int getReaderOffset() {
+        return reader.getOffset();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeSet.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeSet.java
new file mode 100644
index 0000000..dd1c64b
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeSet.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.util;
+
+import org.jf.dexlib2.dexbacked.DexBuffer;
+import org.jf.dexlib2.dexbacked.DexReader;
+
+import javax.annotation.Nonnull;
+import java.util.AbstractSet;
+
+public abstract class VariableSizeSet<T> extends AbstractSet<T> {
+    @Nonnull private final DexBuffer buffer;
+    private final int offset;
+    private final int size;
+
+    public VariableSizeSet(@Nonnull DexBuffer buffer, int offset, int size) {
+        this.buffer = buffer;
+        this.offset = offset;
+        this.size = size;
+    }
+
+    protected abstract T readNextItem(@Nonnull DexReader reader, int index);
+
+    @Override
+    @Nonnull
+    public VariableSizeIterator<T> iterator() {
+        return new VariableSizeIterator<T>(buffer, offset, size) {
+            @Override
+            protected T readNextItem(@Nonnull DexReader reader, int index) {
+                return VariableSizeSet.this.readNextItem(reader, index);
+            }
+        };
+    }
+
+    @Override public int size() { return size; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedAnnotationEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedAnnotationEncodedValue.java
new file mode 100644
index 0000000..baed27b
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedAnnotationEncodedValue.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.value;
+
+import org.jf.dexlib2.base.value.BaseAnnotationEncodedValue;
+import org.jf.dexlib2.dexbacked.DexBackedAnnotationElement;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.DexReader;
+import org.jf.dexlib2.dexbacked.util.VariableSizeSet;
+import org.jf.dexlib2.iface.value.AnnotationEncodedValue;
+
+import javax.annotation.Nonnull;
+import java.util.Set;
+
+public class DexBackedAnnotationEncodedValue extends BaseAnnotationEncodedValue implements AnnotationEncodedValue {
+    @Nonnull public final DexBackedDexFile dexFile;
+    @Nonnull public final String type;
+    private final int elementCount;
+    private final int elementsOffset;
+
+    public DexBackedAnnotationEncodedValue(@Nonnull DexBackedDexFile dexFile, @Nonnull DexReader reader) {
+        this.dexFile = dexFile;
+        this.type = dexFile.getTypeSection().get(reader.readSmallUleb128());
+        this.elementCount = reader.readSmallUleb128();
+        this.elementsOffset = reader.getOffset();
+        skipElements(reader, elementCount);
+    }
+
+    public static void skipFrom(@Nonnull DexReader reader) {
+        reader.skipUleb128(); // type
+        int elementCount = reader.readSmallUleb128();
+        skipElements(reader, elementCount);
+    }
+
+    private static void skipElements(@Nonnull DexReader reader, int elementCount) {
+        for (int i=0; i<elementCount; i++) {
+            reader.skipUleb128();
+            DexBackedEncodedValue.skipFrom(reader);
+        }
+    }
+
+    @Nonnull @Override public String getType() { return type; }
+
+    @Nonnull
+    @Override
+    public Set<? extends DexBackedAnnotationElement> getElements() {
+        return new VariableSizeSet<DexBackedAnnotationElement>(dexFile.getDataBuffer(), elementsOffset, elementCount) {
+            @Nonnull
+            @Override
+            protected DexBackedAnnotationElement readNextItem(@Nonnull DexReader dexReader, int index) {
+                return new DexBackedAnnotationElement(dexFile, dexReader);
+            }
+        };
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedArrayEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedArrayEncodedValue.java
new file mode 100644
index 0000000..428233e
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedArrayEncodedValue.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.value;
+
+import org.jf.dexlib2.base.value.BaseArrayEncodedValue;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.DexReader;
+import org.jf.dexlib2.dexbacked.util.VariableSizeList;
+import org.jf.dexlib2.iface.value.ArrayEncodedValue;
+import org.jf.dexlib2.iface.value.EncodedValue;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+public class DexBackedArrayEncodedValue extends BaseArrayEncodedValue implements ArrayEncodedValue {
+    @Nonnull public final DexBackedDexFile dexFile;
+    private final int elementCount;
+    private final int encodedArrayOffset;
+
+    public DexBackedArrayEncodedValue(@Nonnull DexBackedDexFile dexFile, @Nonnull DexReader reader) {
+        this.dexFile = dexFile;
+        this.elementCount = reader.readSmallUleb128();
+        this.encodedArrayOffset = reader.getOffset();
+        skipElementsFrom(reader, elementCount);
+    }
+
+    public static void skipFrom(@Nonnull DexReader reader) {
+        int elementCount = reader.readSmallUleb128();
+        skipElementsFrom(reader, elementCount);
+    }
+
+    private static void skipElementsFrom(@Nonnull DexReader reader, int elementCount) {
+        for (int i=0; i<elementCount; i++) {
+            DexBackedEncodedValue.skipFrom(reader);
+        }
+    }
+
+    @Nonnull
+    @Override
+    public List<? extends EncodedValue> getValue() {
+        return new VariableSizeList<EncodedValue>(dexFile.getDataBuffer(), encodedArrayOffset, elementCount) {
+            @Nonnull
+            @Override
+            protected EncodedValue readNextItem(@Nonnull DexReader dexReader, int index) {
+                return DexBackedEncodedValue.readFrom(dexFile, dexReader);
+            }
+        };
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedEncodedValue.java
new file mode 100644
index 0000000..cfc691a
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedEncodedValue.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.value;
+
+import org.jf.dexlib2.ValueType;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.DexReader;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.dexlib2.immutable.value.*;
+import org.jf.dexlib2.util.Preconditions;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+
+public abstract class DexBackedEncodedValue {
+    @Nonnull
+    public static EncodedValue readFrom(@Nonnull DexBackedDexFile dexFile, @Nonnull DexReader reader) {
+        int startOffset = reader.getOffset();
+
+        try {
+            int b = reader.readUbyte();
+            int valueType = b & 0x1f;
+            int valueArg = b >>> 5;
+
+            switch (valueType) {
+                case ValueType.BYTE:
+                    Preconditions.checkValueArg(valueArg, 0);
+                    return new ImmutableByteEncodedValue((byte)reader.readByte());
+                case ValueType.SHORT:
+                    Preconditions.checkValueArg(valueArg, 1);
+                    return new ImmutableShortEncodedValue((short)reader.readSizedInt(valueArg + 1));
+                case ValueType.CHAR:
+                    Preconditions.checkValueArg(valueArg, 1);
+                    return new ImmutableCharEncodedValue((char)reader.readSizedSmallUint(valueArg + 1));
+                case ValueType.INT:
+                    Preconditions.checkValueArg(valueArg, 3);
+                    return new ImmutableIntEncodedValue(reader.readSizedInt(valueArg + 1));
+                case ValueType.LONG:
+                    Preconditions.checkValueArg(valueArg, 7);
+                    return new ImmutableLongEncodedValue(reader.readSizedLong(valueArg + 1));
+                case ValueType.FLOAT:
+                    Preconditions.checkValueArg(valueArg, 3);
+                    return new ImmutableFloatEncodedValue(Float.intBitsToFloat(
+                            reader.readSizedRightExtendedInt(valueArg + 1)));
+                case ValueType.DOUBLE:
+                    Preconditions.checkValueArg(valueArg, 7);
+                    return new ImmutableDoubleEncodedValue(Double.longBitsToDouble(
+                            reader.readSizedRightExtendedLong(valueArg + 1)));
+                case ValueType.STRING:
+                    Preconditions.checkValueArg(valueArg, 3);
+                    return new DexBackedStringEncodedValue(dexFile, reader, valueArg);
+                case ValueType.TYPE:
+                    Preconditions.checkValueArg(valueArg, 3);
+                    return new DexBackedTypeEncodedValue(dexFile, reader, valueArg);
+                case ValueType.FIELD:
+                    Preconditions.checkValueArg(valueArg, 3);
+                    return new DexBackedFieldEncodedValue(dexFile, reader, valueArg);
+                case ValueType.METHOD:
+                    Preconditions.checkValueArg(valueArg, 3);
+                    return new DexBackedMethodEncodedValue(dexFile, reader, valueArg);
+                case ValueType.ENUM:
+                    Preconditions.checkValueArg(valueArg, 3);
+                    return new DexBackedEnumEncodedValue(dexFile, reader, valueArg);
+                case ValueType.ARRAY:
+                    Preconditions.checkValueArg(valueArg, 0);
+                    return new DexBackedArrayEncodedValue(dexFile, reader);
+                case ValueType.ANNOTATION:
+                    Preconditions.checkValueArg(valueArg, 0);
+                    return new DexBackedAnnotationEncodedValue(dexFile, reader);
+                case ValueType.NULL:
+                    Preconditions.checkValueArg(valueArg, 0);
+                    return ImmutableNullEncodedValue.INSTANCE;
+                case ValueType.BOOLEAN:
+                    Preconditions.checkValueArg(valueArg, 1);
+                    return ImmutableBooleanEncodedValue.forBoolean(valueArg == 1);
+                case ValueType.METHOD_HANDLE:
+                    Preconditions.checkValueArg(valueArg, 3);
+                    return new DexBackedMethodHandleEncodedValue(dexFile, reader, valueArg);
+                case ValueType.METHOD_TYPE:
+                    Preconditions.checkValueArg(valueArg, 3);
+                    return new DexBackedMethodTypeEncodedValue(dexFile, reader, valueArg);
+                default:
+                    throw new ExceptionWithContext("Invalid encoded_value type: 0x%x", valueType);
+            }
+        } catch (Exception ex) {
+            throw ExceptionWithContext.withContext(ex, "Error while reading encoded value at offset 0x%x", startOffset);
+        }
+    }
+
+    public static void skipFrom(@Nonnull DexReader reader) {
+        int startOffset = reader.getOffset();
+
+        try {
+            int b = reader.readUbyte();
+            int valueType = b & 0x1f;
+
+            switch (valueType) {
+                case ValueType.BYTE:
+                    reader.skipByte();
+                    break;
+                case ValueType.SHORT:
+                case ValueType.CHAR:
+                case ValueType.INT:
+                case ValueType.LONG:
+                case ValueType.FLOAT:
+                case ValueType.DOUBLE:
+                case ValueType.STRING:
+                case ValueType.TYPE:
+                case ValueType.FIELD:
+                case ValueType.METHOD:
+                case ValueType.ENUM:
+                case ValueType.METHOD_HANDLE:
+                case ValueType.METHOD_TYPE:
+                    int valueArg = b >>> 5;
+                    reader.moveRelative(valueArg+1);
+                    break;
+                case ValueType.ARRAY:
+                    DexBackedArrayEncodedValue.skipFrom(reader);
+                    break;
+                case ValueType.ANNOTATION:
+                    DexBackedAnnotationEncodedValue.skipFrom(reader);
+                    break;
+                case ValueType.NULL:
+                case ValueType.BOOLEAN:
+                    break;
+                default:
+                    throw new ExceptionWithContext("Invalid encoded_value type: 0x%x", valueType);
+            }
+        } catch (Exception ex) {
+            throw ExceptionWithContext.withContext(ex, "Error while skipping encoded value at offset 0x%x",
+                    startOffset);
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedEnumEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedEnumEncodedValue.java
new file mode 100644
index 0000000..ca0ad09
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedEnumEncodedValue.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.value;
+
+import org.jf.dexlib2.base.value.BaseEnumEncodedValue;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.DexReader;
+import org.jf.dexlib2.dexbacked.reference.DexBackedFieldReference;
+import org.jf.dexlib2.iface.reference.FieldReference;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedEnumEncodedValue extends BaseEnumEncodedValue {
+    @Nonnull public final DexBackedDexFile dexFile;
+    private final int fieldIndex;
+
+    public DexBackedEnumEncodedValue(@Nonnull DexBackedDexFile dexFile, @Nonnull DexReader reader, int valueArg) {
+        this.dexFile = dexFile;
+        fieldIndex = reader.readSizedSmallUint(valueArg + 1);
+    }
+
+    @Nonnull @Override public FieldReference getValue() {
+        return new DexBackedFieldReference(dexFile, fieldIndex);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedFieldEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedFieldEncodedValue.java
new file mode 100644
index 0000000..bd0aa3f
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedFieldEncodedValue.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.value;
+
+import org.jf.dexlib2.base.value.BaseFieldEncodedValue;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.DexReader;
+import org.jf.dexlib2.dexbacked.reference.DexBackedFieldReference;
+import org.jf.dexlib2.iface.reference.FieldReference;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedFieldEncodedValue extends BaseFieldEncodedValue {
+    @Nonnull public final DexBackedDexFile dexFile;
+    private final int fieldIndex;
+
+    public DexBackedFieldEncodedValue(@Nonnull DexBackedDexFile dexFile, @Nonnull DexReader reader, int valueArg) {
+        this.dexFile = dexFile;
+        fieldIndex = reader.readSizedSmallUint(valueArg + 1);
+    }
+
+    @Nonnull @Override public FieldReference getValue() {
+        return new DexBackedFieldReference(dexFile, fieldIndex);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedMethodEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedMethodEncodedValue.java
new file mode 100644
index 0000000..c960538
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedMethodEncodedValue.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.value;
+
+import org.jf.dexlib2.base.value.BaseMethodEncodedValue;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.DexReader;
+import org.jf.dexlib2.dexbacked.reference.DexBackedMethodReference;
+import org.jf.dexlib2.iface.reference.MethodReference;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedMethodEncodedValue extends BaseMethodEncodedValue {
+    @Nonnull public final DexBackedDexFile dexFile;
+    private final int methodIndex;
+
+    public DexBackedMethodEncodedValue(@Nonnull DexBackedDexFile dexFile, @Nonnull DexReader reader, int valueArg) {
+        this.dexFile = dexFile;
+        methodIndex = reader.readSizedSmallUint(valueArg + 1);
+    }
+
+    @Nonnull @Override public MethodReference getValue() {
+        return new DexBackedMethodReference(dexFile, methodIndex);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedMethodHandleEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedMethodHandleEncodedValue.java
new file mode 100644
index 0000000..90519a3
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedMethodHandleEncodedValue.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.value;
+
+import org.jf.dexlib2.base.value.BaseMethodHandleEncodedValue;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.DexReader;
+import org.jf.dexlib2.dexbacked.reference.DexBackedMethodHandleReference;
+import org.jf.dexlib2.iface.reference.MethodHandleReference;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedMethodHandleEncodedValue extends BaseMethodHandleEncodedValue {
+    @Nonnull public final DexBackedDexFile dexFile;
+    private final int methodHandleIndex;
+
+    public DexBackedMethodHandleEncodedValue(
+            @Nonnull DexBackedDexFile dexFile, @Nonnull DexReader reader, int valueArg) {
+        this.dexFile = dexFile;
+        this.methodHandleIndex = reader.readSizedSmallUint(valueArg + 1);
+    }
+
+    @Nonnull
+    @Override
+    public MethodHandleReference getValue() {
+        return new DexBackedMethodHandleReference(dexFile, methodHandleIndex);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedMethodTypeEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedMethodTypeEncodedValue.java
new file mode 100644
index 0000000..a4ce41c
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedMethodTypeEncodedValue.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.value;
+
+import org.jf.dexlib2.base.value.BaseMethodTypeEncodedValue;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.DexReader;
+import org.jf.dexlib2.dexbacked.reference.DexBackedMethodProtoReference;
+import org.jf.dexlib2.iface.reference.MethodProtoReference;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedMethodTypeEncodedValue extends BaseMethodTypeEncodedValue {
+    @Nonnull public final DexBackedDexFile dexFile;
+    private final int methodProtoIndex;
+
+    public DexBackedMethodTypeEncodedValue(@Nonnull DexBackedDexFile dexFile, @Nonnull DexReader reader, int valueArg) {
+        this.dexFile = dexFile;
+        this.methodProtoIndex = reader.readSizedSmallUint(valueArg + 1);
+    }
+
+    @Nonnull
+    @Override
+    public MethodProtoReference getValue() {
+        return new DexBackedMethodProtoReference(dexFile, methodProtoIndex);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedStringEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedStringEncodedValue.java
new file mode 100644
index 0000000..028a19b
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedStringEncodedValue.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.value;
+
+import org.jf.dexlib2.base.value.BaseStringEncodedValue;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.DexReader;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedStringEncodedValue extends BaseStringEncodedValue {
+    @Nonnull public final DexBackedDexFile dexFile;
+    private final int stringIndex;
+
+    public DexBackedStringEncodedValue(@Nonnull DexBackedDexFile dexFile, @Nonnull DexReader reader, int valueArg) {
+        this.dexFile = dexFile;
+        stringIndex = reader.readSizedSmallUint(valueArg + 1);
+    }
+
+    @Nonnull @Override public String getValue() {
+        return dexFile.getStringSection().get(stringIndex);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedTypeEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedTypeEncodedValue.java
new file mode 100644
index 0000000..ac09285
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedTypeEncodedValue.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked.value;
+
+import org.jf.dexlib2.base.value.BaseTypeEncodedValue;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.DexReader;
+
+import javax.annotation.Nonnull;
+
+public class DexBackedTypeEncodedValue extends BaseTypeEncodedValue {
+    @Nonnull public final DexBackedDexFile dexFile;
+    private final int typeIndex;
+
+    public DexBackedTypeEncodedValue(@Nonnull DexBackedDexFile dexFile, @Nonnull DexReader reader, int valueArg) {
+        this.dexFile = dexFile;
+        typeIndex = reader.readSizedSmallUint(valueArg + 1);
+    }
+
+    @Nonnull @Override public String getValue() {
+        return dexFile.getTypeSection().get(typeIndex);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/Annotatable.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/Annotatable.java
new file mode 100644
index 0000000..f16c207
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/Annotatable.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface;
+
+import javax.annotation.Nonnull;
+import java.util.Set;
+
+/**
+ * This class represents an object that can have Annotations applied to it
+ */
+public interface Annotatable {
+    /**
+     * Gets a set of the annotations that are applied to this object.
+     *
+     * The annotations in the returned set are guaranteed to have unique types.
+     *
+     * @return A set of the annotations that are applied to this object
+     */
+    @Nonnull Set<? extends Annotation> getAnnotations();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/Annotation.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/Annotation.java
new file mode 100644
index 0000000..7c107a4
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/Annotation.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Set;
+
+/**
+ * This class represents a specific instance of an annotation applied to a class/field/method/parameter
+ */
+public interface Annotation extends BasicAnnotation, Comparable<Annotation> {
+    /**
+     * Gets the visibility of this annotation.
+     *
+     * This will be one of the AnnotationVisibility.* constants.
+     *
+     * @return The visibility of this annotation
+     */
+    int getVisibility();
+
+    /**
+     * Gets the type of this annotation.
+     *
+     * This will be the type descriptor of the class that defines this annotation.
+     *
+     * @return The type of this annotation
+     */
+    @Nonnull @Override String getType();
+
+    /**
+     * Gets a set of the name/value elements associated with this annotation.
+     *
+     * The elements in the returned set will be unique with respect to the element name.
+     *
+     * @return A set of AnnotationElements
+     */
+    @Nonnull @Override Set<? extends AnnotationElement> getElements();
+
+    /**
+     * Returns a hashcode for this Annotation.
+     *
+     * This hashCode is defined to be the following:
+     *
+     * <pre>
+     * {@code
+     * int hashCode = getVisibility();
+     * hashCode = hashCode*31 + getType().hashCode();
+     * hashCode = hashCode*31 + getElements().hashCode();
+     * }</pre>
+     *
+     * @return The hash code value for this Annotation
+     */
+    @Override int hashCode();
+
+    /**
+     * Compares this Annotation to another Annotation for equality.
+     *
+     * This Annotation is equal to another Annotation if all of it's "fields" are equal. That is, if the return values
+     * of getVisibility(), getType(), and getElements() are all equal.
+     *
+     * @param o The object to be compared for equality with this Annotation
+     * @return true if the specified object is equal to this Annotation
+     */
+    @Override boolean equals(@Nullable Object o);
+
+    /**
+     * Compares this Annotation to another Annotation.
+     *
+     * The comparison is based on the value of getVisibility(), getType() and getElements(), in that order. When
+     * comparing the set of elements, the comparison is done with the semantics of
+     * org.jf.util.CollectionUtils.compareAsSet(), using the natural ordering of AnnotationElement.
+     *
+     * @param o The Annotation to compare with this Annotation
+     * @return An integer representing the result of the comparison
+     */
+    @Override int compareTo(Annotation o);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/AnnotationElement.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/AnnotationElement.java
new file mode 100644
index 0000000..0ac61cc
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/AnnotationElement.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface;
+
+import org.jf.dexlib2.iface.value.EncodedValue;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * This class represents an individual name/value element in an annotation
+ */
+public interface AnnotationElement extends Comparable<AnnotationElement> {
+    /**
+     * Gets the name of the element.
+     *
+     * @return The name of the element.
+     */
+    @Nonnull String getName();
+
+    /**
+     * Gets the value of the element.
+     *
+     * @return The value of the element
+     */
+    @Nonnull EncodedValue getValue();
+
+    /**
+     * Returns a hashcode for this AnnotationElement.
+     *
+     * This hashCode is defined to be the following:
+     *
+     * <pre>
+     * {@code
+     * int hashCode = getName().hashCode();
+     * hashCode = hashCode*31 + getValue().hashCode();
+     * }</pre>
+     *
+     * @return The hash code value for this AnnotationElement
+     */
+    @Override int hashCode();
+
+    /**
+     * Compares this AnnotationElement to another AnnotationElement for equality.
+     *
+     * This AnnotationElement is equal to another AnnotationElement if all of it's "fields" are equal. That is, if
+     * the return values of getName() and getValue() are both equal.
+     *
+     * @param o The object to be compared for equality with this AnnotationElement
+     * @return true if the specified object is equal to this AnnotationElement
+     */
+    @Override boolean equals(@Nullable Object o);
+
+    /**
+     * Compares this AnnotationElement to another AnnotationElement.
+     *
+     * The comparison is based on the value of getName() and getValue(), in that order.
+     *
+     * @param o The AnnotationElement to compare with this AnnotationElement
+     * @return An integer representing the result of the comparison
+     */
+    @Override int compareTo(AnnotationElement o);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/BasicAnnotation.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/BasicAnnotation.java
new file mode 100644
index 0000000..4433b6a
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/BasicAnnotation.java
@@ -0,0 +1,27 @@
+package org.jf.dexlib2.iface;
+
+import javax.annotation.Nonnull;
+import java.util.Set;
+
+/**
+ * This represents a basic annotation, and serves as a common superclass for Annotation and AnnotationEncodedValue
+ */
+public interface BasicAnnotation {
+    /**
+     * Gets the type of this annotation.
+     *
+     * This will be the type descriptor of the class that defines this annotation.
+     *
+     * @return The type of this annotation
+     */
+    @Nonnull String getType();
+
+    /**
+     * Gets a set of the name/value elements associated with this annotation.
+     *
+     * The elements in the returned set will be unique with respect to the element name.
+     *
+     * @return A set of AnnotationElements
+     */
+    @Nonnull Set<? extends AnnotationElement> getElements();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/ClassDef.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/ClassDef.java
new file mode 100644
index 0000000..78e17b1
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/ClassDef.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface;
+
+import org.jf.dexlib2.iface.reference.TypeReference;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * This class represents a class definition.
+ *
+ * It also acts as a TypeReference to itself. Any equality/comparison is based on its identity as a TypeReference,
+ * and shouldn't take into account anything other than the type of this class.
+ */
+public interface ClassDef extends TypeReference, Annotatable {
+    /**
+     * Gets the class type.
+     *
+     * This will be a type descriptor per the dex file specification.
+     *
+     * @return The class type
+     */
+    @Override @Nonnull String getType();
+
+    /**
+     * Gets the access flags for this class.
+     *
+     * This will be a combination of the AccessFlags.* flags that are marked as compatible for use with a class.
+     *
+     * @return The access flags for this class
+     */
+    int getAccessFlags();
+
+    /**
+     * Gets the superclass of this class.
+     *
+     * This will only be null if this is the base java.lang.Object class.
+     *
+     * @return The superclass of this class
+     */
+    @Nullable String getSuperclass();
+
+    /**
+     * Gets a list of the interfaces that this class implements.
+     *
+     * @return A list of the interfaces that this class implements
+     */
+    @Nonnull List<String> getInterfaces();
+
+    /**
+     * Gets the name of the primary source file that this class is defined in, if available.
+     *
+     * This will be the default source file associated with all methods defined in this class. This can be overridden
+     * for sections of an individual method with the SetSourceFile debug item.
+     *
+     * @return The name of the primary source file for this class, or null if not available
+     */
+    @Nullable String getSourceFile();
+
+    /**
+     * Gets a set of the annotations that are applied to this class.
+     *
+     * The annotations in the returned set are guaranteed to have unique types.
+     *
+     * @return A set of the annotations that are applied to this class
+     */
+    @Override @Nonnull Set<? extends Annotation> getAnnotations();
+
+    /**
+     * Gets the static fields that are defined by this class.
+     *
+     * The static fields that are returned must have no duplicates.
+     *
+     * @return The static fields that are defined by this class
+     */
+    @Nonnull Iterable<? extends Field> getStaticFields();
+
+    /**
+     * Gets the instance fields that are defined by this class.
+     *
+     * The instance fields that are returned must have no duplicates.
+     *
+     * @return The instance fields that are defined by this class
+     */
+    @Nonnull Iterable<? extends Field> getInstanceFields();
+
+    /**
+     * Gets all the fields that are defined by this class.
+     *
+     * This is a convenience method that combines getStaticFields() and getInstanceFields()
+     *
+     * The returned fields may be in any order. I.e. It's not safe to assume that all instance fields will come after
+     * all static fields.
+     *
+     * Note that there typically should not be any duplicate fields between the two, but some versions of
+     * dalvik inadvertently allow duplicate static/instance fields, and are supported here for completeness
+     *
+     * @return A set of the fields that are defined by this class
+     */
+    @Nonnull Iterable<? extends Field> getFields();
+
+    /**
+     * Gets the direct methods that are defined by this class.
+     *
+     * The direct methods that are returned must have no duplicates.
+     *
+     * @return The direct methods that are defined by this class.
+     */
+    @Nonnull Iterable<? extends Method> getDirectMethods();
+
+    /**
+     * Gets the virtual methods that are defined by this class.
+     *
+     * The virtual methods that are returned must have no duplicates.
+     *
+     * @return The virtual methods that are defined by this class.
+     */
+    @Nonnull Iterable<? extends Method> getVirtualMethods();
+
+    /**
+     * Gets all the methods that are defined by this class.
+     *
+     * This is a convenience method that combines getDirectMethods() and getVirtualMethods().
+     *
+     * The returned methods may be in any order. I.e. It's not safe to assume that all virtual methods will come after
+     * all direct methods.
+     *
+     * Note that there typically should not be any duplicate methods between the two, but some versions of
+     * dalvik inadvertently allow duplicate direct/virtual methods, and are supported here for completeness
+     *
+     * @return An iterable of the methods that are defined by this class.
+     */
+    @Nonnull Iterable<? extends Method> getMethods();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/DexFile.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/DexFile.java
new file mode 100644
index 0000000..474bfb1
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/DexFile.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface;
+
+import org.jf.dexlib2.Opcodes;
+
+import javax.annotation.Nonnull;
+import java.util.Set;
+
+/**
+ * This class is a high level representation of a dex file - essentially a set of class definitions.
+ */
+public interface DexFile {
+    /**
+     * Get a set of the classes defined in this dex file.
+     *
+     * The classes in the returned set will all have unique types.
+     *
+     * @return A set of the classes defined in this dex file
+     */
+    @Nonnull Set<? extends ClassDef> getClasses();
+
+    /**
+     * Get the Opcodes associated with this dex file
+     *
+     * @return The Opcodes instance representing the possible opcodes that can be encountered in this dex file
+     */
+    @Nonnull Opcodes getOpcodes();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/ExceptionHandler.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/ExceptionHandler.java
new file mode 100644
index 0000000..ede016e
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/ExceptionHandler.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface;
+
+import org.jf.dexlib2.iface.reference.TypeReference;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * This class represents an individual exception handler entry, in a try block.
+ */
+public interface ExceptionHandler extends Comparable<ExceptionHandler> {
+    /**
+     * Gets the type of exception that is handled by this handler.
+     *
+     * @return The type of exception that is handled by this handler, or null if this is a catch-all handler.
+     */
+    @Nullable String getExceptionType();
+
+    /**
+     * Gets the type of exception that is handled by this handler.
+     *
+     * @return A TypeReference to the type of exception that is handled by this handler, or null if this is a
+     * catch-all handler.
+     */
+    @Nullable TypeReference getExceptionTypeReference();
+
+    /**
+     * Gets the code offset of the handler.
+     *
+     * @return The offset of the handler from the the beginning of the bytecode for the method. The offset will be in
+     * terms of 16-bit code units
+     */
+    int getHandlerCodeAddress();
+
+    /**
+     * Returns a hashcode for this ExceptionHandler.
+     *
+     * This hashCode is defined to be the following:
+     *
+     * <pre>
+     * {@code
+     * String exceptionType = getExceptionType();
+     * int hashCode = exceptionType==null?0:exceptionType.hashCode();
+     * return hashCode*31 + getHandlerCodeAddress();
+     * }</pre>
+     *
+     * @return The hash code value for this ExceptionHandler
+     */
+    @Override int hashCode();
+
+    /**
+     * Compares this ExceptionHandler to another ExceptionHandler for equality.
+     *
+     * This ExceptionHandler is equal to another ExceptionHandler if all of it's "fields" are equal. That is, if
+     * the return values of getExceptionType() and getHandlerCodeAddress() are both equal.
+     *
+     * @param o The object to be compared for equality with this ExceptionHandler
+     * @return true if the specified object is equal to this ExceptionHandler
+     */
+    @Override boolean equals(@Nullable Object o);
+
+    /**
+     * Compare this ExceptionHandler to another ExceptionHandler.
+     *
+     * The comparison is based on the comparison of the return values of getExceptionType() and
+     * getHandlerCodeAddress() in that order. A null value for getExceptionType() compares after a non-null value.
+     *
+     * @param o The ExceptionHandler to compare with this ExceptionHandler
+     * @return An integer representing the result of the comparison
+     */
+    @Override int compareTo(@Nonnull ExceptionHandler o);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/Field.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/Field.java
new file mode 100644
index 0000000..179520f
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/Field.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface;
+
+import org.jf.dexlib2.HiddenApiRestriction;
+import org.jf.dexlib2.iface.reference.FieldReference;
+import org.jf.dexlib2.iface.value.EncodedValue;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Set;
+
+/**
+ * This class represents a specific field definition in a class.
+ *
+ * It also acts as a FieldReference to itself. Any equality/comparison is based on its identity as a FieldReference,
+ * and shouldn't take into account any non-FieldReference specifics of this field.
+ */
+public interface Field extends FieldReference, Member {
+    /**
+     * Gets the type of the class that defines this field.
+     *
+     * @return The type of the class that defines this field
+     */
+    @Override @Nonnull String getDefiningClass();
+
+    /**
+     * Gets the name of this field.
+     *
+     * @return The name of this field
+     */
+    @Override @Nonnull String getName();
+
+    /**
+     * Gets the type of this field.
+     *
+     * @return The type of this field
+     */
+    @Override @Nonnull String getType();
+
+    /**
+     * Gets the access flags for this field.
+     *
+     * This will be a combination of the AccessFlags.* flags that are marked as compatible for use with a field.
+     *
+     * @return The access flags for this field
+     */
+    @Override int getAccessFlags();
+
+    /**
+     * Gets the initial value for this field, if available.
+     *
+     * Only static field may have an initial value set, but are not required to have an initial value.
+     *
+     * @return The initial value for this field, or null if this field is not a static field, or if this static field
+     * does not have an initial value.
+     */
+    @Nullable EncodedValue getInitialValue();
+
+    /**
+     * Gets a set of the annotations that are applied to this field.
+     *
+     * The annotations in the returned set are guaranteed to have unique types.
+     *
+     * @return A set of the annotations that are applied to this field
+     */
+    @Override @Nonnull Set<? extends Annotation> getAnnotations();
+
+    /**
+     * Gets the hidden api restrictions for this field.
+     *
+     * This will contain at most 1 normal flag (with isDomainSpecificApiFlag() = false), and 1
+     * domain-specific api flag (with isDomainSpecificApiFlag() = true)
+     *
+     * @return A set of the hidden api restrictions for this field.
+     */
+    @Nonnull Set<HiddenApiRestriction> getHiddenApiRestrictions();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/Member.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/Member.java
new file mode 100644
index 0000000..bf57b84
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/Member.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface;
+
+import org.jf.dexlib2.HiddenApiRestriction;
+
+import javax.annotation.Nonnull;
+import java.util.Set;
+
+/**
+ * This class represents a generic class member
+ */
+public interface Member extends Annotatable {
+    /**
+     * Gets the type of the class that defines this member.
+     *
+     * @return The type of the class that defines this member
+     */
+    @Nonnull String getDefiningClass();
+
+    /**
+     * Gets the name of this member.
+     *
+     * @return The name of this field
+     */
+    @Nonnull String getName();
+
+    /**
+     * Gets the access flags for this member.
+     *
+     * This will be a combination of the AccessFlags.* flags that are marked as compatible for use with this type
+     * of member.
+     *
+     * @return The access flags for this member
+     */
+    int getAccessFlags();
+
+    /**
+     * Gets the hidden api restrictions for this member.
+     *
+     * This will contain at most 1 normal flag (with isDomainSpecificApiFlag() = false), and 1
+     * domain-specific api flag (with isDomainSpecificApiFlag() = true)
+     *
+     * @return A set of the hidden api restrictions for this member.
+     */
+    @Nonnull Set<HiddenApiRestriction> getHiddenApiRestrictions();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/Method.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/Method.java
new file mode 100644
index 0000000..3a3d4df
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/Method.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface;
+
+import org.jf.dexlib2.HiddenApiRestriction;
+import org.jf.dexlib2.iface.reference.MethodReference;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * This class represents a specific method definition in a class.
+ *
+ * It also acts as a MethodReference to itself. Any equality/comparison is based on its identity as a MethodReference,
+ * and shouldn't take into account any non-MethodReference specifics of this method.
+ */
+public interface Method extends MethodReference, Member {
+    /**
+     * Gets the type of the class that defines this method.
+     *
+     * @return The type of the class that defines this method
+     */
+    @Override @Nonnull String getDefiningClass();
+
+    /**
+     * Gets the name of this method.
+     *
+     * @return The name of this method
+     */
+    @Override @Nonnull String getName();
+
+    /**
+     * Gets a list of the parameters of this method.
+     *
+     * As per the MethodReference interface, the MethodParameter objects contained in the returned list also act
+     * as a simple reference to the type of the parameter. However, the MethodParameter object can also contain
+     * additional information about the parameter.
+     *
+     * Note: In some implementations, the returned list is likely to *not* provide efficient random access.
+     *
+     * @return A list of MethodParameter objects, representing the parameters of this method.
+     */
+    @Nonnull List<? extends MethodParameter> getParameters();
+
+    /**
+     * Gets the return type of this method.
+     *
+     * @return The return type of this method.
+     */
+    @Override @Nonnull String getReturnType();
+
+    /**
+     * Gets the access flags for this method.
+     *
+     * This will be a combination of the AccessFlags.* flags that are marked as compatible for use with a method.
+     *
+     * @return The access flags for this method
+     */
+    @Override int getAccessFlags();
+
+    /**
+     * Gets a set of the annotations that are applied to this method.
+     *
+     * The annotations in the returned set are guaranteed to have unique types.
+     *
+     * @return A set of the annotations that are applied to this method
+     */
+    @Override @Nonnull Set<? extends Annotation> getAnnotations();
+
+    /**
+     * Gets the hidden api restrictions for this method.
+     *
+     * This will contain at most 1 normal flag (with isDomainSpecificApiFlag() = false), and 1
+     * domain-specific api flag (with isDomainSpecificApiFlag() = true)
+     *
+     * @return A set of the hidden api restrictions for this method.
+     */
+    @Nonnull Set<HiddenApiRestriction> getHiddenApiRestrictions();
+
+    /**
+     * Gets a MethodImplementation object that defines the implementation of the method.
+     *
+     * If this is an abstract method in an abstract class, or an interface method in an interface definition, then the
+     * method has no implementation, and this will return null.
+     *
+     * @return A MethodImplementation object defining the implementation of this method, or null if the method has no
+     * implementation
+     */
+    @Nullable MethodImplementation getImplementation();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/MethodImplementation.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/MethodImplementation.java
new file mode 100644
index 0000000..a88e56e
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/MethodImplementation.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface;
+
+import org.jf.dexlib2.iface.debug.DebugItem;
+import org.jf.dexlib2.iface.instruction.Instruction;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+/**
+ * This class represents the implementation details of a method.
+ */
+public interface MethodImplementation {
+    /**
+     * Gets the number of registers in this method.
+     *
+     * @return The number of register in this method.
+     */
+    int getRegisterCount();
+
+    /**
+     * Gets the instructions in this method.
+     *
+     * @return An Iterable of the instructions in this method
+     */
+    @Nonnull Iterable<? extends Instruction> getInstructions();
+
+    /**
+     * Gets a list of the try blocks defined for this method.
+     *
+     * Try blocks may overlap freely, and do not need to be strictly nested, as in java. This is a more relaxed
+     * requirement than specified by the dex format, where try blocks may not overlap, and must be specified in
+     * ascending order. When writing to a dex file, the try blocks will be massaged into the appropriate format.
+     *
+     * In any region where there are overlapping try blocks, set of exception handlers for the overlapping region will
+     * consist of the union of all handlers in any try block that covers that region.
+     *
+     * If multiple overlapping try blocks define a handler for the same exception type, or define a catch-all
+     * handler, then those duplicate handlers must use the same handler offset.
+     *
+     * @return A list of the TryBlock items
+     */
+    @Nonnull List<? extends TryBlock<? extends ExceptionHandler>> getTryBlocks();
+
+    /**
+     * Get a list of debug items for this method.
+     *
+     * This generally matches the semantics of the debug_info_item in the dex specification, although in an easier to
+     * digest form.
+     *
+     * The addresses of the DebugItems in the returned list will be in non-descending order.
+     *
+     * @return A list of DebugInfo items
+     */
+    @Nonnull Iterable<? extends DebugItem> getDebugItems();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/MethodParameter.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/MethodParameter.java
new file mode 100644
index 0000000..d982fe2
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/MethodParameter.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface;
+
+import org.jf.dexlib2.iface.debug.LocalInfo;
+import org.jf.dexlib2.iface.reference.TypeReference;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Set;
+
+/**
+ * This class represents a method parameter.
+ *
+ * It also acts as a TypeReference to the type of this parameter. Any equality/comparison is based on its identity as a
+ * TypeReference, and should not take into account any details other than the parameter type.
+ *
+ * It also acts as a LocalInfo object, and conceptually defines the debug information for any parameter register at the
+ * beginning of the method.
+ */
+public interface MethodParameter extends TypeReference, LocalInfo {
+    /**
+     * The type of this method parameter.
+     *
+     * This may be any type, including primitive or array types, other than the void (V) type.
+     *
+     * @return The type of this method parameter
+     */
+    @Nonnull String getType();
+
+    /**
+     * Gets a set of the annotations that are applied to this parameter.
+     *
+     * The annotations in the returned set are guaranteed to have unique types.
+     *
+     * @return A set of the annotations that are applied to this parameter
+     */
+    @Nonnull Set<? extends Annotation> getAnnotations();
+
+    /**
+     * Gets the name of this parameter, if available.
+     *
+     * @return The name of this parameter, or null if the name is not available.
+     */
+    @Nullable String getName();
+
+    /**
+     * Gets the signature of this parameter, if available.
+     *
+     * The signature of a parameter is defined to be the concatenated version of the dalvik.annotation.Signature
+     * annotation applied to this parameter, or null if there is no dalvik.annotation.Signature annotation.
+     *
+     * @return The signature of this parameter, or null if not available
+     */
+    @Nullable String getSignature();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/MultiDexContainer.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/MultiDexContainer.java
new file mode 100644
index 0000000..f2e3176
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/MultiDexContainer.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * This class represents a dex container that can contain multiple, named dex files
+ */
+public interface MultiDexContainer<T extends DexFile> {
+    /**
+     * @return A list of the names of dex entries in this container
+     */
+    @Nonnull List<String> getDexEntryNames() throws IOException;
+
+    /**
+     * Gets the dex entry with the given name
+     *
+     * @param entryName The name of the entry
+     * @return A DexFile, or null if no entry with that name is found
+     */
+    @Nullable DexEntry<T> getEntry(@Nonnull String entryName) throws IOException;
+
+    /**
+     * This class represents a dex file entry in a MultiDexContainer
+     */
+    interface DexEntry<T extends DexFile> {
+        /**
+         * @return The name of this entry within its container
+         */
+        @Nonnull String getEntryName();
+
+        /**
+         * @return The dex file associated with this entry
+         */
+        @Nonnull T getDexFile();
+
+        /**
+         * @return The MultiDexContainer that contains this dex file
+         */
+        @Nonnull MultiDexContainer<? extends T> getContainer();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/TryBlock.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/TryBlock.java
new file mode 100644
index 0000000..b6e4bbd
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/TryBlock.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.List;
+
+/**
+ * This class represents an individual try block and associated set of handlers.
+ */
+public interface TryBlock<EH extends ExceptionHandler> {
+    /**
+     * Gets the code offset of the start of this try block.
+     *
+     * The starting location must not occur in the middle of an instruction.
+     *
+     * @return The offset of the start of the try block from the the beginning of the bytecode for the method. The
+     * offset will be in terms of 16-bit code units.
+     */
+    int getStartCodeAddress();
+
+    /**
+     * Gets the number of code units covered by this try block.
+     *
+     * The end of the try block is typically coincident with the end of an instruction, but does not strictly need to
+     * be. If the last instruction is only partly covered by this try block, it is considered to be covered.
+     *
+     * @return The number of code units covered by this try block.
+     */
+    int getCodeUnitCount();
+
+    /**
+     * A list of the exception handlers associated with this try block.
+     *
+     * The exception handlers in the returned list will all have a unique type, including at most 1 with no type, which
+     * is the catch-all handler. If present, the catch-all handler is always the last item in the list.
+     *
+     * @return A list of ExceptionHandler objects
+     */
+    @Nonnull List<? extends EH> getExceptionHandlers();
+
+    /**
+     * Compares this TryBlock to another TryBlock for equality.
+     *
+     * This TryBlock is equal to another TryBlock if all 3 fields are equal. The exception handlers are tested for
+     * equality using the usual List equality semantics.
+     *
+     * @param o The object to be compared for equality with this TryBlock
+     * @return true if the specified object is equal to this TryBlock
+     */
+    @Override boolean equals(@Nullable Object o);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/DebugItem.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/DebugItem.java
new file mode 100644
index 0000000..6cf4dbb
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/DebugItem.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.debug;
+
+/**
+ * This class represents a generic debug item.
+ *
+ * The specific sub-types of this class correspond to the various debug opcodes specified in the debug_info_item type
+ * in the dex file specification.
+ */
+public interface DebugItem {
+    /**
+     * The type of this debug item.
+     *
+     * The returned integer will be one of the DebugItemType.* constants.
+     *
+     * @return The type of this debug item.
+     */
+    int getDebugItemType();
+
+    /**
+     * @return The code address
+     */
+    int getCodeAddress();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/EndLocal.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/EndLocal.java
new file mode 100644
index 0000000..bc8d2b1
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/EndLocal.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.debug;
+
+public interface EndLocal extends DebugItem, LocalInfo {
+    int getRegister();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/EpilogueBegin.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/EpilogueBegin.java
new file mode 100644
index 0000000..bc5dc02
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/EpilogueBegin.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.debug;
+
+public interface EpilogueBegin extends DebugItem {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/LineNumber.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/LineNumber.java
new file mode 100644
index 0000000..8b860d1
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/LineNumber.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.debug;
+
+public interface LineNumber extends DebugItem {
+    /**
+     * The line number associated with this code address. This value should be treated as an unsigned integer, with
+     * negative values indicating a value > 2^31, using the usual two's complement semantics.
+     *
+     * @return The line number associated with this code address.
+     */
+    int getLineNumber();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/LocalInfo.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/LocalInfo.java
new file mode 100644
index 0000000..4d3b179
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/LocalInfo.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.debug;
+
+import javax.annotation.Nullable;
+
+public interface LocalInfo {
+    @Nullable String getName();
+    @Nullable String getType();
+    @Nullable String getSignature();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/PrologueEnd.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/PrologueEnd.java
new file mode 100644
index 0000000..13f45d2
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/PrologueEnd.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.debug;
+
+public interface PrologueEnd extends DebugItem {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/RestartLocal.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/RestartLocal.java
new file mode 100644
index 0000000..fece839
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/RestartLocal.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.debug;
+
+public interface RestartLocal extends DebugItem, LocalInfo {
+    int getRegister();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/SetSourceFile.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/SetSourceFile.java
new file mode 100644
index 0000000..de243ab
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/SetSourceFile.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.debug;
+
+import org.jf.dexlib2.iface.reference.StringReference;
+
+import javax.annotation.Nullable;
+
+public interface SetSourceFile extends DebugItem {
+    @Nullable String getSourceFile();
+    @Nullable StringReference getSourceFileReference();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/StartLocal.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/StartLocal.java
new file mode 100644
index 0000000..90a5547
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/debug/StartLocal.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.debug;
+
+import org.jf.dexlib2.iface.reference.StringReference;
+import org.jf.dexlib2.iface.reference.TypeReference;
+
+import javax.annotation.Nullable;
+
+public interface StartLocal extends DebugItem, LocalInfo {
+    int getRegister();
+
+    @Nullable StringReference getNameReference();
+    @Nullable TypeReference getTypeReference();
+    @Nullable StringReference getSignatureReference();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/DualReferenceInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/DualReferenceInstruction.java
new file mode 100644
index 0000000..0f1f81b
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/DualReferenceInstruction.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction;
+
+import org.jf.dexlib2.iface.reference.Reference;
+
+import javax.annotation.Nonnull;
+
+public interface DualReferenceInstruction extends ReferenceInstruction {
+    @Nonnull Reference getReference2();
+    int getReferenceType2();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/FieldOffsetInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/FieldOffsetInstruction.java
new file mode 100644
index 0000000..048dd54
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/FieldOffsetInstruction.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction;
+
+public interface FieldOffsetInstruction extends Instruction {
+    int getFieldOffset();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/FiveRegisterInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/FiveRegisterInstruction.java
new file mode 100644
index 0000000..5e0a2d1
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/FiveRegisterInstruction.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction;
+
+public interface FiveRegisterInstruction extends VariableRegisterInstruction {
+    int getRegisterC();
+    int getRegisterD();
+    int getRegisterE();
+    int getRegisterF();
+    int getRegisterG();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/HatLiteralInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/HatLiteralInstruction.java
new file mode 100644
index 0000000..da7fee9
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/HatLiteralInstruction.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction;
+
+public interface HatLiteralInstruction extends Instruction {
+    /**
+     * @return the high order 16 bits of the literal, as a short value
+     */
+    short getHatLiteral();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/InlineIndexInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/InlineIndexInstruction.java
new file mode 100644
index 0000000..b169146
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/InlineIndexInstruction.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction;
+
+public interface InlineIndexInstruction extends Instruction {
+    int getInlineIndex();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/Instruction.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/Instruction.java
new file mode 100644
index 0000000..db85e61
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/Instruction.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction;
+
+import org.jf.dexlib2.Opcode;
+
+/**
+ * This class represents a generic instruction.
+ *
+ * There are two categories of sub-interfaces of this interface. The dexlib2.iface.instruction.* interfaces are set of
+ * generic categories of instructions, while the dexlib2.iface.instruction.formats.* interfaces each represent a
+ * specific instruction format, and are typically built up as a composite of generic instruction interfaces.
+ */
+public interface Instruction {
+    /**
+     * Gets the opcode of this instruction.
+     *
+     * @return The Opcode of this instruction.
+     */
+    Opcode getOpcode();
+
+    /**
+     * Gets the size of this instruction.
+     *
+     * @return The size of this instruction, as a count of the number of 16-bit code units that make up this
+     * instruction.
+     */
+    int getCodeUnits();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/LongHatLiteralInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/LongHatLiteralInstruction.java
new file mode 100644
index 0000000..5a0aa4b
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/LongHatLiteralInstruction.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction;
+
+public interface LongHatLiteralInstruction extends WideLiteralInstruction, HatLiteralInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/NarrowHatLiteralInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/NarrowHatLiteralInstruction.java
new file mode 100644
index 0000000..710adf1
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/NarrowHatLiteralInstruction.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction;
+
+public interface NarrowHatLiteralInstruction extends HatLiteralInstruction, NarrowLiteralInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/NarrowLiteralInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/NarrowLiteralInstruction.java
new file mode 100644
index 0000000..7e715ee
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/NarrowLiteralInstruction.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction;
+
+public interface NarrowLiteralInstruction extends WideLiteralInstruction {
+    int getNarrowLiteral();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/OffsetInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/OffsetInstruction.java
new file mode 100644
index 0000000..ee50003
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/OffsetInstruction.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction;
+
+public interface OffsetInstruction extends Instruction {
+    int getCodeOffset();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/OneRegisterInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/OneRegisterInstruction.java
new file mode 100644
index 0000000..5394abe
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/OneRegisterInstruction.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction;
+
+public interface OneRegisterInstruction extends Instruction {
+    int getRegisterA();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/PayloadInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/PayloadInstruction.java
new file mode 100644
index 0000000..361b08b
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/PayloadInstruction.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction;
+
+/**
+ * Empty marker interface for the switch/array payload instructions
+ */
+public interface PayloadInstruction extends Instruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/ReferenceInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/ReferenceInstruction.java
new file mode 100644
index 0000000..be686b5
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/ReferenceInstruction.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction;
+
+import org.jf.dexlib2.iface.reference.Reference;
+
+import javax.annotation.Nonnull;
+
+public interface ReferenceInstruction extends Instruction {
+    @Nonnull Reference getReference();
+    int getReferenceType();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/RegisterRangeInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/RegisterRangeInstruction.java
new file mode 100644
index 0000000..37752df
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/RegisterRangeInstruction.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction;
+
+public interface RegisterRangeInstruction extends VariableRegisterInstruction {
+    int getStartRegister();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/SwitchElement.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/SwitchElement.java
new file mode 100644
index 0000000..b24f6ad
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/SwitchElement.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction;
+
+public interface SwitchElement {
+    public int getKey();
+    public int getOffset();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/SwitchPayload.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/SwitchPayload.java
new file mode 100644
index 0000000..3d882cf
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/SwitchPayload.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+public interface SwitchPayload extends PayloadInstruction {
+    @Nonnull List<? extends SwitchElement> getSwitchElements();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/ThreeRegisterInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/ThreeRegisterInstruction.java
new file mode 100644
index 0000000..3b4227b
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/ThreeRegisterInstruction.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction;
+
+public interface ThreeRegisterInstruction extends TwoRegisterInstruction {
+    int getRegisterC();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/TwoRegisterInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/TwoRegisterInstruction.java
new file mode 100644
index 0000000..4045bf6
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/TwoRegisterInstruction.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction;
+
+public interface TwoRegisterInstruction extends OneRegisterInstruction {
+    int getRegisterB();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/VariableRegisterInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/VariableRegisterInstruction.java
new file mode 100644
index 0000000..6c37581
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/VariableRegisterInstruction.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction;
+
+public interface VariableRegisterInstruction extends Instruction {
+    int getRegisterCount();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/VerificationErrorInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/VerificationErrorInstruction.java
new file mode 100644
index 0000000..24a7121
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/VerificationErrorInstruction.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction;
+
+public interface VerificationErrorInstruction extends Instruction {
+    int getVerificationError();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/VtableIndexInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/VtableIndexInstruction.java
new file mode 100644
index 0000000..28bcc67
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/VtableIndexInstruction.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction;
+
+public interface VtableIndexInstruction extends Instruction {
+    int getVtableIndex();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/WideLiteralInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/WideLiteralInstruction.java
new file mode 100644
index 0000000..5cde645
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/WideLiteralInstruction.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction;
+
+public interface WideLiteralInstruction extends Instruction {
+    long getWideLiteral();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/ArrayPayload.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/ArrayPayload.java
new file mode 100644
index 0000000..0a69854
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/ArrayPayload.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.PayloadInstruction;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+public interface ArrayPayload extends PayloadInstruction {
+    public int getElementWidth();
+    @Nonnull public List<Number> getArrayElements();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction10t.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction10t.java
new file mode 100644
index 0000000..51d6f1e
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction10t.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.OffsetInstruction;
+
+public interface Instruction10t extends OffsetInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction10x.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction10x.java
new file mode 100644
index 0000000..841160c
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction10x.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.Instruction;
+
+public interface Instruction10x extends Instruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction11n.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction11n.java
new file mode 100644
index 0000000..b3051a7
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction11n.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.NarrowLiteralInstruction;
+import org.jf.dexlib2.iface.instruction.OneRegisterInstruction;
+
+public interface Instruction11n extends OneRegisterInstruction, NarrowLiteralInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction11x.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction11x.java
new file mode 100644
index 0000000..087439c
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction11x.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.OneRegisterInstruction;
+
+public interface Instruction11x extends OneRegisterInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction12x.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction12x.java
new file mode 100644
index 0000000..9a8a761
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction12x.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.TwoRegisterInstruction;
+
+public interface Instruction12x extends TwoRegisterInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction20bc.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction20bc.java
new file mode 100644
index 0000000..09d7439
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction20bc.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.ReferenceInstruction;
+import org.jf.dexlib2.iface.instruction.VerificationErrorInstruction;
+
+public interface Instruction20bc extends VerificationErrorInstruction, ReferenceInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction20t.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction20t.java
new file mode 100644
index 0000000..de050d8
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction20t.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.OffsetInstruction;
+
+public interface Instruction20t extends OffsetInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction21c.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction21c.java
new file mode 100644
index 0000000..234343e
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction21c.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.OneRegisterInstruction;
+import org.jf.dexlib2.iface.instruction.ReferenceInstruction;
+
+public interface Instruction21c extends OneRegisterInstruction, ReferenceInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction21ih.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction21ih.java
new file mode 100644
index 0000000..31a0219
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction21ih.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.NarrowHatLiteralInstruction;
+import org.jf.dexlib2.iface.instruction.OneRegisterInstruction;
+
+public interface Instruction21ih extends OneRegisterInstruction, NarrowHatLiteralInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction21lh.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction21lh.java
new file mode 100644
index 0000000..3d4fca9
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction21lh.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.LongHatLiteralInstruction;
+import org.jf.dexlib2.iface.instruction.OneRegisterInstruction;
+
+public interface Instruction21lh extends OneRegisterInstruction, LongHatLiteralInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction21s.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction21s.java
new file mode 100644
index 0000000..2966cb8
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction21s.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.NarrowLiteralInstruction;
+import org.jf.dexlib2.iface.instruction.OneRegisterInstruction;
+
+public interface Instruction21s extends OneRegisterInstruction, NarrowLiteralInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction21t.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction21t.java
new file mode 100644
index 0000000..1c4b8a2
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction21t.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.OffsetInstruction;
+import org.jf.dexlib2.iface.instruction.OneRegisterInstruction;
+
+public interface Instruction21t extends OneRegisterInstruction, OffsetInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction22b.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction22b.java
new file mode 100644
index 0000000..5a72048
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction22b.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.NarrowLiteralInstruction;
+import org.jf.dexlib2.iface.instruction.TwoRegisterInstruction;
+
+public interface Instruction22b extends TwoRegisterInstruction, NarrowLiteralInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction22c.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction22c.java
new file mode 100644
index 0000000..d255f34
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction22c.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.ReferenceInstruction;
+import org.jf.dexlib2.iface.instruction.TwoRegisterInstruction;
+
+public interface Instruction22c extends TwoRegisterInstruction, ReferenceInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction22cs.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction22cs.java
new file mode 100644
index 0000000..8d34cec
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction22cs.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.FieldOffsetInstruction;
+import org.jf.dexlib2.iface.instruction.TwoRegisterInstruction;
+
+public interface Instruction22cs extends TwoRegisterInstruction, FieldOffsetInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction22s.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction22s.java
new file mode 100644
index 0000000..10d14e9
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction22s.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.NarrowLiteralInstruction;
+import org.jf.dexlib2.iface.instruction.TwoRegisterInstruction;
+
+public interface Instruction22s extends TwoRegisterInstruction, NarrowLiteralInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction22t.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction22t.java
new file mode 100644
index 0000000..775d3ec
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction22t.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.OffsetInstruction;
+import org.jf.dexlib2.iface.instruction.TwoRegisterInstruction;
+
+public interface Instruction22t extends TwoRegisterInstruction, OffsetInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction22x.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction22x.java
new file mode 100644
index 0000000..92bf8ec
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction22x.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.TwoRegisterInstruction;
+
+public interface Instruction22x extends TwoRegisterInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction23x.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction23x.java
new file mode 100644
index 0000000..7087be6
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction23x.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.ThreeRegisterInstruction;
+
+public interface Instruction23x extends ThreeRegisterInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction30t.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction30t.java
new file mode 100644
index 0000000..1dee9a4
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction30t.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.OffsetInstruction;
+
+public interface Instruction30t extends OffsetInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction31c.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction31c.java
new file mode 100644
index 0000000..9386dae
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction31c.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.OneRegisterInstruction;
+import org.jf.dexlib2.iface.instruction.ReferenceInstruction;
+
+public interface Instruction31c extends OneRegisterInstruction, ReferenceInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction31i.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction31i.java
new file mode 100644
index 0000000..c54ae42
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction31i.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.NarrowLiteralInstruction;
+import org.jf.dexlib2.iface.instruction.OneRegisterInstruction;
+
+public interface Instruction31i extends OneRegisterInstruction, NarrowLiteralInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction31t.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction31t.java
new file mode 100644
index 0000000..98abb8d
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction31t.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.OffsetInstruction;
+import org.jf.dexlib2.iface.instruction.OneRegisterInstruction;
+
+public interface Instruction31t extends OneRegisterInstruction, OffsetInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction32x.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction32x.java
new file mode 100644
index 0000000..34837e9
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction32x.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.TwoRegisterInstruction;
+
+public interface Instruction32x extends TwoRegisterInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction35c.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction35c.java
new file mode 100644
index 0000000..4742c54
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction35c.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.FiveRegisterInstruction;
+import org.jf.dexlib2.iface.instruction.ReferenceInstruction;
+
+public interface Instruction35c extends FiveRegisterInstruction, ReferenceInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction35mi.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction35mi.java
new file mode 100644
index 0000000..4b502fe
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction35mi.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.FiveRegisterInstruction;
+import org.jf.dexlib2.iface.instruction.InlineIndexInstruction;
+
+public interface Instruction35mi extends FiveRegisterInstruction, InlineIndexInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction35ms.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction35ms.java
new file mode 100644
index 0000000..2d4c52e
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction35ms.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.FiveRegisterInstruction;
+import org.jf.dexlib2.iface.instruction.VtableIndexInstruction;
+
+public interface Instruction35ms extends FiveRegisterInstruction, VtableIndexInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction3rc.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction3rc.java
new file mode 100644
index 0000000..07f9a7f
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction3rc.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.ReferenceInstruction;
+import org.jf.dexlib2.iface.instruction.RegisterRangeInstruction;
+
+public interface Instruction3rc extends RegisterRangeInstruction, ReferenceInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction3rmi.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction3rmi.java
new file mode 100644
index 0000000..246dbf6
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction3rmi.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.InlineIndexInstruction;
+import org.jf.dexlib2.iface.instruction.RegisterRangeInstruction;
+
+public interface Instruction3rmi extends RegisterRangeInstruction, InlineIndexInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction3rms.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction3rms.java
new file mode 100644
index 0000000..c01200d
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction3rms.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.RegisterRangeInstruction;
+import org.jf.dexlib2.iface.instruction.VtableIndexInstruction;
+
+public interface Instruction3rms extends RegisterRangeInstruction, VtableIndexInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction45cc.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction45cc.java
new file mode 100644
index 0000000..221fd62
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction45cc.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.DualReferenceInstruction;
+import org.jf.dexlib2.iface.instruction.FiveRegisterInstruction;
+
+public interface Instruction45cc extends FiveRegisterInstruction, DualReferenceInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction4rcc.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction4rcc.java
new file mode 100644
index 0000000..d0b930b
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction4rcc.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.DualReferenceInstruction;
+import org.jf.dexlib2.iface.instruction.RegisterRangeInstruction;
+
+public interface Instruction4rcc extends RegisterRangeInstruction, DualReferenceInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction51l.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction51l.java
new file mode 100644
index 0000000..be6655e
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/Instruction51l.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.OneRegisterInstruction;
+import org.jf.dexlib2.iface.instruction.WideLiteralInstruction;
+
+public interface Instruction51l extends OneRegisterInstruction, WideLiteralInstruction {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/PackedSwitchPayload.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/PackedSwitchPayload.java
new file mode 100644
index 0000000..8fdb4e7
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/PackedSwitchPayload.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.SwitchElement;
+import org.jf.dexlib2.iface.instruction.SwitchPayload;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+public interface PackedSwitchPayload extends SwitchPayload {
+    /**
+     * @return A list of the switch elements associated with this switch payload instruction. The returned list must
+     * have switch elements with keys that are ordered and sequential.
+     */
+    @Nonnull @Override List<? extends SwitchElement> getSwitchElements();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/SparseSwitchPayload.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/SparseSwitchPayload.java
new file mode 100644
index 0000000..29cc9c4
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/SparseSwitchPayload.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+import org.jf.dexlib2.iface.instruction.SwitchPayload;
+
+public interface SparseSwitchPayload extends SwitchPayload {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/UnknownInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/UnknownInstruction.java
new file mode 100644
index 0000000..45975d9
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/instruction/formats/UnknownInstruction.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.instruction.formats;
+
+public interface UnknownInstruction extends Instruction10x {
+    int getOriginalOpcode();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/reference/CallSiteReference.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/reference/CallSiteReference.java
new file mode 100644
index 0000000..d3444af
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/reference/CallSiteReference.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.reference;
+
+import org.jf.dexlib2.iface.value.EncodedValue;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.List;
+
+/**
+ * This class represents a reference to a call site
+ */
+public interface CallSiteReference extends Reference {
+
+    /**
+     * Gets a name for this call site.
+     *
+     * This is an arbitrary synthetic string that serves to differentiate call sites that would otherwise be identical.
+     *
+     * It can be any arbitrary string, with the only requirement being that 2 different, but otherwise identical call
+     * sites in the same dex file must not share the same name. Multiple non-identical call sites may use the same name
+     * however.
+     *
+     * @return The name for this call site.
+     */
+    @Nonnull String getName();
+
+    /**
+     * Gets a reference to a method handle for the bootstrap linker method
+     *
+     * @return A MethodHandleReference to the bootstrap linker method
+     */
+    @Nonnull MethodHandleReference getMethodHandle();
+
+    /**
+     * @return A method name that the bootstrap linker should resolve.
+     */
+    @Nonnull String getMethodName();
+
+    /**
+     * @return A MethodProtoReference corresponding to the prototype of the method that the bootstrap linker should
+     * resolve
+     */
+    @Nonnull MethodProtoReference getMethodProto();
+
+    /**
+     * @return A list of extra arguments to pass to the bootstrap linker
+     */
+    @Nonnull List<? extends EncodedValue> getExtraArguments();
+
+    /**
+     * Returns a hashcode for this CallSiteReference.
+     *
+     * This hashCode is defined to be the following:
+     *
+     * <pre>
+     * {@code
+     * int hashCode = getName().hashCode();
+     * hashCode = hashCode*31 + getMethodHandle().hashCode();
+     * hashCode = hashCode*31 + getMethodName().hashCode();
+     * hashCode = hashCode*31 + getMethodProto().hashCode();
+     * hashCode = hashCode*31 + getExtraArguments().hashCode();
+     * }</pre>
+     *
+     * @return The hash code value for this MethodReference
+     */
+    @Override int hashCode();
+
+    /**
+     * Compares this CallSiteReference to another CallSiteReference for equality.
+     *
+     * This CallSiteReference is equal to another CallSiteReference if all of its fields are equal. That is, if
+     * the return values of getMethodHandle(), getMethodName(), getMethodProto() and getExtraArguments() are all equal.
+     *
+     * @param o The object to be compared for equality with this CallSiteReference
+     * @return true if the specified object is equal to this CallSiteReference
+     */
+    @Override boolean equals(@Nullable Object o);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/reference/FieldReference.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/reference/FieldReference.java
new file mode 100644
index 0000000..8d1a104
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/reference/FieldReference.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.reference;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * This class represents a reference to a field.
+ */
+public interface FieldReference extends Reference, Comparable<FieldReference> {
+    /**
+     * Gets the type of the class that defines the referenced field.
+     *
+     * @return The type of the class that defines the referenced field
+     */
+    @Nonnull String getDefiningClass();
+
+    /**
+     * Gets the name of the referenced field.
+     *
+     * @return The name of the referenced field
+     */
+    @Nonnull String getName();
+
+    /**
+     * Gets the type of the referenced field.
+     *
+     * @return The type of the referenced field
+     */
+    @Nonnull String getType();
+
+    /**
+     * Returns a hashcode for this FieldReference.
+     *
+     * This hashCode is defined to be the following:
+     *
+     * <pre>
+     * {@code
+     * int hashCode =  getDefiningClass().hashCode();
+     * hashCode = hashCode*31 + getName().hashCode();
+     * hashCode = hashCode*31 + getType().hashCode();
+     * }</pre>
+     *
+     * @return The hash code value for this FieldReference
+     */
+    @Override int hashCode();
+
+    /**
+     * Compares this FieldReference to another FieldReference for equality.
+     *
+     * This FieldReference is equal to another FieldReference if all of it's "fields" are equal. That is, if
+     * the return values of getDefiningClass(), getName() and getType() are all equal.
+     *
+     * @param o The object to be compared for equality with this FieldReference
+     * @return true if the specified object is equal to this FieldReference
+     */
+    @Override boolean equals(@Nullable Object o);
+
+    /**
+     * Compare this FieldReference to another FieldReference.
+     *
+     * The comparison is based on the comparison of the return values of getDefiningClass(), getName() and
+     * getType(), in that order.
+     *
+     * @param o The FieldReference to compare with this FieldReference
+     * @return An integer representing the result of the comparison
+     */
+    @Override int compareTo(@Nonnull FieldReference o);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/reference/MethodHandleReference.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/reference/MethodHandleReference.java
new file mode 100644
index 0000000..f9e0f1e
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/reference/MethodHandleReference.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.reference;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * This class represents a reference to a method handle
+ */
+public interface MethodHandleReference extends Reference, Comparable<MethodHandleReference> {
+    /**
+     * Gets the method handle type.
+     *
+     * @return One of the MethodHandleType values
+     */
+    int getMethodHandleType();
+
+    /**
+     * Gets the member that is being referenced by this method handle.
+     *
+     * @return A MethodReference or FieldReference, depending on the method handle type
+     */
+    @Nonnull Reference getMemberReference();
+
+    /**
+     * Returns a hashcode for this MethodHandleReference.
+     *
+     * This hashCode is defined to be the following:
+     *
+     * <pre>
+     * {@code
+     * int hashCode =  getMethodHandleType();
+     * hashCode = hashCode*31 + getMemberReference().hashCode();
+     * }</pre>
+     *
+     * @return The hash code value for this MethodHandleReference
+     */
+    @Override int hashCode();
+
+    /**
+     * Compares this MethodHandleReference to another MethodHandleReference for equality.
+     *
+     * This MethodHandleReference is equal to another MethodHandleReference if all of its fields are equal. That is, if
+     * the return values of getMethodHandleType() and getMemberReference() are all equal.
+     *
+     * @param o The object to be compared for equality with this MethodHandleReference
+     * @return true if the specified object is equal to this MethodHandleReference
+     */
+    @Override boolean equals(@Nullable Object o);
+
+    /**
+     * Compare this MethodHandleReference to another MethodHandleReference.
+     *
+     * The comparison is based on the comparison of the return values of getMethodHandleType() and getMemberReference()
+     * in that order.
+     *
+     * @param o The MethodHandleReference to compare with this MethodHandleReference
+     * @return An integer representing the result of the comparison
+     */
+    @Override int compareTo(@Nonnull MethodHandleReference o);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/reference/MethodProtoReference.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/reference/MethodProtoReference.java
new file mode 100644
index 0000000..4adee37
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/reference/MethodProtoReference.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright 20116, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.reference;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.List;
+
+/**
+ * This class represents a reference to a method prototype.
+ */
+public interface MethodProtoReference extends Reference, Comparable<MethodProtoReference> {
+    /**
+     * Gets a list of the types of the parameters of this method prototype.
+     *
+     * @return A list of the parameter types of this method prototype, as strings.
+     */
+    @Nonnull List<? extends CharSequence> getParameterTypes();
+
+    /**
+     * Gets the return type of the referenced method prototype.
+     *
+     * @return The return type of the referenced method prototype.
+     */
+    @Nonnull String getReturnType();
+
+    /**
+     * Returns a hashcode for this MethodProtoReference.
+     *
+     * This hashCode is defined to be the following:
+     *
+     * <pre>
+     * {@code
+     * int hashCode =  getReturnType().hashCode();
+     * hashCode = hashCode*31 + CharSequenceUtils.listHashCode(getParameters());
+     * }</pre>
+     *
+     * @return The hash code value for this ProtoReference
+     */
+    @Override int hashCode();
+
+    /**
+     * Compares this MethodProtoReference to another MethodProtoReference for equality.
+     *
+     * This MethodProtoReference is equal to another MethodProtoReference if all of it's "fields" are equal. That is, if
+     * the return values of getReturnType() and getParameterTypes() are all equal.
+     *
+     * Equality for getParameters() should be tested by comparing the string representation of each element. I.e.
+     * CharSequenceUtils.listEquals(this.getParameterTypes(), other.getParameterTypes())
+     *
+     * @param o The object to be compared for equality with this MethodProtoReference
+     * @return true if the specified object is equal to this MethodProtoReference
+     */
+    @Override boolean equals(@Nullable Object o);
+
+    /**
+     * Compare this MethodProtoReference to another MethodProtoReference.
+     *
+     * The comparison is based on the comparison of the return values of getReturnType() and getParameters(),
+     * in that order. getParameters() should be compared using the semantics of
+     * org.jf.util.CollectionUtils.compareAsList()
+     *
+     * @param o The MethodReference to compare with this MethodProtoReference
+     * @return An integer representing the result of the comparison
+     */
+    @Override int compareTo(@Nonnull MethodProtoReference o);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/reference/MethodReference.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/reference/MethodReference.java
new file mode 100644
index 0000000..8a7bb39
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/reference/MethodReference.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.reference;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.List;
+
+/**
+ * This class represents a reference to a method.
+ */
+public interface MethodReference extends Reference, Comparable<MethodReference> {
+    /**
+     * Gets the type of the class that defines the referenced method.
+     *
+     * @return The type of the class that defines the referenced method
+     */
+    @Nonnull String getDefiningClass();
+
+    /**
+     * Gets the name of the referenced method.
+     *
+     * @return The name of the referenced method
+     */
+    @Nonnull String getName();
+
+    /**
+     * Gets a list of the types of the parameters of this method.
+     *
+     * @return A list of the parameter types of this method, as strings.
+     */
+    @Nonnull List<? extends CharSequence> getParameterTypes();
+
+    /**
+     * Gets the return type of the referenced method.
+     *
+     * @return The return type of the referenced method.
+     */
+    @Nonnull String getReturnType();
+
+    /**
+     * Returns a hashcode for this MethodReference.
+     *
+     * This hashCode is defined to be the following:
+     *
+     * <pre>
+     * {@code
+     * int hashCode =  getDefiningClass().hashCode();
+     * hashCode = hashCode*31 + getName().hashCode();
+     * hashCode = hashCode*31 + getReturnType().hashCode();
+     * hashCode = hashCode*31 + CharSequenceUtils.listHashCode(getParameters());
+     * }</pre>
+     *
+     * @return The hash code value for this MethodReference
+     */
+    @Override int hashCode();
+
+    /**
+     * Compares this MethodReference to another MethodReference for equality.
+     *
+     * This MethodReference is equal to another MethodReference if all of it's "fields" are equal. That is, if
+     * the return values of getDefiningClass(), getName(), getReturnType() and getParameterTypes() are all equal.
+     *
+     * Equality for getParameters() should be tested by comparing the string representation of each element. I.e.
+     * CharSequenceUtils.listEquals(this.getParameterTypes(), other.getParameterTypes())
+     *
+     * @param o The object to be compared for equality with this MethodReference
+     * @return true if the specified object is equal to this MethodReference
+     */
+    @Override boolean equals(@Nullable Object o);
+
+    /**
+     * Compare this MethodReference to another MethodReference.
+     *
+     * The comparison is based on the comparison of the return values of getDefiningClass(), getName(),
+     * getReturnType() and getParameters(), in that order. getParameters() should be compared using the semantics
+     * of org.jf.util.CollectionUtils.compareAsList()
+     *
+     * @param o The MethodReference to compare with this MethodReference
+     * @return An integer representing the result of the comparison
+     */
+    @Override int compareTo(@Nonnull MethodReference o);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/reference/Reference.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/reference/Reference.java
new file mode 100644
index 0000000..e1ba73f
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/reference/Reference.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.reference;
+
+/**
+ * This class is the base interface for field/method/string/type references in a dex file.
+ */
+public interface Reference {
+
+    /**
+     * Verifies that this reference is valid.
+     *
+     * @throws InvalidReferenceException If the reference is not valid.
+     */
+    void validateReference() throws InvalidReferenceException;
+
+    class InvalidReferenceException extends Exception {
+        private final String invalidReferenceRepresentation;
+
+        public InvalidReferenceException(String invalidReferenceRepresentation) {
+            super("Invalid reference");
+            this.invalidReferenceRepresentation = invalidReferenceRepresentation;
+        }
+
+        public InvalidReferenceException(String invalidReferenceRepresentation, String msg) {
+            super(msg);
+            this.invalidReferenceRepresentation = invalidReferenceRepresentation;
+        }
+
+        public InvalidReferenceException(String invalidReferenceRepresentation, String s, Throwable throwable) {
+            super(s, throwable);
+            this.invalidReferenceRepresentation = invalidReferenceRepresentation;
+        }
+
+        public InvalidReferenceException(String invalidReferenceRepresentation, Throwable throwable) {
+            super(throwable);
+            this.invalidReferenceRepresentation = invalidReferenceRepresentation;
+        }
+
+        /**
+         * @return A string representation of the invalid reference. This should be a human-readable string that gives
+         * enough information to identify the reference in question.
+         *
+         * The format of the string is not specified, although as an illustrative example "string@123" could be
+         * used for a reference to the string at index 123.
+         */
+        public String getInvalidReferenceRepresentation() {
+            return invalidReferenceRepresentation;
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/reference/StringReference.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/reference/StringReference.java
new file mode 100644
index 0000000..5b13ef1
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/reference/StringReference.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.reference;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * This class represents a reference to an arbitrary string.
+ *
+ * When possible, elsewhere in the interface, a string is represented directly by its value. A StringReference is only
+ * used  in those cases where a generic Reference is needed
+ *
+ * This type also acts as a CharSequence wrapper around the referenced string value. As per the CharSequence contract,
+ * calling toString() on a StringReference yields the referenced string value. This is the same value returned by
+ * getString().
+ */
+public interface StringReference extends Reference, CharSequence, Comparable<CharSequence> {
+    /**
+     * Gets the referenced string.
+     *
+     * @return the referenced string
+     */
+    @Nonnull String getString();
+
+    /**
+     * Returns a hashcode for this StringReference.
+     *
+     * This is defined to be getString().hashCode().
+     *
+     * @return The hash code value for this StringReference
+     */
+    @Override int hashCode();
+
+    /**
+     * Compares this StringReference to another CharSequence for equality.
+     *
+     * String StringReference is equal to a CharSequence iff this.getString().equals(other.toString()).
+     *
+     * Equivalently, This StringReference is equal to another StringReference iff
+     * this.getString().equals(other.getString()).
+     *
+     * @param o The object to be compared for equality with this TypeReference
+     * @return true if the specified object is equal to this TypeReference
+     */
+    @Override boolean equals(@Nullable Object o);
+
+    /**
+     * Compare this StringReference to another StringReference, or more generally to another CharSequence.
+     *
+     * The comparison is defined to be this.getString().compareTo(other.toString()).
+     *
+     * @param o The CharSequence to compare with this StringReference
+     * @return An integer representing the result of the comparison
+     */
+    @Override int compareTo(@Nonnull CharSequence o);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/reference/TypeReference.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/reference/TypeReference.java
new file mode 100644
index 0000000..e7c77c2
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/reference/TypeReference.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.reference;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * This class represents a reference to a type.
+ *
+ * When possible, elsewhere in the interface, a type is referenced directly as a String. A TypeReference is only used
+ * in those cases where a generic Reference is needed
+ *
+ * The type being referenced is represented as a String in the format of a TypeDescriptor, as defined by the dex file
+ * specification.
+ *
+ * This type also acts as a CharSequence wrapper around the TypeDescriptor string. As per the CharSequence contract,
+ * calling toString() on a TypeReference yields the type descriptor as a String. This is the same value returned by
+ * getType()
+ */
+public interface TypeReference extends Reference, CharSequence, Comparable<CharSequence> {
+    /**
+     * Gets the string representation of the referenced type.
+     *
+     * The returned string will be a TypeDescriptor, as defined in the dex file specification
+     *
+     * @return The string representation of the referenced type.
+     */
+    @Nonnull String getType();
+
+    /**
+     * Returns a hashcode for this TypeReference.
+     *
+     * This is defined to be getType().hashCode()
+     *
+     * @return The hash code value for this TypeReference
+     */
+    @Override int hashCode();
+
+    /**
+     * Compares this TypeReference to another TypeReference, or more generally to another CharSequence for equality.
+     *
+     * This TypeReference is equal to a CharSequence iff this.getType().equals(other.toString()).
+     *
+     * Equivalently, This TypeReference is equal to another TypeReference iff this.getType().equals(other.getType()).
+     *
+     * @param o The object to be compared for equality with this TypeReference
+     * @return true if the specified object is equal to this TypeReference
+     */
+    @Override boolean equals(@Nullable Object o);
+
+    /**
+     * Compare this TypeReference to another TypeReference, or more generally to another CharSequence.
+     *
+     * The comparison is defined to be this.getType().compareTo(other.toString())
+     *
+     * @param o The CharSequence to compare with this TypeReference
+     * @return An integer representing the result of the comparison
+     */
+    @Override int compareTo(@Nonnull CharSequence o);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/value/AnnotationEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/AnnotationEncodedValue.java
new file mode 100644
index 0000000..c59b387
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/AnnotationEncodedValue.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.value;
+
+import org.jf.dexlib2.iface.AnnotationElement;
+import org.jf.dexlib2.iface.BasicAnnotation;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Set;
+
+/**
+ * This class represents an encoded annotation value.
+ */
+public interface AnnotationEncodedValue extends EncodedValue, BasicAnnotation {
+    /**
+     * Gets the type of this annotation.
+     *
+     * This will be the type descriptor of the class that defines this annotation.
+     *
+     * @return The type of this annotation
+     */
+    @Nonnull String getType();
+
+    /**
+     * Gets a set of the name/value elements associated with this annotation.
+     *
+     * The elements in the returned set will be unique by name.
+     *
+     * @return A set of AnnotationElements
+     */
+    @Nonnull Set<? extends AnnotationElement> getElements();
+
+    /**
+     * Returns a hashcode for this AnnotationEncodedValue.
+     *
+     * This hashCode is defined to be the following:
+     *
+     * <pre>
+     * {@code
+     * int hashCode = getType().hashCode();
+     * hashCode = hashCode*31 + getElements().hashCode();
+     * }</pre>
+     *
+     * @return The hash code value for this AnnotationEncodedValue
+     */
+    @Override int hashCode();
+
+    /**
+     * Compares this AnnotationEncodedValue to another AnnotationEncodedValue for equality.
+     *
+     * This AnnotationEncodedValue is equal to another AnnotationEncodedValue if all of it's "fields" are equal. That
+     * is, if the return values getType() and getElements() are both equal.
+     *
+     * @param o The object to be compared for equality with this AnnotationEncodedValue
+     * @return true if the specified object is equal to this AnnotationEncodedValue
+     */
+    @Override boolean equals(@Nullable Object o);
+
+    /**
+     * Compare this AnnotationEncodedValue to another EncodedValue.
+     *
+     * The comparison is based on the value of getType() and getElements(), in that order. When
+     * comparing the set of elements, the comparison is done with the semantics of
+     * org.jf.util.CollectionUtils.compareAsSet(), using the natural ordering of AnnotationElement.
+     *
+     * @param o The EncodedValue to compare with this AnnotationEncodedValue
+     * @return An integer representing the result of the comparison
+     */
+    @Override int compareTo(@Nonnull EncodedValue o);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/value/ArrayEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/ArrayEncodedValue.java
new file mode 100644
index 0000000..f0e2d90
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/ArrayEncodedValue.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.value;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.List;
+
+/**
+ * This class represents an encoded array value.
+ */
+public interface ArrayEncodedValue extends EncodedValue {
+    /**
+     * Gets the list of the values contained in this ArrayEncodedValue
+     *
+     * @return A list of EncodedValue instances
+     */
+    @Nonnull List<? extends EncodedValue> getValue();
+
+    /**
+     * Returns a hashcode for this EncodedArrayValue.
+     *
+     * This hashCode is defined to be the following:
+     *
+     * <pre>
+     * {@code
+     * int hashCode = getValue().hashCode();
+     * }</pre>
+     *
+     * @return The hash code value for this EncodedArrayValue
+     */
+    @Override int hashCode();
+
+    /**
+     * Compares this ArrayEncodedValue to another ArrayEncodedValue for equality.
+     *
+     * This ArrayEncodedValue is equal to another ArrayEncodedValue if the values returned by getValue() are equal.
+     *
+     * @param o The object to be compared for equality with this ArrayEncodedValue
+     * @return true if the specified object is equal to this ArrayEncodedValue
+     */
+    @Override boolean equals(@Nullable Object o);
+
+    /**
+     * Compare this ArrayEncodedValue to another EncodedValue.
+     *
+     * The comparison is first done on the return values of getValueType(). If the other value is another
+     * ArrayEncodedValue, the lists returned by getValue() are compared, based on the semantics of
+     * org.jf.util.ComparisonUtils.compareAsList(), using the natural ordering for EncodedValue.
+     *
+     * @param o The EncodedValue to compare with this ArrayEncodedValue
+     * @return An integer representing the result of the comparison
+     */
+    @Override int compareTo(@Nonnull EncodedValue o);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/value/BooleanEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/BooleanEncodedValue.java
new file mode 100644
index 0000000..c822955
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/BooleanEncodedValue.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.value;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * This class represents an encoded boolean value.
+ */
+public interface BooleanEncodedValue extends EncodedValue {
+    /**
+     * Gets the boolean value.
+     *
+     * @return the boolean value
+     */
+    boolean getValue();
+
+    /**
+     * Returns a hashcode for this EncodedBooleanValue.
+     *
+     * This hashCode is defined to be the following:
+     *
+     * <pre>
+     * {@code
+     * int hashCode = getValue()?1:0;
+     * }</pre>
+     *
+     * @return The hash code value for this EncodedBooleanValue
+     */
+    @Override int hashCode();
+
+    /**
+     * Compares this BooleanEncodedValue to another BooleanEncodedValue for equality.
+     *
+     * This BooleanEncodedValue is equal to another BooleanEncodedValue if the values returned by getValue() are equal.
+     *
+     * @param o The object to be compared for equality with this BooleanEncodedValue
+     * @return true if the specified object is equal to this BooleanEncodedValue
+     */
+    @Override boolean equals(@Nullable Object o);
+
+    /**
+     * Compare this BooleanEncodedValue to another EncodedValue.
+     *
+     * The comparison is first done on the return values of getValueType(). If the other value is another
+     * BooleanEncodedValue, the return values of getValue() are compared, based on the semantics of
+     * Boolean.compareTo().
+     *
+     * @param o The EncodedValue to compare with this BooleanEncodedValue
+     * @return An integer representing the result of the comparison
+     */
+    @Override int compareTo(@Nonnull EncodedValue o);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/value/ByteEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/ByteEncodedValue.java
new file mode 100644
index 0000000..27360f6
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/ByteEncodedValue.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.value;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * This class represents an encoded byte value.
+ */
+public interface ByteEncodedValue extends EncodedValue {
+    /**
+     * Gets the byte value.
+     *
+     * @return the byte value
+     */
+    byte getValue();
+
+    /**
+     * Returns a hashcode for this EncodedByteValue.
+     *
+     * This hashCode is defined to be the following:
+     *
+     * <pre>
+     * {@code
+     * int hashCode = getValue();
+     * }</pre>
+     *
+     * @return The hash code value for this EncodedByteValue
+     */
+    @Override int hashCode();
+
+    /**
+     * Compares this ByteEncodedValue to another ByteEncodedValue for equality.
+     *
+     * This ByteEncodedValue is equal to another ByteEncodedValue if the values returned by getValue() are equal.
+     *
+     * @param o The object to be compared for equality with this ByteEncodedValue
+     * @return true if the specified object is equal to this ByteEncodedValue
+     */
+    @Override boolean equals(@Nullable Object o);
+
+    /**
+     * Compare this ByteEncodedValue to another EncodedValue.
+     *
+     * The comparison is first done on the return values of getValueType(). If the other value is another
+     * ByteEncodedValue, the return values of getValue() are compared.
+     *
+     * @param o The EncodedValue to compare with this ByteEncodedValue
+     * @return An integer representing the result of the comparison
+     */
+    @Override int compareTo(@Nonnull EncodedValue o);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/value/CharEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/CharEncodedValue.java
new file mode 100644
index 0000000..d208e34
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/CharEncodedValue.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.value;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * This class represents an encoded char value.
+ */
+public interface CharEncodedValue extends EncodedValue {
+    /**
+     * Gets the char value.
+     *
+     * @return the char value
+     */
+    char getValue();
+
+    /**
+     * Returns a hashcode for this EncodedCharValue.
+     *
+     * This hashCode is defined to be the following:
+     *
+     * <pre>
+     * {@code
+     * int hashCode = getValue();
+     * }</pre>
+     *
+     * @return The hash code value for this EncodedCharValue
+     */
+    @Override int hashCode();
+
+    /**
+     * Compares this CharEncodedValue to another CharEncodedValue for equality.
+     *
+     * This CharEncodedValue is equal to another CharEncodedValue if the values returned by getValue() are equal.
+     *
+     * @param o The object to be compared for equality with this CharEncodedValue
+     * @return true if the specified object is equal to this CharEncodedValue
+     */
+    @Override boolean equals(@Nullable Object o);
+
+    /**
+     * Compare this CharEncodedValue to another EncodedValue.
+     *
+     * The comparison is first done on the return values of getValueType(). If the other value is another
+     * CharEncodedValue, the return values of getValue() are compared.
+     *
+     * @param o The EncodedValue to compare with this CharEncodedValue
+     * @return An integer representing the result of the comparison
+     */
+    @Override int compareTo(@Nonnull EncodedValue o);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/value/DoubleEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/DoubleEncodedValue.java
new file mode 100644
index 0000000..c60fe5d
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/DoubleEncodedValue.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.value;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * This class represents an encoded double value.
+ */
+public interface DoubleEncodedValue extends EncodedValue {
+    /**
+     * Gets the double value.
+     *
+     * @return the double value
+     */
+    double getValue();
+
+    /**
+     * Returns a hashcode for this EncodedDoubleValue.
+     *
+     * This hashCode is defined to be the following:
+     *
+     * <pre>
+     * {@code
+     * long v = Double.doubleToRawLongBits(getValue());
+     * int hashCode = (int)(v^(v>>>32));
+     * }</pre>
+     *
+     * Note: This is slightly different than the definition of Double.hashCode(). This uses doubleToRawLongBits()
+     * instead of doubleToLongBits(), in order to preserve as much information as possible.
+     *
+     * @return The hash code value for this EncodedDoubleValue
+     */
+    @Override int hashCode();
+
+    /**
+     * Compares this DoubleEncodedValue to another DoubleEncodedValue for equality.
+     *
+     * This DoubleEncodedValue is equal to another DoubleEncodedValue if the values returned by
+     * getValue().doubleToRawLongBits() are equal.
+     *
+     * Note: this isn't quite the same as getValue() == getValue(), due to various NaN issues and signed zero issues.
+     *
+     * @param o The object to be compared for equality with this DoubleEncodedValue
+     * @return true if the specified object is equal to this DoubleEncodedValue
+     */
+    @Override boolean equals(@Nullable Object o);
+
+    /**
+     * Compare this DoubleEncodedValue to another EncodedValue.
+     *
+     * The comparison is first done on the return values of getValueType(), and then if the other value is another
+     * DoubleEncodedValue, the return values of getValue() are compared, using the semantics of Double.compare()
+     *
+     * @param o The EncodedValue to compare with this DoubleEncodedValue
+     * @return An integer representing the result of the comparison
+     */
+    @Override int compareTo(@Nonnull EncodedValue o);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/value/EncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/EncodedValue.java
new file mode 100644
index 0000000..8238286
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/EncodedValue.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.value;
+
+/**
+ * This class represents a generic encoded value.
+ *
+ * It acts as the base interface for each specific type of encoded value.
+ */
+public interface EncodedValue extends Comparable<EncodedValue> {
+    /**
+     * Returns the type of this encoded value.
+     *
+     * The returned integer will be one of the ValueType.* constants.
+     *
+     * @return The type of this encoded value
+     */
+    int getValueType();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/value/EnumEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/EnumEncodedValue.java
new file mode 100644
index 0000000..962785f
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/EnumEncodedValue.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.value;
+
+import org.jf.dexlib2.iface.reference.FieldReference;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * This class represents an encoded enum value.
+ *
+ * The enum value is represented as a FieldReference to the field on an enum class that holds the enum value.
+ */
+public interface EnumEncodedValue extends EncodedValue {
+    /**
+     * Gets the enum value.
+     *
+     * @return a reference to the field on the enum class that holds the enum value, as a FieldReference
+     */
+    @Nonnull FieldReference getValue();
+
+    /**
+     * Returns a hashcode for this EncodedEnumValue.
+     *
+     * This hashCode is defined to be the following:
+     *
+     * <pre>
+     * {@code
+     * int hashCode = getValue.hashCode();
+     * }</pre>
+     *
+     * @return The hash code value for this EncodedEnumValue
+     */
+    @Override int hashCode();
+
+    /**
+     * Compares this EnumEncodedValue to another EnumEncodedValue for equality.
+     *
+     * This EnumEncodedValue is equal to another EnumEncodedValue if the values returned by getValue() are equal.
+     *
+     * @param o The object to be compared for equality with this EnumEncodedValue
+     * @return true if the specified object is equal to this EnumEncodedValue
+     */
+    @Override boolean equals(@Nullable Object o);
+
+    /**
+     * Compare this EnumEncodedValue to another EncodedValue.
+     *
+     * The comparison is first done on the return values of getValueType(). If the other value is another
+     * EnumEncodedValue, the return values of getValue() are compared.
+     *
+     * @param o The EncodedValue to compare with this EnumEncodedValue
+     * @return An integer representing the result of the comparison
+     */
+    @Override int compareTo(@Nonnull EncodedValue o);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/value/FieldEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/FieldEncodedValue.java
new file mode 100644
index 0000000..80a9696
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/FieldEncodedValue.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.value;
+
+import org.jf.dexlib2.iface.reference.FieldReference;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * This class represents an encoded field value.
+ */
+public interface FieldEncodedValue extends EncodedValue {
+    /**
+     * Gets the field value.
+     *
+     * @return the field value as a FieldReference
+     */
+    @Nonnull FieldReference getValue();
+
+    /**
+     * Returns a hashcode for this EncodedFieldValue.
+     * <p/>
+     * This hashCode is defined to be the following:
+     * <p/>
+     * <pre>
+     * {@code
+     * int hashCode = getValue.hashCode();
+     * }</pre>
+     *
+     * @return The hash code value for this EncodedFieldValue
+     */
+    @Override int hashCode();
+
+    /**
+     * Compares this FieldEncodedValue to another FieldEncodedValue for equality.
+     * <p/>
+     * This FieldEncodedValue is equal to another FieldEncodedValue if the values returned by getValue() are equal.
+     *
+     * @param o The object to be compared for equality with this FieldEncodedValue
+     * @return true if the specified object is equal to this FieldEncodedValue
+     */
+    @Override boolean equals(@Nullable Object o);
+
+    /**
+     * Compare this FieldEncodedValue to another EncodedValue.
+     * <p/>
+     * The comparison is first done on the return values of getValueType(). If the other value is another
+     * FieldEncodedValue, the return values of getValue() are compared.
+     *
+     * @param o The EncodedValue to compare with this FieldEncodedValue
+     * @return An integer representing the result of the comparison
+     */
+    @Override int compareTo(@Nonnull EncodedValue o);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/value/FloatEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/FloatEncodedValue.java
new file mode 100644
index 0000000..275ca6b
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/FloatEncodedValue.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.value;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * This class represents an encoded float value.
+ */
+public interface FloatEncodedValue extends EncodedValue {
+    /**
+     * Gets the float value.
+     *
+     * @return the float value
+     */
+    float getValue();
+
+    /**
+     * Returns a hashcode for this EncodedFloatValue.
+     *
+     * This hashCode is defined to be the following:
+     *
+     * <pre>
+     * {@code
+     * int hashCode = Float.floatToRawIntBits(getValue());
+     * }</pre>
+     *
+     * Note: This is slightly different than the definition of Float.hashCode(). This uses floatToRawIntBits()
+     * instead of floatToIntBits(), in order to preserve as much information as possible.
+     *
+     * @return The hash code value for this EncodedFloatValue
+     */
+    @Override int hashCode();
+
+    /**
+     * Compares this FloatEncodedValue to another FloatEncodedValue for equality.
+     *
+     * This FloatEncodedValue is equal to another FloatEncodedValue if the values returned by
+     * getValue().floatToRawIntBits() are equal.
+     *
+     * Note: this isn't quite the same as getValue() == getValue(), due to various NaN issues and signed zero issues.
+     *
+     * @param o The object to be compared for equality with this FloatEncodedValue
+     * @return true if the specified object is equal to this FloatEncodedValue
+     */
+    @Override boolean equals(@Nullable Object o);
+
+    /**
+     * Compare this FloatEncodedValue to another EncodedValue.
+     *
+     * The comparison is first done on the return values of getValueType(). If the other value is another
+     * FloatEncodedValue, the return values of getValue() are compared, using the semantics of Float.compare()
+     *
+     * @param o The EncodedValue to compare with this FloatEncodedValue
+     * @return An integer representing the result of the comparison
+     */
+    @Override int compareTo(@Nonnull EncodedValue o);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/value/IntEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/IntEncodedValue.java
new file mode 100644
index 0000000..00909db
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/IntEncodedValue.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.value;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * This class represents an encoded integer value.
+ */
+public interface IntEncodedValue extends EncodedValue {
+    /**
+     * Gets the integer value.
+     *
+     * @return the int value
+     */
+    int getValue();
+
+    /**
+     * Returns a hashcode for this EncodedIntValue.
+     *
+     * This hashCode is defined to be the following:
+     *
+     * <pre>
+     * {@code
+     * int hashCode = getValue();
+     * }</pre>
+     *
+     * @return The hash code value for this EncodedIntValue
+     */
+    @Override int hashCode();
+
+    /**
+     * Compares this IntEncodedValue to another IntEncodedValue for equality.
+     *
+     * This IntEncodedValue is equal to another IntEncodedValue if the values returned by getValue() are equal.
+     *
+     * @param o The object to be compared for equality with this IntEncodedValue
+     * @return true if the specified object is equal to this IntEncodedValue
+     */
+    @Override boolean equals(@Nullable Object o);
+
+    /**
+     * Compare this IntEncodedValue to another EncodedValue.
+     *
+     * The comparison is first done on the return values of getValueType(). If the other value is another
+     * IntEncodedValue, the return values of getValue() are compared.
+     *
+     * @param o The EncodedValue to compare with this IntEncodedValue
+     * @return An integer representing the result of the comparison
+     */
+    @Override int compareTo(@Nonnull EncodedValue o);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/value/LongEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/LongEncodedValue.java
new file mode 100644
index 0000000..52fb3f3
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/LongEncodedValue.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.value;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * This class represents an encoded long value.
+ */
+public interface LongEncodedValue extends EncodedValue {
+    /**
+     * Gets the long value.
+     *
+     * @return the long value
+     */
+    long getValue();
+
+    /**
+     * Returns a hashcode for this EncodedLongValue.
+     *
+     * This hashCode is defined to be the following:
+     *
+     * <pre>
+     * {@code
+     * long v = getValue();
+     * int hashCode = (int)(v^(v>>>32));
+     * }</pre>
+     *
+     * @return The hash code value for this EncodedLongValue
+     */
+    @Override int hashCode();
+
+    /**
+     * Compares this LongEncodedValue to another LongEncodedValue for equality.
+     *
+     * This LongEncodedValue is equal to another LongEncodedValue if the values returned by getValue() are equal.
+     *
+     * @param o The object to be compared for equality with this LongEncodedValue
+     * @return true if the specified object is equal to this LongEncodedValue
+     */
+    @Override boolean equals(@Nullable Object o);
+
+    /**
+     * Compare this LongEncodedValue to another EncodedValue.
+     *
+     * The comparison is first done on the return values of getValueType(). If the other value is another
+     * LongEncodedValue, the return values of getValue() are compared.
+     *
+     * @param o The EncodedValue to compare with this LongEncodedValue
+     * @return An integer representing the result of the comparison
+     */
+    @Override int compareTo(@Nonnull EncodedValue o);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/value/MethodEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/MethodEncodedValue.java
new file mode 100644
index 0000000..3e3a2f8
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/MethodEncodedValue.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.value;
+
+import org.jf.dexlib2.iface.reference.MethodReference;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * This class represents an encoded method value.
+ */
+public interface MethodEncodedValue extends EncodedValue {
+    /**
+     * Gets the method value.
+     *
+     * @return the method value as a MethodReference
+     */
+    MethodReference getValue();
+
+    /**
+     * Returns a hashcode for this EncodedMethodValue.
+     *
+     * This hashCode is defined to be the following:
+     *
+     * <pre>
+     * {@code
+     * int hashCode = getValue.hashCode();
+     * }</pre>
+     *
+     * @return The hash code value for this EncodedMethodValue
+     */
+    @Override int hashCode();
+
+    /**
+     * Compares this MethodEncodedValue to another MethodEncodedValue for equality.
+     *
+     * This MethodEncodedValue is equal to another MethodEncodedValue if the values returned by getValue() are equal.
+     *
+     * @param o The object to be compared for equality with this MethodEncodedValue
+     * @return true if the specified object is equal to this MethodEncodedValue
+     */
+    @Override boolean equals(@Nullable Object o);
+
+    /**
+     * Compare this MethodEncodedValue to another EncodedValue.
+     *
+     * The comparison is first done on the return values of getValueType(). If the other value is another
+     * MethodEncodedValue, the return values of getValue() are compared.
+     *
+     * @param o The EncodedValue to compare with this MethodEncodedValue
+     * @return An integer representing the result of the comparison
+     */
+    @Override int compareTo(@Nonnull EncodedValue o);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/value/MethodHandleEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/MethodHandleEncodedValue.java
new file mode 100644
index 0000000..d62a9d3
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/MethodHandleEncodedValue.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.value;
+
+import org.jf.dexlib2.iface.reference.MethodHandleReference;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * This class represents an encoded method type value.
+ */
+public interface MethodHandleEncodedValue extends EncodedValue {
+    /**
+     * Gets the method handle value.
+     *
+     * @return the method handle value as a MethodHandleReference
+     */
+    @Nonnull MethodHandleReference getValue();
+
+    /**
+     * Returns a hashcode for this MethodHandleEncodedValue.
+     *
+     * This hashCode is defined to be the following:
+     *
+     * <pre>
+     * {@code
+     * int hashCode = getValue.hashCode();
+     * }</pre>
+     *
+     * @return The hash code value for this MethodHandleEncodedValue
+     */
+    @Override int hashCode();
+
+    /**
+     * Compares this MethodHandleEncodedValue to another MethodHandleEncodedValue for equality.
+     *
+     * This MethodHandleEncodedValue is equal to another MethodHandleEncodedValue if the values returned by getValue()
+     * are equal.
+     *
+     * @param o The object to be compared for equality with this MethodHandleEncodedValue
+     * @return true if the specified object is equal to this MethodHandleEncodedValue
+     */
+    @Override boolean equals(@Nullable Object o);
+
+    /**
+     * Compare this MethodHandleEncodedValue to another EncodedValue.
+     *
+     * The comparison is first done on the return values of getValueType(). If the other value is another
+     * MethodHandleEncodedValue, the return values of getValue() are compared.
+     *
+     * @param o The EncodedValue to compare with this MethodHandleEncodedValue
+     * @return An integer representing the result of the comparison
+     */
+    @Override int compareTo(@Nonnull EncodedValue o);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/value/MethodTypeEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/MethodTypeEncodedValue.java
new file mode 100644
index 0000000..bf64618
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/MethodTypeEncodedValue.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.value;
+
+import org.jf.dexlib2.iface.reference.MethodProtoReference;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * This class represents an encoded method type value.
+ */
+public interface MethodTypeEncodedValue extends EncodedValue {
+    /**
+     * Gets the method type value.
+     *
+     * @return the method type value as a MethodProtoReference
+     */
+    @Nonnull MethodProtoReference getValue();
+
+    /**
+     * Returns a hashcode for this MethodTypeEncodedValue.
+     *
+     * This hashCode is defined to be the following:
+     *
+     * <pre>
+     * {@code
+     * int hashCode = getValue.hashCode();
+     * }</pre>
+     *
+     * @return The hash code value for this MethodTypeEncodedValue
+     */
+    @Override int hashCode();
+
+    /**
+     * Compares this MethodTypeEncodedValue to another MethodTypeEncodedValue for equality.
+     *
+     * This MethodTypeEncodedValue is equal to another MethodTypeEncodedValue if the values returned by getValue()
+     * are equal.
+     *
+     * @param o The object to be compared for equality with this MethodTypeEncodedValue
+     * @return true if the specified object is equal to this MethodTypeEncodedValue
+     */
+    @Override boolean equals(@Nullable Object o);
+
+    /**
+     * Compare this MethodTypeEncodedValue to another EncodedValue.
+     *
+     * The comparison is first done on the return values of getValueType(). If the other value is another
+     * MethodTypeEncodedValue, the return values of getValue() are compared.
+     *
+     * @param o The EncodedValue to compare with this MethodTypeEncodedValue
+     * @return An integer representing the result of the comparison
+     */
+    @Override int compareTo(@Nonnull EncodedValue o);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/value/NullEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/NullEncodedValue.java
new file mode 100644
index 0000000..3c6988d
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/NullEncodedValue.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.value;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * This class represents an encoded null value.
+ */
+public interface NullEncodedValue extends EncodedValue {
+    /**
+     * Returns a hashcode for this EncodedNullValue.
+     *
+     * This hashCode is defined to be the following:
+     *
+     * <pre>
+     * {@code
+     * int hashCode = 0;
+     * }</pre>
+     *
+     * @return The hash code value for this EncodedNullValue
+     */
+    @Override int hashCode();
+
+    /**
+     * Compares this NullEncodedValue to another NullEncodedValue for equality.
+     *
+     * This NullEncodedValue is always equal to another other NullEncodedValue
+     *
+     * @param o The object to be compared for equality with this NullEncodedValue
+     * @return true if the specified object is equal to this NullEncodedValue
+     */
+    @Override boolean equals(@Nullable Object o);
+
+    /**
+     * Compare this NullEncodedValue to another EncodedValue.
+     *
+     * The comparison is first done on the return values of getValueType(). If the other value is another
+     * NullEncodedValue, then 0 is returned.
+     *
+     * @param o The EncodedValue to compare with this NullEncodedValue
+     * @return An integer representing the result of the comparison
+     */
+    @Override int compareTo(@Nonnull EncodedValue o);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/value/ShortEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/ShortEncodedValue.java
new file mode 100644
index 0000000..f5cb515
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/ShortEncodedValue.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.value;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * This class represents an encoded short value.
+ */
+public interface ShortEncodedValue extends EncodedValue {
+    /**
+     * Gets the short value.
+     *
+     * @return the short value
+     */
+    short getValue();
+
+    /**
+     * Returns a hashcode for this EncodedShortValue.
+     *
+     * This hashCode is defined to be the following:
+     *
+     * <pre>
+     * {@code
+     * int hashCode = getValue();
+     * }</pre>
+     *
+     * @return The hash code value for this EncodedShortValue
+     */
+    @Override int hashCode();
+
+    /**
+     * Compares this ShortEncodedValue to another ShortEncodedValue for equality.
+     *
+     * This ShortEncodedValue is equal to another ShortEncodedValue if the values returned by getValue() are equal.
+     *
+     * @param o The object to be compared for equality with this ShortEncodedValue
+     * @return true if the specified object is equal to this ShortEncodedValue
+     */
+    @Override boolean equals(@Nullable Object o);
+
+    /**
+     * Compare this ShortEncodedValue to another EncodedValue.
+     *
+     * The comparison is first done on the return values of getValueType(). If the other value is another
+     * ShortEncodedValue, the return values of getValue() are compared.
+     *
+     * @param o The EncodedValue to compare with this ShortEncodedValue
+     * @return An integer representing the result of the comparison
+     */
+    @Override int compareTo(@Nonnull EncodedValue o);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/value/StringEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/StringEncodedValue.java
new file mode 100644
index 0000000..01da85c
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/StringEncodedValue.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.value;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * This class represents an encoded string value.
+ */
+public interface StringEncodedValue extends EncodedValue {
+    /**
+     * Gets the string value.
+     *
+     * @return the string value
+     */
+    @Nonnull String getValue();
+
+    /**
+     * Returns a hashcode for this EncodedStringValue.
+     *
+     * This hashCode is defined to be the following:
+     *
+     * <pre>
+     * {@code
+     * int hashCode = getValue().hashCode();
+     * }</pre>
+     *
+     * @return The hash code value for this EncodedStringValue
+     */
+    @Override int hashCode();
+
+    /**
+     * Compares this StringEncodedValue to another StringEncodedValue for equality.
+     *
+     * This StringEncodedValue is equal to another StringEncodedValue if the values returned by getValue() are equal.
+     *
+     * @param o The object to be compared for equality with this StringEncodedValue
+     * @return true if the specified object is equal to this StringEncodedValue
+     */
+    @Override boolean equals(@Nullable Object o);
+
+    /**
+     * Compare this StringEncodedValue to another EncodedValue.
+     *
+     * The comparison is first done on the return values of getValueType(). If the other value is another
+     * StringEncodedValue, the return values of getValue() are compared.
+     *
+     * @param o The EncodedValue to compare with this StringEncodedValue
+     * @return An integer representing the result of the comparison
+     */
+    @Override int compareTo(@Nonnull EncodedValue o);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/value/TypeEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/TypeEncodedValue.java
new file mode 100644
index 0000000..6fb5ffd
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/value/TypeEncodedValue.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface.value;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * This class represents an encoded type value.
+ */
+public interface TypeEncodedValue extends EncodedValue {
+    /**
+     * Gets the type value.
+     *
+     * @return the type value
+     */
+    @Nonnull String getValue();
+
+    /**
+     * Returns a hashcode for this EncodedTypeValue.
+     *
+     * This hashCode is defined to be the following:
+     *
+     * <pre>
+     * {@code
+     * int hashCode = getValue().hashCode();
+     * }</pre>
+     *
+     * @return The hash code value for this EncodedTypeValue
+     */
+    @Override int hashCode();
+
+    /**
+     * Compares this TypeEncodedValue to another TypeEncodedValue for equality.
+     *
+     * This TypeEncodedValue is equal to another TypeEncodedValue if the values returned by getValue() are equal.
+     *
+     * @param o The object to be compared for equality with this TypeEncodedValue
+     * @return true if the specified object is equal to this TypeEncodedValue
+     */
+    @Override boolean equals(@Nullable Object o);
+
+    /**
+     * Compare this TypeEncodedValue to another EncodedValue.
+     *
+     * The comparison is first done on the return values of getValueType(). If the other value is another
+     * TypeEncodedValue, the return values of getValue() are compared.
+     *
+     * @param o The EncodedValue to compare with this TypeEncodedValue
+     * @return An integer representing the result of the comparison
+     */
+    @Override int compareTo(@Nonnull EncodedValue o);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableAnnotation.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableAnnotation.java
new file mode 100644
index 0000000..bb68e5b
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableAnnotation.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable;
+
+import com.google.common.collect.ImmutableSet;
+import org.jf.dexlib2.base.BaseAnnotation;
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.iface.AnnotationElement;
+import org.jf.util.ImmutableConverter;
+import org.jf.util.ImmutableUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Collection;
+
+public class ImmutableAnnotation extends BaseAnnotation {
+    protected final int visibility;
+    @Nonnull protected final String type;
+    @Nonnull protected final ImmutableSet<? extends ImmutableAnnotationElement> elements;
+
+    public ImmutableAnnotation(int visibility,
+                               @Nonnull String type,
+                               @Nullable Collection<? extends AnnotationElement> elements) {
+        this.visibility = visibility;
+        this.type = type;
+        this.elements = ImmutableAnnotationElement.immutableSetOf(elements);
+    }
+
+    public ImmutableAnnotation(int visibility,
+                               @Nonnull String type,
+                               @Nullable ImmutableSet<? extends ImmutableAnnotationElement> elements) {
+        this.visibility = visibility;
+        this.type = type;
+        this.elements = ImmutableUtils.nullToEmptySet(elements);
+    }
+
+    public static ImmutableAnnotation of(Annotation annotation) {
+        if (annotation instanceof  ImmutableAnnotation) {
+            return (ImmutableAnnotation)annotation;
+        }
+        return new ImmutableAnnotation(
+                annotation.getVisibility(),
+                annotation.getType(),
+                annotation.getElements());
+    }
+
+    @Override public int getVisibility() { return visibility; }
+    @Nonnull @Override public String getType() { return type; }
+    @Nonnull @Override public ImmutableSet<? extends ImmutableAnnotationElement> getElements() { return elements; }
+
+    @Nonnull
+    public static ImmutableSet<ImmutableAnnotation> immutableSetOf(@Nullable Iterable<? extends Annotation> list) {
+        return CONVERTER.toSet(list);
+    }
+
+    private static final ImmutableConverter<ImmutableAnnotation, Annotation> CONVERTER =
+            new ImmutableConverter<ImmutableAnnotation, Annotation>() {
+                @Override
+                protected boolean isImmutable(@Nonnull Annotation item) {
+                    return item instanceof ImmutableAnnotation;
+                }
+
+                @Nonnull
+                @Override
+                protected ImmutableAnnotation makeImmutable(@Nonnull Annotation item) {
+                    return ImmutableAnnotation.of(item);
+                }
+            };
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableAnnotationElement.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableAnnotationElement.java
new file mode 100644
index 0000000..8255658
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableAnnotationElement.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable;
+
+import com.google.common.collect.ImmutableSet;
+import org.jf.dexlib2.base.BaseAnnotationElement;
+import org.jf.dexlib2.iface.AnnotationElement;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.dexlib2.immutable.value.ImmutableEncodedValue;
+import org.jf.dexlib2.immutable.value.ImmutableEncodedValueFactory;
+import org.jf.util.ImmutableConverter;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class ImmutableAnnotationElement extends BaseAnnotationElement {
+    @Nonnull protected final String name;
+    @Nonnull protected final ImmutableEncodedValue value;
+
+    public ImmutableAnnotationElement(@Nonnull String name,
+                                      @Nonnull EncodedValue value) {
+        this.name = name;
+        this.value = ImmutableEncodedValueFactory.of(value);
+    }
+
+    public ImmutableAnnotationElement(@Nonnull String name,
+                                      @Nonnull ImmutableEncodedValue value) {
+        this.name = name;
+        this.value = value;
+    }
+
+    public static ImmutableAnnotationElement of(AnnotationElement annotationElement) {
+        if (annotationElement instanceof ImmutableAnnotationElement) {
+            return (ImmutableAnnotationElement)annotationElement;
+        }
+        return new ImmutableAnnotationElement(
+                annotationElement.getName(),
+                annotationElement.getValue());
+    }
+
+    @Nonnull @Override public String getName() { return name; }
+    @Nonnull @Override public EncodedValue getValue() { return value; }
+
+    @Nonnull
+    public static ImmutableSet<ImmutableAnnotationElement> immutableSetOf(
+            @Nullable Iterable<? extends AnnotationElement> list) {
+        return CONVERTER.toSet(list);
+    }
+
+    private static final ImmutableConverter<ImmutableAnnotationElement, AnnotationElement> CONVERTER =
+            new ImmutableConverter<ImmutableAnnotationElement, AnnotationElement>() {
+                @Override
+                protected boolean isImmutable(@Nonnull AnnotationElement item) {
+                    return item instanceof ImmutableAnnotationElement;
+                }
+
+                @Nonnull
+                @Override
+                protected ImmutableAnnotationElement makeImmutable(@Nonnull AnnotationElement item) {
+                    return ImmutableAnnotationElement.of(item);
+                }
+            };
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableClassDef.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableClassDef.java
new file mode 100644
index 0000000..8bdfff2
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableClassDef.java
@@ -0,0 +1,213 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable;
+
+import com.google.common.collect.*;
+import org.jf.dexlib2.base.reference.BaseTypeReference;
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.Field;
+import org.jf.dexlib2.iface.Method;
+import org.jf.dexlib2.util.FieldUtil;
+import org.jf.dexlib2.util.MethodUtil;
+import org.jf.util.ImmutableConverter;
+import org.jf.util.ImmutableUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.AbstractCollection;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
+public class ImmutableClassDef extends BaseTypeReference implements ClassDef {
+    @Nonnull protected final String type;
+    protected final int accessFlags;
+    @Nullable protected final String superclass;
+    @Nonnull protected final ImmutableList<String> interfaces;
+    @Nullable protected final String sourceFile;
+    @Nonnull protected final ImmutableSet<? extends ImmutableAnnotation> annotations;
+    @Nonnull protected final ImmutableSortedSet<? extends ImmutableField> staticFields;
+    @Nonnull protected final ImmutableSortedSet<? extends ImmutableField> instanceFields;
+    @Nonnull protected final ImmutableSortedSet<? extends ImmutableMethod> directMethods;
+    @Nonnull protected final ImmutableSortedSet<? extends ImmutableMethod> virtualMethods;
+
+    public ImmutableClassDef(@Nonnull String type,
+                             int accessFlags,
+                             @Nullable String superclass,
+                             @Nullable Collection<String> interfaces,
+                             @Nullable String sourceFile,
+                             @Nullable Collection<? extends Annotation> annotations,
+                             @Nullable Iterable<? extends Field> fields,
+                             @Nullable Iterable<? extends Method> methods) {
+        if (fields == null) {
+            fields = ImmutableList.of();
+        }
+        if (methods == null) {
+            methods = ImmutableList.of();
+        }
+
+        this.type = type;
+        this.accessFlags = accessFlags;
+        this.superclass = superclass;
+        this.interfaces = interfaces==null ? ImmutableList.<String>of() : ImmutableList.copyOf(interfaces);
+        this.sourceFile = sourceFile;
+        this.annotations = ImmutableAnnotation.immutableSetOf(annotations);
+        this.staticFields = ImmutableField.immutableSetOf(Iterables.filter(fields, FieldUtil.FIELD_IS_STATIC));
+        this.instanceFields = ImmutableField.immutableSetOf(Iterables.filter(fields, FieldUtil.FIELD_IS_INSTANCE));
+        this.directMethods = ImmutableMethod.immutableSetOf(Iterables.filter(methods, MethodUtil.METHOD_IS_DIRECT));
+        this.virtualMethods = ImmutableMethod.immutableSetOf(Iterables.filter(methods, MethodUtil.METHOD_IS_VIRTUAL));
+    }
+
+    public ImmutableClassDef(@Nonnull String type,
+                             int accessFlags,
+                             @Nullable String superclass,
+                             @Nullable Collection<String> interfaces,
+                             @Nullable String sourceFile,
+                             @Nullable Collection<? extends Annotation> annotations,
+                             @Nullable Iterable<? extends Field> staticFields,
+                             @Nullable Iterable<? extends Field> instanceFields,
+                             @Nullable Iterable<? extends Method> directMethods,
+                             @Nullable Iterable<? extends Method> virtualMethods) {
+        this.type = type;
+        this.accessFlags = accessFlags;
+        this.superclass = superclass;
+        this.interfaces = interfaces==null ? ImmutableList.<String>of() : ImmutableList.copyOf(interfaces);
+        this.sourceFile = sourceFile;
+        this.annotations = ImmutableAnnotation.immutableSetOf(annotations);
+        this.staticFields = ImmutableField.immutableSetOf(staticFields);
+        this.instanceFields = ImmutableField.immutableSetOf(instanceFields);
+        this.directMethods = ImmutableMethod.immutableSetOf(directMethods);
+        this.virtualMethods = ImmutableMethod.immutableSetOf(virtualMethods);
+    }
+
+    public ImmutableClassDef(@Nonnull String type,
+                             int accessFlags,
+                             @Nullable String superclass,
+                             @Nullable ImmutableList<String> interfaces,
+                             @Nullable String sourceFile,
+                             @Nullable ImmutableSet<? extends ImmutableAnnotation> annotations,
+                             @Nullable ImmutableSortedSet<? extends ImmutableField> staticFields,
+                             @Nullable ImmutableSortedSet<? extends ImmutableField> instanceFields,
+                             @Nullable ImmutableSortedSet<? extends ImmutableMethod> directMethods,
+                             @Nullable ImmutableSortedSet<? extends ImmutableMethod> virtualMethods) {
+        this.type = type;
+        this.accessFlags = accessFlags;
+        this.superclass = superclass;
+        this.interfaces = ImmutableUtils.nullToEmptyList(interfaces);
+        this.sourceFile = sourceFile;
+        this.annotations = ImmutableUtils.nullToEmptySet(annotations);
+        this.staticFields = ImmutableUtils.nullToEmptySortedSet(staticFields);
+        this.instanceFields = ImmutableUtils.nullToEmptySortedSet(instanceFields);
+        this.directMethods = ImmutableUtils.nullToEmptySortedSet(directMethods);
+        this.virtualMethods = ImmutableUtils.nullToEmptySortedSet(virtualMethods);
+    }
+
+    public static ImmutableClassDef of(ClassDef classDef) {
+        if (classDef instanceof ImmutableClassDef) {
+            return (ImmutableClassDef)classDef;
+        }
+        return new ImmutableClassDef(
+                classDef.getType(),
+                classDef.getAccessFlags(),
+                classDef.getSuperclass(),
+                classDef.getInterfaces(),
+                classDef.getSourceFile(),
+                classDef.getAnnotations(),
+                classDef.getStaticFields(),
+                classDef.getInstanceFields(),
+                classDef.getDirectMethods(),
+                classDef.getVirtualMethods());
+    }
+
+    @Nonnull @Override public String getType() { return type; }
+    @Override public int getAccessFlags() { return accessFlags; }
+    @Nullable @Override public String getSuperclass() { return superclass; }
+    @Nonnull @Override public ImmutableList<String> getInterfaces() { return interfaces; }
+    @Nullable @Override public String getSourceFile() { return sourceFile; }
+    @Nonnull @Override public ImmutableSet<? extends ImmutableAnnotation> getAnnotations() { return annotations; }
+    @Nonnull @Override public ImmutableSet<? extends ImmutableField> getStaticFields() { return staticFields; }
+    @Nonnull @Override public ImmutableSet<? extends ImmutableField> getInstanceFields() { return instanceFields; }
+    @Nonnull @Override public ImmutableSet<? extends ImmutableMethod> getDirectMethods() { return directMethods; }
+    @Nonnull @Override public ImmutableSet<? extends ImmutableMethod> getVirtualMethods() { return virtualMethods; }
+
+    @Nonnull
+    @Override
+    public Collection<? extends ImmutableField> getFields() {
+        return new AbstractCollection<ImmutableField>() {
+            @Nonnull
+            @Override
+            public Iterator<ImmutableField> iterator() {
+                return Iterators.concat(staticFields.iterator(), instanceFields.iterator());
+            }
+
+            @Override public int size() {
+                return staticFields.size() + instanceFields.size();
+            }
+        };
+    }
+
+    @Nonnull
+    @Override
+    public Collection<? extends ImmutableMethod> getMethods() {
+        return new AbstractCollection<ImmutableMethod>() {
+            @Nonnull
+            @Override
+            public Iterator<ImmutableMethod> iterator() {
+                return Iterators.concat(directMethods.iterator(), virtualMethods.iterator());
+            }
+
+            @Override public int size() {
+                return directMethods.size() + virtualMethods.size();
+            }
+        };
+    }
+
+    @Nonnull
+    public static ImmutableSet<ImmutableClassDef> immutableSetOf(@Nullable Iterable<? extends ClassDef> iterable) {
+        return CONVERTER.toSet(iterable);
+    }
+
+    private static final ImmutableConverter<ImmutableClassDef, ClassDef> CONVERTER =
+            new ImmutableConverter<ImmutableClassDef, ClassDef>() {
+                @Override
+                protected boolean isImmutable(@Nonnull ClassDef item) {
+                    return item instanceof ImmutableClassDef;
+                }
+
+                @Nonnull
+                @Override
+                protected ImmutableClassDef makeImmutable(@Nonnull ClassDef item) {
+                    return ImmutableClassDef.of(item);
+                }
+            };
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableDexFile.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableDexFile.java
new file mode 100644
index 0000000..76f39a1
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableDexFile.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable;
+
+import com.google.common.collect.ImmutableSet;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.DexFile;
+import org.jf.util.ImmutableUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Collection;
+
+public class ImmutableDexFile implements DexFile {
+    @Nonnull protected final ImmutableSet<? extends ImmutableClassDef> classes;
+    @Nonnull private final Opcodes opcodes;
+
+    public ImmutableDexFile(@Nonnull Opcodes opcodes, @Nullable Collection<? extends ClassDef> classes) {
+        this.classes = ImmutableClassDef.immutableSetOf(classes);
+        this.opcodes = opcodes;
+    }
+
+    public ImmutableDexFile(@Nonnull Opcodes opcodes, @Nullable ImmutableSet<? extends ImmutableClassDef> classes) {
+        this.classes = ImmutableUtils.nullToEmptySet(classes);
+        this.opcodes = opcodes;
+    }
+
+    public static ImmutableDexFile of(DexFile dexFile) {
+        if (dexFile instanceof ImmutableDexFile) {
+            return (ImmutableDexFile)dexFile;
+        }
+        return new ImmutableDexFile(dexFile.getOpcodes(), dexFile.getClasses());
+    }
+
+    @Nonnull @Override public ImmutableSet<? extends ImmutableClassDef> getClasses() { return classes; }
+    @Nonnull @Override public Opcodes getOpcodes() { return opcodes; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableExceptionHandler.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableExceptionHandler.java
new file mode 100644
index 0000000..4c71ffc
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableExceptionHandler.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable;
+
+import com.google.common.collect.ImmutableList;
+import org.jf.dexlib2.base.BaseExceptionHandler;
+import org.jf.dexlib2.iface.ExceptionHandler;
+import org.jf.util.ImmutableConverter;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class ImmutableExceptionHandler extends BaseExceptionHandler implements ExceptionHandler {
+    @Nullable protected final String exceptionType;
+    protected final int handlerCodeAddress;
+
+    public ImmutableExceptionHandler(@Nullable String exceptionType,
+                                     int handlerCodeAddress) {
+        this.exceptionType = exceptionType;
+        this.handlerCodeAddress = handlerCodeAddress;
+    }
+
+    public static ImmutableExceptionHandler of(ExceptionHandler exceptionHandler) {
+        if (exceptionHandler instanceof ImmutableExceptionHandler) {
+            return (ImmutableExceptionHandler)exceptionHandler;
+        }
+        return new ImmutableExceptionHandler(
+                exceptionHandler.getExceptionType(),
+                exceptionHandler.getHandlerCodeAddress());
+    }
+
+    @Nullable @Override public String getExceptionType() { return exceptionType; }
+    @Override public int getHandlerCodeAddress() { return handlerCodeAddress; }
+
+    @Nonnull
+    public static ImmutableList<ImmutableExceptionHandler> immutableListOf(
+            @Nullable Iterable<? extends ExceptionHandler> list) {
+        return CONVERTER.toList(list);
+    }
+
+    private static final ImmutableConverter<ImmutableExceptionHandler, ExceptionHandler> CONVERTER =
+            new ImmutableConverter<ImmutableExceptionHandler, ExceptionHandler>() {
+                @Override
+                protected boolean isImmutable(@Nonnull ExceptionHandler item) {
+                    return item instanceof ImmutableExceptionHandler;
+                }
+
+                @Nonnull
+                @Override
+                protected ImmutableExceptionHandler makeImmutable(@Nonnull ExceptionHandler item) {
+                    return ImmutableExceptionHandler.of(item);
+                }
+            };
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableField.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableField.java
new file mode 100644
index 0000000..0202be9
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableField.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSortedSet;
+import com.google.common.collect.Ordering;
+import org.jf.dexlib2.HiddenApiRestriction;
+import org.jf.dexlib2.base.reference.BaseFieldReference;
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.iface.Field;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.dexlib2.immutable.value.ImmutableEncodedValue;
+import org.jf.dexlib2.immutable.value.ImmutableEncodedValueFactory;
+import org.jf.util.ImmutableConverter;
+import org.jf.util.ImmutableUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Collection;
+import java.util.Set;
+
+public class ImmutableField extends BaseFieldReference implements Field {
+    @Nonnull protected final String definingClass;
+    @Nonnull protected final String name;
+    @Nonnull protected final String type;
+    protected final int accessFlags;
+    @Nullable protected final ImmutableEncodedValue initialValue;
+    @Nonnull protected final ImmutableSet<? extends ImmutableAnnotation> annotations;
+    @Nonnull protected final ImmutableSet<HiddenApiRestriction> hiddenApiRestrictions;
+
+    public ImmutableField(@Nonnull String definingClass,
+                          @Nonnull String name,
+                          @Nonnull String type,
+                          int accessFlags,
+                          @Nullable EncodedValue initialValue,
+                          @Nullable Collection<? extends Annotation> annotations,
+                          @Nullable Set<HiddenApiRestriction> hiddenApiRestrictions) {
+        this.definingClass = definingClass;
+        this.name = name;
+        this.type = type;
+        this.accessFlags = accessFlags;
+        this.initialValue = ImmutableEncodedValueFactory.ofNullable(initialValue);
+        this.annotations = ImmutableAnnotation.immutableSetOf(annotations);
+        this.hiddenApiRestrictions =
+                hiddenApiRestrictions == null ? ImmutableSet.of() : ImmutableSet.copyOf(hiddenApiRestrictions);
+    }
+
+    public ImmutableField(@Nonnull String definingClass,
+                          @Nonnull String name,
+                          @Nonnull String type,
+                          int accessFlags,
+                          @Nullable ImmutableEncodedValue initialValue,
+                          @Nullable ImmutableSet<? extends ImmutableAnnotation> annotations,
+                          @Nullable ImmutableSet<HiddenApiRestriction> hiddenApiRestrictions) {
+        this.definingClass = definingClass;
+        this.name = name;
+        this.type = type;
+        this.accessFlags = accessFlags;
+        this.initialValue = initialValue;
+        this.annotations = ImmutableUtils.nullToEmptySet(annotations);
+        this.hiddenApiRestrictions = ImmutableUtils.nullToEmptySet(hiddenApiRestrictions);
+    }
+
+    public static ImmutableField of(Field field) {
+        if (field instanceof  ImmutableField) {
+            return (ImmutableField)field;
+        }
+        return new ImmutableField(
+                field.getDefiningClass(),
+                field.getName(),
+                field.getType(),
+                field.getAccessFlags(),
+                field.getInitialValue(),
+                field.getAnnotations(),
+                field.getHiddenApiRestrictions());
+    }
+
+    @Nonnull @Override public String getDefiningClass() { return definingClass; }
+    @Nonnull @Override public String getName() { return name; }
+    @Nonnull @Override public String getType() { return type; }
+    @Override public int getAccessFlags() { return accessFlags; }
+    @Override public EncodedValue getInitialValue() { return initialValue;}
+    @Nonnull @Override public ImmutableSet<? extends ImmutableAnnotation> getAnnotations() { return annotations; }
+    @Nonnull @Override public Set<HiddenApiRestriction> getHiddenApiRestrictions() { return hiddenApiRestrictions; }
+
+    @Nonnull
+    public static ImmutableSortedSet<ImmutableField> immutableSetOf(@Nullable Iterable<? extends Field> list) {
+        return CONVERTER.toSortedSet(Ordering.natural(), list);
+    }
+
+    private static final ImmutableConverter<ImmutableField, Field> CONVERTER =
+            new ImmutableConverter<ImmutableField, Field>() {
+                @Override
+                protected boolean isImmutable(@Nonnull Field item) {
+                    return item instanceof ImmutableField;
+                }
+
+                @Nonnull
+                @Override
+                protected ImmutableField makeImmutable(@Nonnull Field item) {
+                    return ImmutableField.of(item);
+                }
+            };
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableMethod.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableMethod.java
new file mode 100644
index 0000000..cc1f02c
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableMethod.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSortedSet;
+import com.google.common.collect.Ordering;
+import org.jf.dexlib2.HiddenApiRestriction;
+import org.jf.dexlib2.base.reference.BaseMethodReference;
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.iface.Method;
+import org.jf.dexlib2.iface.MethodImplementation;
+import org.jf.dexlib2.iface.MethodParameter;
+import org.jf.util.ImmutableConverter;
+import org.jf.util.ImmutableUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Set;
+
+public class ImmutableMethod extends BaseMethodReference implements Method {
+    @Nonnull protected final String definingClass;
+    @Nonnull protected final String name;
+    @Nonnull protected final ImmutableList<? extends ImmutableMethodParameter> parameters;
+    @Nonnull protected final String returnType;
+    protected final int accessFlags;
+    @Nonnull protected final ImmutableSet<? extends ImmutableAnnotation> annotations;
+    @Nonnull protected final ImmutableSet<HiddenApiRestriction> hiddenApiRestrictions;
+    @Nullable protected final ImmutableMethodImplementation methodImplementation;
+
+    public ImmutableMethod(@Nonnull String definingClass,
+                           @Nonnull String name,
+                           @Nullable Iterable<? extends MethodParameter> parameters,
+                           @Nonnull String returnType,
+                           int accessFlags,
+                           @Nullable Set<? extends Annotation> annotations,
+                           @Nullable Set<HiddenApiRestriction> hiddenApiRestrictions,
+                           @Nullable MethodImplementation methodImplementation) {
+        this.definingClass = definingClass;
+        this.name = name;
+        this.parameters = ImmutableMethodParameter.immutableListOf(parameters);
+        this.returnType = returnType;
+        this.accessFlags = accessFlags;
+        this.annotations = ImmutableAnnotation.immutableSetOf(annotations);
+        this.hiddenApiRestrictions =
+                hiddenApiRestrictions == null ? ImmutableSet.of() : ImmutableSet.copyOf(hiddenApiRestrictions);
+        this.methodImplementation = ImmutableMethodImplementation.of(methodImplementation);
+    }
+
+    public ImmutableMethod(@Nonnull String definingClass,
+                           @Nonnull String name,
+                           @Nullable ImmutableList<? extends ImmutableMethodParameter> parameters,
+                           @Nonnull String returnType,
+                           int accessFlags,
+                           @Nullable ImmutableSet<? extends ImmutableAnnotation> annotations,
+                           @Nullable ImmutableSet<HiddenApiRestriction> hiddenApiRestrictions,
+                           @Nullable ImmutableMethodImplementation methodImplementation) {
+        this.definingClass = definingClass;
+        this.name = name;
+        this.parameters = ImmutableUtils.nullToEmptyList(parameters);
+        this.returnType = returnType;
+        this.accessFlags = accessFlags;
+        this.annotations = ImmutableUtils.nullToEmptySet(annotations);
+        this.hiddenApiRestrictions = ImmutableUtils.nullToEmptySet(hiddenApiRestrictions);
+        this.methodImplementation = methodImplementation;
+    }
+
+    public static ImmutableMethod of(Method method) {
+        if (method instanceof ImmutableMethod) {
+            return (ImmutableMethod)method;
+        }
+        return new ImmutableMethod(
+                method.getDefiningClass(),
+                method.getName(),
+                method.getParameters(),
+                method.getReturnType(),
+                method.getAccessFlags(),
+                method.getAnnotations(),
+                method.getHiddenApiRestrictions(),
+                method.getImplementation());
+    }
+
+    @Override @Nonnull public String getDefiningClass() { return definingClass; }
+    @Override @Nonnull public String getName() { return name; }
+    @Override @Nonnull public ImmutableList<? extends CharSequence> getParameterTypes() { return parameters; }
+    @Override @Nonnull public ImmutableList<? extends ImmutableMethodParameter> getParameters() { return parameters; }
+    @Override @Nonnull public String getReturnType() { return returnType; }
+    @Override public int getAccessFlags() { return accessFlags; }
+    @Override @Nonnull public ImmutableSet<? extends ImmutableAnnotation> getAnnotations() { return annotations; }
+    @Nonnull @Override public Set<HiddenApiRestriction> getHiddenApiRestrictions() { return hiddenApiRestrictions; }
+    @Override @Nullable public ImmutableMethodImplementation getImplementation() { return methodImplementation; }
+
+    @Nonnull
+    public static ImmutableSortedSet<ImmutableMethod> immutableSetOf(@Nullable Iterable<? extends Method> list) {
+        return CONVERTER.toSortedSet(Ordering.natural(), list);
+    }
+
+    private static final ImmutableConverter<ImmutableMethod, Method> CONVERTER =
+            new ImmutableConverter<ImmutableMethod, Method>() {
+                @Override
+                protected boolean isImmutable(@Nonnull Method item) {
+                    return item instanceof ImmutableMethod;
+                }
+
+                @Nonnull
+                @Override
+                protected ImmutableMethod makeImmutable(@Nonnull Method item) {
+                    return ImmutableMethod.of(item);
+                }
+            };
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableMethodImplementation.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableMethodImplementation.java
new file mode 100644
index 0000000..c111730
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableMethodImplementation.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable;
+
+import com.google.common.collect.ImmutableList;
+import org.jf.dexlib2.iface.ExceptionHandler;
+import org.jf.dexlib2.iface.MethodImplementation;
+import org.jf.dexlib2.iface.TryBlock;
+import org.jf.dexlib2.iface.debug.DebugItem;
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.dexlib2.immutable.debug.ImmutableDebugItem;
+import org.jf.dexlib2.immutable.instruction.ImmutableInstruction;
+import org.jf.util.ImmutableUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.List;
+
+public class ImmutableMethodImplementation implements MethodImplementation {
+    protected final int registerCount;
+    @Nonnull protected final ImmutableList<? extends ImmutableInstruction> instructions;
+    @Nonnull protected final ImmutableList<? extends ImmutableTryBlock> tryBlocks;
+    @Nonnull protected final ImmutableList<? extends ImmutableDebugItem> debugItems;
+
+    public ImmutableMethodImplementation(int registerCount,
+                                         @Nullable Iterable<? extends Instruction> instructions,
+                                         @Nullable List<? extends TryBlock<? extends ExceptionHandler>> tryBlocks,
+                                         @Nullable Iterable<? extends DebugItem> debugItems) {
+        this.registerCount = registerCount;
+        this.instructions = ImmutableInstruction.immutableListOf(instructions);
+        this.tryBlocks = ImmutableTryBlock.immutableListOf(tryBlocks);
+        this.debugItems = ImmutableDebugItem.immutableListOf(debugItems);
+    }
+
+    public ImmutableMethodImplementation(int registerCount,
+                                         @Nullable ImmutableList<? extends ImmutableInstruction> instructions,
+                                         @Nullable ImmutableList<? extends ImmutableTryBlock> tryBlocks,
+                                         @Nullable ImmutableList<? extends ImmutableDebugItem> debugItems) {
+        this.registerCount = registerCount;
+        this.instructions = ImmutableUtils.nullToEmptyList(instructions);
+        this.tryBlocks = ImmutableUtils.nullToEmptyList(tryBlocks);
+        this.debugItems = ImmutableUtils.nullToEmptyList(debugItems);
+    }
+
+    @Nullable
+    public static ImmutableMethodImplementation of(@Nullable MethodImplementation methodImplementation) {
+        if (methodImplementation == null) {
+            return null;
+        }
+        if (methodImplementation instanceof ImmutableMethodImplementation) {
+            return (ImmutableMethodImplementation)methodImplementation;
+        }
+        return new ImmutableMethodImplementation(
+                methodImplementation.getRegisterCount(),
+                methodImplementation.getInstructions(),
+                methodImplementation.getTryBlocks(),
+                methodImplementation.getDebugItems());
+    }
+
+    @Override public int getRegisterCount() { return registerCount; }
+    @Nonnull @Override public ImmutableList<? extends ImmutableInstruction> getInstructions() { return instructions; }
+    @Nonnull @Override public ImmutableList<? extends ImmutableTryBlock> getTryBlocks() { return tryBlocks; }
+    @Nonnull @Override public ImmutableList<? extends ImmutableDebugItem> getDebugItems() { return debugItems; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableMethodParameter.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableMethodParameter.java
new file mode 100644
index 0000000..05124ff
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableMethodParameter.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import org.jf.dexlib2.base.BaseMethodParameter;
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.iface.MethodParameter;
+import org.jf.util.ImmutableConverter;
+import org.jf.util.ImmutableUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Set;
+
+public class ImmutableMethodParameter extends BaseMethodParameter {
+    @Nonnull protected final String type;
+    @Nonnull protected final ImmutableSet<? extends ImmutableAnnotation> annotations;
+    @Nullable protected final String name;
+
+    public ImmutableMethodParameter(@Nonnull String type,
+                                    @Nullable Set<? extends Annotation> annotations,
+                                    @Nullable String name) {
+        this.type = type;
+        this.annotations = ImmutableAnnotation.immutableSetOf(annotations);
+        this.name = name;
+    }
+
+    public ImmutableMethodParameter(@Nonnull String type,
+                                    @Nullable ImmutableSet<? extends ImmutableAnnotation> annotations,
+                                    @Nullable String name) {
+        this.type = type;
+        this.annotations = ImmutableUtils.nullToEmptySet(annotations);
+        this.name = name;
+    }
+
+    public static ImmutableMethodParameter of(MethodParameter methodParameter) {
+        if (methodParameter instanceof ImmutableMethodParameter) {
+            return (ImmutableMethodParameter)methodParameter;
+        }
+        return new ImmutableMethodParameter(
+                methodParameter.getType(),
+                methodParameter.getAnnotations(),
+                methodParameter.getName());
+    }
+
+    @Nonnull @Override public String getType() { return type; }
+    @Nonnull @Override public Set<? extends Annotation> getAnnotations() { return annotations; }
+    @Nullable @Override public String getName() { return name; }
+
+    //TODO: iterate over the annotations to get the signature
+    @Nullable @Override public String getSignature() { return null; }
+
+    @Nonnull
+    public static ImmutableList<ImmutableMethodParameter> immutableListOf(
+            @Nullable Iterable<? extends MethodParameter> list) {
+        return CONVERTER.toList(list);
+    }
+
+    private static final ImmutableConverter<ImmutableMethodParameter, MethodParameter> CONVERTER =
+            new ImmutableConverter<ImmutableMethodParameter, MethodParameter>() {
+                @Override
+                protected boolean isImmutable(@Nonnull MethodParameter item) {
+                    return item instanceof ImmutableMethodParameter;
+                }
+
+                @Nonnull
+                @Override
+                protected ImmutableMethodParameter makeImmutable(@Nonnull MethodParameter item) {
+                    return ImmutableMethodParameter.of(item);
+                }
+            };
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableMultiDexContainer.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableMultiDexContainer.java
new file mode 100644
index 0000000..ae3e8eb
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableMultiDexContainer.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2019, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import org.jf.dexlib2.iface.MultiDexContainer;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.List;
+import java.util.Map;
+
+public class ImmutableMultiDexContainer implements MultiDexContainer<ImmutableDexFile> {
+
+    private final ImmutableMap<String, ImmutableDexEntry> entries;
+
+    public ImmutableMultiDexContainer(Map<String, ImmutableDexFile> entries) {
+        ImmutableMap.Builder<String, ImmutableDexEntry> builder = ImmutableMap.builder();
+
+        for (Map.Entry<String, ImmutableDexFile> entry : entries.entrySet()) {
+            ImmutableDexEntry dexEntry = new ImmutableDexEntry(entry.getKey(), entry.getValue());
+            builder.put(dexEntry.getEntryName(), dexEntry);
+        }
+
+        this.entries = builder.build();
+    }
+
+
+    @Nonnull
+    @Override
+    public List<String> getDexEntryNames() {
+        return ImmutableList.copyOf(entries.keySet());
+    }
+
+    @Nullable
+    @Override
+    public ImmutableDexEntry getEntry(@Nonnull String entryName) {
+        return entries.get(entryName);
+    }
+
+    public class ImmutableDexEntry implements DexEntry<ImmutableDexFile> {
+
+        private final String entryName;
+        private final ImmutableDexFile dexFile;
+
+        protected ImmutableDexEntry(String entryName, ImmutableDexFile dexFile) {
+            this.entryName = entryName;
+            this.dexFile = dexFile;
+        }
+
+        @Nonnull
+        @Override
+        public String getEntryName() {
+            return entryName;
+        }
+
+        @Nonnull
+        @Override
+        public ImmutableDexFile getDexFile() {
+            return dexFile;
+        }
+
+        @Nonnull
+        @Override
+        public MultiDexContainer<? extends ImmutableDexFile> getContainer() {
+            return ImmutableMultiDexContainer.this;
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableTryBlock.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableTryBlock.java
new file mode 100644
index 0000000..aa442bf
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableTryBlock.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable;
+
+import com.google.common.collect.ImmutableList;
+import org.jf.dexlib2.base.BaseTryBlock;
+import org.jf.dexlib2.iface.ExceptionHandler;
+import org.jf.dexlib2.iface.TryBlock;
+import org.jf.util.ImmutableConverter;
+import org.jf.util.ImmutableUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.List;
+
+public class ImmutableTryBlock extends BaseTryBlock<ImmutableExceptionHandler> {
+    protected final int startCodeAddress;
+    protected final int codeUnitCount;
+    @Nonnull protected final ImmutableList<? extends ImmutableExceptionHandler> exceptionHandlers;
+
+    public ImmutableTryBlock(int startCodeAddress,
+                             int codeUnitCount,
+                             @Nullable List<? extends ExceptionHandler> exceptionHandlers) {
+        this.startCodeAddress = startCodeAddress;
+        this.codeUnitCount = codeUnitCount;
+        this.exceptionHandlers = ImmutableExceptionHandler.immutableListOf(exceptionHandlers);
+    }
+
+    public ImmutableTryBlock(int startCodeAddress,
+                             int codeUnitCount,
+                             @Nullable ImmutableList<? extends ImmutableExceptionHandler> exceptionHandlers) {
+        this.startCodeAddress = startCodeAddress;
+        this.codeUnitCount = codeUnitCount;
+        this.exceptionHandlers = ImmutableUtils.nullToEmptyList(exceptionHandlers);
+    }
+
+    public static ImmutableTryBlock of(TryBlock<? extends ExceptionHandler> tryBlock) {
+        if (tryBlock instanceof ImmutableTryBlock) {
+            return (ImmutableTryBlock)tryBlock;
+        }
+        return new ImmutableTryBlock(
+                tryBlock.getStartCodeAddress(),
+                tryBlock.getCodeUnitCount(),
+                tryBlock.getExceptionHandlers());
+    }
+
+    @Override public int getStartCodeAddress() { return startCodeAddress; }
+    @Override public int getCodeUnitCount() { return codeUnitCount; }
+
+    @Nonnull @Override public ImmutableList<? extends ImmutableExceptionHandler> getExceptionHandlers() {
+        return exceptionHandlers;
+    }
+
+    @Nonnull
+    public static ImmutableList<ImmutableTryBlock> immutableListOf(
+            @Nullable List<? extends TryBlock<? extends ExceptionHandler>> list) {
+        return CONVERTER.toList(list);
+    }
+
+    private static final ImmutableConverter<ImmutableTryBlock, TryBlock<? extends ExceptionHandler>> CONVERTER =
+            new ImmutableConverter<ImmutableTryBlock, TryBlock<? extends ExceptionHandler>>() {
+                @Override
+                protected boolean isImmutable(@Nonnull TryBlock item) {
+                    return item instanceof ImmutableTryBlock;
+                }
+
+                @Nonnull
+                @Override
+                protected ImmutableTryBlock makeImmutable(@Nonnull TryBlock<? extends ExceptionHandler> item) {
+                    return ImmutableTryBlock.of(item);
+                }
+            };
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutableDebugItem.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutableDebugItem.java
new file mode 100644
index 0000000..7b016ef
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutableDebugItem.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.debug;
+
+import com.google.common.collect.ImmutableList;
+import org.jf.dexlib2.DebugItemType;
+import org.jf.dexlib2.iface.debug.*;
+import org.jf.util.ExceptionWithContext;
+import org.jf.util.ImmutableConverter;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public abstract class ImmutableDebugItem implements DebugItem {
+    protected final int codeAddress;
+
+    public ImmutableDebugItem(int codeAddress) {
+        this.codeAddress = codeAddress;
+    }
+
+    @Nonnull
+    public static ImmutableDebugItem of(DebugItem debugItem) {
+        if (debugItem instanceof ImmutableDebugItem) {
+            return (ImmutableDebugItem)debugItem;
+        }
+        switch (debugItem.getDebugItemType()) {
+            case DebugItemType.START_LOCAL:
+                return ImmutableStartLocal.of((StartLocal)debugItem);
+            case DebugItemType.END_LOCAL:
+                return ImmutableEndLocal.of((EndLocal)debugItem);
+            case DebugItemType.RESTART_LOCAL:
+                return ImmutableRestartLocal.of((RestartLocal)debugItem);
+            case DebugItemType.PROLOGUE_END:
+                return ImmutablePrologueEnd.of((PrologueEnd)debugItem);
+            case DebugItemType.EPILOGUE_BEGIN:
+                return ImmutableEpilogueBegin.of((EpilogueBegin)debugItem);
+            case DebugItemType.SET_SOURCE_FILE:
+                return ImmutableSetSourceFile.of((SetSourceFile)debugItem);
+            case DebugItemType.LINE_NUMBER:
+                return ImmutableLineNumber.of((LineNumber)debugItem);
+            default:
+                throw new ExceptionWithContext("Invalid debug item type: %d", debugItem.getDebugItemType());
+        }
+    }
+
+    @Override public int getCodeAddress() { return codeAddress; }
+
+    @Nonnull
+    public static ImmutableList<ImmutableDebugItem> immutableListOf(@Nullable Iterable<? extends DebugItem> list) {
+        return CONVERTER.toList(list);
+    }
+
+    private static final ImmutableConverter<ImmutableDebugItem, DebugItem> CONVERTER =
+            new ImmutableConverter<ImmutableDebugItem, DebugItem>() {
+                @Override
+                protected boolean isImmutable(@Nonnull DebugItem item) {
+                    return item instanceof ImmutableDebugItem;
+                }
+
+                @Nonnull
+                @Override
+                protected ImmutableDebugItem makeImmutable(@Nonnull DebugItem item) {
+                    return ImmutableDebugItem.of(item);
+                }
+            };
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutableEndLocal.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutableEndLocal.java
new file mode 100644
index 0000000..4cc0cac
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutableEndLocal.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.debug;
+
+import org.jf.dexlib2.DebugItemType;
+import org.jf.dexlib2.iface.debug.EndLocal;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class ImmutableEndLocal extends ImmutableDebugItem implements EndLocal {
+    protected final int register;
+    @Nullable protected final String name;
+    @Nullable protected final String type;
+    @Nullable protected final String signature;
+
+    public ImmutableEndLocal(int codeAddress,
+                             int register) {
+        super(codeAddress);
+        this.register = register;
+        this.name = null;
+        this.type = null;
+        this.signature = null;
+    }
+
+    public ImmutableEndLocal(int codeAddress,
+                             int register,
+                             @Nullable String name,
+                             @Nullable String type,
+                             @Nullable String signature) {
+        super(codeAddress);
+        this.register = register;
+        this.name = name;
+        this.type = type;
+        this.signature = signature;
+    }
+
+    @Nonnull
+    public static ImmutableEndLocal of(@Nonnull EndLocal endLocal) {
+        if (endLocal instanceof  ImmutableEndLocal) {
+            return (ImmutableEndLocal)endLocal;
+        }
+        return new ImmutableEndLocal(
+                endLocal.getCodeAddress(),
+                endLocal.getRegister(),
+                endLocal.getType(),
+                endLocal.getName(),
+                endLocal.getSignature());
+    }
+
+    @Override public int getRegister() { return register; }
+    @Nullable @Override public String getName() { return name; }
+    @Nullable @Override public String getType() { return type; }
+    @Nullable @Override public String getSignature() { return signature; }
+
+    @Override public int getDebugItemType() { return DebugItemType.END_LOCAL; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutableEpilogueBegin.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutableEpilogueBegin.java
new file mode 100644
index 0000000..dcb9567
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutableEpilogueBegin.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.debug;
+
+import org.jf.dexlib2.DebugItemType;
+import org.jf.dexlib2.iface.debug.EpilogueBegin;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableEpilogueBegin extends ImmutableDebugItem implements EpilogueBegin {
+    public ImmutableEpilogueBegin(int codeAddress) {
+        super(codeAddress);
+    }
+
+    @Nonnull
+    public static ImmutableEpilogueBegin of(@Nonnull EpilogueBegin epilogueBegin) {
+        if (epilogueBegin instanceof ImmutableEpilogueBegin) {
+            return (ImmutableEpilogueBegin)epilogueBegin;
+        }
+        return new ImmutableEpilogueBegin(epilogueBegin.getCodeAddress());
+    }
+
+    @Override public int getDebugItemType() { return DebugItemType.EPILOGUE_BEGIN; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutableLineNumber.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutableLineNumber.java
new file mode 100644
index 0000000..fcfafe5
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutableLineNumber.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.debug;
+
+import org.jf.dexlib2.DebugItemType;
+import org.jf.dexlib2.iface.debug.LineNumber;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableLineNumber extends ImmutableDebugItem implements LineNumber {
+    protected final int lineNumber;
+
+    public ImmutableLineNumber(int codeAddress,
+                               int lineNumber) {
+        super(codeAddress);
+        this.lineNumber = lineNumber;
+    }
+
+    @Nonnull
+    public static ImmutableLineNumber of(@Nonnull LineNumber lineNumber) {
+        if (lineNumber instanceof ImmutableLineNumber) {
+            return (ImmutableLineNumber)lineNumber;
+        }
+        return new ImmutableLineNumber(
+                lineNumber.getCodeAddress(),
+                lineNumber.getLineNumber());
+    }
+
+    @Override public int getLineNumber() { return lineNumber; }
+
+    @Override public int getDebugItemType() { return DebugItemType.LINE_NUMBER; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutablePrologueEnd.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutablePrologueEnd.java
new file mode 100644
index 0000000..dac5350
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutablePrologueEnd.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.debug;
+
+import org.jf.dexlib2.DebugItemType;
+import org.jf.dexlib2.iface.debug.PrologueEnd;
+
+import javax.annotation.Nonnull;
+
+public class ImmutablePrologueEnd extends ImmutableDebugItem implements PrologueEnd {
+    public ImmutablePrologueEnd(int codeAddress) {
+        super(codeAddress);
+    }
+
+    @Nonnull
+    public static ImmutablePrologueEnd of(@Nonnull PrologueEnd prologueEnd) {
+        if (prologueEnd instanceof ImmutablePrologueEnd) {
+            return (ImmutablePrologueEnd)prologueEnd;
+        }
+        return new ImmutablePrologueEnd(prologueEnd.getCodeAddress());
+    }
+
+    @Override public int getDebugItemType() { return DebugItemType.PROLOGUE_END; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutableRestartLocal.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutableRestartLocal.java
new file mode 100644
index 0000000..c639e7d
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutableRestartLocal.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.debug;
+
+import org.jf.dexlib2.DebugItemType;
+import org.jf.dexlib2.iface.debug.RestartLocal;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class ImmutableRestartLocal extends ImmutableDebugItem implements RestartLocal {
+    protected final int register;
+    @Nullable protected final String name;
+    @Nullable protected final String type;
+    @Nullable protected final String signature;
+
+    public ImmutableRestartLocal(int codeAddress,
+                                 int register) {
+        super(codeAddress);
+        this.register = register;
+        this.name = null;
+        this.type = null;
+        this.signature = null;
+    }
+
+    public ImmutableRestartLocal(int codeAddress,
+                                 int register,
+                                 @Nullable String name,
+                                 @Nullable String type,
+                                 @Nullable String signature) {
+        super(codeAddress);
+        this.register = register;
+        this.name = name;
+        this.type = type;
+        this.signature = signature;
+    }
+
+    @Nonnull
+    public static ImmutableRestartLocal of(@Nonnull RestartLocal restartLocal) {
+        if (restartLocal instanceof  ImmutableRestartLocal) {
+            return (ImmutableRestartLocal)restartLocal;
+        }
+        return new ImmutableRestartLocal(
+                restartLocal.getCodeAddress(),
+                restartLocal.getRegister(),
+                restartLocal.getType(),
+                restartLocal.getName(),
+                restartLocal.getSignature());
+    }
+
+    @Override public int getRegister() { return register; }
+    @Nullable @Override public String getName() { return name; }
+    @Nullable @Override public String getType() { return type; }
+    @Nullable @Override public String getSignature() { return signature; }
+
+    @Override public int getDebugItemType() { return DebugItemType.RESTART_LOCAL; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutableSetSourceFile.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutableSetSourceFile.java
new file mode 100644
index 0000000..b74adab
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutableSetSourceFile.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.debug;
+
+import org.jf.dexlib2.DebugItemType;
+import org.jf.dexlib2.base.reference.BaseStringReference;
+import org.jf.dexlib2.iface.debug.SetSourceFile;
+import org.jf.dexlib2.iface.reference.StringReference;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class ImmutableSetSourceFile extends ImmutableDebugItem implements SetSourceFile {
+    @Nullable protected final String sourceFile;
+
+    public ImmutableSetSourceFile(int codeAddress,
+                                  @Nullable String sourceFile) {
+        super(codeAddress);
+        this.sourceFile = sourceFile;
+    }
+
+    @Nonnull
+    public static ImmutableSetSourceFile of (@Nonnull SetSourceFile setSourceFile) {
+        if (setSourceFile instanceof ImmutableSetSourceFile) {
+            return (ImmutableSetSourceFile)setSourceFile;
+        }
+        return new ImmutableSetSourceFile(
+                setSourceFile.getCodeAddress(),
+                setSourceFile.getSourceFile());
+    }
+
+    @Nullable @Override public String getSourceFile() { return sourceFile; }
+
+    @Nullable @Override public StringReference getSourceFileReference() {
+        return sourceFile==null?null:new BaseStringReference() {
+            @Nonnull @Override public String getString() {
+                return sourceFile;
+            }
+        };
+    }
+
+
+    @Override public int getDebugItemType() { return DebugItemType.SET_SOURCE_FILE; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutableStartLocal.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutableStartLocal.java
new file mode 100644
index 0000000..db19f01
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/debug/ImmutableStartLocal.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.debug;
+
+import org.jf.dexlib2.DebugItemType;
+import org.jf.dexlib2.base.reference.BaseStringReference;
+import org.jf.dexlib2.base.reference.BaseTypeReference;
+import org.jf.dexlib2.iface.debug.StartLocal;
+import org.jf.dexlib2.iface.reference.StringReference;
+import org.jf.dexlib2.iface.reference.TypeReference;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class ImmutableStartLocal extends ImmutableDebugItem implements StartLocal {
+    protected final int register;
+    @Nullable protected final String name;
+    @Nullable protected final String type;
+    @Nullable protected final String signature;
+
+    public ImmutableStartLocal(int codeAddress,
+                               int register,
+                               @Nullable String name,
+                               @Nullable String type,
+                               @Nullable String signature) {
+        super(codeAddress);
+        this.register = register;
+        this.name = name;
+        this.type = type;
+        this.signature = signature;
+    }
+
+    @Nonnull
+    public static ImmutableStartLocal of(@Nonnull StartLocal startLocal) {
+        if (startLocal instanceof  ImmutableStartLocal) {
+            return (ImmutableStartLocal)startLocal;
+        }
+        return new ImmutableStartLocal(
+                startLocal.getCodeAddress(),
+                startLocal.getRegister(),
+                startLocal.getName(),
+                startLocal.getType(),
+                startLocal.getSignature());
+    }
+
+    @Override public int getRegister() { return register; }
+
+    @Nullable @Override public StringReference getNameReference() {
+        return name==null?null:new BaseStringReference() {
+            @Nonnull @Override public String getString() {
+                return name;
+            }
+        };
+    }
+
+    @Nullable @Override public TypeReference getTypeReference() {
+        return type==null?null:new BaseTypeReference() {
+            @Nonnull @Override public String getType() {
+                return type;
+            }
+        };
+    }
+
+    @Nullable @Override public StringReference getSignatureReference() {
+        return signature==null?null:new BaseStringReference() {
+            @Nonnull @Override public String getString() {
+                return signature;
+            }
+        };
+    }
+
+    @Nullable @Override public String getName() { return name; }
+    @Nullable @Override public String getType() { return type; }
+    @Nullable @Override public String getSignature() { return signature; }
+
+    @Override public int getDebugItemType() { return DebugItemType.START_LOCAL; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableArrayPayload.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableArrayPayload.java
new file mode 100644
index 0000000..3b7656e
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableArrayPayload.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import com.google.common.collect.ImmutableList;
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.ArrayPayload;
+import org.jf.dexlib2.util.Preconditions;
+import org.jf.util.ImmutableUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.List;
+
+public class ImmutableArrayPayload extends ImmutableInstruction implements ArrayPayload {
+    public static final Opcode OPCODE = Opcode.ARRAY_PAYLOAD;
+
+    protected final int elementWidth;
+    @Nonnull protected final ImmutableList<Number> arrayElements;
+
+    public ImmutableArrayPayload(int elementWidth,
+                                 @Nullable List<Number> arrayElements) {
+        super(OPCODE);
+        this.elementWidth = Preconditions.checkArrayPayloadElementWidth(elementWidth);
+        this.arrayElements = Preconditions.checkArrayPayloadElements(elementWidth,
+                arrayElements==null ? ImmutableList.<Number>of() : ImmutableList.copyOf(arrayElements));
+    }
+
+    public ImmutableArrayPayload(int elementWidth,
+                                 @Nullable ImmutableList<Number> arrayElements) {
+        super(OPCODE);
+        this.elementWidth = Preconditions.checkArrayPayloadElementWidth(elementWidth);
+        this.arrayElements = Preconditions.checkArrayPayloadElements(elementWidth, ImmutableUtils.nullToEmptyList(arrayElements));
+    }
+
+    @Nonnull
+    public static ImmutableArrayPayload of(ArrayPayload instruction) {
+        if (instruction instanceof ImmutableArrayPayload) {
+            return (ImmutableArrayPayload)instruction;
+        }
+        return new ImmutableArrayPayload(
+                instruction.getElementWidth(),
+                instruction.getArrayElements());
+    }
+
+    @Override public int getElementWidth() { return elementWidth; }
+    @Nonnull @Override public List<Number> getArrayElements() { return arrayElements; }
+
+    @Override public int getCodeUnits() { return 4 + (elementWidth * arrayElements.size() + 1) / 2; }
+    @Override public Format getFormat() { return OPCODE.format; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction.java
new file mode 100644
index 0000000..1954194
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import com.google.common.collect.ImmutableList;
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.dexlib2.iface.instruction.formats.*;
+import org.jf.dexlib2.util.Preconditions;
+import org.jf.util.ImmutableConverter;
+
+import javax.annotation.Nonnull;
+
+public abstract class ImmutableInstruction implements Instruction {
+    @Nonnull protected final Opcode opcode;
+
+    protected ImmutableInstruction(@Nonnull Opcode opcode) {
+        Preconditions.checkFormat(opcode, getFormat());
+        this.opcode = opcode;
+    }
+
+    @Nonnull
+    public static ImmutableInstruction of(Instruction instruction) {
+        if (instruction instanceof ImmutableInstruction) {
+            return (ImmutableInstruction)instruction;
+        }
+
+        switch (instruction.getOpcode().format) {
+            case Format10t:
+                return ImmutableInstruction10t.of((Instruction10t)instruction);
+            case Format10x:
+                if (instruction instanceof UnknownInstruction) {
+                    return ImmutableUnknownInstruction.of((UnknownInstruction)instruction);
+                }
+                return ImmutableInstruction10x.of((Instruction10x)instruction);
+            case Format11n:
+                return ImmutableInstruction11n.of((Instruction11n)instruction);
+            case Format11x:
+                return ImmutableInstruction11x.of((Instruction11x)instruction);
+            case Format12x:
+                return ImmutableInstruction12x.of((Instruction12x)instruction);
+            case Format20bc:
+                return ImmutableInstruction20bc.of((Instruction20bc)instruction);
+            case Format20t:
+                return ImmutableInstruction20t.of((Instruction20t)instruction);
+            case Format21c:
+                return ImmutableInstruction21c.of((Instruction21c)instruction);
+            case Format21ih:
+                return ImmutableInstruction21ih.of((Instruction21ih)instruction);
+            case Format21lh:
+                return ImmutableInstruction21lh.of((Instruction21lh)instruction);
+            case Format21s:
+                return ImmutableInstruction21s.of((Instruction21s)instruction);
+            case Format21t:
+                return ImmutableInstruction21t.of((Instruction21t)instruction);
+            case Format22b:
+                return ImmutableInstruction22b.of((Instruction22b)instruction);
+            case Format22c:
+                return ImmutableInstruction22c.of((Instruction22c)instruction);
+            case Format22cs:
+                return ImmutableInstruction22cs.of((Instruction22cs)instruction);
+            case Format22s:
+                return ImmutableInstruction22s.of((Instruction22s)instruction);
+            case Format22t:
+                return ImmutableInstruction22t.of((Instruction22t)instruction);
+            case Format22x:
+                return ImmutableInstruction22x.of((Instruction22x)instruction);
+            case Format23x:
+                return ImmutableInstruction23x.of((Instruction23x)instruction);
+            case Format30t:
+                return ImmutableInstruction30t.of((Instruction30t)instruction);
+            case Format31c:
+                return ImmutableInstruction31c.of((Instruction31c)instruction);
+            case Format31i:
+                return ImmutableInstruction31i.of((Instruction31i)instruction);
+            case Format31t:
+                return ImmutableInstruction31t.of((Instruction31t)instruction);
+            case Format32x:
+                return ImmutableInstruction32x.of((Instruction32x)instruction);
+            case Format35c:
+                return ImmutableInstruction35c.of((Instruction35c)instruction);
+            case Format35mi:
+                return ImmutableInstruction35mi.of((Instruction35mi)instruction);
+            case Format35ms:
+                return ImmutableInstruction35ms.of((Instruction35ms)instruction);
+            case Format3rc:
+                return ImmutableInstruction3rc.of((Instruction3rc)instruction);
+            case Format3rmi:
+                return ImmutableInstruction3rmi.of((Instruction3rmi)instruction);
+            case Format3rms:
+                return ImmutableInstruction3rms.of((Instruction3rms)instruction);
+            case Format45cc:
+                return ImmutableInstruction45cc.of((Instruction45cc)instruction);
+            case Format4rcc:
+                return ImmutableInstruction4rcc.of((Instruction4rcc)instruction);
+            case Format51l:
+                return ImmutableInstruction51l.of((Instruction51l)instruction);
+            case PackedSwitchPayload:
+                return ImmutablePackedSwitchPayload.of((PackedSwitchPayload) instruction);
+            case SparseSwitchPayload:
+                return ImmutableSparseSwitchPayload.of((SparseSwitchPayload) instruction);
+            case ArrayPayload:
+                return ImmutableArrayPayload.of((ArrayPayload) instruction);
+            default:
+                throw new RuntimeException("Unexpected instruction type");
+        }
+    }
+
+    @Nonnull public Opcode getOpcode() {
+        return opcode;
+    }
+
+    public abstract Format getFormat();
+
+    public int getCodeUnits() {
+        return getFormat().size / 2;
+    }
+
+    @Nonnull
+    public static ImmutableList<ImmutableInstruction> immutableListOf(Iterable<? extends Instruction> list) {
+        return CONVERTER.toList(list);
+    }
+
+    private static final ImmutableConverter<ImmutableInstruction, Instruction> CONVERTER =
+            new ImmutableConverter<ImmutableInstruction, Instruction>() {
+                @Override
+                protected boolean isImmutable(@Nonnull Instruction item) {
+                    return item instanceof ImmutableInstruction;
+                }
+
+                @Nonnull
+                @Override
+                protected ImmutableInstruction makeImmutable(@Nonnull Instruction item) {
+                    return ImmutableInstruction.of(item);
+                }
+            };
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction10t.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction10t.java
new file mode 100644
index 0000000..5f8ecd1
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction10t.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction10t;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction10t extends ImmutableInstruction implements Instruction10t {
+    public static final Format FORMAT = Format.Format10t;
+
+    protected final int codeOffset;
+
+    public ImmutableInstruction10t(@Nonnull Opcode opcode,
+                                   int codeOffset) {
+        super(opcode);
+        this.codeOffset = Preconditions.checkByteCodeOffset(codeOffset);
+    }
+
+    public static ImmutableInstruction10t of(Instruction10t instruction) {
+        if (instruction instanceof ImmutableInstruction10t) {
+            return (ImmutableInstruction10t)instruction;
+        }
+        return new ImmutableInstruction10t(
+                instruction.getOpcode(),
+                instruction.getCodeOffset());
+    }
+
+    @Override public int getCodeOffset() { return codeOffset; }
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction10x.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction10x.java
new file mode 100644
index 0000000..c69eda7
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction10x.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction10x;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction10x extends ImmutableInstruction implements Instruction10x {
+    public static final Format FORMAT = Format.Format10x;
+
+    public ImmutableInstruction10x(@Nonnull Opcode opcode) {
+        super(opcode);
+    }
+
+    public static ImmutableInstruction10x of(Instruction10x instruction) {
+        if (instruction instanceof ImmutableInstruction10x) {
+            return (ImmutableInstruction10x)instruction;
+        }
+        return new ImmutableInstruction10x(instruction.getOpcode());
+    }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction11n.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction11n.java
new file mode 100644
index 0000000..05ad13c
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction11n.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction11n;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction11n extends ImmutableInstruction implements Instruction11n {
+    public static final Format FORMAT = Format.Format11n;
+
+    protected final int registerA;
+    protected final int literal;
+
+    public ImmutableInstruction11n(@Nonnull Opcode opcode,
+                                   int registerA,
+                                   int literal) {
+        super(opcode);
+        this.registerA = Preconditions.checkNibbleRegister(registerA);
+        this.literal = Preconditions.checkNibbleLiteral(literal);
+    }
+    
+    public static ImmutableInstruction11n of(Instruction11n instruction) {
+        if (instruction instanceof ImmutableInstruction11n) {
+            return (ImmutableInstruction11n)instruction;
+        }
+        return new ImmutableInstruction11n(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getNarrowLiteral());
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public int getNarrowLiteral() { return literal; }
+    @Override public long getWideLiteral() { return literal; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction11x.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction11x.java
new file mode 100644
index 0000000..7b7b2ae
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction11x.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction11x;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction11x extends ImmutableInstruction implements Instruction11x {
+    public static final Format FORMAT = Format.Format11x;
+
+    protected final int registerA;
+
+    public ImmutableInstruction11x(@Nonnull Opcode opcode,
+                                   int registerA) {
+        super(opcode);
+        this.registerA = Preconditions.checkByteRegister(registerA);
+    }
+
+    public static ImmutableInstruction11x of(Instruction11x instruction) {
+        if (instruction instanceof ImmutableInstruction11x) {
+            return (ImmutableInstruction11x)instruction;
+        }
+        return new ImmutableInstruction11x(
+                instruction.getOpcode(),
+                instruction.getRegisterA());
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction12x.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction12x.java
new file mode 100644
index 0000000..c192f98
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction12x.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction12x;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction12x extends ImmutableInstruction implements Instruction12x {
+    public static final Format FORMAT = Format.Format12x;
+
+    protected final int registerA;
+    protected final int registerB;
+
+    public ImmutableInstruction12x(@Nonnull Opcode opcode,
+                                   int registerA,
+                                   int registerB) {
+        super(opcode);
+        this.registerA = Preconditions.checkNibbleRegister(registerA);
+        this.registerB = Preconditions.checkNibbleRegister(registerB);
+    }
+
+    public static ImmutableInstruction12x of(Instruction12x instruction) {
+        if (instruction instanceof ImmutableInstruction12x) {
+            return (ImmutableInstruction12x)instruction;
+        }
+        return new ImmutableInstruction12x(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getRegisterB());
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public int getRegisterB() { return registerB; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction20bc.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction20bc.java
new file mode 100644
index 0000000..a0b9677
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction20bc.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.ReferenceType;
+import org.jf.dexlib2.iface.instruction.formats.Instruction20bc;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.dexlib2.immutable.reference.ImmutableReference;
+import org.jf.dexlib2.immutable.reference.ImmutableReferenceFactory;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction20bc extends ImmutableInstruction implements Instruction20bc {
+    public static final Format FORMAT = Format.Format20bc;
+
+    protected final int verificationError;
+    @Nonnull protected final ImmutableReference reference;
+
+    public ImmutableInstruction20bc(@Nonnull Opcode opcode,
+                                   int verificationError,
+                                   @Nonnull Reference reference) {
+        super(opcode);
+        this.verificationError = Preconditions.checkVerificationError(verificationError);
+        this.reference = ImmutableReferenceFactory.of(opcode.referenceType, reference);
+    }
+
+    public static ImmutableInstruction20bc of(Instruction20bc instruction) {
+        if (instruction instanceof ImmutableInstruction20bc) {
+            return (ImmutableInstruction20bc)instruction;
+        }
+        return new ImmutableInstruction20bc(
+                instruction.getOpcode(),
+                instruction.getVerificationError(),
+                instruction.getReference());
+    }
+
+    @Override public int getVerificationError() { return verificationError; }
+    @Nonnull @Override public ImmutableReference getReference() { return reference; }
+    @Override public int getReferenceType() { return ReferenceType.getReferenceType(reference); }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction20t.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction20t.java
new file mode 100644
index 0000000..92f4547
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction20t.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction20t;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction20t extends ImmutableInstruction implements Instruction20t {
+    public static final Format FORMAT = Format.Format20t;
+
+    protected final int codeOffset;
+
+    public ImmutableInstruction20t(@Nonnull Opcode opcode,
+                                   int codeOffset) {
+        super(opcode);
+        this.codeOffset = Preconditions.checkShortCodeOffset(codeOffset);
+    }
+
+    public static ImmutableInstruction20t of(Instruction20t instruction) {
+        if (instruction instanceof ImmutableInstruction20t) {
+            return (ImmutableInstruction20t)instruction;
+        }
+        return new ImmutableInstruction20t(
+                instruction.getOpcode(),
+                instruction.getCodeOffset());
+    }
+
+    @Override public int getCodeOffset() { return codeOffset; }
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction21c.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction21c.java
new file mode 100644
index 0000000..9b0717d
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction21c.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction21c;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.dexlib2.immutable.reference.ImmutableReference;
+import org.jf.dexlib2.immutable.reference.ImmutableReferenceFactory;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction21c extends ImmutableInstruction implements Instruction21c {
+    public static final Format FORMAT = Format.Format21c;
+
+    protected final int registerA;
+    @Nonnull protected final ImmutableReference reference;
+
+    public ImmutableInstruction21c(@Nonnull Opcode opcode,
+                                      int registerA,
+                                      @Nonnull Reference reference) {
+        super(opcode);
+        this.registerA = Preconditions.checkByteRegister(registerA);
+        this.reference = ImmutableReferenceFactory.of(opcode.referenceType, reference);
+    }
+
+    public static ImmutableInstruction21c of(Instruction21c instruction) {
+        if (instruction instanceof ImmutableInstruction21c) {
+            return (ImmutableInstruction21c)instruction;
+        }
+        return new ImmutableInstruction21c(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getReference());
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Nonnull @Override public ImmutableReference getReference() { return reference; }
+    @Override public int getReferenceType() { return opcode.referenceType; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction21ih.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction21ih.java
new file mode 100644
index 0000000..a095c2a
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction21ih.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction21ih;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction21ih extends ImmutableInstruction implements Instruction21ih {
+    public static final Format FORMAT = Format.Format21ih;
+
+    protected final int registerA;
+    protected final int literal;
+
+    public ImmutableInstruction21ih(@Nonnull Opcode opcode,
+                                    int registerA,
+                                    int literal) {
+        super(opcode);
+        this.registerA = Preconditions.checkByteRegister(registerA);
+        this.literal = Preconditions.checkIntegerHatLiteral(literal);
+    }
+
+    public static ImmutableInstruction21ih of(Instruction21ih instruction) {
+        if (instruction instanceof ImmutableInstruction21ih) {
+            return (ImmutableInstruction21ih)instruction;
+        }
+        return new ImmutableInstruction21ih(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getNarrowLiteral());
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public int getNarrowLiteral() { return literal; }
+    @Override public long getWideLiteral() { return literal; }
+    @Override public short getHatLiteral() { return (short)(literal >>> 16); }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction21lh.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction21lh.java
new file mode 100644
index 0000000..ed63cdd
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction21lh.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction21lh;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction21lh extends ImmutableInstruction implements Instruction21lh {
+    public static final Format FORMAT = Format.Format21lh;
+
+    protected final int registerA;
+    protected final long literal;
+
+    public ImmutableInstruction21lh(@Nonnull Opcode opcode,
+                                    int registerA,
+                                    long literal) {
+        super(opcode);
+        this.registerA = Preconditions.checkByteRegister(registerA);
+        this.literal = Preconditions.checkLongHatLiteral(literal);
+    }
+
+    public static ImmutableInstruction21lh of(Instruction21lh instruction) {
+        if (instruction instanceof ImmutableInstruction21lh) {
+            return (ImmutableInstruction21lh)instruction;
+        }
+        return new ImmutableInstruction21lh(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getWideLiteral());
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public long getWideLiteral() { return literal; }
+    @Override public short getHatLiteral() { return (short)(literal >>> 48); }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction21s.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction21s.java
new file mode 100644
index 0000000..259c74b
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction21s.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction21s;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction21s extends ImmutableInstruction implements Instruction21s {
+    public static final Format FORMAT = Format.Format21s;
+
+    protected final int registerA;
+    protected final int literal;
+
+    public ImmutableInstruction21s(@Nonnull Opcode opcode,
+                                   int registerA,
+                                   int literal) {
+        super(opcode);
+        this.registerA = Preconditions.checkByteRegister(registerA);
+        this.literal = Preconditions.checkShortLiteral(literal);
+    }
+
+    public static ImmutableInstruction21s of(Instruction21s instruction) {
+        if (instruction instanceof ImmutableInstruction21s) {
+            return (ImmutableInstruction21s)instruction;
+        }
+        return new ImmutableInstruction21s(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getNarrowLiteral());
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public int getNarrowLiteral() { return literal; }
+    @Override public long getWideLiteral() { return literal; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction21t.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction21t.java
new file mode 100644
index 0000000..c9db4e6
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction21t.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction21t;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction21t extends ImmutableInstruction implements Instruction21t {
+    public static final Format FORMAT = Format.Format21t;
+
+    protected final int registerA;
+    protected final int codeOffset;
+
+    public ImmutableInstruction21t(@Nonnull Opcode opcode,
+                                   int registerA,
+                                   int codeOffset) {
+        super(opcode);
+        this.registerA = Preconditions.checkByteRegister(registerA);
+        this.codeOffset = Preconditions.checkShortCodeOffset(codeOffset);
+    }
+
+    public static ImmutableInstruction21t of(Instruction21t instruction) {
+        if (instruction instanceof ImmutableInstruction21t) {
+            return (ImmutableInstruction21t)instruction;
+        }
+        return new ImmutableInstruction21t(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getCodeOffset());
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public int getCodeOffset() { return codeOffset; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction22b.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction22b.java
new file mode 100644
index 0000000..9dae438
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction22b.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction22b;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction22b extends ImmutableInstruction implements Instruction22b {
+    public static final Format FORMAT = Format.Format22b;
+
+    protected final int registerA;
+    protected final int registerB;
+    protected final int literal;
+
+    public ImmutableInstruction22b(@Nonnull Opcode opcode,
+                                   int registerA,
+                                   int registerB,
+                                   int literal) {
+        super(opcode);
+        this.registerA = Preconditions.checkByteRegister(registerA);
+        this.registerB = Preconditions.checkByteRegister(registerB);
+        this.literal = Preconditions.checkByteLiteral(literal);
+    }
+
+    public static ImmutableInstruction22b of(Instruction22b instruction) {
+        if (instruction instanceof ImmutableInstruction22b) {
+            return (ImmutableInstruction22b)instruction;
+        }
+        return new ImmutableInstruction22b(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getRegisterB(),
+                instruction.getNarrowLiteral());
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public int getRegisterB() { return registerB; }
+    @Override public int getNarrowLiteral() { return literal; }
+    @Override public long getWideLiteral() { return literal; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction22c.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction22c.java
new file mode 100644
index 0000000..7220077
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction22c.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction22c;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.dexlib2.immutable.reference.ImmutableReference;
+import org.jf.dexlib2.immutable.reference.ImmutableReferenceFactory;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction22c extends ImmutableInstruction implements Instruction22c {
+    public static final Format FORMAT = Format.Format22c;
+
+    protected final int registerA;
+    protected final int registerB;
+    @Nonnull protected final ImmutableReference reference;
+
+    public ImmutableInstruction22c(@Nonnull Opcode opcode,
+                                   int registerA,
+                                   int registerB,
+                                   @Nonnull Reference reference) {
+        super(opcode);
+        this.registerA = Preconditions.checkNibbleRegister(registerA);
+        this.registerB = Preconditions.checkNibbleRegister(registerB);
+        this.reference = ImmutableReferenceFactory.of(opcode.referenceType, reference);
+    }
+
+    public static ImmutableInstruction22c of(Instruction22c instruction) {
+        if (instruction instanceof ImmutableInstruction22c) {
+            return (ImmutableInstruction22c)instruction;
+        }
+        return new ImmutableInstruction22c(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getRegisterB(),
+                instruction.getReference());
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public int getRegisterB() { return registerB; }
+    @Nonnull @Override public ImmutableReference getReference() { return reference; }
+    @Override public int getReferenceType() { return opcode.referenceType; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
\ No newline at end of file
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction22cs.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction22cs.java
new file mode 100644
index 0000000..f17e88d
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction22cs.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction22cs;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction22cs extends ImmutableInstruction implements Instruction22cs {
+    public static final Format FORMAT = Format.Format22cs;
+
+    protected final int registerA;
+    protected final int registerB;
+    protected final int fieldOffset;
+
+    public ImmutableInstruction22cs(@Nonnull Opcode opcode,
+                                   int registerA,
+                                   int registerB,
+                                   int fieldOffset) {
+        super(opcode);
+        this.registerA = Preconditions.checkNibbleRegister(registerA);
+        this.registerB = Preconditions.checkNibbleRegister(registerB);
+        this.fieldOffset = Preconditions.checkFieldOffset(fieldOffset);
+    }
+
+    public static ImmutableInstruction22cs of(Instruction22cs instruction) {
+        if (instruction instanceof ImmutableInstruction22cs) {
+            return (ImmutableInstruction22cs)instruction;
+        }
+        return new ImmutableInstruction22cs(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getRegisterB(),
+                instruction.getFieldOffset());
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public int getRegisterB() { return registerB; }
+    @Override public int getFieldOffset() { return fieldOffset; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction22s.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction22s.java
new file mode 100644
index 0000000..96a9f0e
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction22s.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction22s;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction22s extends ImmutableInstruction implements Instruction22s {
+    public static final Format FORMAT = Format.Format22s;
+
+    protected final int registerA;
+    protected final int registerB;
+    protected final int literal;
+
+    public ImmutableInstruction22s(@Nonnull Opcode opcode,
+                                   int registerA,
+                                   int registerB,
+                                   int literal) {
+        super(opcode);
+        this.registerA = Preconditions.checkNibbleRegister(registerA);
+        this.registerB = Preconditions.checkNibbleRegister(registerB);
+        this.literal = Preconditions.checkShortLiteral(literal);
+    }
+
+    public static ImmutableInstruction22s of(Instruction22s instruction) {
+        if (instruction instanceof ImmutableInstruction22s) {
+            return (ImmutableInstruction22s)instruction;
+        }
+        return new ImmutableInstruction22s(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getRegisterB(),
+                instruction.getNarrowLiteral());
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public int getRegisterB() { return registerB; }
+    @Override public int getNarrowLiteral() { return literal; }
+    @Override public long getWideLiteral() { return literal; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
\ No newline at end of file
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction22t.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction22t.java
new file mode 100644
index 0000000..9e334dd
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction22t.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction22t;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction22t extends ImmutableInstruction implements Instruction22t {
+    public static final Format FORMAT = Format.Format22t;
+
+    protected final int registerA;
+    protected final int registerB;
+    protected final int codeOffset;
+
+    public ImmutableInstruction22t(@Nonnull Opcode opcode,
+                                   int registerA,
+                                   int registerB,
+                                   int codeOffset) {
+        super(opcode);
+        this.registerA = Preconditions.checkNibbleRegister(registerA);
+        this.registerB = Preconditions.checkNibbleRegister(registerB);
+        this.codeOffset = Preconditions.checkShortCodeOffset(codeOffset);
+    }
+
+    public static ImmutableInstruction22t of(Instruction22t instruction) {
+        if (instruction instanceof ImmutableInstruction22t) {
+            return (ImmutableInstruction22t)instruction;
+        }
+        return new ImmutableInstruction22t(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getRegisterB(),
+                instruction.getCodeOffset());
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public int getRegisterB() { return registerB; }
+    @Override public int getCodeOffset() { return codeOffset; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction22x.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction22x.java
new file mode 100644
index 0000000..cad6687
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction22x.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction22x;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction22x extends ImmutableInstruction implements Instruction22x {
+    public static final Format FORMAT = Format.Format22x;
+
+    protected final int registerA;
+    protected final int registerB;
+
+    public ImmutableInstruction22x(@Nonnull Opcode opcode,
+                                   int registerA,
+                                   int registerB) {
+        super(opcode);
+        this.registerA = Preconditions.checkByteRegister(registerA);
+        this.registerB = Preconditions.checkShortRegister(registerB);
+    }
+
+    public static ImmutableInstruction22x of(Instruction22x instruction) {
+        if (instruction instanceof ImmutableInstruction22x) {
+            return (ImmutableInstruction22x)instruction;
+        }
+        return new ImmutableInstruction22x(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getRegisterB());
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public int getRegisterB() { return registerB; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction23x.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction23x.java
new file mode 100644
index 0000000..e5ef91a
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction23x.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction23x;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction23x extends ImmutableInstruction implements Instruction23x {
+    public static final Format FORMAT = Format.Format23x;
+
+    protected final int registerA;
+    protected final int registerB;
+    protected final int registerC;
+
+    public ImmutableInstruction23x(@Nonnull Opcode opcode,
+                                   int registerA,
+                                   int registerB,
+                                   int registerC) {
+        super(opcode);
+        this.registerA = Preconditions.checkByteRegister(registerA);
+        this.registerB = Preconditions.checkByteRegister(registerB);
+        this.registerC = Preconditions.checkByteRegister(registerC);
+    }
+
+    public static ImmutableInstruction23x of(Instruction23x instruction) {
+        if (instruction instanceof ImmutableInstruction23x) {
+            return (ImmutableInstruction23x)instruction;
+        }
+        return new ImmutableInstruction23x(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getRegisterB(),
+                instruction.getRegisterC());
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public int getRegisterB() { return registerB; }
+    @Override public int getRegisterC() { return registerC; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction30t.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction30t.java
new file mode 100644
index 0000000..364e3a6
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction30t.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction30t;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction30t extends ImmutableInstruction implements Instruction30t {
+    public static final Format FORMAT = Format.Format30t;
+
+    protected final int codeOffset;
+
+    public ImmutableInstruction30t(@Nonnull Opcode opcode,
+                                   int codeOffset) {
+        super(opcode);
+        this.codeOffset = codeOffset;
+    }
+
+    public static ImmutableInstruction30t of(Instruction30t instruction) {
+        if (instruction instanceof ImmutableInstruction30t) {
+            return (ImmutableInstruction30t)instruction;
+        }
+        return new ImmutableInstruction30t(
+                instruction.getOpcode(),
+                instruction.getCodeOffset());
+    }
+
+    @Override public int getCodeOffset() { return codeOffset; }
+    @Override public Format getFormat() { return FORMAT; }
+}
+
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction31c.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction31c.java
new file mode 100644
index 0000000..f8699d9
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction31c.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction31c;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.dexlib2.immutable.reference.ImmutableReference;
+import org.jf.dexlib2.immutable.reference.ImmutableReferenceFactory;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction31c extends ImmutableInstruction implements Instruction31c {
+    public static final Format FORMAT = Format.Format31c;
+
+    protected final int registerA;
+    @Nonnull protected final ImmutableReference reference;
+
+    public ImmutableInstruction31c(@Nonnull Opcode opcode,
+                                   int registerA,
+                                   @Nonnull Reference reference) {
+        super(opcode);
+        this.registerA = Preconditions.checkByteRegister(registerA);
+        this.reference = ImmutableReferenceFactory.of(opcode.referenceType, reference);
+    }
+
+    public static ImmutableInstruction31c of(Instruction31c instruction) {
+        if (instruction instanceof ImmutableInstruction31c) {
+            return (ImmutableInstruction31c)instruction;
+        }
+        return new ImmutableInstruction31c(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getReference());
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Nonnull @Override public ImmutableReference getReference() { return reference; }
+    @Override public int getReferenceType() { return opcode.referenceType; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction31i.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction31i.java
new file mode 100644
index 0000000..7d8f644
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction31i.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction31i;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction31i extends ImmutableInstruction implements Instruction31i {
+    public static final Format FORMAT = Format.Format31i;
+
+    protected final int registerA;
+    protected final int literal;
+
+    public ImmutableInstruction31i(@Nonnull Opcode opcode,
+                                   int registerA,
+                                   int literal) {
+        super(opcode);
+        this.registerA = Preconditions.checkByteRegister(registerA);
+        this.literal = literal;
+    }
+
+    public static ImmutableInstruction31i of(Instruction31i instruction) {
+        if (instruction instanceof ImmutableInstruction31i) {
+            return (ImmutableInstruction31i)instruction;
+        }
+        return new ImmutableInstruction31i(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getNarrowLiteral());
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public int getNarrowLiteral() { return literal; }
+    @Override public long getWideLiteral() { return literal; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction31t.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction31t.java
new file mode 100644
index 0000000..6f865ee
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction31t.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction31t;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction31t extends ImmutableInstruction implements Instruction31t {
+    public static final Format FORMAT = Format.Format31t;
+
+    protected final int registerA;
+    protected final int codeOffset;
+
+    public ImmutableInstruction31t(@Nonnull Opcode opcode,
+                                   int registerA,
+                                   int codeOffset) {
+        super(opcode);
+        this.registerA = Preconditions.checkByteRegister(registerA);
+        this.codeOffset = codeOffset;
+    }
+
+    public static ImmutableInstruction31t of(Instruction31t instruction) {
+        if (instruction instanceof ImmutableInstruction31t) {
+            return (ImmutableInstruction31t)instruction;
+        }
+        return new ImmutableInstruction31t(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getCodeOffset());
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public int getCodeOffset() { return codeOffset; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
+
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction32x.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction32x.java
new file mode 100644
index 0000000..1027098
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction32x.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction32x;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction32x extends ImmutableInstruction implements Instruction32x {
+    public static final Format FORMAT = Format.Format32x;
+
+    protected final int registerA;
+    protected final int registerB;
+
+    public ImmutableInstruction32x(@Nonnull Opcode opcode,
+                                   int registerA,
+                                   int registerB) {
+        super(opcode);
+        this.registerA = Preconditions.checkShortRegister(registerA);
+        this.registerB = Preconditions.checkShortRegister(registerB);
+    }
+
+    public static ImmutableInstruction32x of(Instruction32x instruction) {
+        if (instruction instanceof ImmutableInstruction32x) {
+            return (ImmutableInstruction32x)instruction;
+        }
+        return new ImmutableInstruction32x(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getRegisterB());
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public int getRegisterB() { return registerB; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction35c.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction35c.java
new file mode 100644
index 0000000..7ac1a8f
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction35c.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction35c;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.dexlib2.immutable.reference.ImmutableReference;
+import org.jf.dexlib2.immutable.reference.ImmutableReferenceFactory;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction35c extends ImmutableInstruction implements Instruction35c {
+    public static final Format FORMAT = Format.Format35c;
+
+    protected final int registerCount;
+    protected final int registerC;
+    protected final int registerD;
+    protected final int registerE;
+    protected final int registerF;
+    protected final int registerG;
+    @Nonnull protected final ImmutableReference reference;
+
+    public ImmutableInstruction35c(@Nonnull Opcode opcode,
+                                   int registerCount,
+                                   int registerC,
+                                   int registerD,
+                                   int registerE,
+                                   int registerF,
+                                   int registerG,
+                                   @Nonnull Reference reference) {
+        super(opcode);
+        this.registerCount = Preconditions.check35cAnd45ccRegisterCount(registerCount);
+        this.registerC = (registerCount>0) ? Preconditions.checkNibbleRegister(registerC) : 0;
+        this.registerD = (registerCount>1) ? Preconditions.checkNibbleRegister(registerD) : 0;
+        this.registerE = (registerCount>2) ? Preconditions.checkNibbleRegister(registerE) : 0;
+        this.registerF = (registerCount>3) ? Preconditions.checkNibbleRegister(registerF) : 0;
+        this.registerG = (registerCount>4) ? Preconditions.checkNibbleRegister(registerG) : 0;
+        this.reference = ImmutableReferenceFactory.of(opcode.referenceType, reference);
+    }
+
+    public static ImmutableInstruction35c of(Instruction35c instruction) {
+        if (instruction instanceof ImmutableInstruction35c) {
+            return (ImmutableInstruction35c)instruction;
+        }
+        return new ImmutableInstruction35c(
+                instruction.getOpcode(),
+                instruction.getRegisterCount(),
+                instruction.getRegisterC(),
+                instruction.getRegisterD(),
+                instruction.getRegisterE(),
+                instruction.getRegisterF(),
+                instruction.getRegisterG(),
+                instruction.getReference());
+    }
+
+    @Override public int getRegisterCount() { return registerCount; }
+    @Override public int getRegisterC() { return registerC; }
+    @Override public int getRegisterD() { return registerD; }
+    @Override public int getRegisterE() { return registerE; }
+    @Override public int getRegisterF() { return registerF; }
+    @Override public int getRegisterG() { return registerG; }
+    @Nonnull @Override public ImmutableReference getReference() { return reference; }
+    @Override public int getReferenceType() { return opcode.referenceType; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction35mi.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction35mi.java
new file mode 100644
index 0000000..5e58cae
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction35mi.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction35mi;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction35mi extends ImmutableInstruction implements Instruction35mi {
+    public static final Format FORMAT = Format.Format35mi;
+
+    protected final int registerCount;
+    protected final int registerC;
+    protected final int registerD;
+    protected final int registerE;
+    protected final int registerF;
+    protected final int registerG;
+    protected final int inlineIndex;
+
+    public ImmutableInstruction35mi(@Nonnull Opcode opcode,
+                                    int registerCount,
+                                    int registerC,
+                                    int registerD,
+                                    int registerE,
+                                    int registerF,
+                                    int registerG,
+                                    int inlineIndex) {
+        super(opcode);
+        this.registerCount = Preconditions.check35cAnd45ccRegisterCount(registerCount);
+        this.registerC = (registerCount>0) ? Preconditions.checkNibbleRegister(registerC) : 0;
+        this.registerD = (registerCount>1) ? Preconditions.checkNibbleRegister(registerD) : 0;
+        this.registerE = (registerCount>2) ? Preconditions.checkNibbleRegister(registerE) : 0;
+        this.registerF = (registerCount>3) ? Preconditions.checkNibbleRegister(registerF) : 0;
+        this.registerG = (registerCount>4) ? Preconditions.checkNibbleRegister(registerG) : 0;
+        this.inlineIndex = Preconditions.checkInlineIndex(inlineIndex);
+    }
+
+    public static ImmutableInstruction35mi of(Instruction35mi instruction) {
+        if (instruction instanceof ImmutableInstruction35mi) {
+            return (ImmutableInstruction35mi)instruction;
+        }
+        return new ImmutableInstruction35mi(
+                instruction.getOpcode(),
+                instruction.getRegisterCount(),
+                instruction.getRegisterC(),
+                instruction.getRegisterD(),
+                instruction.getRegisterE(),
+                instruction.getRegisterF(),
+                instruction.getRegisterG(),
+                instruction.getInlineIndex());
+    }
+
+    @Override public int getRegisterCount() { return registerCount; }
+    @Override public int getRegisterC() { return registerC; }
+    @Override public int getRegisterD() { return registerD; }
+    @Override public int getRegisterE() { return registerE; }
+    @Override public int getRegisterF() { return registerF; }
+    @Override public int getRegisterG() { return registerG; }
+    @Override public int getInlineIndex() { return inlineIndex; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction35ms.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction35ms.java
new file mode 100644
index 0000000..0130f47
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction35ms.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction35ms;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction35ms extends ImmutableInstruction implements Instruction35ms {
+    public static final Format FORMAT = Format.Format35ms;
+
+    protected final int registerCount;
+    protected final int registerC;
+    protected final int registerD;
+    protected final int registerE;
+    protected final int registerF;
+    protected final int registerG;
+    protected final int vtableIndex;
+
+    public ImmutableInstruction35ms(@Nonnull Opcode opcode,
+                                    int registerCount,
+                                    int registerC,
+                                    int registerD,
+                                    int registerE,
+                                    int registerF,
+                                    int registerG,
+                                    int vtableIndex) {
+        super(opcode);
+        this.registerCount = Preconditions.check35cAnd45ccRegisterCount(registerCount);
+        this.registerC = (registerCount>0) ? Preconditions.checkNibbleRegister(registerC) : 0;
+        this.registerD = (registerCount>1) ? Preconditions.checkNibbleRegister(registerD) : 0;
+        this.registerE = (registerCount>2) ? Preconditions.checkNibbleRegister(registerE) : 0;
+        this.registerF = (registerCount>3) ? Preconditions.checkNibbleRegister(registerF) : 0;
+        this.registerG = (registerCount>4) ? Preconditions.checkNibbleRegister(registerG) : 0;
+        this.vtableIndex = Preconditions.checkVtableIndex(vtableIndex);
+    }
+
+    public static ImmutableInstruction35ms of(Instruction35ms instruction) {
+        if (instruction instanceof ImmutableInstruction35ms) {
+            return (ImmutableInstruction35ms)instruction;
+        }
+        return new ImmutableInstruction35ms(
+                instruction.getOpcode(),
+                instruction.getRegisterCount(),
+                instruction.getRegisterC(),
+                instruction.getRegisterD(),
+                instruction.getRegisterE(),
+                instruction.getRegisterF(),
+                instruction.getRegisterG(),
+                instruction.getVtableIndex());
+    }
+
+    @Override public int getRegisterCount() { return registerCount; }
+    @Override public int getRegisterC() { return registerC; }
+    @Override public int getRegisterD() { return registerD; }
+    @Override public int getRegisterE() { return registerE; }
+    @Override public int getRegisterF() { return registerF; }
+    @Override public int getRegisterG() { return registerG; }
+    @Override public int getVtableIndex() { return vtableIndex; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction3rc.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction3rc.java
new file mode 100644
index 0000000..eb135d4
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction3rc.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction3rc;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.dexlib2.immutable.reference.ImmutableReference;
+import org.jf.dexlib2.immutable.reference.ImmutableReferenceFactory;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction3rc extends ImmutableInstruction implements Instruction3rc {
+    public static final Format FORMAT = Format.Format3rc;
+
+    protected final int startRegister;
+    protected final int registerCount;
+
+    @Nonnull protected final ImmutableReference reference;
+
+    public ImmutableInstruction3rc(@Nonnull Opcode opcode,
+                                   int startRegister,
+                                   int registerCount,
+                                   @Nonnull Reference reference) {
+        super(opcode);
+        this.startRegister = Preconditions.checkShortRegister(startRegister);
+        this.registerCount = Preconditions.checkRegisterRangeCount(registerCount);
+        this.reference = ImmutableReferenceFactory.of(opcode.referenceType, reference);
+    }
+
+    public static ImmutableInstruction3rc of(Instruction3rc instruction) {
+        if (instruction instanceof ImmutableInstruction3rc) {
+            return (ImmutableInstruction3rc)instruction;
+        }
+        return new ImmutableInstruction3rc(
+                instruction.getOpcode(),
+                instruction.getStartRegister(),
+                instruction.getRegisterCount(),
+                instruction.getReference());
+    }
+
+    @Override public int getStartRegister() { return startRegister; }
+    @Override public int getRegisterCount() { return registerCount; }
+    @Nonnull @Override public ImmutableReference getReference() { return reference; }
+    @Override public int getReferenceType() { return opcode.referenceType; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
+
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction3rmi.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction3rmi.java
new file mode 100644
index 0000000..a5136bc
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction3rmi.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction3rmi;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction3rmi extends ImmutableInstruction implements Instruction3rmi {
+    public static final Format FORMAT = Format.Format3rmi;
+
+    protected final int startRegister;
+    protected final int registerCount;
+    protected final int inlineIndex;
+
+    public ImmutableInstruction3rmi(@Nonnull Opcode opcode,
+                                    int startRegister,
+                                    int registerCount,
+                                    int inlineIndex) {
+        super(opcode);
+        this.startRegister = Preconditions.checkShortRegister(startRegister);
+        this.registerCount = Preconditions.checkRegisterRangeCount(registerCount);
+        this.inlineIndex = Preconditions.checkInlineIndex(inlineIndex);
+    }
+
+    public static ImmutableInstruction3rmi of(Instruction3rmi instruction) {
+        if (instruction instanceof ImmutableInstruction3rmi) {
+            return (ImmutableInstruction3rmi)instruction;
+        }
+        return new ImmutableInstruction3rmi(
+                instruction.getOpcode(),
+                instruction.getStartRegister(),
+                instruction.getRegisterCount(),
+                instruction.getInlineIndex());
+    }
+
+    @Override public int getStartRegister() { return startRegister; }
+    @Override public int getRegisterCount() { return registerCount; }
+    @Override public int getInlineIndex() { return inlineIndex; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
+
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction3rms.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction3rms.java
new file mode 100644
index 0000000..a81edb0
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction3rms.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction3rms;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction3rms extends ImmutableInstruction implements Instruction3rms {
+    public static final Format FORMAT = Format.Format3rms;
+
+    protected final int startRegister;
+    protected final int registerCount;
+    protected final int vtableIndex;
+
+    public ImmutableInstruction3rms(@Nonnull Opcode opcode,
+                                    int startRegister,
+                                    int registerCount,
+                                    int vtableIndex) {
+        super(opcode);
+        this.startRegister = Preconditions.checkShortRegister(startRegister);
+        this.registerCount = Preconditions.checkRegisterRangeCount(registerCount);
+        this.vtableIndex = Preconditions.checkVtableIndex(vtableIndex);
+    }
+
+    public static ImmutableInstruction3rms of(Instruction3rms instruction) {
+        if (instruction instanceof ImmutableInstruction3rms) {
+            return (ImmutableInstruction3rms)instruction;
+        }
+        return new ImmutableInstruction3rms(
+                instruction.getOpcode(),
+                instruction.getStartRegister(),
+                instruction.getRegisterCount(),
+                instruction.getVtableIndex());
+    }
+
+    @Override public int getStartRegister() { return startRegister; }
+    @Override public int getRegisterCount() { return registerCount; }
+    @Override public int getVtableIndex() { return vtableIndex; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
+
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction45cc.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction45cc.java
new file mode 100644
index 0000000..3385df1
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction45cc.java
@@ -0,0 +1,76 @@
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction45cc;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.dexlib2.immutable.reference.ImmutableReference;
+import org.jf.dexlib2.immutable.reference.ImmutableReferenceFactory;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction45cc extends ImmutableInstruction implements Instruction45cc {
+    public static final Format FORMAT = Format.Format45cc;
+
+    protected final int registerCount;
+    protected final int registerC;
+    protected final int registerD;
+    protected final int registerE;
+    protected final int registerF;
+    protected final int registerG;
+    @Nonnull protected final ImmutableReference reference;
+    @Nonnull protected final ImmutableReference reference2;
+
+    public ImmutableInstruction45cc(@Nonnull Opcode opcode,
+                                    int registerCount,
+                                    int registerC,
+                                    int registerD,
+                                    int registerE,
+                                    int registerF,
+                                    int registerG,
+                                    @Nonnull Reference reference,
+                                    @Nonnull Reference reference2) {
+        super(opcode);
+        this.registerCount = Preconditions.check35cAnd45ccRegisterCount(registerCount);
+        this.registerC = (registerCount>0) ? Preconditions.checkNibbleRegister(registerC) : 0;
+        this.registerD = (registerCount>1) ? Preconditions.checkNibbleRegister(registerD) : 0;
+        this.registerE = (registerCount>2) ? Preconditions.checkNibbleRegister(registerE) : 0;
+        this.registerF = (registerCount>3) ? Preconditions.checkNibbleRegister(registerF) : 0;
+        this.registerG = (registerCount>4) ? Preconditions.checkNibbleRegister(registerG) : 0;
+        this.reference = ImmutableReferenceFactory.of(reference);
+        this.reference2 = ImmutableReferenceFactory.of(reference2);
+    }
+
+    public static ImmutableInstruction45cc of(Instruction45cc instruction) {
+        if (instruction instanceof ImmutableInstruction45cc) {
+            return (ImmutableInstruction45cc) instruction;
+        } else {
+            return new ImmutableInstruction45cc(
+                    instruction.getOpcode(),
+                    instruction.getRegisterCount(),
+                    instruction.getRegisterC(),
+                    instruction.getRegisterD(),
+                    instruction.getRegisterE(),
+                    instruction.getRegisterF(),
+                    instruction.getRegisterG(),
+                    instruction.getReference(),
+                    instruction.getReference2());
+        }
+    }
+
+    @Override public int getRegisterCount() { return registerCount; }
+    @Override public int getRegisterC() { return registerC; }
+    @Override public int getRegisterD() { return registerD; }
+    @Override public int getRegisterE() { return registerE; }
+    @Override public int getRegisterF() { return registerF; }
+    @Override public int getRegisterG() { return registerG; }
+
+    @Override public ImmutableReference getReference() { return reference; }
+    @Override public int getReferenceType() { return opcode.referenceType; }
+
+    @Override public ImmutableReference getReference2() { return reference2; }
+    @Override public int getReferenceType2() { return opcode.referenceType2; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction4rcc.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction4rcc.java
new file mode 100644
index 0000000..aa30b41
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction4rcc.java
@@ -0,0 +1,57 @@
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction4rcc;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.dexlib2.immutable.reference.ImmutableReference;
+import org.jf.dexlib2.immutable.reference.ImmutableReferenceFactory;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction4rcc extends ImmutableInstruction implements Instruction4rcc {
+    private static final Format FORMAT = Format.Format4rcc;
+
+    protected final int startRegister;
+    protected final int registerCount;
+
+    @Nonnull protected final ImmutableReference reference;
+    @Nonnull protected final ImmutableReference reference2;
+
+    public ImmutableInstruction4rcc(
+            @Nonnull Opcode opcode,
+            int startRegister,
+            int registerCount,
+            @Nonnull Reference reference,
+            @Nonnull Reference reference2) {
+        super(opcode);
+        this.startRegister = Preconditions.checkShortRegister(startRegister);
+        this.registerCount = Preconditions.checkRegisterRangeCount(registerCount);
+        this.reference = ImmutableReferenceFactory.of(reference);
+        this.reference2 = ImmutableReferenceFactory.of(reference2);
+    }
+
+    public static ImmutableInstruction4rcc of(Instruction4rcc instruction) {
+        if (instruction instanceof ImmutableInstruction4rcc) {
+            return (ImmutableInstruction4rcc) instruction;
+        }
+        return new ImmutableInstruction4rcc(
+                instruction.getOpcode(),
+                instruction.getStartRegister(),
+                instruction.getRegisterCount(),
+                instruction.getReference(),
+                instruction.getReference2());
+    }
+
+    @Override public int getStartRegister() { return startRegister; }
+    @Override public int getRegisterCount() { return registerCount; }
+
+    @Override public Reference getReference() { return reference; }
+    @Override public int getReferenceType() { return opcode.referenceType; }
+
+    @Override public Reference getReference2() { return reference2; }
+    @Override public int getReferenceType2() { return opcode.referenceType2; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction51l.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction51l.java
new file mode 100644
index 0000000..01afad9
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstruction51l.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.Instruction51l;
+import org.jf.dexlib2.util.Preconditions;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableInstruction51l extends ImmutableInstruction implements Instruction51l {
+    public static final Format FORMAT = Format.Format51l;
+
+    protected final int registerA;
+    protected final long literal;
+
+    public ImmutableInstruction51l(@Nonnull Opcode opcode,
+                                   int registerA,
+                                   long literal) {
+        super(opcode);
+        this.registerA = Preconditions.checkByteRegister(registerA);
+        this.literal = literal;
+    }
+
+    public static ImmutableInstruction51l of(Instruction51l instruction) {
+        if (instruction instanceof ImmutableInstruction51l) {
+            return (ImmutableInstruction51l)instruction;
+        }
+        return new ImmutableInstruction51l(
+                instruction.getOpcode(),
+                instruction.getRegisterA(),
+                instruction.getWideLiteral());
+    }
+
+    @Override public int getRegisterA() { return registerA; }
+    @Override public long getWideLiteral() { return literal; }
+
+    @Override public Format getFormat() { return FORMAT; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstructionFactory.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstructionFactory.java
new file mode 100644
index 0000000..38a4d1d
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableInstructionFactory.java
@@ -0,0 +1,223 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.SwitchElement;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.dexlib2.writer.InstructionFactory;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.List;
+
+public class ImmutableInstructionFactory implements InstructionFactory<Reference> {
+    public static final ImmutableInstructionFactory INSTANCE = new ImmutableInstructionFactory();
+
+    private ImmutableInstructionFactory() {
+    }
+
+    public ImmutableInstruction10t makeInstruction10t(@Nonnull Opcode opcode,
+                                                      int codeOffset) {
+        return new ImmutableInstruction10t(opcode, codeOffset);
+    }
+
+    public ImmutableInstruction10x makeInstruction10x(@Nonnull Opcode opcode) {
+        return new ImmutableInstruction10x(opcode);
+    }
+
+    public ImmutableInstruction11n makeInstruction11n(@Nonnull Opcode opcode,
+                                                      int registerA,
+                                                      int literal) {
+        return new ImmutableInstruction11n(opcode, registerA, literal);
+    }
+
+    public ImmutableInstruction11x makeInstruction11x(@Nonnull Opcode opcode,
+                                                      int registerA) {
+        return new ImmutableInstruction11x(opcode, registerA);
+    }
+
+    public ImmutableInstruction12x makeInstruction12x(@Nonnull Opcode opcode,
+                                                      int registerA,
+                                                      int registerB) {
+        return new ImmutableInstruction12x(opcode, registerA, registerB);
+    }
+
+    public ImmutableInstruction20bc makeInstruction20bc(@Nonnull Opcode opcode,
+                                                        int verificationError,
+                                                        @Nonnull Reference reference) {
+        return new ImmutableInstruction20bc(opcode, verificationError, reference);
+    }
+
+    public ImmutableInstruction20t makeInstruction20t(@Nonnull Opcode opcode,
+                                                      int codeOffset) {
+        return new ImmutableInstruction20t(opcode, codeOffset);
+    }
+
+    public ImmutableInstruction21c makeInstruction21c(@Nonnull Opcode opcode,
+                                                      int registerA,
+                                                      @Nonnull Reference reference) {
+        return new ImmutableInstruction21c(opcode, registerA, reference);
+    }
+
+    public ImmutableInstruction21ih makeInstruction21ih(@Nonnull Opcode opcode,
+                                                        int registerA,
+                                                        int literal) {
+        return new ImmutableInstruction21ih(opcode, registerA, literal);
+    }
+
+    public ImmutableInstruction21lh makeInstruction21lh(@Nonnull Opcode opcode,
+                                                        int registerA,
+                                                        long literal) {
+        return new ImmutableInstruction21lh(opcode, registerA, literal);
+    }
+
+    public ImmutableInstruction21s makeInstruction21s(@Nonnull Opcode opcode,
+                                                      int registerA,
+                                                      int literal) {
+        return new ImmutableInstruction21s(opcode, registerA, literal);
+    }
+
+    public ImmutableInstruction21t makeInstruction21t(@Nonnull Opcode opcode,
+                                                      int registerA,
+                                                      int codeOffset) {
+        return new ImmutableInstruction21t(opcode, registerA, codeOffset);
+    }
+
+    public ImmutableInstruction22b makeInstruction22b(@Nonnull Opcode opcode,
+                                                      int registerA,
+                                                      int registerB,
+                                                      int literal) {
+        return new ImmutableInstruction22b(opcode, registerA, registerB, literal);
+    }
+
+    public ImmutableInstruction22c makeInstruction22c(@Nonnull Opcode opcode,
+                                                      int registerA,
+                                                      int registerB,
+                                                      @Nonnull Reference reference) {
+        return new ImmutableInstruction22c(opcode, registerA, registerB, reference);
+    }
+
+    public ImmutableInstruction22s makeInstruction22s(@Nonnull Opcode opcode,
+                                                      int registerA,
+                                                      int registerB,
+                                                      int literal) {
+        return new ImmutableInstruction22s(opcode, registerA, registerB, literal);
+    }
+
+    public ImmutableInstruction22t makeInstruction22t(@Nonnull Opcode opcode,
+                                                      int registerA,
+                                                      int registerB,
+                                                      int codeOffset) {
+        return new ImmutableInstruction22t(opcode, registerA, registerB, codeOffset);
+    }
+
+    public ImmutableInstruction22x makeInstruction22x(@Nonnull Opcode opcode,
+                                                      int registerA,
+                                                      int registerB) {
+        return new ImmutableInstruction22x(opcode, registerA, registerB);
+    }
+
+    public ImmutableInstruction23x makeInstruction23x(@Nonnull Opcode opcode,
+                                                      int registerA,
+                                                      int registerB,
+                                                      int registerC) {
+        return new ImmutableInstruction23x(opcode, registerA, registerB, registerC);
+    }
+
+    public ImmutableInstruction30t makeInstruction30t(@Nonnull Opcode opcode,
+                                                      int codeOffset) {
+        return new ImmutableInstruction30t(opcode, codeOffset);
+    }
+
+    public ImmutableInstruction31c makeInstruction31c(@Nonnull Opcode opcode,
+                                                      int registerA,
+                                                      @Nonnull Reference reference) {
+        return new ImmutableInstruction31c(opcode, registerA, reference);
+    }
+
+    public ImmutableInstruction31i makeInstruction31i(@Nonnull Opcode opcode,
+                                                      int registerA,
+                                                      int literal) {
+        return new ImmutableInstruction31i(opcode, registerA, literal);
+    }
+
+    public ImmutableInstruction31t makeInstruction31t(@Nonnull Opcode opcode,
+                                                      int registerA,
+                                                      int codeOffset) {
+        return new ImmutableInstruction31t(opcode, registerA, codeOffset);
+    }
+
+    public ImmutableInstruction32x makeInstruction32x(@Nonnull Opcode opcode,
+                                                      int registerA,
+                                                      int registerB) {
+        return new ImmutableInstruction32x(opcode, registerA, registerB);
+    }
+
+    public ImmutableInstruction35c makeInstruction35c(@Nonnull Opcode opcode,
+                                                      int registerCount,
+                                                      int registerC,
+                                                      int registerD,
+                                                      int registerE,
+                                                      int registerF,
+                                                      int registerG,
+                                                      @Nonnull Reference reference) {
+        return new ImmutableInstruction35c(opcode, registerCount, registerC, registerD, registerE, registerF, registerG,
+                reference);
+    }
+
+    public ImmutableInstruction3rc makeInstruction3rc(@Nonnull Opcode opcode,
+                                                      int startRegister,
+                                                      int registerCount,
+                                                      @Nonnull Reference reference) {
+        return new ImmutableInstruction3rc(opcode, startRegister, registerCount, reference);
+    }
+
+    public ImmutableInstruction51l makeInstruction51l(@Nonnull Opcode opcode,
+                                                      int registerA,
+                                                      long literal) {
+        return new ImmutableInstruction51l(opcode, registerA, literal);
+    }
+
+    public ImmutableSparseSwitchPayload makeSparseSwitchPayload(@Nullable List<? extends SwitchElement> switchElements) {
+        return new ImmutableSparseSwitchPayload(switchElements);
+    }
+
+    public ImmutablePackedSwitchPayload makePackedSwitchPayload(@Nullable List<? extends SwitchElement> switchElements) {
+        return new ImmutablePackedSwitchPayload(switchElements);
+    }
+
+    public ImmutableArrayPayload makeArrayPayload(int elementWidth,
+                                                @Nullable List<Number> arrayElements) {
+        return new ImmutableArrayPayload(elementWidth, arrayElements);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutablePackedSwitchPayload.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutablePackedSwitchPayload.java
new file mode 100644
index 0000000..ae8f331
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutablePackedSwitchPayload.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import com.google.common.collect.ImmutableList;
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.SwitchElement;
+import org.jf.dexlib2.iface.instruction.formats.PackedSwitchPayload;
+import org.jf.dexlib2.util.Preconditions;
+import org.jf.util.ImmutableUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.List;
+
+public class ImmutablePackedSwitchPayload extends ImmutableInstruction implements PackedSwitchPayload {
+    public static final Opcode OPCODE = Opcode.PACKED_SWITCH_PAYLOAD;
+
+    @Nonnull protected final ImmutableList<? extends ImmutableSwitchElement> switchElements;
+
+    public ImmutablePackedSwitchPayload(@Nullable List<? extends SwitchElement> switchElements) {
+        super(OPCODE);
+        this.switchElements = Preconditions.checkSequentialOrderedKeys(ImmutableSwitchElement.immutableListOf(switchElements));
+    }
+
+    public ImmutablePackedSwitchPayload(
+            @Nullable ImmutableList<? extends ImmutableSwitchElement> switchElements) {
+        super(OPCODE);
+        this.switchElements = Preconditions.checkSequentialOrderedKeys(ImmutableUtils.nullToEmptyList(switchElements));
+    }
+
+    @Nonnull
+    public static ImmutablePackedSwitchPayload of(PackedSwitchPayload instruction) {
+        if (instruction instanceof ImmutablePackedSwitchPayload) {
+            return (ImmutablePackedSwitchPayload)instruction;
+        }
+        return new ImmutablePackedSwitchPayload(
+                instruction.getSwitchElements());
+    }
+
+    @Nonnull @Override public List<? extends SwitchElement> getSwitchElements() { return switchElements; }
+
+    @Override public int getCodeUnits() { return 4 + switchElements.size() * 2; }
+    @Override public Format getFormat() { return OPCODE.format; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableSparseSwitchPayload.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableSparseSwitchPayload.java
new file mode 100644
index 0000000..eb4e90e
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableSparseSwitchPayload.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import com.google.common.collect.ImmutableList;
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.SwitchElement;
+import org.jf.dexlib2.iface.instruction.formats.SparseSwitchPayload;
+import org.jf.util.ImmutableUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.List;
+
+public class ImmutableSparseSwitchPayload extends ImmutableInstruction implements SparseSwitchPayload {
+    public static final Opcode OPCODE = Opcode.SPARSE_SWITCH_PAYLOAD;
+
+    @Nonnull protected final ImmutableList<? extends ImmutableSwitchElement> switchElements;
+
+    public ImmutableSparseSwitchPayload(@Nullable List<? extends SwitchElement> switchElements) {
+        super(OPCODE);
+        this.switchElements = ImmutableSwitchElement.immutableListOf(switchElements);
+    }
+
+    public ImmutableSparseSwitchPayload(
+            @Nullable ImmutableList<? extends ImmutableSwitchElement> switchElements) {
+        super(OPCODE);
+        this.switchElements = ImmutableUtils.nullToEmptyList(switchElements);
+    }
+
+    @Nonnull
+    public static ImmutableSparseSwitchPayload of(SparseSwitchPayload instruction) {
+        if (instruction instanceof ImmutableSparseSwitchPayload) {
+            return (ImmutableSparseSwitchPayload)instruction;
+        }
+        return new ImmutableSparseSwitchPayload(
+                instruction.getSwitchElements());
+    }
+
+    @Nonnull @Override public List<? extends SwitchElement> getSwitchElements() { return switchElements; }
+
+    @Override public int getCodeUnits() { return 2 + switchElements.size() * 4; }
+    @Override public Format getFormat() { return OPCODE.format; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableSwitchElement.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableSwitchElement.java
new file mode 100644
index 0000000..bc26ed9
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableSwitchElement.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import com.google.common.collect.ImmutableList;
+import org.jf.dexlib2.iface.instruction.SwitchElement;
+import org.jf.util.ImmutableConverter;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.List;
+
+public class ImmutableSwitchElement implements SwitchElement {
+    protected final int key;
+    protected final int offset;
+
+    public ImmutableSwitchElement(int key,
+                                  int offset) {
+        this.key = key;
+        this.offset = offset;
+    }
+
+    @Nonnull
+    public static ImmutableSwitchElement of(SwitchElement switchElement) {
+        if (switchElement instanceof  ImmutableSwitchElement) {
+            return (ImmutableSwitchElement)switchElement;
+        }
+        return new ImmutableSwitchElement(
+                switchElement.getKey(),
+                switchElement.getOffset());
+    }
+
+    @Override public int getKey() { return key; }
+    @Override public int getOffset() { return offset; }
+
+    @Nonnull
+    public static ImmutableList<ImmutableSwitchElement> immutableListOf(@Nullable List<? extends SwitchElement> list) {
+        return CONVERTER.toList(list);
+    }
+
+    private static final ImmutableConverter<ImmutableSwitchElement, SwitchElement> CONVERTER =
+            new ImmutableConverter<ImmutableSwitchElement, SwitchElement>() {
+                @Override
+                protected boolean isImmutable(@Nonnull SwitchElement item) {
+                    return item instanceof ImmutableSwitchElement;
+                }
+
+                @Nonnull
+                @Override
+                protected ImmutableSwitchElement makeImmutable(@Nonnull SwitchElement item) {
+                    return ImmutableSwitchElement.of(item);
+                }
+            };
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableUnknownInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableUnknownInstruction.java
new file mode 100644
index 0000000..7979857
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/instruction/ImmutableUnknownInstruction.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.instruction;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.formats.UnknownInstruction;
+
+public class ImmutableUnknownInstruction extends ImmutableInstruction implements UnknownInstruction {
+    public static final Format FORMAT = Format.Format10x;
+
+    protected final int originalOpcode;
+
+    public ImmutableUnknownInstruction(int originalOpcode) {
+        super(Opcode.NOP);
+        this.originalOpcode = originalOpcode;
+    }
+
+    public static ImmutableUnknownInstruction of(UnknownInstruction instruction) {
+        if (instruction instanceof ImmutableUnknownInstruction) {
+            return (ImmutableUnknownInstruction)instruction;
+        }
+        return new ImmutableUnknownInstruction(instruction.getOriginalOpcode());
+    }
+
+    @Override public Format getFormat() { return FORMAT; }
+    @Override public int getOriginalOpcode() { return originalOpcode; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/reference/ImmutableCallSiteReference.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/reference/ImmutableCallSiteReference.java
new file mode 100644
index 0000000..8b3c17f
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/reference/ImmutableCallSiteReference.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.reference;
+
+import com.google.common.collect.ImmutableList;
+import org.jf.dexlib2.base.reference.BaseCallSiteReference;
+import org.jf.dexlib2.iface.reference.CallSiteReference;
+import org.jf.dexlib2.iface.reference.MethodHandleReference;
+import org.jf.dexlib2.iface.reference.MethodProtoReference;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.dexlib2.immutable.value.ImmutableEncodedValue;
+import org.jf.dexlib2.immutable.value.ImmutableEncodedValueFactory;
+import org.jf.util.ImmutableUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.List;
+
+public class ImmutableCallSiteReference extends BaseCallSiteReference implements ImmutableReference {
+    @Nonnull protected final String name;
+    @Nonnull protected final ImmutableMethodHandleReference methodHandle;
+    @Nonnull protected final String methodName;
+    @Nonnull protected final ImmutableMethodProtoReference methodProto;
+    @Nonnull protected final ImmutableList<? extends ImmutableEncodedValue> extraArguments;
+
+    public ImmutableCallSiteReference(@Nonnull String name, @Nonnull MethodHandleReference methodHandle,
+                                      @Nonnull String methodName, @Nonnull MethodProtoReference methodProto,
+                                      @Nonnull Iterable<? extends EncodedValue> extraArguments) {
+        this.name = name;
+        this.methodHandle = ImmutableMethodHandleReference.of(methodHandle);
+        this.methodName = methodName;
+        this.methodProto = ImmutableMethodProtoReference.of(methodProto);
+        this.extraArguments = ImmutableEncodedValueFactory.immutableListOf(extraArguments);
+    }
+
+    public ImmutableCallSiteReference(@Nonnull String name, @Nonnull ImmutableMethodHandleReference methodHandle,
+                                      @Nonnull String methodName, @Nonnull ImmutableMethodProtoReference methodProto,
+                                      @Nullable ImmutableList<? extends ImmutableEncodedValue> extraArguments) {
+        this.name = name;
+        this.methodHandle = methodHandle;
+        this.methodName = methodName;
+        this.methodProto = methodProto;
+        this.extraArguments = ImmutableUtils.nullToEmptyList(extraArguments);
+    }
+
+    @Nonnull
+    public static ImmutableCallSiteReference of(@Nonnull CallSiteReference callSiteReference) {
+        if (callSiteReference instanceof ImmutableCallSiteReference) {
+            return (ImmutableCallSiteReference) callSiteReference;
+        }
+        return new ImmutableCallSiteReference(callSiteReference.getName(),
+                ImmutableMethodHandleReference.of(callSiteReference.getMethodHandle()),
+                callSiteReference.getMethodName(),
+                ImmutableMethodProtoReference.of(callSiteReference.getMethodProto()),
+                ImmutableEncodedValueFactory.immutableListOf(callSiteReference.getExtraArguments()));
+    }
+
+    @Nonnull @Override public String getName() { return name; }
+    @Nonnull @Override public MethodHandleReference getMethodHandle() { return methodHandle; }
+    @Nonnull @Override public String getMethodName() { return methodName; }
+    @Nonnull @Override public MethodProtoReference getMethodProto() { return methodProto; }
+    @Nonnull @Override public List<? extends EncodedValue> getExtraArguments() { return extraArguments; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/reference/ImmutableFieldReference.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/reference/ImmutableFieldReference.java
new file mode 100644
index 0000000..e9fdf3e
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/reference/ImmutableFieldReference.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.reference;
+
+import org.jf.dexlib2.base.reference.BaseFieldReference;
+import org.jf.dexlib2.iface.reference.FieldReference;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableFieldReference extends BaseFieldReference implements ImmutableReference {
+    @Nonnull protected final String definingClass;
+    @Nonnull protected final String name;
+    @Nonnull protected final String type;
+
+    public ImmutableFieldReference(@Nonnull String definingClass,
+                                   @Nonnull String name,
+                                   @Nonnull String type) {
+        this.definingClass = definingClass;
+        this.name = name;
+        this.type = type;
+    }
+
+    @Nonnull
+    public static ImmutableFieldReference of(@Nonnull FieldReference fieldReference) {
+        if (fieldReference instanceof ImmutableFieldReference) {
+            return (ImmutableFieldReference)fieldReference;
+        }
+        return new ImmutableFieldReference(
+                fieldReference.getDefiningClass(),
+                fieldReference.getName(),
+                fieldReference.getType());
+    }
+
+    @Nonnull public String getDefiningClass() { return definingClass; }
+    @Nonnull public String getName() { return name; }
+    @Nonnull public String getType() { return type; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/reference/ImmutableMethodHandleReference.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/reference/ImmutableMethodHandleReference.java
new file mode 100644
index 0000000..c35b071
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/reference/ImmutableMethodHandleReference.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.reference;
+
+import org.jf.dexlib2.MethodHandleType;
+import org.jf.dexlib2.base.reference.BaseMethodHandleReference;
+import org.jf.dexlib2.iface.reference.FieldReference;
+import org.jf.dexlib2.iface.reference.MethodHandleReference;
+import org.jf.dexlib2.iface.reference.MethodReference;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableMethodHandleReference extends BaseMethodHandleReference implements ImmutableReference {
+    protected final int methodHandleType;
+    @Nonnull protected final ImmutableReference memberReference;
+
+    public ImmutableMethodHandleReference(int methodHandleType, @Nonnull ImmutableReference memberReference) {
+        this.methodHandleType = methodHandleType;
+        this.memberReference = memberReference;
+    }
+
+    public ImmutableMethodHandleReference(int methodHandleType, @Nonnull Reference memberReference) {
+        this.methodHandleType = methodHandleType;
+        this.memberReference = ImmutableReferenceFactory.of(memberReference);
+    }
+
+    @Nonnull
+    public static ImmutableMethodHandleReference of(@Nonnull MethodHandleReference methodHandleReference) {
+        if (methodHandleReference instanceof ImmutableMethodHandleReference) {
+            return (ImmutableMethodHandleReference) methodHandleReference;
+        }
+        int methodHandleType = methodHandleReference.getMethodHandleType();
+        ImmutableReference memberReference;
+
+        switch (methodHandleType) {
+            case MethodHandleType.STATIC_PUT:
+            case MethodHandleType.STATIC_GET:
+            case MethodHandleType.INSTANCE_PUT:
+            case MethodHandleType.INSTANCE_GET:
+                memberReference = ImmutableFieldReference.of(
+                        (FieldReference) methodHandleReference.getMemberReference());
+                break;
+            case MethodHandleType.INVOKE_STATIC:
+            case MethodHandleType.INVOKE_INSTANCE:
+            case MethodHandleType.INVOKE_CONSTRUCTOR:
+            case MethodHandleType.INVOKE_DIRECT:
+            case MethodHandleType.INVOKE_INTERFACE:
+                memberReference = ImmutableMethodReference.of(
+                        (MethodReference) methodHandleReference.getMemberReference());
+                break;
+            default:
+                throw new ExceptionWithContext("Invalid method handle type: %d", methodHandleType);
+        }
+        return new ImmutableMethodHandleReference(methodHandleType, memberReference);
+    }
+
+    @Override public int getMethodHandleType() { return methodHandleType; }
+    @Nonnull @Override public Reference getMemberReference() { return memberReference; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/reference/ImmutableMethodProtoReference.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/reference/ImmutableMethodProtoReference.java
new file mode 100644
index 0000000..d1c62e1
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/reference/ImmutableMethodProtoReference.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.reference;
+
+import com.google.common.collect.ImmutableList;
+import org.jf.dexlib2.base.reference.BaseMethodProtoReference;
+import org.jf.dexlib2.iface.reference.MethodProtoReference;
+import org.jf.dexlib2.immutable.util.CharSequenceConverter;
+import org.jf.util.ImmutableUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.List;
+
+public class ImmutableMethodProtoReference extends BaseMethodProtoReference implements ImmutableReference {
+    @Nonnull protected final ImmutableList<String> parameters;
+    @Nonnull protected final String returnType;
+
+    public ImmutableMethodProtoReference(@Nullable ImmutableList<String> parameters,
+                                         @Nonnull String returnType) {
+        this.parameters = ImmutableUtils.nullToEmptyList(parameters);
+        this.returnType = returnType;
+    }
+
+    public ImmutableMethodProtoReference(@Nullable Iterable<? extends CharSequence> parameters,
+                                         @Nonnull String returnType) {
+        this.parameters = CharSequenceConverter.immutableStringList(parameters);
+        this.returnType = returnType;
+    }
+
+    @Nonnull public static ImmutableMethodProtoReference of(@Nonnull MethodProtoReference methodProtoReference) {
+        if (methodProtoReference instanceof ImmutableMethodProtoReference) {
+            return (ImmutableMethodProtoReference) methodProtoReference;
+        }
+        return new ImmutableMethodProtoReference(
+                methodProtoReference.getParameterTypes(),
+                methodProtoReference.getReturnType());
+    }
+
+    @Override
+    public List<? extends CharSequence> getParameterTypes() {
+        return parameters;
+    }
+
+    @Override
+    public String getReturnType() {
+        return returnType;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/reference/ImmutableMethodReference.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/reference/ImmutableMethodReference.java
new file mode 100644
index 0000000..fed0998
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/reference/ImmutableMethodReference.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.reference;
+
+import com.google.common.collect.ImmutableList;
+import org.jf.dexlib2.base.reference.BaseMethodReference;
+import org.jf.dexlib2.iface.reference.MethodReference;
+import org.jf.dexlib2.immutable.util.CharSequenceConverter;
+import org.jf.util.ImmutableUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class ImmutableMethodReference extends BaseMethodReference implements ImmutableReference {
+    @Nonnull protected final String definingClass;
+    @Nonnull protected final String name;
+    @Nonnull protected final ImmutableList<String> parameters;
+    @Nonnull protected final String returnType;
+
+    public ImmutableMethodReference(@Nonnull String definingClass,
+                                    @Nonnull String name,
+                                    @Nullable Iterable<? extends CharSequence> parameters,
+                                    @Nonnull String returnType) {
+        this.definingClass = definingClass;
+        this.name = name;
+        this.parameters = CharSequenceConverter.immutableStringList(parameters);
+        this.returnType = returnType;
+    }
+
+    public ImmutableMethodReference(@Nonnull String definingClass,
+                                    @Nonnull String name,
+                                    @Nullable ImmutableList<String> parameters,
+                                    @Nonnull String returnType) {
+        this.definingClass = definingClass;
+        this.name = name;
+        this.parameters = ImmutableUtils.nullToEmptyList(parameters);
+        this.returnType = returnType;
+    }
+
+    @Nonnull
+    public static ImmutableMethodReference of(@Nonnull MethodReference methodReference) {
+        if (methodReference instanceof ImmutableMethodReference) {
+            return (ImmutableMethodReference)methodReference;
+        }
+        return new ImmutableMethodReference(
+                methodReference.getDefiningClass(),
+                methodReference.getName(),
+                methodReference.getParameterTypes(),
+                methodReference.getReturnType());
+    }
+
+    @Nonnull @Override public String getDefiningClass() { return definingClass; }
+    @Nonnull @Override public String getName() { return name; }
+    @Nonnull @Override public ImmutableList<String> getParameterTypes() { return parameters; }
+    @Nonnull @Override public String getReturnType() { return returnType; }
+
+
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/reference/ImmutableReference.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/reference/ImmutableReference.java
new file mode 100644
index 0000000..39bfeef
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/reference/ImmutableReference.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.reference;
+
+import org.jf.dexlib2.ReferenceType;
+import org.jf.dexlib2.iface.reference.*;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+
+public interface ImmutableReference extends Reference {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/reference/ImmutableReferenceFactory.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/reference/ImmutableReferenceFactory.java
new file mode 100644
index 0000000..c611844
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/reference/ImmutableReferenceFactory.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.reference;
+
+import org.jf.dexlib2.ReferenceType;
+import org.jf.dexlib2.iface.reference.*;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableReferenceFactory {
+    @Nonnull
+    public static ImmutableReference of(Reference reference) {
+        if (reference instanceof StringReference) {
+            return ImmutableStringReference.of((StringReference)reference);
+        }
+        if (reference instanceof TypeReference) {
+            return ImmutableTypeReference.of((TypeReference)reference);
+        }
+        if (reference instanceof FieldReference) {
+            return ImmutableFieldReference.of((FieldReference)reference);
+        }
+        if (reference instanceof MethodReference) {
+            return ImmutableMethodReference.of((MethodReference)reference);
+        }
+        if (reference instanceof MethodProtoReference) {
+            return ImmutableMethodProtoReference.of((MethodProtoReference) reference);
+        }
+        if (reference instanceof CallSiteReference) {
+            return ImmutableCallSiteReference.of((CallSiteReference) reference);
+        }
+        if (reference instanceof MethodHandleReference) {
+            return ImmutableMethodHandleReference.of((MethodHandleReference) reference);
+        }
+        throw new ExceptionWithContext("Invalid reference type");
+    }
+
+    @Nonnull
+    public static ImmutableReference of(int referenceType, Reference reference) {
+        switch (referenceType) {
+            case ReferenceType.STRING:
+                return ImmutableStringReference.of((StringReference)reference);
+            case ReferenceType.TYPE:
+                return ImmutableTypeReference.of((TypeReference)reference);
+            case ReferenceType.FIELD:
+                return ImmutableFieldReference.of((FieldReference)reference);
+            case ReferenceType.METHOD:
+                return ImmutableMethodReference.of((MethodReference)reference);
+            case ReferenceType.METHOD_PROTO:
+                return ImmutableMethodProtoReference.of((MethodProtoReference)reference);
+            case ReferenceType.CALL_SITE:
+                return ImmutableCallSiteReference.of((CallSiteReference) reference);
+            case ReferenceType.METHOD_HANDLE:
+                return ImmutableMethodHandleReference.of((MethodHandleReference) reference);
+        }
+        throw new ExceptionWithContext("Invalid reference type: %d", referenceType);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/reference/ImmutableStringReference.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/reference/ImmutableStringReference.java
new file mode 100644
index 0000000..292c841
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/reference/ImmutableStringReference.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.reference;
+
+import org.jf.dexlib2.base.reference.BaseStringReference;
+import org.jf.dexlib2.iface.reference.StringReference;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableStringReference extends BaseStringReference implements ImmutableReference {
+    @Nonnull protected final String str;
+
+    public ImmutableStringReference(String str) {
+        this.str = str;
+    }
+
+    @Nonnull
+    public static ImmutableStringReference of(@Nonnull StringReference stringReference) {
+        if (stringReference instanceof ImmutableStringReference) {
+            return (ImmutableStringReference)stringReference;
+        }
+        return new ImmutableStringReference(stringReference.getString());
+    }
+
+    @Nonnull @Override public String getString() { return str; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/reference/ImmutableTypeReference.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/reference/ImmutableTypeReference.java
new file mode 100644
index 0000000..128fbc4
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/reference/ImmutableTypeReference.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.reference;
+
+import com.google.common.collect.ImmutableList;
+import org.jf.dexlib2.base.reference.BaseTypeReference;
+import org.jf.dexlib2.iface.reference.TypeReference;
+import org.jf.util.ImmutableConverter;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.List;
+
+public class ImmutableTypeReference extends BaseTypeReference implements ImmutableReference {
+    @Nonnull protected final String type;
+
+    public ImmutableTypeReference(String type) {
+        this.type = type;
+    }
+
+    @Nonnull
+    public static ImmutableTypeReference of(@Nonnull TypeReference typeReference) {
+        if (typeReference instanceof ImmutableTypeReference) {
+            return (ImmutableTypeReference)typeReference;
+        }
+        return new ImmutableTypeReference(typeReference.getType());
+    }
+
+    @Nonnull @Override public String getType() { return type; }
+
+    @Nonnull
+    public static ImmutableList<ImmutableTypeReference> immutableListOf(@Nullable List<? extends TypeReference> list) {
+        return CONVERTER.toList(list);
+    }
+
+    private static final ImmutableConverter<ImmutableTypeReference, TypeReference> CONVERTER =
+            new ImmutableConverter<ImmutableTypeReference, TypeReference>() {
+                @Override
+                protected boolean isImmutable(@Nonnull TypeReference item) {
+                    return item instanceof ImmutableTypeReference;
+                }
+
+                @Nonnull
+                @Override
+                protected ImmutableTypeReference makeImmutable(@Nonnull TypeReference item) {
+                    return ImmutableTypeReference.of(item);
+                }
+            };
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/util/CharSequenceConverter.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/util/CharSequenceConverter.java
new file mode 100644
index 0000000..596e8e3
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/util/CharSequenceConverter.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.util;
+
+import com.google.common.collect.ImmutableList;
+import org.jf.util.ImmutableConverter;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public final class CharSequenceConverter {
+    private CharSequenceConverter() {
+    }
+
+    @Nonnull
+    public static ImmutableList<String> immutableStringList(@Nullable Iterable<? extends CharSequence> iterable) {
+        return CONVERTER.toList(iterable);
+    }
+
+    private static final ImmutableConverter<String, CharSequence> CONVERTER =
+            new ImmutableConverter<String, CharSequence>() {
+                @Override
+                protected boolean isImmutable(@Nonnull CharSequence item) {
+                    return item instanceof String;
+                }
+
+                @Nonnull
+                @Override
+                protected String makeImmutable(@Nonnull CharSequence item) {
+                    return item.toString();
+                }
+            };
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/util/ParamUtil.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/util/ParamUtil.java
new file mode 100644
index 0000000..9886e1a
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/util/ParamUtil.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.util;
+
+import org.jf.dexlib2.immutable.ImmutableMethodParameter;
+
+import javax.annotation.Nonnull;
+import java.util.Iterator;
+
+public class ParamUtil {
+    private static int findTypeEnd(@Nonnull String str, int index) {
+        char c = str.charAt(index);
+        switch (c) {
+            case 'Z':
+            case 'B':
+            case 'S':
+            case 'C':
+            case 'I':
+            case 'J':
+            case 'F':
+            case 'D':
+                return index+1;
+            case 'L':
+                while (str.charAt(index++) != ';') {}
+                return index;
+            case '[':
+                while (str.charAt(index++) != '[') {}
+                return findTypeEnd(str, index);
+            default:
+                throw new IllegalArgumentException(String.format("Param string \"%s\" contains invalid type prefix: %s",
+                        str, Character.toString(c)));
+        }
+    }
+
+    @Nonnull
+    public static Iterable<ImmutableMethodParameter> parseParamString(@Nonnull final String params) {
+        return new Iterable<ImmutableMethodParameter>() {
+            @Override public Iterator<ImmutableMethodParameter> iterator() {
+                return new Iterator<ImmutableMethodParameter>() {
+
+                    private int index = 0;
+
+                    @Override public boolean hasNext() {
+                        return index < params.length();
+                    }
+
+                    @Override public ImmutableMethodParameter next() {
+                        int end = findTypeEnd(params, index);
+                        String ret = params.substring(index, end);
+                        index = end;
+                        return new ImmutableMethodParameter(ret, null, null);
+                    }
+
+                    @Override public void remove() {
+                        throw new UnsupportedOperationException();
+                    }
+                };
+            }
+        };
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableAnnotationEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableAnnotationEncodedValue.java
new file mode 100644
index 0000000..98585e7
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableAnnotationEncodedValue.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.value;
+
+import com.google.common.collect.ImmutableSet;
+import org.jf.dexlib2.base.value.BaseAnnotationEncodedValue;
+import org.jf.dexlib2.iface.AnnotationElement;
+import org.jf.dexlib2.iface.value.AnnotationEncodedValue;
+import org.jf.dexlib2.immutable.ImmutableAnnotationElement;
+import org.jf.util.ImmutableUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Collection;
+
+public class ImmutableAnnotationEncodedValue extends BaseAnnotationEncodedValue implements ImmutableEncodedValue {
+    @Nonnull protected final String type;
+    @Nonnull protected final ImmutableSet<? extends ImmutableAnnotationElement> elements;
+
+    public ImmutableAnnotationEncodedValue(@Nonnull String type,
+                                           @Nullable Collection<? extends AnnotationElement> elements) {
+        this.type = type;
+        this.elements = ImmutableAnnotationElement.immutableSetOf(elements);
+    }
+
+    public ImmutableAnnotationEncodedValue(@Nonnull String type,
+                                           @Nullable ImmutableSet<? extends ImmutableAnnotationElement> elements) {
+        this.type = type;
+        this.elements = ImmutableUtils.nullToEmptySet(elements);
+    }
+
+    public static ImmutableAnnotationEncodedValue of(AnnotationEncodedValue annotationEncodedValue) {
+        if (annotationEncodedValue instanceof ImmutableAnnotationEncodedValue) {
+            return (ImmutableAnnotationEncodedValue)annotationEncodedValue;
+        }
+        return new ImmutableAnnotationEncodedValue(
+                annotationEncodedValue.getType(),
+                annotationEncodedValue.getElements());
+    }
+
+    @Nonnull @Override public String getType() { return type; }
+    @Nonnull @Override public ImmutableSet<? extends ImmutableAnnotationElement> getElements() { return elements; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableArrayEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableArrayEncodedValue.java
new file mode 100644
index 0000000..7544049
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableArrayEncodedValue.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.value;
+
+import com.google.common.collect.ImmutableList;
+import org.jf.dexlib2.base.value.BaseArrayEncodedValue;
+import org.jf.dexlib2.iface.value.ArrayEncodedValue;
+import org.jf.dexlib2.iface.value.EncodedValue;
+
+import javax.annotation.Nonnull;
+import java.util.Collection;
+
+public class ImmutableArrayEncodedValue extends BaseArrayEncodedValue implements ImmutableEncodedValue {
+    @Nonnull protected final ImmutableList<? extends ImmutableEncodedValue> value;
+
+    public ImmutableArrayEncodedValue(@Nonnull Collection<? extends EncodedValue> value) {
+        this.value = ImmutableEncodedValueFactory.immutableListOf(value);
+    }
+
+    public ImmutableArrayEncodedValue(@Nonnull ImmutableList<ImmutableEncodedValue> value) {
+        this.value = value;
+    }
+
+    public static ImmutableArrayEncodedValue of(@Nonnull ArrayEncodedValue arrayEncodedValue) {
+        if (arrayEncodedValue instanceof ImmutableArrayEncodedValue) {
+            return (ImmutableArrayEncodedValue)arrayEncodedValue;
+        }
+        return new ImmutableArrayEncodedValue(arrayEncodedValue.getValue());
+    }
+
+    @Nonnull public ImmutableList<? extends ImmutableEncodedValue> getValue() { return value; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableBooleanEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableBooleanEncodedValue.java
new file mode 100644
index 0000000..beef8aa
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableBooleanEncodedValue.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.value;
+
+import org.jf.dexlib2.base.value.BaseBooleanEncodedValue;
+import org.jf.dexlib2.iface.value.BooleanEncodedValue;
+
+public class ImmutableBooleanEncodedValue extends BaseBooleanEncodedValue implements ImmutableEncodedValue {
+    public static final ImmutableBooleanEncodedValue TRUE_VALUE = new ImmutableBooleanEncodedValue(true);
+    public static final ImmutableBooleanEncodedValue FALSE_VALUE = new ImmutableBooleanEncodedValue(false);
+
+    protected final boolean value;
+
+    private ImmutableBooleanEncodedValue(boolean value) {
+        this.value = value;
+    }
+
+    public static ImmutableBooleanEncodedValue forBoolean(boolean value) {
+        return value?TRUE_VALUE:FALSE_VALUE;
+    }
+
+    public static ImmutableBooleanEncodedValue of(BooleanEncodedValue booleanEncodedValue) {
+        return forBoolean(booleanEncodedValue.getValue());
+    }
+
+    @Override public boolean getValue() { return value; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableByteEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableByteEncodedValue.java
new file mode 100644
index 0000000..f5e7220
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableByteEncodedValue.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.value;
+
+import org.jf.dexlib2.base.value.BaseByteEncodedValue;
+import org.jf.dexlib2.iface.value.ByteEncodedValue;
+
+public class ImmutableByteEncodedValue extends BaseByteEncodedValue implements ImmutableEncodedValue {
+    protected final byte value;
+
+    public ImmutableByteEncodedValue(byte value) {
+        this.value = value;
+    }
+
+    public static ImmutableByteEncodedValue of(ByteEncodedValue byteEncodedValue) {
+        if (byteEncodedValue instanceof ImmutableByteEncodedValue) {
+            return (ImmutableByteEncodedValue)byteEncodedValue;
+        }
+        return new ImmutableByteEncodedValue(byteEncodedValue.getValue());
+    }
+
+    @Override public byte getValue() { return value; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableCharEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableCharEncodedValue.java
new file mode 100644
index 0000000..ee064e4
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableCharEncodedValue.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.value;
+
+import org.jf.dexlib2.base.value.BaseCharEncodedValue;
+import org.jf.dexlib2.iface.value.CharEncodedValue;
+
+public class ImmutableCharEncodedValue extends BaseCharEncodedValue implements ImmutableEncodedValue {
+    protected final char value;
+
+    public ImmutableCharEncodedValue(char value) {
+        this.value = value;
+    }
+
+    public static ImmutableCharEncodedValue of(CharEncodedValue charEncodedValue) {
+        if (charEncodedValue instanceof ImmutableCharEncodedValue) {
+            return (ImmutableCharEncodedValue)charEncodedValue;
+        }
+        return new ImmutableCharEncodedValue(charEncodedValue.getValue());
+    }
+
+    @Override public char getValue() { return value; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableDoubleEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableDoubleEncodedValue.java
new file mode 100644
index 0000000..d22d0f7
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableDoubleEncodedValue.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.value;
+
+import org.jf.dexlib2.base.value.BaseDoubleEncodedValue;
+import org.jf.dexlib2.iface.value.DoubleEncodedValue;
+
+public class ImmutableDoubleEncodedValue extends BaseDoubleEncodedValue implements ImmutableEncodedValue {
+    protected final double value;
+
+    public ImmutableDoubleEncodedValue(double value) {
+        this.value = value;
+    }
+
+    public static ImmutableDoubleEncodedValue of(DoubleEncodedValue doubleEncodedValue) {
+        if (doubleEncodedValue instanceof ImmutableDoubleEncodedValue) {
+            return (ImmutableDoubleEncodedValue)doubleEncodedValue;
+        }
+        return new ImmutableDoubleEncodedValue(doubleEncodedValue.getValue());
+    }
+
+    @Override public double getValue() { return value; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableEncodedValue.java
new file mode 100644
index 0000000..2e7fc36
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableEncodedValue.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.value;
+
+import org.jf.dexlib2.iface.value.EncodedValue;
+
+public interface ImmutableEncodedValue extends EncodedValue {
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableEncodedValueFactory.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableEncodedValueFactory.java
new file mode 100644
index 0000000..f22e8c5
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableEncodedValueFactory.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.value;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import org.jf.dexlib2.ValueType;
+import org.jf.dexlib2.iface.value.*;
+import org.jf.util.ExceptionWithContext;
+import org.jf.util.ImmutableConverter;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class ImmutableEncodedValueFactory {
+    @Nonnull
+    public static ImmutableEncodedValue of(@Nonnull EncodedValue encodedValue) {
+        switch (encodedValue.getValueType()) {
+            case ValueType.BYTE:
+                return ImmutableByteEncodedValue.of((ByteEncodedValue)encodedValue);
+            case ValueType.SHORT:
+                return ImmutableShortEncodedValue.of((ShortEncodedValue)encodedValue);
+            case ValueType.CHAR:
+                return ImmutableCharEncodedValue.of((CharEncodedValue)encodedValue);
+            case ValueType.INT:
+                return ImmutableIntEncodedValue.of((IntEncodedValue)encodedValue);
+            case ValueType.LONG:
+                return ImmutableLongEncodedValue.of((LongEncodedValue)encodedValue);
+            case ValueType.FLOAT:
+                return ImmutableFloatEncodedValue.of((FloatEncodedValue)encodedValue);
+            case ValueType.DOUBLE:
+                return ImmutableDoubleEncodedValue.of((DoubleEncodedValue)encodedValue);
+            case ValueType.STRING:
+                return ImmutableStringEncodedValue.of((StringEncodedValue)encodedValue);
+            case ValueType.TYPE:
+                return ImmutableTypeEncodedValue.of((TypeEncodedValue)encodedValue);
+            case ValueType.FIELD:
+                return ImmutableFieldEncodedValue.of((FieldEncodedValue)encodedValue);
+            case ValueType.METHOD:
+                return ImmutableMethodEncodedValue.of((MethodEncodedValue)encodedValue);
+            case ValueType.ENUM:
+                return ImmutableEnumEncodedValue.of((EnumEncodedValue)encodedValue);
+            case ValueType.ARRAY:
+                return ImmutableArrayEncodedValue.of((ArrayEncodedValue)encodedValue);
+            case ValueType.ANNOTATION:
+                return ImmutableAnnotationEncodedValue.of((AnnotationEncodedValue)encodedValue);
+            case ValueType.NULL:
+                return ImmutableNullEncodedValue.INSTANCE;
+            case ValueType.BOOLEAN:
+                return ImmutableBooleanEncodedValue.of((BooleanEncodedValue)encodedValue);
+            case ValueType.METHOD_HANDLE:
+                return ImmutableMethodHandleEncodedValue.of((MethodHandleEncodedValue) encodedValue);
+            case ValueType.METHOD_TYPE:
+                return ImmutableMethodTypeEncodedValue.of((MethodTypeEncodedValue) encodedValue);
+            default:
+                Preconditions.checkArgument(false);
+                return null;
+        }
+    }
+
+    @Nonnull
+    public static EncodedValue defaultValueForType(String type) {
+        switch (type.charAt(0)) {
+            case 'Z':
+                return ImmutableBooleanEncodedValue.FALSE_VALUE;
+            case 'B':
+                return new ImmutableByteEncodedValue((byte)0);
+            case 'S':
+                return new ImmutableShortEncodedValue((short)0);
+            case 'C':
+                return new ImmutableCharEncodedValue((char)0);
+            case 'I':
+                return new ImmutableIntEncodedValue(0);
+            case 'J':
+                return new ImmutableLongEncodedValue(0);
+            case 'F':
+                return new ImmutableFloatEncodedValue(0);
+            case 'D':
+                return new ImmutableDoubleEncodedValue(0);
+            case 'L':
+            case '[':
+                return ImmutableNullEncodedValue.INSTANCE;
+            default:
+                throw new ExceptionWithContext("Unrecognized type: %s", type);
+        }
+    }
+
+    @Nullable
+    public static ImmutableEncodedValue ofNullable(@Nullable EncodedValue encodedValue) {
+        if (encodedValue == null) {
+            return null;
+        }
+        return of(encodedValue);
+    }
+
+    @Nonnull
+    public static ImmutableList<ImmutableEncodedValue> immutableListOf
+            (@Nullable Iterable<? extends EncodedValue> list) {
+        return CONVERTER.toList(list);
+    }
+
+    private static final ImmutableConverter<ImmutableEncodedValue, EncodedValue> CONVERTER =
+            new ImmutableConverter<ImmutableEncodedValue, EncodedValue>() {
+                @Override
+                protected boolean isImmutable(@Nonnull EncodedValue item) {
+                    return item instanceof ImmutableEncodedValue;
+                }
+
+                @Nonnull
+                @Override
+                protected ImmutableEncodedValue makeImmutable(@Nonnull EncodedValue item) {
+                    return of(item);
+                }
+            };
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableEnumEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableEnumEncodedValue.java
new file mode 100644
index 0000000..a67ff31
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableEnumEncodedValue.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.value;
+
+import org.jf.dexlib2.base.value.BaseEnumEncodedValue;
+import org.jf.dexlib2.iface.value.EnumEncodedValue;
+import org.jf.dexlib2.immutable.reference.ImmutableFieldReference;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableEnumEncodedValue extends BaseEnumEncodedValue implements ImmutableEncodedValue {
+    @Nonnull protected final ImmutableFieldReference value;
+
+    public ImmutableEnumEncodedValue(@Nonnull ImmutableFieldReference value) {
+        this.value = value;
+    }
+
+    public static ImmutableEnumEncodedValue of(EnumEncodedValue enumEncodedValue) {
+        if (enumEncodedValue instanceof ImmutableEnumEncodedValue) {
+            return (ImmutableEnumEncodedValue)enumEncodedValue;
+        }
+        return new ImmutableEnumEncodedValue(ImmutableFieldReference.of(enumEncodedValue.getValue()));
+    }
+
+    @Nonnull @Override public ImmutableFieldReference getValue() { return value; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableFieldEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableFieldEncodedValue.java
new file mode 100644
index 0000000..60dea87
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableFieldEncodedValue.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.value;
+
+import org.jf.dexlib2.base.value.BaseFieldEncodedValue;
+import org.jf.dexlib2.iface.value.FieldEncodedValue;
+import org.jf.dexlib2.immutable.reference.ImmutableFieldReference;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableFieldEncodedValue extends BaseFieldEncodedValue implements ImmutableEncodedValue {
+    @Nonnull protected final ImmutableFieldReference value;
+
+    public ImmutableFieldEncodedValue(@Nonnull ImmutableFieldReference value) {
+        this.value = value;
+    }
+
+    public static ImmutableFieldEncodedValue of(@Nonnull FieldEncodedValue fieldEncodedValue) {
+        if (fieldEncodedValue instanceof ImmutableFieldEncodedValue) {
+            return (ImmutableFieldEncodedValue)fieldEncodedValue;
+        }
+        return new ImmutableFieldEncodedValue(ImmutableFieldReference.of(fieldEncodedValue.getValue()));
+    }
+
+    @Nonnull @Override public ImmutableFieldReference getValue() { return value; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableFloatEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableFloatEncodedValue.java
new file mode 100644
index 0000000..e207871
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableFloatEncodedValue.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.value;
+
+import org.jf.dexlib2.base.value.BaseFloatEncodedValue;
+import org.jf.dexlib2.iface.value.FloatEncodedValue;
+
+public class ImmutableFloatEncodedValue extends BaseFloatEncodedValue implements ImmutableEncodedValue {
+    protected final float value;
+
+    public ImmutableFloatEncodedValue(float value) {
+        this.value = value;
+    }
+
+    public static ImmutableFloatEncodedValue of(FloatEncodedValue floatEncodedValue) {
+        if (floatEncodedValue instanceof ImmutableFloatEncodedValue) {
+            return (ImmutableFloatEncodedValue)floatEncodedValue;
+        }
+        return new ImmutableFloatEncodedValue(floatEncodedValue.getValue());
+    }
+
+    @Override public float getValue() { return value; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableIntEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableIntEncodedValue.java
new file mode 100644
index 0000000..6b2014b
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableIntEncodedValue.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.value;
+
+import org.jf.dexlib2.base.value.BaseIntEncodedValue;
+import org.jf.dexlib2.iface.value.IntEncodedValue;
+
+public class ImmutableIntEncodedValue extends BaseIntEncodedValue implements ImmutableEncodedValue {
+    protected final int value;
+
+    public ImmutableIntEncodedValue(int value) {
+        this.value = value;
+    }
+
+    public static ImmutableIntEncodedValue of(IntEncodedValue intEncodedValue) {
+        if (intEncodedValue instanceof ImmutableIntEncodedValue) {
+            return (ImmutableIntEncodedValue)intEncodedValue;
+        }
+        return new ImmutableIntEncodedValue(intEncodedValue.getValue());
+    }
+
+    @Override public int getValue() { return value; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableLongEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableLongEncodedValue.java
new file mode 100644
index 0000000..097ec72
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableLongEncodedValue.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.value;
+
+import org.jf.dexlib2.base.value.BaseLongEncodedValue;
+import org.jf.dexlib2.iface.value.LongEncodedValue;
+
+public class ImmutableLongEncodedValue extends BaseLongEncodedValue implements ImmutableEncodedValue {
+    protected final long value;
+
+    public ImmutableLongEncodedValue(long value) {
+        this.value = value;
+    }
+
+    public static ImmutableLongEncodedValue of(LongEncodedValue longEncodedValue) {
+        if (longEncodedValue instanceof ImmutableLongEncodedValue) {
+            return (ImmutableLongEncodedValue)longEncodedValue;
+        }
+        return new ImmutableLongEncodedValue(longEncodedValue.getValue());
+    }
+
+    @Override public long getValue() { return value; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableMethodEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableMethodEncodedValue.java
new file mode 100644
index 0000000..99c108f
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableMethodEncodedValue.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.value;
+
+import org.jf.dexlib2.base.value.BaseMethodEncodedValue;
+import org.jf.dexlib2.iface.value.MethodEncodedValue;
+import org.jf.dexlib2.immutable.reference.ImmutableMethodReference;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableMethodEncodedValue extends BaseMethodEncodedValue implements ImmutableEncodedValue {
+    @Nonnull protected final ImmutableMethodReference value;
+
+    public ImmutableMethodEncodedValue(@Nonnull ImmutableMethodReference value) {
+        this.value = value;
+    }
+
+    public static ImmutableMethodEncodedValue of(@Nonnull MethodEncodedValue methodEncodedValue) {
+        if (methodEncodedValue instanceof ImmutableMethodEncodedValue) {
+            return (ImmutableMethodEncodedValue)methodEncodedValue;
+        }
+        return new ImmutableMethodEncodedValue(ImmutableMethodReference.of(methodEncodedValue.getValue()));
+    }
+
+    @Nonnull @Override public ImmutableMethodReference getValue() { return value; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableMethodHandleEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableMethodHandleEncodedValue.java
new file mode 100644
index 0000000..cc893ea
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableMethodHandleEncodedValue.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.value;
+
+import org.jf.dexlib2.base.value.BaseMethodHandleEncodedValue;
+import org.jf.dexlib2.iface.value.MethodHandleEncodedValue;
+import org.jf.dexlib2.immutable.reference.ImmutableMethodHandleReference;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableMethodHandleEncodedValue extends BaseMethodHandleEncodedValue implements ImmutableEncodedValue {
+    @Nonnull protected final ImmutableMethodHandleReference methodHandleReference;
+
+    public ImmutableMethodHandleEncodedValue(@Nonnull ImmutableMethodHandleReference methodHandleReference) {
+        this.methodHandleReference = methodHandleReference;
+    }
+
+    @Nonnull
+    public static ImmutableMethodHandleEncodedValue of(@Nonnull MethodHandleEncodedValue methodHandleEncodedValue) {
+        if (methodHandleEncodedValue instanceof ImmutableMethodHandleEncodedValue) {
+            return (ImmutableMethodHandleEncodedValue) methodHandleEncodedValue;
+        }
+        return new ImmutableMethodHandleEncodedValue(
+                ImmutableMethodHandleReference.of(methodHandleEncodedValue.getValue()));
+    }
+
+    @Nonnull @Override public ImmutableMethodHandleReference getValue() { return methodHandleReference; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableMethodTypeEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableMethodTypeEncodedValue.java
new file mode 100644
index 0000000..3aa13a1
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableMethodTypeEncodedValue.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.value;
+
+import org.jf.dexlib2.base.value.BaseMethodTypeEncodedValue;
+import org.jf.dexlib2.iface.value.MethodTypeEncodedValue;
+import org.jf.dexlib2.immutable.reference.ImmutableMethodProtoReference;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableMethodTypeEncodedValue extends BaseMethodTypeEncodedValue implements ImmutableEncodedValue {
+    @Nonnull protected final ImmutableMethodProtoReference methodProtoReference;
+
+    public ImmutableMethodTypeEncodedValue(@Nonnull ImmutableMethodProtoReference methodProtoReference) {
+        this.methodProtoReference = methodProtoReference;
+    }
+
+    @Nonnull
+    public static ImmutableMethodTypeEncodedValue of(@Nonnull MethodTypeEncodedValue methodTypeEncodedValue) {
+        if (methodTypeEncodedValue instanceof ImmutableMethodTypeEncodedValue) {
+            return (ImmutableMethodTypeEncodedValue) methodTypeEncodedValue;
+        }
+        return new ImmutableMethodTypeEncodedValue(
+                ImmutableMethodProtoReference.of(methodTypeEncodedValue.getValue()));
+    }
+
+    @Nonnull @Override public ImmutableMethodProtoReference getValue() { return methodProtoReference; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableNullEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableNullEncodedValue.java
new file mode 100644
index 0000000..89f414e
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableNullEncodedValue.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.value;
+
+import org.jf.dexlib2.base.value.BaseNullEncodedValue;
+
+public class ImmutableNullEncodedValue extends BaseNullEncodedValue implements ImmutableEncodedValue {
+    public static final ImmutableNullEncodedValue INSTANCE = new ImmutableNullEncodedValue();
+
+    private ImmutableNullEncodedValue() {}
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableShortEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableShortEncodedValue.java
new file mode 100644
index 0000000..ceea56f
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableShortEncodedValue.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.value;
+
+import org.jf.dexlib2.base.value.BaseShortEncodedValue;
+import org.jf.dexlib2.iface.value.ShortEncodedValue;
+
+public class ImmutableShortEncodedValue extends BaseShortEncodedValue implements ImmutableEncodedValue {
+    protected final short value;
+
+    public ImmutableShortEncodedValue(short value) {
+        this.value = value;
+    }
+
+    public static ImmutableShortEncodedValue of(ShortEncodedValue shortEncodedValue) {
+        if (shortEncodedValue instanceof ImmutableShortEncodedValue) {
+            return (ImmutableShortEncodedValue)shortEncodedValue;
+        }
+        return new ImmutableShortEncodedValue(shortEncodedValue.getValue());
+    }
+
+    @Override public short getValue() { return value; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableStringEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableStringEncodedValue.java
new file mode 100644
index 0000000..0795695
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableStringEncodedValue.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.value;
+
+import org.jf.dexlib2.base.value.BaseStringEncodedValue;
+import org.jf.dexlib2.iface.value.StringEncodedValue;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableStringEncodedValue extends BaseStringEncodedValue implements ImmutableEncodedValue {
+    @Nonnull protected final String value;
+
+    public ImmutableStringEncodedValue(@Nonnull String value) {
+        this.value = value;
+    }
+
+    public static ImmutableStringEncodedValue of(@Nonnull StringEncodedValue stringEncodedValue) {
+        if (stringEncodedValue instanceof ImmutableStringEncodedValue) {
+            return (ImmutableStringEncodedValue)stringEncodedValue;
+        }
+        return new ImmutableStringEncodedValue(stringEncodedValue.getValue());
+    }
+
+    @Nonnull @Override public String getValue() { return value; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableTypeEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableTypeEncodedValue.java
new file mode 100644
index 0000000..df71978
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/value/ImmutableTypeEncodedValue.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.immutable.value;
+
+import org.jf.dexlib2.base.value.BaseTypeEncodedValue;
+import org.jf.dexlib2.iface.value.TypeEncodedValue;
+
+import javax.annotation.Nonnull;
+
+public class ImmutableTypeEncodedValue extends BaseTypeEncodedValue implements ImmutableEncodedValue {
+    @Nonnull protected final String value;
+
+    public ImmutableTypeEncodedValue(@Nonnull String value) {
+        this.value = value;
+    }
+
+    public static ImmutableTypeEncodedValue of(@Nonnull TypeEncodedValue typeEncodedValue) {
+        if (typeEncodedValue instanceof ImmutableTypeEncodedValue) {
+            return (ImmutableTypeEncodedValue)typeEncodedValue;
+        }
+        return new ImmutableTypeEncodedValue(typeEncodedValue.getValue());
+    }
+
+    @Nonnull @Override public String getValue() { return value; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/rewriter/AnnotationElementRewriter.java b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/AnnotationElementRewriter.java
new file mode 100644
index 0000000..945f022
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/AnnotationElementRewriter.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2014, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.rewriter;
+
+import org.jf.dexlib2.base.BaseAnnotationElement;
+import org.jf.dexlib2.iface.AnnotationElement;
+import org.jf.dexlib2.iface.value.EncodedValue;
+
+import javax.annotation.Nonnull;
+
+public class AnnotationElementRewriter implements Rewriter<AnnotationElement> {
+    @Nonnull protected final Rewriters rewriters;
+
+    public AnnotationElementRewriter(@Nonnull Rewriters rewriters) {
+        this.rewriters = rewriters;
+    }
+
+    @Nonnull @Override public AnnotationElement rewrite(@Nonnull AnnotationElement annotationElement) {
+        return new RewrittenAnnotationElement(annotationElement);
+    }
+
+    protected class RewrittenAnnotationElement extends BaseAnnotationElement {
+        @Nonnull protected AnnotationElement annotationElement;
+
+        public RewrittenAnnotationElement(@Nonnull AnnotationElement annotationElement) {
+            this.annotationElement = annotationElement;
+        }
+
+        @Nonnull @Override public String getName() {
+            return annotationElement.getName();
+        }
+
+        @Nonnull @Override public EncodedValue getValue() {
+            return rewriters.getEncodedValueRewriter().rewrite(annotationElement.getValue());
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/rewriter/AnnotationRewriter.java b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/AnnotationRewriter.java
new file mode 100644
index 0000000..725d2f2
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/AnnotationRewriter.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2014, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.rewriter;
+
+import org.jf.dexlib2.base.BaseAnnotation;
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.iface.AnnotationElement;
+
+import javax.annotation.Nonnull;
+import java.util.Set;
+
+public class AnnotationRewriter implements Rewriter<Annotation> {
+    @Nonnull protected final Rewriters rewriters;
+
+    public AnnotationRewriter(@Nonnull Rewriters rewriters) {
+        this.rewriters = rewriters;
+    }
+
+    @Nonnull @Override public Annotation rewrite(@Nonnull Annotation value) {
+        return new RewrittenAnnotation(value);
+    }
+
+    protected class RewrittenAnnotation extends BaseAnnotation {
+        @Nonnull protected Annotation annotation;
+
+        public RewrittenAnnotation(@Nonnull Annotation annotation) {
+            this.annotation = annotation;
+        }
+
+        @Override public int getVisibility() {
+            return annotation.getVisibility();
+        }
+
+        @Override @Nonnull public String getType() {
+            return rewriters.getTypeRewriter().rewrite(annotation.getType());
+        }
+
+        @Override @Nonnull public Set<? extends AnnotationElement> getElements() {
+            return RewriterUtils.rewriteSet(rewriters.getAnnotationElementRewriter(), annotation.getElements());
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/rewriter/ClassDefRewriter.java b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/ClassDefRewriter.java
new file mode 100644
index 0000000..7e34ee3
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/ClassDefRewriter.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2014, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.rewriter;
+
+import com.google.common.collect.Iterators;
+import org.jf.dexlib2.base.reference.BaseTypeReference;
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.Field;
+import org.jf.dexlib2.iface.Method;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+public class ClassDefRewriter implements Rewriter<ClassDef> {
+    @Nonnull protected final Rewriters rewriters;
+
+    public ClassDefRewriter(@Nonnull Rewriters rewriters) {
+        this.rewriters = rewriters;
+    }
+
+    @Nonnull @Override public ClassDef rewrite(@Nonnull ClassDef classDef) {
+        return new RewrittenClassDef(classDef);
+    }
+
+    protected class RewrittenClassDef extends BaseTypeReference implements ClassDef {
+        @Nonnull protected ClassDef classDef;
+
+        public RewrittenClassDef(@Nonnull ClassDef classdef) {
+            this.classDef = classdef;
+        }
+
+        @Override @Nonnull public String getType() {
+            return rewriters.getTypeRewriter().rewrite(classDef.getType());
+        }
+
+        @Override public int getAccessFlags() {
+            return classDef.getAccessFlags();
+        }
+
+        @Override @Nullable public String getSuperclass() {
+            return RewriterUtils.rewriteNullable(rewriters.getTypeRewriter(), classDef.getSuperclass());
+        }
+
+        @Override @Nonnull public List<String> getInterfaces() {
+            return RewriterUtils.rewriteList(rewriters.getTypeRewriter(), classDef.getInterfaces());
+        }
+
+        @Override @Nullable public String getSourceFile() {
+            return classDef.getSourceFile();
+        }
+
+        @Override @Nonnull public Set<? extends Annotation> getAnnotations() {
+            return RewriterUtils.rewriteSet(rewriters.getAnnotationRewriter(), classDef.getAnnotations());
+        }
+
+        @Override @Nonnull public Iterable<? extends Field> getStaticFields() {
+            return RewriterUtils.rewriteIterable(rewriters.getFieldRewriter(), classDef.getStaticFields());
+        }
+
+        @Override @Nonnull public Iterable<? extends Field> getInstanceFields() {
+            return RewriterUtils.rewriteIterable(rewriters.getFieldRewriter(), classDef.getInstanceFields());
+        }
+
+        @Nonnull
+        @Override
+        public Iterable<? extends Field> getFields() {
+            return new Iterable<Field>() {
+                @Nonnull
+                @Override
+                public Iterator<Field> iterator() {
+                    return Iterators.concat(getStaticFields().iterator(), getInstanceFields().iterator());
+                }
+            };
+        }
+
+        @Override @Nonnull public Iterable<? extends Method> getDirectMethods() {
+            return RewriterUtils.rewriteIterable(rewriters.getMethodRewriter(), classDef.getDirectMethods());
+        }
+
+        @Override @Nonnull public Iterable<? extends Method> getVirtualMethods() {
+            return RewriterUtils.rewriteIterable(rewriters.getMethodRewriter(), classDef.getVirtualMethods());
+        }
+
+        @Nonnull
+        @Override
+        public Iterable<? extends Method> getMethods() {
+            return new Iterable<Method>() {
+                @Nonnull
+                @Override
+                public Iterator<Method> iterator() {
+                    return Iterators.concat(getDirectMethods().iterator(), getVirtualMethods().iterator());
+                }
+            };
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/rewriter/DebugItemRewriter.java b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/DebugItemRewriter.java
new file mode 100644
index 0000000..4fc753a
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/DebugItemRewriter.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright 2014, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.rewriter;
+
+import org.jf.dexlib2.DebugItemType;
+import org.jf.dexlib2.iface.debug.*;
+import org.jf.dexlib2.iface.reference.StringReference;
+import org.jf.dexlib2.iface.reference.TypeReference;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class DebugItemRewriter implements Rewriter<DebugItem> {
+    @Nonnull protected final Rewriters rewriters;
+
+    public DebugItemRewriter(@Nonnull Rewriters rewriters) {
+        this.rewriters = rewriters;
+    }
+
+    @Nonnull @Override public DebugItem rewrite(@Nonnull DebugItem value) {
+        switch (value.getDebugItemType()) {
+            case DebugItemType.START_LOCAL:
+                return new RewrittenStartLocal((StartLocal)value);
+            case DebugItemType.END_LOCAL:
+                return new RewrittenEndLocal((EndLocal)value);
+            case DebugItemType.RESTART_LOCAL:
+                return new RewrittenRestartLocal((RestartLocal)value);
+            default:
+                return value;
+        }
+    }
+
+    protected class BaseRewrittenLocalInfoDebugItem<T extends DebugItem & LocalInfo> implements DebugItem, LocalInfo {
+        @Nonnull protected T debugItem;
+
+        public BaseRewrittenLocalInfoDebugItem (@Nonnull T debugItem) {
+            this.debugItem = debugItem;
+        }
+
+        @Override public int getDebugItemType() {
+            return debugItem.getDebugItemType();
+        }
+
+        @Override public int getCodeAddress() {
+            return debugItem.getCodeAddress();
+        }
+
+        @Override @Nullable public String getName() {
+            return debugItem.getName();
+        }
+
+        @Override @Nullable public String getType() {
+            return RewriterUtils.rewriteNullable(rewriters.getTypeRewriter(), debugItem.getType());
+        }
+
+        @Override @Nullable public String getSignature() {
+            return debugItem.getSignature();
+        }
+    }
+
+    protected class RewrittenStartLocal extends BaseRewrittenLocalInfoDebugItem<StartLocal> implements StartLocal {
+        public RewrittenStartLocal(@Nonnull StartLocal debugItem) {
+            super(debugItem);
+        }
+
+        @Override public int getRegister() {
+            return debugItem.getRegister();
+        }
+
+        @Override @Nullable public StringReference getNameReference() {
+            return debugItem.getNameReference();
+        }
+
+        @Override @Nullable public TypeReference getTypeReference() {
+            TypeReference typeReference = debugItem.getTypeReference();
+            if (typeReference == null) {
+                return null;
+            }
+
+            return RewriterUtils.rewriteTypeReference(rewriters.getTypeRewriter(), typeReference);
+        }
+
+        @Override @Nullable public StringReference getSignatureReference() {
+            return debugItem.getSignatureReference();
+        }
+    }
+
+    protected class RewrittenEndLocal extends BaseRewrittenLocalInfoDebugItem<EndLocal> implements EndLocal {
+        public RewrittenEndLocal(@Nonnull EndLocal instruction) {
+            super(instruction);
+        }
+
+        public int getRegister() {
+            return debugItem.getRegister();
+        }
+    }
+
+    protected class RewrittenRestartLocal extends BaseRewrittenLocalInfoDebugItem<RestartLocal>
+            implements RestartLocal {
+        public RewrittenRestartLocal(@Nonnull RestartLocal instruction) {
+            super(instruction);
+        }
+
+        public int getRegister() {
+            return debugItem.getRegister();
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/rewriter/DexFileRewriter.java b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/DexFileRewriter.java
new file mode 100644
index 0000000..faa991c
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/DexFileRewriter.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2020, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.rewriter;
+
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.DexFile;
+
+import javax.annotation.Nonnull;
+import java.util.Set;
+
+public class DexFileRewriter implements Rewriter<DexFile> {
+    @Nonnull protected final Rewriters rewriters;
+
+    public DexFileRewriter(@Nonnull Rewriters rewriters) {
+        this.rewriters = rewriters;
+    }
+
+    @Nonnull @Override public DexFile rewrite(@Nonnull DexFile value) {
+        return new RewrittenDexFile(value);
+    }
+
+    protected class RewrittenDexFile implements DexFile {
+        @Nonnull protected final DexFile dexFile;
+
+        public RewrittenDexFile(@Nonnull DexFile dexFile) {
+            this.dexFile = dexFile;
+        }
+
+        @Override @Nonnull public Set<? extends ClassDef> getClasses() {
+            return RewriterUtils.rewriteSet(rewriters.getClassDefRewriter(), dexFile.getClasses());
+        }
+
+        @Nonnull @Override public Opcodes getOpcodes() {
+            return dexFile.getOpcodes();
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/rewriter/DexRewriter.java b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/DexRewriter.java
new file mode 100644
index 0000000..84963aa
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/DexRewriter.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2014, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.rewriter;
+
+import org.jf.dexlib2.iface.*;
+import org.jf.dexlib2.iface.debug.DebugItem;
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.dexlib2.iface.reference.FieldReference;
+import org.jf.dexlib2.iface.reference.MethodReference;
+import org.jf.dexlib2.iface.value.EncodedValue;
+
+import javax.annotation.Nonnull;
+
+/**
+ * Out-of-the box, this class does nothing except make a picture-perfect copy of a dex file.
+ *
+ * However, it provides many points where you can hook into this process and selectively modify
+ * the dex file. For example, If you want to rename all instances (including definitions and references)
+ * of the class Lorg/blah/MyBlah; to Lorg/blah/YourBlah;
+ *
+ * <pre>
+ * {@code
+ * DexRewriter rewriter = new DexRewriter(new RewriterModule() {
+ *     public Rewriter<String> getTypeRewriter(Rewriters rewriters) {
+ *         return new Rewriter<String>() {
+ *             public String rewrite(String value) {
+ *                 if (value.equals("Lorg/blah/MyBlah;")) {
+ *                     return "Lorg/blah/YourBlah;";
+ *                 }
+ *                 return value;
+ *             }
+ *         };
+ *     }
+ * });
+ * DexFile rewrittenDexFile = rewriter.rewriteDexFile(dexFile);
+ * }
+ * </pre>
+ */
+public class DexRewriter implements Rewriters {
+    private final Rewriter<DexFile> dexFileRewriter;
+    private final Rewriter<ClassDef> classDefRewriter;
+    private final Rewriter<Field> fieldRewriter;
+    private final Rewriter<Method> methodRewriter;
+    private final Rewriter<MethodParameter> methodParameterRewriter;
+    private final Rewriter<MethodImplementation> methodImplementationRewriter;
+    private final Rewriter<Instruction> instructionRewriter;
+    private final Rewriter<TryBlock<? extends ExceptionHandler>> tryBlockRewriter;
+    private final Rewriter<ExceptionHandler> exceptionHandlerRewriter;
+    private final Rewriter<DebugItem> debugItemRewriter;
+    private final Rewriter<String> typeRewriter;
+    private final Rewriter<FieldReference> fieldReferenceRewriter;
+    private final Rewriter<MethodReference> methodReferenceRewriter;
+    private final Rewriter<Annotation> annotationRewriter;
+    private final Rewriter<AnnotationElement> annotationElementRewriter;
+    private final Rewriter<EncodedValue> encodedValueRewriter;
+
+    public DexRewriter(RewriterModule module) {
+        this.dexFileRewriter = module.getDexFileRewriter(this);
+        this.classDefRewriter = module.getClassDefRewriter(this);
+        this.fieldRewriter = module.getFieldRewriter(this);
+        this.methodRewriter = module.getMethodRewriter(this);
+        this.methodParameterRewriter = module.getMethodParameterRewriter(this);
+        this.methodImplementationRewriter = module.getMethodImplementationRewriter(this);
+        this.instructionRewriter = module.getInstructionRewriter(this);
+        this.tryBlockRewriter = module.getTryBlockRewriter(this);
+        this.exceptionHandlerRewriter = module.getExceptionHandlerRewriter(this);
+        this.debugItemRewriter = module.getDebugItemRewriter(this);
+        this.typeRewriter = module.getTypeRewriter(this);
+        this.fieldReferenceRewriter = module.getFieldReferenceRewriter(this);
+        this.methodReferenceRewriter = module.getMethodReferenceRewriter(this);
+        this.annotationRewriter = module.getAnnotationRewriter(this);
+        this.annotationElementRewriter = module.getAnnotationElementRewriter(this);
+        this.encodedValueRewriter = module.getEncodedValueRewriter(this);
+    }
+
+    @Nonnull @Override public Rewriter<DexFile> getDexFileRewriter() { return dexFileRewriter; }
+    @Nonnull @Override public Rewriter<ClassDef> getClassDefRewriter() { return classDefRewriter; }
+    @Nonnull @Override public Rewriter<Field> getFieldRewriter() { return fieldRewriter; }
+    @Nonnull @Override public Rewriter<Method> getMethodRewriter() { return methodRewriter; }
+    @Nonnull @Override public Rewriter<MethodParameter> getMethodParameterRewriter() { return methodParameterRewriter; }
+    @Nonnull @Override public Rewriter<MethodImplementation> getMethodImplementationRewriter() { return methodImplementationRewriter; }
+    @Nonnull @Override public Rewriter<Instruction> getInstructionRewriter() { return instructionRewriter; }
+    @Nonnull @Override public Rewriter<TryBlock<? extends ExceptionHandler>> getTryBlockRewriter() { return tryBlockRewriter; }
+    @Nonnull @Override public Rewriter<ExceptionHandler> getExceptionHandlerRewriter() { return exceptionHandlerRewriter; }
+    @Nonnull @Override public Rewriter<DebugItem> getDebugItemRewriter() { return debugItemRewriter; }
+    @Nonnull @Override public Rewriter<String> getTypeRewriter() { return typeRewriter; }
+    @Nonnull @Override public Rewriter<FieldReference> getFieldReferenceRewriter() { return fieldReferenceRewriter; }
+    @Nonnull @Override public Rewriter<MethodReference> getMethodReferenceRewriter() { return methodReferenceRewriter; }
+    @Nonnull @Override public Rewriter<Annotation> getAnnotationRewriter() { return annotationRewriter; }
+    @Nonnull @Override public Rewriter<AnnotationElement> getAnnotationElementRewriter() { return annotationElementRewriter; }
+    @Nonnull @Override public Rewriter<EncodedValue> getEncodedValueRewriter() { return encodedValueRewriter; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/rewriter/EncodedValueRewriter.java b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/EncodedValueRewriter.java
new file mode 100644
index 0000000..981c8ac
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/EncodedValueRewriter.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright 2014, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.rewriter;
+
+import org.jf.dexlib2.ValueType;
+import org.jf.dexlib2.base.value.*;
+import org.jf.dexlib2.iface.AnnotationElement;
+import org.jf.dexlib2.iface.reference.FieldReference;
+import org.jf.dexlib2.iface.reference.MethodReference;
+import org.jf.dexlib2.iface.value.*;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+import java.util.Set;
+
+public class EncodedValueRewriter implements Rewriter<EncodedValue> {
+    @Nonnull protected final Rewriters rewriters;
+
+    public EncodedValueRewriter(@Nonnull Rewriters rewriters) {
+        this.rewriters = rewriters;
+    }
+
+    @Nonnull @Override public EncodedValue rewrite(@Nonnull EncodedValue encodedValue) {
+        switch (encodedValue.getValueType()) {
+            case ValueType.TYPE:
+                return new RewrittenTypeEncodedValue((TypeEncodedValue)encodedValue);
+            case ValueType.FIELD:
+                return new RewrittenFieldEncodedValue((FieldEncodedValue)encodedValue);
+            case ValueType.METHOD:
+                return new RewrittenMethodEncodedValue((MethodEncodedValue)encodedValue);
+            case ValueType.ENUM:
+                return new RewrittenEnumEncodedValue((EnumEncodedValue)encodedValue);
+            case ValueType.ARRAY:
+                return new RewrittenArrayEncodedValue((ArrayEncodedValue)encodedValue);
+            case ValueType.ANNOTATION:
+                return new RewrittenAnnotationEncodedValue((AnnotationEncodedValue)encodedValue);
+            default:
+                return encodedValue;
+        }
+    }
+
+    protected class RewrittenTypeEncodedValue extends BaseTypeEncodedValue {
+        @Nonnull protected TypeEncodedValue typeEncodedValue;
+
+        public RewrittenTypeEncodedValue(@Nonnull TypeEncodedValue typeEncodedValue) {
+            this.typeEncodedValue = typeEncodedValue;
+        }
+
+        @Override @Nonnull public String getValue() {
+            return rewriters.getTypeRewriter().rewrite(typeEncodedValue.getValue());
+        }
+    }
+
+    protected class RewrittenFieldEncodedValue extends BaseFieldEncodedValue {
+        @Nonnull protected FieldEncodedValue fieldEncodedValue;
+
+        public RewrittenFieldEncodedValue(@Nonnull FieldEncodedValue fieldEncodedValue) {
+            this.fieldEncodedValue = fieldEncodedValue;
+        }
+
+        @Override @Nonnull public FieldReference getValue() {
+            return rewriters.getFieldReferenceRewriter().rewrite(fieldEncodedValue.getValue());
+        }
+    }
+
+    protected class RewrittenEnumEncodedValue extends BaseEnumEncodedValue {
+        @Nonnull protected EnumEncodedValue enumEncodedValue;
+
+        public RewrittenEnumEncodedValue(@Nonnull EnumEncodedValue enumEncodedValue) {
+            this.enumEncodedValue = enumEncodedValue;
+        }
+
+        @Override @Nonnull public FieldReference getValue() {
+            return rewriters.getFieldReferenceRewriter().rewrite(enumEncodedValue.getValue());
+        }
+    }
+
+    protected class RewrittenMethodEncodedValue extends BaseMethodEncodedValue {
+        @Nonnull protected MethodEncodedValue methodEncodedValue;
+
+        public RewrittenMethodEncodedValue(@Nonnull MethodEncodedValue methodEncodedValue) {
+            this.methodEncodedValue = methodEncodedValue;
+        }
+
+        @Override @Nonnull public MethodReference getValue() {
+            return rewriters.getMethodReferenceRewriter().rewrite(methodEncodedValue.getValue());
+        }
+    }
+
+    protected class RewrittenArrayEncodedValue extends BaseArrayEncodedValue {
+        @Nonnull protected ArrayEncodedValue arrayEncodedValue;
+
+        public RewrittenArrayEncodedValue(@Nonnull ArrayEncodedValue arrayEncodedValue) {
+            this.arrayEncodedValue = arrayEncodedValue;
+        }
+
+        @Override @Nonnull public List<? extends EncodedValue> getValue() {
+            return RewriterUtils.rewriteList(rewriters.getEncodedValueRewriter(), arrayEncodedValue.getValue());
+        }
+    }
+
+    protected class RewrittenAnnotationEncodedValue extends BaseAnnotationEncodedValue {
+        @Nonnull protected AnnotationEncodedValue annotationEncodedValue;
+
+        public RewrittenAnnotationEncodedValue(@Nonnull AnnotationEncodedValue annotationEncodedValue) {
+            this.annotationEncodedValue = annotationEncodedValue;
+        }
+
+        @Nonnull @Override public String getType() {
+            return rewriters.getTypeRewriter().rewrite(annotationEncodedValue.getType());
+        }
+
+        @Nonnull @Override public Set<? extends AnnotationElement> getElements() {
+            return RewriterUtils.rewriteSet(rewriters.getAnnotationElementRewriter(),
+                    annotationEncodedValue.getElements());
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/rewriter/ExceptionHandlerRewriter.java b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/ExceptionHandlerRewriter.java
new file mode 100644
index 0000000..51df68c
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/ExceptionHandlerRewriter.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2014, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.rewriter;
+
+import org.jf.dexlib2.base.BaseExceptionHandler;
+import org.jf.dexlib2.iface.ExceptionHandler;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class ExceptionHandlerRewriter implements Rewriter<ExceptionHandler> {
+    @Nonnull protected final Rewriters rewriters;
+
+    public ExceptionHandlerRewriter(@Nonnull Rewriters rewriters) {
+        this.rewriters = rewriters;
+    }
+
+    @Nonnull @Override public ExceptionHandler rewrite(@Nonnull ExceptionHandler value) {
+        return new RewrittenExceptionHandler(value);
+    }
+
+    protected class RewrittenExceptionHandler extends BaseExceptionHandler {
+        @Nonnull protected ExceptionHandler exceptionHandler;
+
+        public RewrittenExceptionHandler(@Nonnull ExceptionHandler exceptionHandler) {
+            this.exceptionHandler = exceptionHandler;
+        }
+
+        @Override @Nullable public String getExceptionType() {
+            return RewriterUtils.rewriteNullable(rewriters.getTypeRewriter(), exceptionHandler.getExceptionType());
+        }
+
+        @Override public int getHandlerCodeAddress() {
+            return exceptionHandler.getHandlerCodeAddress();
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/rewriter/FieldReferenceRewriter.java b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/FieldReferenceRewriter.java
new file mode 100644
index 0000000..41b5093
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/FieldReferenceRewriter.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2014, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.rewriter;
+
+import org.jf.dexlib2.base.reference.BaseFieldReference;
+import org.jf.dexlib2.iface.reference.FieldReference;
+
+import javax.annotation.Nonnull;
+
+public class FieldReferenceRewriter implements Rewriter<FieldReference> {
+    @Nonnull protected final Rewriters rewriters;
+
+    public FieldReferenceRewriter(@Nonnull Rewriters rewriters) {
+        this.rewriters = rewriters;
+    }
+
+    @Nonnull @Override public FieldReference rewrite(@Nonnull FieldReference fieldReference) {
+        return new RewrittenFieldReference(fieldReference);
+    }
+
+    protected class RewrittenFieldReference extends BaseFieldReference {
+        @Nonnull protected FieldReference fieldReference;
+
+        public RewrittenFieldReference(@Nonnull FieldReference fieldReference) {
+            this.fieldReference = fieldReference;
+        }
+
+        @Override @Nonnull public String getDefiningClass() {
+            return rewriters.getTypeRewriter().rewrite(fieldReference.getDefiningClass());
+        }
+
+        @Override @Nonnull public String getName() {
+            return fieldReference.getName();
+        }
+
+        @Override @Nonnull public String getType() {
+            return rewriters.getTypeRewriter().rewrite(fieldReference.getType());
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/rewriter/FieldRewriter.java b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/FieldRewriter.java
new file mode 100644
index 0000000..42ce79a
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/FieldRewriter.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2014, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.rewriter;
+
+import org.jf.dexlib2.HiddenApiRestriction;
+import org.jf.dexlib2.base.reference.BaseFieldReference;
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.iface.Field;
+import org.jf.dexlib2.iface.value.EncodedValue;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Set;
+
+public class FieldRewriter implements Rewriter<Field> {
+    @Nonnull protected final Rewriters rewriters;
+
+    public FieldRewriter(@Nonnull Rewriters rewriters) {
+        this.rewriters = rewriters;
+    }
+
+    @Nonnull @Override public Field rewrite(@Nonnull Field field) {
+        return new RewrittenField(field);
+    }
+
+    protected class RewrittenField extends BaseFieldReference implements Field {
+        @Nonnull protected Field field;
+
+        public RewrittenField(@Nonnull Field field) {
+            this.field = field;
+        }
+
+        @Override @Nonnull public String getDefiningClass() {
+            return rewriters.getFieldReferenceRewriter().rewrite(field).getDefiningClass();
+        }
+
+        @Override @Nonnull public String getName() {
+            return rewriters.getFieldReferenceRewriter().rewrite(field).getName();
+        }
+
+        @Override @Nonnull public String getType() {
+            return rewriters.getFieldReferenceRewriter().rewrite(field).getType();
+        }
+
+        public int getAccessFlags() {
+            return field.getAccessFlags();
+        }
+
+        @Nullable public EncodedValue getInitialValue() {
+            return RewriterUtils.rewriteNullable(rewriters.getEncodedValueRewriter(), field.getInitialValue());
+        }
+
+        @Nonnull public Set<? extends Annotation> getAnnotations() {
+            return RewriterUtils.rewriteSet(rewriters.getAnnotationRewriter(), field.getAnnotations());
+        }
+
+        @Nonnull @Override public Set<HiddenApiRestriction> getHiddenApiRestrictions() {
+            return field.getHiddenApiRestrictions();
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/rewriter/InstructionRewriter.java b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/InstructionRewriter.java
new file mode 100644
index 0000000..92d94be
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/InstructionRewriter.java
@@ -0,0 +1,205 @@
+/*
+ * Copyright 2014, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.rewriter;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.ReferenceType;
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.dexlib2.iface.instruction.ReferenceInstruction;
+import org.jf.dexlib2.iface.instruction.formats.*;
+import org.jf.dexlib2.iface.reference.FieldReference;
+import org.jf.dexlib2.iface.reference.MethodReference;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.dexlib2.iface.reference.TypeReference;
+
+import javax.annotation.Nonnull;
+
+public class InstructionRewriter implements Rewriter<Instruction> {
+    @Nonnull protected final Rewriters rewriters;
+
+    public InstructionRewriter(@Nonnull Rewriters rewriters) {
+        this.rewriters = rewriters;
+    }
+
+    @Nonnull @Override public Instruction rewrite(@Nonnull Instruction instruction) {
+        if (instruction instanceof ReferenceInstruction) {
+            switch (instruction.getOpcode().format) {
+                case Format20bc:
+                    return new RewrittenInstruction20bc((Instruction20bc)instruction);
+                case Format21c:
+                    return new RewrittenInstruction21c((Instruction21c)instruction);
+                case Format22c:
+                    return new RewrittenInstruction22c((Instruction22c)instruction);
+                case Format31c:
+                    return new RewrittenInstruction31c((Instruction31c)instruction);
+                case Format35c:
+                    return new RewrittenInstruction35c((Instruction35c)instruction);
+                case Format3rc:
+                    return new RewrittenInstruction3rc((Instruction3rc)instruction);
+                default:
+                    throw new IllegalArgumentException();
+            }
+        }
+        return instruction;
+    }
+
+    protected class BaseRewrittenReferenceInstruction<T extends ReferenceInstruction>
+            implements ReferenceInstruction {
+        @Nonnull protected T instruction;
+
+        protected BaseRewrittenReferenceInstruction(@Nonnull T instruction) {
+            this.instruction = instruction;
+        }
+
+        @Override @Nonnull public Reference getReference() {
+            switch (instruction.getReferenceType()) {
+                case ReferenceType.TYPE:
+                    return RewriterUtils.rewriteTypeReference(rewriters.getTypeRewriter(),
+                            (TypeReference)instruction.getReference());
+                case ReferenceType.FIELD:
+                    return rewriters.getFieldReferenceRewriter().rewrite((FieldReference)instruction.getReference());
+                case ReferenceType.METHOD:
+                    return rewriters.getMethodReferenceRewriter().rewrite((MethodReference)instruction.getReference());
+                case ReferenceType.STRING:
+                    return instruction.getReference();
+                default:
+                    throw new IllegalArgumentException();
+            }
+        }
+
+        @Override public int getReferenceType() {
+            return instruction.getReferenceType();
+        }
+
+        @Override public Opcode getOpcode() {
+            return instruction.getOpcode();
+        }
+
+        @Override public int getCodeUnits() {
+            return instruction.getCodeUnits();
+        }
+    }
+
+    protected class RewrittenInstruction20bc extends BaseRewrittenReferenceInstruction<Instruction20bc>
+            implements Instruction20bc {
+        public RewrittenInstruction20bc(@Nonnull Instruction20bc instruction) {
+            super(instruction);
+        }
+
+        @Override public int getVerificationError() {
+            return instruction.getVerificationError();
+        }
+    }
+
+    protected class RewrittenInstruction21c extends BaseRewrittenReferenceInstruction<Instruction21c>
+            implements Instruction21c {
+        public RewrittenInstruction21c(@Nonnull Instruction21c instruction) {
+            super(instruction);
+        }
+
+        public int getRegisterA() {
+            return instruction.getRegisterA();
+        }
+    }
+
+    protected class RewrittenInstruction22c extends BaseRewrittenReferenceInstruction<Instruction22c>
+            implements Instruction22c {
+        public RewrittenInstruction22c(@Nonnull Instruction22c instruction) {
+            super(instruction);
+        }
+
+        public int getRegisterA() {
+            return instruction.getRegisterA();
+        }
+
+        public int getRegisterB() {
+            return instruction.getRegisterB();
+        }
+    }
+
+    protected class RewrittenInstruction31c extends BaseRewrittenReferenceInstruction<Instruction31c>
+            implements Instruction31c {
+        public RewrittenInstruction31c(@Nonnull Instruction31c instruction) {
+            super(instruction);
+        }
+
+        public int getRegisterA() {
+            return instruction.getRegisterA();
+        }
+    }
+
+    protected class RewrittenInstruction35c extends BaseRewrittenReferenceInstruction<Instruction35c>
+            implements Instruction35c {
+        public RewrittenInstruction35c(@Nonnull Instruction35c instruction) {
+            super(instruction);
+        }
+
+        public int getRegisterC() {
+            return instruction.getRegisterC();
+        }
+
+        public int getRegisterE() {
+            return instruction.getRegisterE();
+        }
+
+        public int getRegisterG() {
+            return instruction.getRegisterG();
+        }
+
+        public int getRegisterCount() {
+            return instruction.getRegisterCount();
+        }
+
+        public int getRegisterD() {
+            return instruction.getRegisterD();
+        }
+
+        public int getRegisterF() {
+            return instruction.getRegisterF();
+        }
+    }
+
+    protected class RewrittenInstruction3rc extends BaseRewrittenReferenceInstruction<Instruction3rc>
+            implements Instruction3rc {
+        public RewrittenInstruction3rc(@Nonnull Instruction3rc instruction) {
+            super(instruction);
+        }
+
+        public int getStartRegister() {
+            return instruction.getStartRegister();
+        }
+
+        public int getRegisterCount() {
+            return instruction.getRegisterCount();
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/rewriter/MethodImplementationRewriter.java b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/MethodImplementationRewriter.java
new file mode 100644
index 0000000..4c90e5a
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/MethodImplementationRewriter.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2014, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.rewriter;
+
+import org.jf.dexlib2.iface.ExceptionHandler;
+import org.jf.dexlib2.iface.MethodImplementation;
+import org.jf.dexlib2.iface.TryBlock;
+import org.jf.dexlib2.iface.debug.DebugItem;
+import org.jf.dexlib2.iface.instruction.Instruction;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+public class MethodImplementationRewriter implements Rewriter<MethodImplementation> {
+    @Nonnull protected final Rewriters rewriters;
+
+    public MethodImplementationRewriter(@Nonnull Rewriters rewriters) {
+        this.rewriters = rewriters;
+    }
+
+    @Nonnull @Override public MethodImplementation rewrite(@Nonnull MethodImplementation methodImplementation) {
+        return new RewrittenMethodImplementation(methodImplementation);
+    }
+
+    protected class RewrittenMethodImplementation implements MethodImplementation {
+        @Nonnull protected MethodImplementation methodImplementation;
+
+        public RewrittenMethodImplementation(@Nonnull MethodImplementation methodImplementation) {
+            this.methodImplementation = methodImplementation;
+        }
+
+        @Override public int getRegisterCount() {
+            return methodImplementation.getRegisterCount();
+        }
+
+        @Override @Nonnull public Iterable<? extends Instruction> getInstructions() {
+            return RewriterUtils.rewriteIterable(rewriters.getInstructionRewriter(),
+                    methodImplementation.getInstructions());
+        }
+
+        @Override @Nonnull public List<? extends TryBlock<? extends ExceptionHandler>> getTryBlocks() {
+            return RewriterUtils.rewriteList(rewriters.getTryBlockRewriter(),
+                    methodImplementation.getTryBlocks());
+        }
+
+        @Override @Nonnull public Iterable<? extends DebugItem> getDebugItems() {
+            return RewriterUtils.rewriteIterable(rewriters.getDebugItemRewriter(),
+                    methodImplementation.getDebugItems());
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/rewriter/MethodParameterRewriter.java b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/MethodParameterRewriter.java
new file mode 100644
index 0000000..1ddc380
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/MethodParameterRewriter.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2014, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.rewriter;
+
+import org.jf.dexlib2.base.BaseMethodParameter;
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.iface.MethodParameter;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Set;
+
+public class MethodParameterRewriter implements Rewriter<MethodParameter> {
+    @Nonnull protected final Rewriters rewriters;
+
+    public MethodParameterRewriter(@Nonnull Rewriters rewriters) {
+        this.rewriters = rewriters;
+    }
+
+    @Nonnull @Override public MethodParameter rewrite(@Nonnull MethodParameter methodParameter) {
+        return new RewrittenMethodParameter(methodParameter);
+    }
+
+    protected class RewrittenMethodParameter extends BaseMethodParameter {
+        @Nonnull protected MethodParameter methodParameter;
+
+        public RewrittenMethodParameter(@Nonnull MethodParameter methodParameter) {
+            this.methodParameter = methodParameter;
+        }
+
+        @Override @Nonnull public String getType() {
+            return rewriters.getTypeRewriter().rewrite(methodParameter.getType());
+        }
+
+        @Override @Nonnull public Set<? extends Annotation> getAnnotations() {
+            return RewriterUtils.rewriteSet(rewriters.getAnnotationRewriter(), methodParameter.getAnnotations());
+        }
+
+        @Override @Nullable public String getName() {
+            return methodParameter.getName();
+        }
+
+        @Override @Nullable public String getSignature() {
+            return methodParameter.getSignature();
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/rewriter/MethodReferenceRewriter.java b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/MethodReferenceRewriter.java
new file mode 100644
index 0000000..83a9f9a
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/MethodReferenceRewriter.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2014, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.rewriter;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Lists;
+import org.jf.dexlib2.base.reference.BaseMethodReference;
+import org.jf.dexlib2.iface.reference.MethodReference;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+public class MethodReferenceRewriter implements Rewriter<MethodReference> {
+    @Nonnull protected final Rewriters rewriters;
+
+    public MethodReferenceRewriter(@Nonnull Rewriters rewriters) {
+        this.rewriters = rewriters;
+    }
+
+    @Nonnull @Override public MethodReference rewrite(@Nonnull MethodReference methodReference) {
+        return new RewrittenMethodReference(methodReference);
+    }
+
+    protected class RewrittenMethodReference extends BaseMethodReference {
+        @Nonnull protected MethodReference methodReference;
+
+        public RewrittenMethodReference(@Nonnull MethodReference methodReference) {
+            this.methodReference = methodReference;
+        }
+
+        @Override @Nonnull public String getDefiningClass() {
+            return rewriters.getTypeRewriter().rewrite(methodReference.getDefiningClass());
+        }
+
+        @Override @Nonnull public String getName() {
+            return methodReference.getName();
+        }
+
+        @Override @Nonnull public List<? extends CharSequence> getParameterTypes() {
+            return RewriterUtils.rewriteList(rewriters.getTypeRewriter(),
+                    Lists.transform(methodReference.getParameterTypes(),
+                    new Function<CharSequence, String>() {
+                        @Nonnull @Override public String apply(CharSequence input) {
+                            return input.toString();
+                        }
+                    }));
+        }
+
+        @Override @Nonnull public String getReturnType() {
+            return rewriters.getTypeRewriter().rewrite(methodReference.getReturnType());
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/rewriter/MethodRewriter.java b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/MethodRewriter.java
new file mode 100644
index 0000000..fa1b737
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/MethodRewriter.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2014, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.rewriter;
+
+import org.jf.dexlib2.HiddenApiRestriction;
+import org.jf.dexlib2.base.reference.BaseMethodReference;
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.iface.Method;
+import org.jf.dexlib2.iface.MethodImplementation;
+import org.jf.dexlib2.iface.MethodParameter;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.List;
+import java.util.Set;
+
+public class MethodRewriter implements Rewriter<Method> {
+    @Nonnull protected final Rewriters rewriters;
+
+    public MethodRewriter(@Nonnull Rewriters rewriters) {
+        this.rewriters = rewriters;
+    }
+
+    @Nonnull @Override public Method rewrite(@Nonnull Method value) {
+        return new RewrittenMethod(value);
+    }
+
+    protected class RewrittenMethod extends BaseMethodReference implements Method {
+        @Nonnull protected Method method;
+
+        public RewrittenMethod(@Nonnull Method method) {
+            this.method = method;
+        }
+
+        @Override @Nonnull public String getDefiningClass() {
+            return rewriters.getMethodReferenceRewriter().rewrite(method).getDefiningClass();
+        }
+
+        @Override @Nonnull public String getName() {
+            return rewriters.getMethodReferenceRewriter().rewrite(method).getName();
+        }
+
+        @Override @Nonnull public List<? extends CharSequence> getParameterTypes() {
+            return rewriters.getMethodReferenceRewriter().rewrite(method).getParameterTypes();
+        }
+
+        @Override @Nonnull public List<? extends MethodParameter> getParameters() {
+            // We can't use the MethodReferenceRewriter to rewrite the parameters, because we would lose
+            // parameter names and annotations. If a method rewrite involves changing parameters, it needs
+            // to be handled here as well as in the MethodReferenceRewriter
+
+            return RewriterUtils.rewriteList(rewriters.getMethodParameterRewriter(), method.getParameters());
+        }
+
+        @Override @Nonnull public String getReturnType() {
+            return rewriters.getMethodReferenceRewriter().rewrite(method).getReturnType();
+        }
+
+        @Override public int getAccessFlags() {
+            return method.getAccessFlags();
+        }
+
+        @Override @Nonnull public Set<? extends Annotation> getAnnotations() {
+            return RewriterUtils.rewriteSet(rewriters.getAnnotationRewriter(), method.getAnnotations());
+        }
+
+        @Nonnull @Override public Set<HiddenApiRestriction> getHiddenApiRestrictions() {
+            return method.getHiddenApiRestrictions();
+        }
+
+        @Override @Nullable public MethodImplementation getImplementation() {
+            return RewriterUtils.rewriteNullable(rewriters.getMethodImplementationRewriter(),
+                    method.getImplementation());
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/rewriter/Rewriter.java b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/Rewriter.java
new file mode 100644
index 0000000..6fc5334
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/Rewriter.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2014, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.rewriter;
+
+import javax.annotation.Nonnull;
+
+public interface Rewriter<T> {
+    @Nonnull
+    T rewrite(@Nonnull T value);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/rewriter/RewriterModule.java b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/RewriterModule.java
new file mode 100644
index 0000000..5723b6d
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/RewriterModule.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2014, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.rewriter;
+
+import org.jf.dexlib2.iface.*;
+import org.jf.dexlib2.iface.debug.DebugItem;
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.dexlib2.iface.reference.FieldReference;
+import org.jf.dexlib2.iface.reference.MethodReference;
+import org.jf.dexlib2.iface.value.EncodedValue;
+
+import javax.annotation.Nonnull;
+
+public class RewriterModule {
+    @Nonnull public Rewriter<DexFile> getDexFileRewriter(@Nonnull Rewriters rewriters) {
+        return new DexFileRewriter(rewriters);
+    }
+
+    @Nonnull public Rewriter<ClassDef> getClassDefRewriter(@Nonnull Rewriters rewriters) {
+        return new ClassDefRewriter(rewriters);
+    }
+
+    @Nonnull public Rewriter<Field> getFieldRewriter(@Nonnull Rewriters rewriters) {
+        return new FieldRewriter(rewriters);
+    }
+
+    @Nonnull public Rewriter<Method> getMethodRewriter(@Nonnull Rewriters rewriters) {
+        return new MethodRewriter(rewriters);
+    }
+
+    @Nonnull public Rewriter<MethodParameter> getMethodParameterRewriter(@Nonnull Rewriters rewriters) {
+        return new MethodParameterRewriter(rewriters);
+    }
+
+    @Nonnull public Rewriter<MethodImplementation> getMethodImplementationRewriter(@Nonnull Rewriters rewriters) {
+        return new MethodImplementationRewriter(rewriters);
+    }
+
+    @Nonnull public Rewriter<Instruction> getInstructionRewriter(@Nonnull Rewriters rewriters) {
+        return new InstructionRewriter(rewriters);
+    }
+
+    @Nonnull public Rewriter<TryBlock<? extends ExceptionHandler>> getTryBlockRewriter(@Nonnull Rewriters rewriters) {
+        return new TryBlockRewriter(rewriters);
+    }
+
+    @Nonnull public Rewriter<ExceptionHandler> getExceptionHandlerRewriter(@Nonnull Rewriters rewriters) {
+        return new ExceptionHandlerRewriter(rewriters);
+    }
+
+    @Nonnull public Rewriter<DebugItem> getDebugItemRewriter(@Nonnull Rewriters rewriters) {
+        return new DebugItemRewriter(rewriters);
+    }
+
+    @Nonnull public Rewriter<String> getTypeRewriter(@Nonnull Rewriters rewriters) {
+        return new TypeRewriter();
+    }
+
+    @Nonnull public Rewriter<FieldReference> getFieldReferenceRewriter(@Nonnull Rewriters rewriters) {
+        return new FieldReferenceRewriter(rewriters);
+    }
+
+    @Nonnull public Rewriter<MethodReference> getMethodReferenceRewriter(@Nonnull Rewriters rewriters) {
+        return new MethodReferenceRewriter(rewriters);
+    }
+
+    @Nonnull public Rewriter<Annotation> getAnnotationRewriter(@Nonnull Rewriters rewriters) {
+        return new AnnotationRewriter(rewriters);
+    }
+
+    @Nonnull public Rewriter<AnnotationElement> getAnnotationElementRewriter(@Nonnull Rewriters rewriters) {
+        return new AnnotationElementRewriter(rewriters);
+    }
+
+    @Nonnull public Rewriter<EncodedValue> getEncodedValueRewriter(@Nonnull Rewriters rewriters) {
+        return new EncodedValueRewriter(rewriters);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/rewriter/RewriterUtils.java b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/RewriterUtils.java
new file mode 100644
index 0000000..d08467a
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/RewriterUtils.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2014, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.rewriter;
+
+import org.jf.dexlib2.base.reference.BaseTypeReference;
+import org.jf.dexlib2.iface.reference.TypeReference;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.*;
+
+public class RewriterUtils {
+    @Nullable
+    public static <T> T rewriteNullable(@Nonnull Rewriter<T> rewriter, @Nullable T value) {
+        return value==null?null:rewriter.rewrite(value);
+    }
+
+    public static <T> Set<T> rewriteSet(@Nonnull final Rewriter<T> rewriter,
+                                        @Nonnull final Set<? extends T> set) {
+        return new AbstractSet<T>() {
+            @Nonnull @Override public Iterator<T> iterator() {
+                final Iterator<? extends T> iterator = set.iterator();
+                return new Iterator<T>() {
+                    @Override public boolean hasNext() {
+                        return iterator.hasNext();
+                    }
+
+                    @Override public T next() {
+                        return rewriteNullable(rewriter, iterator.next());
+                    }
+
+                    @Override public void remove() {
+                        iterator.remove();
+                    }
+                };
+            }
+
+            @Override public int size() {
+                return set.size();
+            }
+        };
+    }
+
+    public static <T> List<T> rewriteList(@Nonnull final Rewriter<T> rewriter,
+                                        @Nonnull final List<? extends T> list) {
+        return new AbstractList<T>() {
+            @Override public T get(int i) {
+                return rewriteNullable(rewriter, list.get(i));
+            }
+
+            @Override public int size() {
+                return list.size();
+            }
+        };
+    }
+
+    public static <T> Iterable<T> rewriteIterable(@Nonnull final Rewriter<T> rewriter,
+                                                  @Nonnull final Iterable<? extends T> iterable) {
+        return new Iterable<T>() {
+            @Override public Iterator<T> iterator() {
+                final Iterator<? extends T> iterator = iterable.iterator();
+                return new Iterator<T>() {
+                    @Override public boolean hasNext() {
+                        return iterator.hasNext();
+                    }
+
+                    @Override public T next() {
+                        return rewriteNullable(rewriter, iterator.next());
+                    }
+
+                    @Override public void remove() {
+                        iterator.remove();
+                    }
+                };
+            }
+        };
+    }
+
+    public static TypeReference rewriteTypeReference(@Nonnull final Rewriter<String> typeRewriter,
+                                                     @Nonnull final TypeReference typeReference) {
+        return new BaseTypeReference() {
+            @Nonnull @Override public String getType() {
+                return typeRewriter.rewrite(typeReference.getType());
+            }
+        };
+    }
+}
+
+
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/rewriter/Rewriters.java b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/Rewriters.java
new file mode 100644
index 0000000..e64c48f
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/Rewriters.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2014, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.rewriter;
+
+import org.jf.dexlib2.iface.*;
+import org.jf.dexlib2.iface.debug.DebugItem;
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.dexlib2.iface.reference.FieldReference;
+import org.jf.dexlib2.iface.reference.MethodReference;
+import org.jf.dexlib2.iface.value.EncodedValue;
+
+import javax.annotation.Nonnull;
+
+public interface Rewriters {
+    @Nonnull Rewriter<DexFile> getDexFileRewriter();
+    @Nonnull Rewriter<ClassDef> getClassDefRewriter();
+    @Nonnull Rewriter<Field> getFieldRewriter();
+
+    @Nonnull Rewriter<Method> getMethodRewriter();
+    @Nonnull Rewriter<MethodParameter> getMethodParameterRewriter();
+    @Nonnull Rewriter<MethodImplementation> getMethodImplementationRewriter();
+    @Nonnull Rewriter<Instruction> getInstructionRewriter();
+    @Nonnull Rewriter<TryBlock<? extends ExceptionHandler>> getTryBlockRewriter();
+    @Nonnull Rewriter<ExceptionHandler> getExceptionHandlerRewriter();
+    @Nonnull Rewriter<DebugItem> getDebugItemRewriter();
+
+    @Nonnull Rewriter<String> getTypeRewriter();
+    @Nonnull Rewriter<FieldReference> getFieldReferenceRewriter();
+    @Nonnull Rewriter<MethodReference> getMethodReferenceRewriter();
+
+    @Nonnull Rewriter<Annotation> getAnnotationRewriter();
+    @Nonnull Rewriter<AnnotationElement> getAnnotationElementRewriter();
+
+    @Nonnull Rewriter<EncodedValue> getEncodedValueRewriter();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/rewriter/TryBlockRewriter.java b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/TryBlockRewriter.java
new file mode 100644
index 0000000..43fed10
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/TryBlockRewriter.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2014, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.rewriter;
+
+import org.jf.dexlib2.base.BaseTryBlock;
+import org.jf.dexlib2.iface.ExceptionHandler;
+import org.jf.dexlib2.iface.TryBlock;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+public class TryBlockRewriter implements Rewriter<TryBlock<? extends ExceptionHandler>> {
+    @Nonnull protected final Rewriters rewriters;
+
+    public TryBlockRewriter(@Nonnull Rewriters rewriters) {
+        this.rewriters = rewriters;
+    }
+
+    @Nonnull @Override public TryBlock<? extends ExceptionHandler> rewrite(
+            @Nonnull TryBlock<? extends ExceptionHandler> tryBlock) {
+        return new RewrittenTryBlock(tryBlock);
+    }
+
+    protected class RewrittenTryBlock extends BaseTryBlock<ExceptionHandler> {
+        @Nonnull protected TryBlock<? extends ExceptionHandler> tryBlock;
+
+        public RewrittenTryBlock(@Nonnull TryBlock<? extends ExceptionHandler> tryBlock) {
+            this.tryBlock = tryBlock;
+        }
+
+        @Override public int getStartCodeAddress() {
+            return tryBlock.getStartCodeAddress();
+        }
+
+        @Override public int getCodeUnitCount() {
+            return tryBlock.getCodeUnitCount();
+        }
+
+        @Override @Nonnull public List<? extends ExceptionHandler> getExceptionHandlers() {
+            return RewriterUtils.rewriteList(rewriters.getExceptionHandlerRewriter(), tryBlock.getExceptionHandlers());
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/rewriter/TypeRewriter.java b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/TypeRewriter.java
new file mode 100644
index 0000000..252003c
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/TypeRewriter.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2014, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.rewriter;
+
+import javax.annotation.Nonnull;
+
+public class TypeRewriter implements Rewriter<String> {
+    @Nonnull @Override public String rewrite(@Nonnull String value) {
+        if (value.length() > 0 && value.charAt(0) == '[') {
+            int dimensions = 0;
+            while (value.charAt(dimensions) == '[') {
+                dimensions++;
+            }
+
+            String unwrappedType = value.substring(dimensions);
+            String rewrittenType = rewriteUnwrappedType(unwrappedType);
+
+            // instance equality, to avoid a value comparison in the common case of the type being unmodified
+            if (unwrappedType != rewrittenType) {
+                return new StringBuilder(dimensions + rewrittenType.length())
+                        .append(value, 0, dimensions).append(rewrittenType).toString();
+            }
+            return value;
+        } else {
+            return rewriteUnwrappedType(value);
+        }
+    }
+
+    /**
+     * This is called by the default rewrite implementation with the unwrapped type.
+     *
+     * <p>For array types, the unwrapped type is the type with the array specifiers removed. And there is no difference
+     * for non-array types.
+     *
+     * @param value The unwrapped type
+     * @return The modified version of the unwrapped type. This will be re-array-ified if the original wrapped type was
+     * an array.
+     */
+    @Nonnull protected String rewriteUnwrappedType(@Nonnull String value) {
+        return value;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/util/AlignmentUtils.java b/dexlib2/src/main/java/org/jf/dexlib2/util/AlignmentUtils.java
new file mode 100644
index 0000000..1648372
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/util/AlignmentUtils.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.util;
+
+public abstract class AlignmentUtils {
+    public static int alignOffset(int offset, int alignment) {
+        int mask = alignment - 1;
+        assert (alignment >= 0) && ((mask & alignment) == 0);
+        return (offset + mask) & ~mask;
+    }
+
+    public static boolean isAligned(int offset, int alignment) {
+        return (offset % alignment) == 0;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/util/AnnotatedBytes.java b/dexlib2/src/main/java/org/jf/dexlib2/util/AnnotatedBytes.java
new file mode 100644
index 0000000..3f2626a
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/util/AnnotatedBytes.java
@@ -0,0 +1,339 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.util;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
+import org.jf.util.ExceptionWithContext;
+import org.jf.util.Hex;
+import org.jf.util.TwoColumnOutput;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * Collects/presents a set of textual annotations, each associated with a range of bytes or a specific point
+ * between bytes.
+ *
+ * Point annotations cannot occur within the middle of a range annotation, only at the endpoints, or some other area
+ * with no range annotation.
+ *
+ * Multiple point annotations can be defined for a given point. They will be printed in insertion order.
+ *
+ * Only a single range annotation may exist for any given range of bytes. Range annotations may not overlap.
+ */
+public class AnnotatedBytes {
+    /**
+     * This defines the bytes ranges and their associated range and point annotations.
+     *
+     * A range is defined by 2 consecutive keys in the map. The first key is the inclusive start point, the second key
+     * is the exclusive end point. The range annotation for a range is associated with the first key for that range.
+     * The point annotations for a point are associated with the key at that point.
+     */
+    @Nonnull private TreeMap<Integer, AnnotationEndpoint> annotatations = Maps.newTreeMap();
+
+    private int cursor;
+    private int indentLevel;
+
+    /** &gt;= 40 (if used); the desired maximum output width */
+    private int outputWidth;
+
+    /**
+     * &gt;= 8 (if used); the number of bytes of hex output to use
+     * in annotations
+     */
+    private int hexCols = 8;
+
+    private int startLimit = -1;
+    private int endLimit = -1;
+
+    public AnnotatedBytes(int width) {
+        this.outputWidth = width;
+    }
+
+    /**
+     * Moves the cursor to a new location
+     *
+     * @param offset The offset to move to
+     */
+    public void moveTo(int offset) {
+        cursor = offset;
+    }
+
+    /**
+     * Moves the cursor forward or backward by some amount
+     *
+     * @param offset The amount to move the cursor
+     */
+    public void moveBy(int offset) {
+        cursor += offset;
+    }
+
+    public void annotateTo(int offset, @Nonnull String msg, Object... formatArgs) {
+        annotate(offset - cursor, msg, formatArgs);
+    }
+
+    /**
+     * Add an annotation of the given length at the current location.
+     *
+     * The location
+     *
+     *
+     * @param length the length of data being annotated
+     * @param msg the annotation message
+     * @param formatArgs format arguments to pass to String.format
+     */
+    public void annotate(int length, @Nonnull String msg, Object... formatArgs) {
+        if (startLimit != -1 && endLimit != -1 && (cursor < startLimit || cursor >= endLimit)) {
+            throw new ExceptionWithContext("Annotating outside the parent bounds");
+        }
+
+        String formattedMsg;
+        if (formatArgs != null && formatArgs.length > 0) {
+            formattedMsg = String.format(msg, formatArgs);
+        } else {
+            formattedMsg = msg;
+        }
+        int exclusiveEndOffset = cursor + length;
+
+        AnnotationEndpoint endPoint = null;
+
+        // Do we have an endpoint at the beginning of this annotation already?
+        AnnotationEndpoint startPoint = annotatations.get(cursor);
+        if (startPoint == null) {
+            // Nope. We need to check that we're not in the middle of an existing range annotation.
+            Map.Entry<Integer, AnnotationEndpoint> previousEntry = annotatations.lowerEntry(cursor);
+            if (previousEntry != null) {
+                AnnotationEndpoint previousAnnotations = previousEntry.getValue();
+                AnnotationItem previousRangeAnnotation = previousAnnotations.rangeAnnotation;
+                if (previousRangeAnnotation != null) {
+                    throw new ExceptionWithContext(
+                            "Cannot add annotation %s, due to existing annotation %s",
+                            formatAnnotation(cursor, cursor + length, formattedMsg),
+                            formatAnnotation(previousEntry.getKey(),
+                                previousRangeAnnotation.annotation));
+                }
+            }
+        } else if (length > 0) {
+            AnnotationItem existingRangeAnnotation = startPoint.rangeAnnotation;
+            if (existingRangeAnnotation != null) {
+                throw new ExceptionWithContext(
+                        "Cannot add annotation %s, due to existing annotation %s",
+                                formatAnnotation(cursor, cursor + length, formattedMsg),
+                                formatAnnotation(cursor, existingRangeAnnotation.annotation));
+            }
+        }
+
+        if (length > 0) {
+            // Ensure that there is no later annotation that would intersect with this one
+            Map.Entry<Integer, AnnotationEndpoint> nextEntry = annotatations.higherEntry(cursor);
+            if (nextEntry != null) {
+                int nextKey = nextEntry.getKey();
+                if (nextKey < exclusiveEndOffset) {
+                    // there is an endpoint that would intersect with this annotation. Find one of the annotations
+                    // associated with the endpoint, to print in the error message
+                    AnnotationEndpoint nextEndpoint = nextEntry.getValue();
+                    AnnotationItem nextRangeAnnotation = nextEndpoint.rangeAnnotation;
+                    if (nextRangeAnnotation != null) {
+                        throw new ExceptionWithContext(
+                                "Cannot add annotation %s, due to existing annotation %s",
+                                        formatAnnotation(cursor, cursor + length, formattedMsg),
+                                        formatAnnotation(nextKey, nextRangeAnnotation.annotation));
+                    }
+                    if (nextEndpoint.pointAnnotations.size() > 0) {
+                        throw new ExceptionWithContext(
+                                "Cannot add annotation %s, due to existing annotation %s",
+                                        formatAnnotation(cursor, cursor + length, formattedMsg),
+                                        formatAnnotation(nextKey, nextKey,
+                                            nextEndpoint.pointAnnotations.get(0).annotation));
+                    }
+                    // There are no annotations on this endpoint. This "shouldn't" happen. We can still throw an exception.
+                    throw new ExceptionWithContext(
+                            "Cannot add annotation %s, due to existing annotation endpoint at %d",
+                                    formatAnnotation(cursor, cursor + length, formattedMsg),
+                                    nextKey);
+                }
+
+                if (nextKey == exclusiveEndOffset) {
+                    // the next endpoint matches the end of the annotation we are adding
+                    endPoint = nextEntry.getValue();
+                }
+            }
+        }
+
+        // Now, actually add the annotation
+        // If startPoint is null, we need to create a new one and add it to annotations. Otherwise, we just need to add
+        // the annotation to the existing AnnotationEndpoint
+        // the range annotation
+        if (startPoint == null) {
+            startPoint = new AnnotationEndpoint();
+            annotatations.put(cursor, startPoint);
+        }
+        if (length == 0) {
+            startPoint.pointAnnotations.add(new AnnotationItem(indentLevel, formattedMsg));
+        } else {
+            startPoint.rangeAnnotation = new AnnotationItem(indentLevel, formattedMsg);
+
+            // If endPoint is null, we need to create a new, empty one and add it to annotations
+            if (endPoint == null) {
+                endPoint = new AnnotationEndpoint();
+                annotatations.put(exclusiveEndOffset, endPoint);
+            }
+        }
+
+        cursor += length;
+    }
+
+    private String formatAnnotation(int offset, String annotationMsg) {
+        Integer endOffset = annotatations.higherKey(offset);
+        return formatAnnotation(offset, endOffset, annotationMsg);
+    }
+
+    private String formatAnnotation(int offset, Integer endOffset, String annotationMsg) {
+        if (endOffset != null) {
+            return String.format("[0x%x, 0x%x) \"%s\"", offset, endOffset, annotationMsg);
+        } else {
+            return String.format("[0x%x, ) \"%s\"", offset, annotationMsg);
+        }
+    }
+
+    public void indent() {
+        indentLevel++;
+    }
+
+    public void deindent() {
+        indentLevel--;
+        if (indentLevel < 0) {
+            indentLevel = 0;
+        }
+    }
+
+    public int getCursor() {
+        return cursor;
+    }
+
+    private static class AnnotationEndpoint {
+        /** Annotations that are associated with a specific point between bytes */
+        @Nonnull
+        public final List<AnnotationItem> pointAnnotations = Lists.newArrayList();
+        /** Annotations that are associated with a range of bytes */
+        @Nullable
+        public AnnotationItem rangeAnnotation = null;
+    }
+
+    private static class AnnotationItem {
+        public final int indentLevel;
+        public final String annotation;
+
+        public AnnotationItem(int  indentLevel, String annotation) {
+            this.indentLevel = indentLevel;
+            this.annotation = annotation;
+        }
+    }
+
+    /**
+     * @return The width of the right side containing the annotations
+     */
+    public int getAnnotationWidth() {
+        int leftWidth = 8 + (hexCols * 2) + (hexCols / 2);
+
+        return outputWidth - leftWidth;
+    }
+
+    /**
+     * Writes the annotated content of this instance to the given writer.
+     *
+     * @param out non-null; where to write to
+     */
+    public void writeAnnotations(Writer out, byte[] data, int offset) throws IOException {
+        int rightWidth = getAnnotationWidth();
+        int leftWidth = outputWidth - rightWidth - 1;
+
+        String padding = Strings.repeat(" ", 1000);
+
+        TwoColumnOutput twoc = new TwoColumnOutput(out, leftWidth, rightWidth, "|");
+
+        Integer[] keys = new Integer[annotatations.size()];
+        keys = annotatations.keySet().toArray(keys);
+
+        AnnotationEndpoint[] values = new AnnotationEndpoint[annotatations.size()];
+        values = annotatations.values().toArray(values);
+
+        for (int i=0; i<keys.length-1; i++) {
+            int rangeStart = keys[i];
+            int rangeEnd = keys[i+1];
+
+            AnnotationEndpoint annotations = values[i];
+
+            for (AnnotationItem pointAnnotation: annotations.pointAnnotations) {
+                String paddingSub = padding.substring(0, pointAnnotation.indentLevel*2);
+                twoc.write("", paddingSub + pointAnnotation.annotation);
+            }
+
+            String right;
+            AnnotationItem rangeAnnotation = annotations.rangeAnnotation;
+            if (rangeAnnotation != null) {
+                right = padding.substring(0, rangeAnnotation.indentLevel*2);
+                right += rangeAnnotation.annotation;
+            } else {
+                right = "";
+            }
+
+            String left = Hex.dump(data, rangeStart + offset, rangeEnd - rangeStart, rangeStart + offset, hexCols, 6);
+
+            twoc.write(left, right);
+        }
+
+        int lastKey = keys[keys.length-1];
+        if (lastKey < data.length) {
+            String left = Hex.dump(data, lastKey + offset, (data.length - offset) - lastKey, lastKey + offset, hexCols, 6);
+            twoc.write(left, "");
+        }
+    }
+
+    public void setLimit(int start, int end) {
+        this.startLimit = start;
+        this.endLimit = end;
+    }
+
+    public void clearLimit() {
+        this.startLimit = -1;
+        this.endLimit = -1;
+    }
+}
\ No newline at end of file
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/util/DexUtil.java b/dexlib2/src/main/java/org/jf/dexlib2/util/DexUtil.java
new file mode 100644
index 0000000..ebaa96e
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/util/DexUtil.java
@@ -0,0 +1,230 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.util;
+
+import com.google.common.io.ByteStreams;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile.NotADexFile;
+import org.jf.dexlib2.dexbacked.DexBackedOdexFile.NotAnOdexFile;
+import org.jf.dexlib2.dexbacked.raw.CdexHeaderItem;
+import org.jf.dexlib2.dexbacked.raw.HeaderItem;
+import org.jf.dexlib2.dexbacked.raw.OdexHeaderItem;
+
+import javax.annotation.Nonnull;
+import java.io.EOFException;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class DexUtil {
+
+    /**
+     * Reads in the dex header from the given input stream and verifies that it is valid and a supported version
+     *
+     * The inputStream must support mark(), and will be reset to initial position upon exiting the method
+     *
+     * @param inputStream An input stream that is positioned at a dex header
+     * @return The dex version
+     * @throws NotADexFile If the file is not a dex file
+     * @throws InvalidFile If the header appears to be a dex file, but is not valid for some reason
+     * @throws UnsupportedFile If the dex header is valid, but uses unsupported functionality
+     */
+    public static int verifyDexHeader(@Nonnull InputStream inputStream) throws IOException {
+        if (!inputStream.markSupported()) {
+            throw new IllegalArgumentException("InputStream must support mark");
+        }
+        inputStream.mark(44);
+        byte[] partialHeader = new byte[44];
+        try {
+            ByteStreams.readFully(inputStream, partialHeader);
+        } catch (EOFException ex) {
+            throw new NotADexFile("File is too short");
+        } finally {
+            inputStream.reset();
+        }
+
+        return verifyDexHeader(partialHeader, 0);
+    }
+
+    /**
+     * Verifies that the dex header is valid and a supported version
+     *
+     * @param buf A byte array containing at least the first 44 bytes of a dex file
+     * @param offset The offset within the array to the dex header
+     * @return The dex version
+     * @throws NotADexFile If the file is not a dex file
+     * @throws InvalidFile If the header appears to be a dex file, but is not valid for some reason
+     * @throws UnsupportedFile If the dex header is valid, but uses unsupported functionality
+     */
+    public static int verifyDexHeader(@Nonnull byte[] buf, int offset) {
+        int dexVersion = HeaderItem.getVersion(buf, offset);
+        if (dexVersion == -1) {
+            StringBuilder sb = new StringBuilder("Not a valid dex magic value:");
+            for (int i=0; i<8; i++) {
+                sb.append(String.format(" %02x", buf[i]));
+            }
+            throw new NotADexFile(sb.toString());
+        }
+
+        if (!HeaderItem.isSupportedDexVersion(dexVersion)) {
+            throw new UnsupportedFile(String.format("Dex version %03d is not supported", dexVersion));
+        }
+
+        int endian = HeaderItem.getEndian(buf, offset);
+        if (endian == HeaderItem.BIG_ENDIAN_TAG) {
+            throw new UnsupportedFile("Big endian dex files are not supported");
+        }
+
+        if (endian != HeaderItem.LITTLE_ENDIAN_TAG) {
+            throw new InvalidFile(String.format("Invalid endian tag: 0x%x", endian));
+        }
+
+        return dexVersion;
+    }
+
+    /**
+     * Verifies that the cdex header is valid and a supported version
+     *
+     * @param buf A byte array containing at least the first 44 bytes of a cdex file
+     * @param offset The offset within the array to the dex header
+     * @return The dex version
+     * @throws NotADexFile If the file is not a cdex file
+     * @throws InvalidFile If the header appears to be a cdex file, but is not valid for some reason
+     * @throws UnsupportedFile If the cdex header is valid, but uses unsupported functionality
+     */
+    public static int verifyCdexHeader(@Nonnull byte[] buf, int offset) {
+        int cdexVersion = CdexHeaderItem.getVersion(buf, offset);
+        if (cdexVersion == -1) {
+            StringBuilder sb = new StringBuilder("Not a valid cdex magic value:");
+            for (int i=0; i<8; i++) {
+                sb.append(String.format(" %02x", buf[offset + i]));
+            }
+            throw new NotADexFile(sb.toString());
+        }
+
+        if (!CdexHeaderItem.isSupportedCdexVersion(cdexVersion)) {
+            throw new UnsupportedFile(String.format("Dex version %03d is not supported", cdexVersion));
+        }
+
+        int endian = HeaderItem.getEndian(buf, offset);
+        if (endian == HeaderItem.BIG_ENDIAN_TAG) {
+            throw new UnsupportedFile("Big endian dex files are not supported");
+        }
+
+        if (endian != HeaderItem.LITTLE_ENDIAN_TAG) {
+            throw new InvalidFile(String.format("Invalid endian tag: 0x%x", endian));
+        }
+
+        return cdexVersion;
+    }
+
+    /**
+     * Reads in the odex header from the given input stream and verifies that it is valid and a supported version
+     *
+     * The inputStream must support mark(), and will be reset to initial position upon exiting the method
+     *
+     * @param inputStream An input stream that is positioned at an odex header
+     * @throws NotAnOdexFile If the file is not an odex file
+     * @throws UnsupportedFile If the odex header is valid, but is an unsupported version
+     */
+    public static void verifyOdexHeader(@Nonnull InputStream inputStream) throws IOException {
+        if (!inputStream.markSupported()) {
+            throw new IllegalArgumentException("InputStream must support mark");
+        }
+        inputStream.mark(8);
+        byte[] partialHeader = new byte[8];
+        try {
+            ByteStreams.readFully(inputStream, partialHeader);
+        } catch (EOFException ex) {
+            throw new NotAnOdexFile("File is too short");
+        } finally {
+            inputStream.reset();
+        }
+
+        verifyOdexHeader(partialHeader, 0);
+    }
+
+    /**
+     * Verifies that the odex header is valid and a supported version
+     *
+     * @param buf A byte array containing at least the first 8 bytes of an odex file
+     * @param offset The offset within the array to the odex header
+     * @throws NotAnOdexFile If the file is not an odex file
+     * @throws UnsupportedFile If the odex header is valid, but uses unsupported functionality
+     */
+    public static void verifyOdexHeader(@Nonnull byte[] buf, int offset) {
+        int odexVersion = OdexHeaderItem.getVersion(buf, offset);
+        if (odexVersion == -1) {
+            StringBuilder sb = new StringBuilder("Not a valid odex magic value:");
+            for (int i=0; i<8; i++) {
+                sb.append(String.format(" %02x", buf[i]));
+            }
+            throw new NotAnOdexFile(sb.toString());
+        }
+
+        if (!OdexHeaderItem.isSupportedOdexVersion(odexVersion)) {
+            throw new UnsupportedFile(String.format("Odex version %03d is not supported", odexVersion));
+        }
+    }
+
+    public static class InvalidFile extends RuntimeException {
+        public InvalidFile() {
+        }
+
+        public InvalidFile(String message) {
+            super(message);
+        }
+
+        public InvalidFile(String message, Throwable cause) {
+            super(message, cause);
+        }
+
+        public InvalidFile(Throwable cause) {
+            super(cause);
+        }
+    }
+
+    public static class UnsupportedFile extends RuntimeException {
+        public UnsupportedFile() {
+        }
+
+        public UnsupportedFile(String message) {
+            super(message);
+        }
+
+        public UnsupportedFile(String message, Throwable cause) {
+            super(message, cause);
+        }
+
+        public UnsupportedFile(Throwable cause) {
+            super(cause);
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/util/EncodedValueUtils.java b/dexlib2/src/main/java/org/jf/dexlib2/util/EncodedValueUtils.java
new file mode 100644
index 0000000..a09bbca
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/util/EncodedValueUtils.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.util;
+
+import org.jf.dexlib2.ValueType;
+import org.jf.dexlib2.iface.AnnotationElement;
+import org.jf.dexlib2.iface.value.*;
+import org.jf.util.StringUtils;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Set;
+
+public final class EncodedValueUtils {
+    public static boolean isDefaultValue(EncodedValue encodedValue) {
+        switch (encodedValue.getValueType()) {
+            case ValueType.BOOLEAN:
+                return !((BooleanEncodedValue)encodedValue).getValue();
+            case ValueType.BYTE:
+                return ((ByteEncodedValue)encodedValue).getValue() == 0;
+            case ValueType.CHAR:
+                return ((CharEncodedValue)encodedValue).getValue() == 0;
+            case ValueType.DOUBLE:
+                return ((DoubleEncodedValue)encodedValue).getValue() == 0;
+            case ValueType.FLOAT:
+                return ((FloatEncodedValue)encodedValue).getValue() == 0;
+            case ValueType.INT:
+                return ((IntEncodedValue)encodedValue).getValue() == 0;
+            case ValueType.LONG:
+                return ((LongEncodedValue)encodedValue).getValue() == 0;
+            case ValueType.NULL:
+                return true;
+            case ValueType.SHORT:
+                return ((ShortEncodedValue)encodedValue).getValue() == 0;
+        }
+        return false;
+    }
+
+    public static void writeEncodedValue(Writer writer, EncodedValue encodedValue) throws IOException {
+        switch (encodedValue.getValueType()) {
+            case ValueType.BOOLEAN:
+                writer.write(Boolean.toString(((BooleanEncodedValue) encodedValue).getValue()));
+                break;
+            case ValueType.BYTE:
+                writer.write(Byte.toString(((ByteEncodedValue)encodedValue).getValue()));
+                break;
+            case ValueType.CHAR:
+                writer.write(Integer.toString(((CharEncodedValue)encodedValue).getValue()));
+                break;
+            case ValueType.SHORT:
+                writer.write(Short.toString(((ShortEncodedValue)encodedValue).getValue()));
+                break;
+            case ValueType.INT:
+                writer.write(Integer.toString(((IntEncodedValue)encodedValue).getValue()));
+                break;
+            case ValueType.LONG:
+                writer.write(Long.toString(((LongEncodedValue)encodedValue).getValue()));
+                break;
+            case ValueType.FLOAT:
+                writer.write(Float.toString(((FloatEncodedValue)encodedValue).getValue()));
+                break;
+            case ValueType.DOUBLE:
+                writer.write(Double.toString(((DoubleEncodedValue)encodedValue).getValue()));
+                break;
+            case ValueType.ANNOTATION:
+                writeAnnotation(writer, (AnnotationEncodedValue)encodedValue);
+                break;
+            case ValueType.ARRAY:
+                writeArray(writer, (ArrayEncodedValue)encodedValue);
+                break;
+            case ValueType.STRING:
+                writer.write('"');
+                StringUtils.writeEscapedString(writer, ((StringEncodedValue)encodedValue).getValue());
+                writer.write('"');
+                break;
+            case ValueType.FIELD:
+                ReferenceUtil.writeFieldDescriptor(writer, ((FieldEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.ENUM:
+                ReferenceUtil.writeFieldDescriptor(writer, ((EnumEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.METHOD:
+                ReferenceUtil.writeMethodDescriptor(writer, ((MethodEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.TYPE:
+                writer.write(((TypeEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.METHOD_TYPE:
+                ReferenceUtil.writeMethodProtoDescriptor(writer, ((MethodTypeEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.METHOD_HANDLE:
+                ReferenceUtil.writeMethodHandle(writer, ((MethodHandleEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.NULL:
+                writer.write("null");
+                break;
+            default:
+                throw new IllegalArgumentException("Unknown encoded value type");
+        }
+    }
+
+    private static void writeAnnotation(Writer writer, AnnotationEncodedValue annotation) throws IOException {
+        writer.write("Annotation[");
+        writer.write(annotation.getType());
+
+        Set<? extends AnnotationElement> elements = annotation.getElements();
+        for (AnnotationElement element: elements) {
+            writer.write(", ");
+            writer.write(element.getName());
+            writer.write('=');
+            writeEncodedValue(writer, element.getValue());
+        }
+
+        writer.write(']');
+    }
+
+    private static void writeArray(Writer writer, ArrayEncodedValue array) throws IOException {
+        writer.write("Array[");
+
+        boolean first = true;
+        for (EncodedValue element: array.getValue()) {
+            if (first) {
+                first = false;
+            } else {
+                writer.write(", ");
+            }
+            writeEncodedValue(writer, element);
+        }
+
+        writer.write(']');
+    }
+
+    private EncodedValueUtils() {}
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/util/FieldUtil.java b/dexlib2/src/main/java/org/jf/dexlib2/util/FieldUtil.java
new file mode 100644
index 0000000..c87e6c3
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/util/FieldUtil.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.util;
+
+import com.google.common.base.Predicate;
+import org.jf.dexlib2.AccessFlags;
+import org.jf.dexlib2.iface.Field;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public final class FieldUtil {
+    public static Predicate<Field> FIELD_IS_STATIC = new Predicate<Field>() {
+        @Override public boolean apply(@Nullable Field input) {
+            return input!=null && isStatic(input);
+        }
+    };
+
+    public static Predicate<Field> FIELD_IS_INSTANCE = new Predicate<Field>() {
+        @Override public boolean apply(@Nullable Field input) {
+            return input!= null && !isStatic(input);
+        }
+    };
+
+    public static boolean isStatic(@Nonnull Field field) {
+        return AccessFlags.STATIC.isSet(field.getAccessFlags());
+    }
+
+    private FieldUtil() {}
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/util/InstructionOffsetMap.java b/dexlib2/src/main/java/org/jf/dexlib2/util/InstructionOffsetMap.java
new file mode 100644
index 0000000..a817523
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/util/InstructionOffsetMap.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.util;
+
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+import java.util.Arrays;
+import java.util.List;
+
+public class InstructionOffsetMap {
+    @Nonnull private final int[] instructionCodeOffsets;
+
+    public InstructionOffsetMap(@Nonnull List<? extends Instruction> instructions) {
+        this.instructionCodeOffsets = new int[instructions.size()];
+
+        int codeOffset = 0;
+        for (int i=0; i<instructions.size(); i++) {
+            instructionCodeOffsets[i] = codeOffset;
+            codeOffset += instructions.get(i).getCodeUnits();
+        }
+    }
+
+    public int getInstructionIndexAtCodeOffset(int codeOffset) {
+        return getInstructionIndexAtCodeOffset(codeOffset, true);
+    }
+
+    public int getInstructionIndexAtCodeOffset(int codeOffset, boolean exact) {
+        int index = Arrays.binarySearch(instructionCodeOffsets, codeOffset);
+        if (index < 0) {
+            if (exact) {
+                throw new InvalidInstructionOffset(codeOffset);
+            } else {
+                // This calculation would be incorrect if index was -1 (i.e. insertion point of 0). Luckily, we can
+                // ignore this case, because codeOffset will always be non-negative, and the code offset of the first
+                // instruction will always be 0.
+                return (~index) - 1;
+            }
+        }
+        return index;
+    }
+
+    public int getInstructionCodeOffset(int index) {
+        if (index < 0 || index >= instructionCodeOffsets.length) {
+            throw new InvalidInstructionIndex(index);
+        }
+        return instructionCodeOffsets[index];
+    }
+
+    public static class InvalidInstructionOffset extends ExceptionWithContext {
+        private final int instructionOffset;
+
+        public InvalidInstructionOffset(int instructionOffset) {
+            super("No instruction at offset %d", instructionOffset);
+            this.instructionOffset = instructionOffset;
+        }
+
+        public int getInstructionOffset() {
+            return instructionOffset;
+        }
+    }
+
+    public static class InvalidInstructionIndex extends ExceptionWithContext {
+        private final int instructionIndex;
+
+        public InvalidInstructionIndex(int instructionIndex) {
+            super("Instruction index out of bounds: %d", instructionIndex);
+            this.instructionIndex = instructionIndex;
+        }
+
+        public int getInstructionIndex() {
+            return instructionIndex;
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/util/InstructionUtil.java b/dexlib2/src/main/java/org/jf/dexlib2/util/InstructionUtil.java
new file mode 100644
index 0000000..58ce262
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/util/InstructionUtil.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.util;
+
+import org.jf.dexlib2.Opcode;
+
+public final class InstructionUtil {
+    public static boolean isInvokeStatic(Opcode opcode) {
+        return opcode == Opcode.INVOKE_STATIC || opcode == Opcode.INVOKE_STATIC_RANGE;
+    }
+
+    public static boolean isInvokePolymorphic(Opcode opcode) {
+        return opcode == Opcode.INVOKE_POLYMORPHIC || opcode == Opcode.INVOKE_POLYMORPHIC_RANGE;
+    }
+
+    private InstructionUtil() {}
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/util/MethodUtil.java b/dexlib2/src/main/java/org/jf/dexlib2/util/MethodUtil.java
new file mode 100644
index 0000000..dc978da
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/util/MethodUtil.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.util;
+
+import com.google.common.base.Predicate;
+import org.jf.dexlib2.AccessFlags;
+import org.jf.dexlib2.iface.Method;
+import org.jf.dexlib2.iface.reference.MethodReference;
+import org.jf.util.CharSequenceUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Collection;
+
+public final class MethodUtil {
+    private static int directMask = AccessFlags.STATIC.getValue() | AccessFlags.PRIVATE.getValue() |
+            AccessFlags.CONSTRUCTOR.getValue();
+
+    public static Predicate<Method> METHOD_IS_DIRECT = new Predicate<Method>() {
+        @Override public boolean apply(@Nullable Method input) {
+            return input != null && isDirect(input);
+        }
+    };
+
+    public static Predicate<Method> METHOD_IS_VIRTUAL = new Predicate<Method>() {
+        @Override public boolean apply(@Nullable Method input) {
+            return input != null && !isDirect(input);
+        }
+    };
+
+    public static boolean isDirect(@Nonnull Method method) {
+        return (method.getAccessFlags() & directMask) != 0;
+    }
+
+    public static boolean isStatic(@Nonnull Method method) {
+        return AccessFlags.STATIC.isSet(method.getAccessFlags());
+    }
+
+    public static boolean isConstructor(@Nonnull MethodReference methodReference) {
+        return methodReference.getName().equals("<init>");
+    }
+
+    public static boolean isPackagePrivate(@Nonnull Method method) {
+        return (method.getAccessFlags() & (AccessFlags.PRIVATE.getValue() |
+                AccessFlags.PROTECTED.getValue() |
+                AccessFlags.PUBLIC.getValue())) == 0;
+    }
+
+    public static int getParameterRegisterCount(@Nonnull Method method) {
+        return getParameterRegisterCount(method, MethodUtil.isStatic(method));
+    }
+
+    public static int getParameterRegisterCount(@Nonnull MethodReference methodRef, boolean isStatic) {
+        return getParameterRegisterCount(methodRef.getParameterTypes(), isStatic);
+    }
+
+    public static int getParameterRegisterCount(@Nonnull Collection<? extends CharSequence> parameterTypes,
+                                                boolean isStatic) {
+        int regCount = 0;
+        for (CharSequence paramType: parameterTypes) {
+            int firstChar = paramType.charAt(0);
+            if (firstChar == 'J' || firstChar == 'D') {
+                regCount += 2;
+            } else {
+                regCount++;
+            }
+        }
+        if (!isStatic) {
+            regCount++;
+        }
+        return regCount;
+    }
+
+    private static char getShortyType(CharSequence type) {
+        if (type.length() > 1) {
+            return 'L';
+        }
+        return type.charAt(0);
+    }
+
+    public static String getShorty(Collection<? extends CharSequence> params, String returnType) {
+        StringBuilder sb = new StringBuilder(params.size() + 1);
+        sb.append(getShortyType(returnType));
+        for (CharSequence typeRef: params) {
+            sb.append(getShortyType(typeRef));
+        }
+        return sb.toString();
+    }
+
+    public static boolean methodSignaturesMatch(@Nonnull MethodReference a, @Nonnull MethodReference b) {
+        return (a.getName().equals(b.getName()) &&
+                a.getReturnType().equals(b.getReturnType()) &&
+                CharSequenceUtils.listEquals(a.getParameterTypes(), b.getParameterTypes()));
+    }
+
+    private MethodUtil() {}
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/util/Preconditions.java b/dexlib2/src/main/java/org/jf/dexlib2/util/Preconditions.java
new file mode 100644
index 0000000..990986b
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/util/Preconditions.java
@@ -0,0 +1,264 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.util;
+
+import org.jf.dexlib2.Format;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.ReferenceType;
+import org.jf.dexlib2.VerificationError;
+import org.jf.dexlib2.iface.instruction.SwitchElement;
+import org.jf.dexlib2.iface.reference.*;
+
+import java.util.Collection;
+import java.util.List;
+
+public class Preconditions {
+    public static void checkFormat(Opcode opcode, Format expectedFormat) {
+        if (opcode.format != expectedFormat) {
+            throw new IllegalArgumentException(
+                    String.format("Invalid opcode %s for %s", opcode.name, expectedFormat.name()));
+        }
+    }
+
+    public static int checkNibbleRegister(int register) {
+        if ((register & 0xFFFFFFF0) != 0) {
+            throw new IllegalArgumentException(
+                    String.format("Invalid register: v%d. Must be between v0 and v15, inclusive.", register));
+        }
+        return register;
+    }
+
+    public static int checkByteRegister(int register) {
+        if ((register & 0xFFFFFF00) != 0) {
+            throw new IllegalArgumentException(
+                    String.format("Invalid register: v%d. Must be between v0 and v255, inclusive.", register));
+        }
+        return register;
+    }
+
+    public static int checkShortRegister(int register) {
+        if ((register & 0xFFFF0000) != 0) {
+            throw new IllegalArgumentException(
+                    String.format("Invalid register: v%d. Must be between v0 and v65535, inclusive.", register));
+        }
+        return register;
+    }
+
+    public static int checkNibbleLiteral(int literal) {
+        if (literal < -8 || literal > 7) {
+            throw new IllegalArgumentException(
+                    String.format("Invalid literal value: %d. Must be between -8 and 7, inclusive.", literal));
+        }
+        return literal;
+    }
+
+    public static int checkByteLiteral(int literal) {
+        if (literal < -128 || literal > 127) {
+            throw new IllegalArgumentException(
+                    String.format("Invalid literal value: %d. Must be between -128 and 127, inclusive.", literal));
+        }
+        return literal;
+    }
+
+    public static int checkShortLiteral(int literal) {
+        if (literal < -32768 || literal > 32767) {
+            throw new IllegalArgumentException(
+                    String.format("Invalid literal value: %d. Must be between -32768 and 32767, inclusive.", literal));
+        }
+        return literal;
+    }
+
+    public static int checkIntegerHatLiteral(int literal) {
+        if ((literal & 0xFFFF) != 0) {
+            throw new IllegalArgumentException(
+                    String.format("Invalid literal value: %d. Low 16 bits must be zeroed out.", literal));
+        }
+        return literal;
+    }
+
+    public static long checkLongHatLiteral(long literal) {
+        if ((literal & 0xFFFFFFFFFFFFL) != 0) {
+            throw new IllegalArgumentException(
+                    String.format("Invalid literal value: %d. Low 48 bits must be zeroed out.", literal));
+        }
+        return literal;
+    }
+
+    public static int checkByteCodeOffset(int offset) {
+        if (offset < -128 || offset > 127) {
+            throw new IllegalArgumentException(
+                    String.format("Invalid code offset: %d. Must be between -128 and 127, inclusive.", offset));
+        }
+        return offset;
+    }
+
+    public static int checkShortCodeOffset(int offset) {
+        if (offset < -32768 || offset > 32767) {
+            throw new IllegalArgumentException(
+                    String.format("Invalid code offset: %d. Must be between -32768 and 32767, inclusive.", offset));
+        }
+        return offset;
+    }
+
+    public static int check35cAnd45ccRegisterCount(int registerCount) {
+        if (registerCount < 0 || registerCount > 5) {
+            throw new IllegalArgumentException(
+                    String.format("Invalid register count: %d. Must be between 0 and 5, inclusive.", registerCount));
+        }
+        return registerCount;
+    }
+
+    public static int checkRegisterRangeCount(int registerCount) {
+        if ((registerCount & 0xFFFFFF00) != 0) {
+            throw new IllegalArgumentException(
+                    String.format("Invalid register count: %d. Must be between 0 and 255, inclusive.", registerCount));
+        }
+        return registerCount;
+    }
+
+    public static void checkValueArg(int valueArg, int maxValue) {
+        if (valueArg > maxValue) {
+            if (maxValue == 0) {
+                throw new IllegalArgumentException(
+                        String.format("Invalid value_arg value %d for an encoded_value. Expecting 0",
+                                valueArg));
+            }
+            throw new IllegalArgumentException(
+                    String.format("Invalid value_arg value %d for an encoded_value. Expecting 0..%d, inclusive",
+                            valueArg, maxValue));
+        }
+    }
+
+    public static int checkFieldOffset(int fieldOffset) {
+        if (fieldOffset < 0 || fieldOffset > 65535) {
+            throw new IllegalArgumentException(
+                    String.format("Invalid field offset: 0x%x. Must be between 0x0000 and 0xFFFF inclusive",
+                            fieldOffset));
+        }
+        return fieldOffset;
+    }
+
+    public static int checkVtableIndex(int vtableIndex) {
+        if (vtableIndex < 0 || vtableIndex > 65535) {
+            throw new IllegalArgumentException(
+                    String.format("Invalid vtable index: %d. Must be between 0 and 65535, inclusive", vtableIndex));
+        }
+        return vtableIndex;
+    }
+
+    public static int checkInlineIndex(int inlineIndex) {
+        if (inlineIndex < 0 || inlineIndex > 65535) {
+            throw new IllegalArgumentException(
+                    String.format("Invalid inline index: %d. Must be between 0 and 65535, inclusive", inlineIndex));
+        }
+        return inlineIndex;
+    }
+
+    public static int checkVerificationError(int verificationError) {
+        if (!VerificationError.isValidVerificationError(verificationError)) {
+            throw new IllegalArgumentException(
+                    String.format("Invalid verification error value: %d. Must be between 1 and 9, inclusive",
+                            verificationError));
+        }
+        return verificationError;
+    }
+
+    public static <C extends Collection<? extends SwitchElement>> C checkSequentialOrderedKeys(C elements) {
+        Integer previousKey = null;
+        for (SwitchElement element : elements) {
+            int key = element.getKey();
+            if (previousKey != null && previousKey + 1 != key) {
+                throw new IllegalArgumentException("SwitchElement set is not sequential and ordered");
+            }
+
+            previousKey = key;
+        }
+
+        return elements;
+    }
+
+    public static int checkArrayPayloadElementWidth(int elementWidth) {
+        switch (elementWidth) {
+            case 1:
+            case 2:
+            case 4:
+            case 8:
+                return elementWidth;
+
+            default:
+                throw new IllegalArgumentException(String.format("Not a valid element width: %d", elementWidth));
+        }
+    }
+
+    public static <L extends List<? extends Number>> L checkArrayPayloadElements(int elementWidth, L elements) {
+        long maxValue = (1L << ((8 * elementWidth) - 1)) - 1;
+        long minValue = -maxValue - 1;
+
+        for (Number element : elements) {
+            if (element.longValue() < minValue || element.longValue() > maxValue) {
+                throw new IllegalArgumentException(
+                        String.format("%d does not fit into a %d-byte signed integer",
+                                element.longValue(), elementWidth));
+            }
+        }
+
+        return elements;
+    }
+
+    public static <T extends Reference> T checkReference(int referenceType, T reference) {
+        switch (referenceType) {
+            case ReferenceType.STRING:
+                if (!(reference instanceof StringReference)) {
+                    throw new IllegalArgumentException("Invalid reference type, expecting a string reference");
+                }
+                break;
+            case ReferenceType.TYPE:
+                if (!(reference instanceof TypeReference)) {
+                    throw new IllegalArgumentException("Invalid reference type, expecting a type reference");
+                }
+                break;
+            case ReferenceType.FIELD:
+                if (!(reference instanceof FieldReference)) {
+                    throw new IllegalArgumentException("Invalid reference type, expecting a field reference");
+                }
+                break;
+            case ReferenceType.METHOD:
+                if (!(reference instanceof MethodReference)) {
+                    throw new IllegalArgumentException("Invalid reference type, expecting a method reference");
+                }
+                break;
+            default:
+                throw new IllegalArgumentException(String.format("Not a valid reference type: %d", referenceType));
+        }
+        return reference;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/util/ReferenceUtil.java b/dexlib2/src/main/java/org/jf/dexlib2/util/ReferenceUtil.java
new file mode 100644
index 0000000..86d3536
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/util/ReferenceUtil.java
@@ -0,0 +1,240 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.util;
+
+import org.jf.dexlib2.MethodHandleType;
+import org.jf.dexlib2.iface.reference.*;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.util.StringUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.io.Writer;
+
+public final class ReferenceUtil {
+    public static String getMethodDescriptor(MethodReference methodReference) {
+        return getMethodDescriptor(methodReference, false);
+    }
+
+    public static String getMethodDescriptor(MethodReference methodReference, boolean useImplicitReference) {
+        StringBuilder sb = new StringBuilder();
+        if (!useImplicitReference) {
+            sb.append(methodReference.getDefiningClass());
+            sb.append("->");
+        }
+        sb.append(methodReference.getName());
+        sb.append('(');
+        for (CharSequence paramType: methodReference.getParameterTypes()) {
+            sb.append(paramType);
+        }
+        sb.append(')');
+        sb.append(methodReference.getReturnType());
+        return sb.toString();
+    }
+
+    public static String getMethodProtoDescriptor(MethodProtoReference methodProtoReference) {
+        StringWriter stringWriter = new StringWriter();
+        try {
+            writeMethodProtoDescriptor(stringWriter, methodProtoReference);
+        } catch (IOException ex) {
+            // IOException shouldn't happen for a StringWriter...
+            throw new RuntimeException(ex);
+        }
+        return stringWriter.toString();
+    }
+
+    public static void writeMethodProtoDescriptor(Writer writer, MethodProtoReference methodProtoReference)
+            throws IOException {
+        writer.write('(');
+        for (CharSequence paramType : methodProtoReference.getParameterTypes()) {
+            writer.write(paramType.toString());
+        }
+        writer.write(')');
+        writer.write(methodProtoReference.getReturnType());
+    }
+
+    public static void writeMethodDescriptor(Writer writer, MethodReference methodReference) throws IOException {
+        writeMethodDescriptor(writer, methodReference, false);
+    }
+
+    public static void writeMethodDescriptor(Writer writer, MethodReference methodReference,
+                                             boolean useImplicitReference) throws IOException {
+        if (!useImplicitReference) {
+            writer.write(methodReference.getDefiningClass());
+            writer.write("->");
+        }
+        writer.write(methodReference.getName());
+        writer.write('(');
+        for (CharSequence paramType: methodReference.getParameterTypes()) {
+            writer.write(paramType.toString());
+        }
+        writer.write(')');
+        writer.write(methodReference.getReturnType());
+    }
+
+    public static String getFieldDescriptor(FieldReference fieldReference) {
+        return getFieldDescriptor(fieldReference, false);
+    }
+
+    public static String getFieldDescriptor(FieldReference fieldReference, boolean useImplicitReference) {
+        StringBuilder sb = new StringBuilder();
+        if (!useImplicitReference) {
+            sb.append(fieldReference.getDefiningClass());
+            sb.append("->");
+        }
+        sb.append(fieldReference.getName());
+        sb.append(':');
+        sb.append(fieldReference.getType());
+        return sb.toString();
+    }
+
+    public static String getShortFieldDescriptor(FieldReference fieldReference) {
+        StringBuilder sb = new StringBuilder();
+        sb.append(fieldReference.getName());
+        sb.append(':');
+        sb.append(fieldReference.getType());
+        return sb.toString();
+    }
+
+    public static void writeFieldDescriptor(Writer writer, FieldReference fieldReference) throws IOException {
+        writeFieldDescriptor(writer, fieldReference, false);
+    }
+
+    public static void writeFieldDescriptor(Writer writer, FieldReference fieldReference,
+                                            boolean implicitReference) throws IOException {
+        if (!implicitReference) {
+            writer.write(fieldReference.getDefiningClass());
+            writer.write("->");
+        }
+        writer.write(fieldReference.getName());
+        writer.write(':');
+        writer.write(fieldReference.getType());
+    }
+
+    public static String getMethodHandleString(MethodHandleReference methodHandleReference) {
+        StringWriter stringWriter = new StringWriter();
+        try {
+            writeMethodHandle(stringWriter, methodHandleReference);
+        } catch (IOException ex) {
+            // IOException shouldn't happen for a StringWriter...
+            throw new RuntimeException(ex);
+        }
+        return stringWriter.toString();
+    }
+
+    public static void writeMethodHandle(Writer writer, MethodHandleReference methodHandleReference)
+            throws IOException {
+        writer.write(MethodHandleType.toString(methodHandleReference.getMethodHandleType()));
+        writer.write('@');
+
+        Reference memberReference = methodHandleReference.getMemberReference();
+        if (memberReference instanceof MethodReference) {
+            writeMethodDescriptor(writer, (MethodReference)memberReference);
+        } else {
+            writeFieldDescriptor(writer, (FieldReference)memberReference);
+        }
+    }
+
+    public static String getCallSiteString(CallSiteReference callSiteReference) {
+        StringWriter stringWriter = new StringWriter();
+        try {
+            writeCallSite(stringWriter, callSiteReference);
+        } catch (IOException ex) {
+            // IOException shouldn't happen for a StringWriter...
+            throw new RuntimeException(ex);
+        }
+        return stringWriter.toString();
+    }
+
+    public static void writeCallSite(Writer writer, CallSiteReference callSiteReference) throws IOException {
+        writer.write(callSiteReference.getName());
+        writer.write('(');
+        writer.write('"');
+        StringUtils.writeEscapedString(writer, callSiteReference.getMethodName());
+        writer.write('"');
+        writer.write(", ");
+        writeMethodProtoDescriptor(writer, callSiteReference.getMethodProto());
+
+        for (EncodedValue encodedValue : callSiteReference.getExtraArguments()) {
+            writer.write(", ");
+            EncodedValueUtils.writeEncodedValue(writer, encodedValue);
+        }
+        writer.write(")@");
+        MethodHandleReference methodHandle = callSiteReference.getMethodHandle();
+        if (methodHandle.getMethodHandleType() != MethodHandleType.INVOKE_STATIC) {
+            throw new IllegalArgumentException("The linker method handle for a call site must be of type invoke-static");
+        }
+        writeMethodDescriptor(writer, (MethodReference)callSiteReference.getMethodHandle().getMemberReference());
+    }
+
+    @Nullable
+    public static String getReferenceString(@Nonnull Reference reference) {
+        return getReferenceString(reference, null);
+    }
+
+    @Nullable
+    public static String getReferenceString(@Nonnull Reference reference, @Nullable String containingClass) {
+        if (reference instanceof StringReference) {
+            return String.format("\"%s\"", StringUtils.escapeString(((StringReference)reference).getString()));
+        }
+        if (reference instanceof TypeReference) {
+            return ((TypeReference)reference).getType();
+        }
+        if (reference instanceof FieldReference) {
+            FieldReference fieldReference = (FieldReference)reference;
+            boolean useImplicitReference = fieldReference.getDefiningClass().equals(containingClass);
+            return getFieldDescriptor(fieldReference, useImplicitReference);
+        }
+        if (reference instanceof MethodReference) {
+            MethodReference methodReference = (MethodReference)reference;
+            boolean useImplicitReference = methodReference.getDefiningClass().equals(containingClass);
+            return getMethodDescriptor(methodReference, useImplicitReference);
+        }
+        if (reference instanceof MethodProtoReference) {
+            MethodProtoReference methodProtoReference = (MethodProtoReference)reference;
+            return getMethodProtoDescriptor(methodProtoReference);
+        }
+        if (reference instanceof MethodHandleReference) {
+            MethodHandleReference methodHandleReference = (MethodHandleReference)reference;
+            return getMethodHandleString(methodHandleReference);
+        }
+        if (reference instanceof CallSiteReference) {
+            CallSiteReference callSiteReference = (CallSiteReference)reference;
+            return getCallSiteString(callSiteReference);
+        }
+        return null;
+    }
+
+    private ReferenceUtil() {}
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/util/SyntheticAccessorFSM.java b/dexlib2/src/main/java/org/jf/dexlib2/util/SyntheticAccessorFSM.java
new file mode 100644
index 0000000..674d518
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/util/SyntheticAccessorFSM.java
@@ -0,0 +1,572 @@
+
+// line 1 "SyntheticAccessorFSM.rl"
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.util;
+
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.dexlib2.iface.instruction.OneRegisterInstruction;
+import org.jf.dexlib2.iface.instruction.WideLiteralInstruction;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+public class SyntheticAccessorFSM {
+    
+// line 43 "SyntheticAccessorFSM.rl"
+    
+// line 48 "/home/jesusfreke/projects/smali/dexlib2/src/main/java/org/jf/dexlib2/util/SyntheticAccessorFSM.java"
+private static byte[] init__SyntheticAccessorFSM_actions_0()
+{
+	return new byte [] {
+	    0,    1,    0,    1,    1,    1,    2,    1,   13,    1,   14,    1,
+	   15,    1,   16,    1,   17,    1,   18,    1,   19,    1,   20,    1,
+	   21,    1,   25,    2,    3,    7,    2,    4,    7,    2,    5,    7,
+	    2,    6,    7,    2,    8,   12,    2,    9,   12,    2,   10,   12,
+	    2,   11,   12,    2,   22,   23,    2,   22,   24,    2,   22,   25,
+	    2,   22,   26,    2,   22,   27,    2,   22,   28
+	};
+}
+
+private static final byte _SyntheticAccessorFSM_actions[] = init__SyntheticAccessorFSM_actions_0();
+
+
+private static short[] init__SyntheticAccessorFSM_key_offsets_0()
+{
+	return new short [] {
+	    0,    0,   12,   82,   98,  102,  104,  166,  172,  174,  180,  184,
+	  190,  192,  196,  198,  201,  203
+	};
+}
+
+private static final short _SyntheticAccessorFSM_key_offsets[] = init__SyntheticAccessorFSM_key_offsets_0();
+
+
+private static short[] init__SyntheticAccessorFSM_trans_keys_0()
+{
+	return new short [] {
+	   82,   88,   89,   95,   96,  102,  103,  109,  110,  114,  116,  120,
+	  145,  146,  147,  148,  149,  150,  151,  152,  153,  154,  155,  156,
+	  157,  158,  159,  160,  161,  162,  163,  164,  165,  166,  167,  168,
+	  169,  170,  171,  172,  173,  174,  175,  177,  179,  180,  181,  182,
+	  183,  184,  185,  186,  187,  188,  190,  191,  192,  193,  194,  195,
+	  196,  197,  198,  199,  201,  202,  203,  204,  206,  207,  208,  216,
+	   15,   17,   18,   25,  129,  143,  144,  176,  178,  205,  144,  145,
+	  155,  156,  166,  167,  171,  172,  176,  177,  187,  188,  198,  199,
+	  203,  204,   89,   95,  103,  109,   15,   17,  145,  146,  147,  148,
+	  149,  150,  151,  152,  153,  154,  155,  156,  157,  158,  159,  160,
+	  161,  162,  163,  164,  165,  166,  167,  168,  169,  170,  171,  172,
+	  173,  174,  175,  177,  179,  180,  181,  182,  183,  184,  185,  186,
+	  187,  188,  190,  191,  192,  193,  194,  195,  196,  197,  198,  199,
+	  201,  202,  203,  204,  206,  207,  144,  176,  178,  205,   89,   95,
+	  103,  109,  129,  143,   15,   17,   89,   95,  103,  109,  129,  143,
+	   89,   95,  103,  109,   89,   95,  103,  109,  129,  143,   15,   17,
+	   89,   95,  103,  109,   15,   17,   14,   10,   12,   15,   17,    0
+	};
+}
+
+private static final short _SyntheticAccessorFSM_trans_keys[] = init__SyntheticAccessorFSM_trans_keys_0();
+
+
+private static byte[] init__SyntheticAccessorFSM_single_lengths_0()
+{
+	return new byte [] {
+	    0,    0,   60,   16,    0,    0,   58,    0,    0,    0,    0,    0,
+	    0,    0,    0,    1,    0,    0
+	};
+}
+
+private static final byte _SyntheticAccessorFSM_single_lengths[] = init__SyntheticAccessorFSM_single_lengths_0();
+
+
+private static byte[] init__SyntheticAccessorFSM_range_lengths_0()
+{
+	return new byte [] {
+	    0,    6,    5,    0,    2,    1,    2,    3,    1,    3,    2,    3,
+	    1,    2,    1,    1,    1,    0
+	};
+}
+
+private static final byte _SyntheticAccessorFSM_range_lengths[] = init__SyntheticAccessorFSM_range_lengths_0();
+
+
+private static short[] init__SyntheticAccessorFSM_index_offsets_0()
+{
+	return new short [] {
+	    0,    0,    7,   73,   90,   93,   95,  156,  160,  162,  166,  169,
+	  173,  175,  178,  180,  183,  185
+	};
+}
+
+private static final short _SyntheticAccessorFSM_index_offsets[] = init__SyntheticAccessorFSM_index_offsets_0();
+
+
+private static byte[] init__SyntheticAccessorFSM_indicies_0()
+{
+	return new byte [] {
+	    0,    2,    0,    2,    3,    3,    1,    8,    9,   10,   11,   12,
+	   13,   14,   15,   16,   17,   18,   19,    9,   10,   11,   12,   13,
+	   14,   15,   16,   17,   20,   21,    9,   10,   11,   22,   23,    9,
+	   10,   11,    8,   10,   11,   12,   13,   14,   15,   16,   17,   18,
+	   19,   10,   11,   12,   13,   14,   15,   16,   17,   20,   21,   10,
+	   11,   22,   23,   10,   11,   24,   24,    4,    5,    6,    7,    9,
+	    1,   25,   26,   27,   28,   29,   30,   31,   32,   25,   26,   27,
+	   28,   29,   30,   31,   32,    1,   33,   33,    1,   34,    1,    8,
+	    9,   10,   11,   12,   13,   14,   15,   16,   17,   18,   19,    9,
+	   10,   11,   12,   13,   14,   15,   16,   17,   20,   21,    9,   10,
+	   11,   22,   23,    9,   10,   11,    8,   10,   11,   12,   13,   14,
+	   15,   16,   17,   18,   19,   10,   11,   12,   13,   14,   15,   16,
+	   17,   20,   21,   10,   11,   22,   23,   10,   11,    7,    9,    1,
+	   35,   35,   36,    1,   37,    1,   35,   35,   38,    1,   35,   35,
+	    1,   39,   39,   40,    1,   41,    1,   39,   39,    1,   42,    1,
+	   44,   43,    1,   45,    1,    1,    0
+	};
+}
+
+private static final byte _SyntheticAccessorFSM_indicies[] = init__SyntheticAccessorFSM_indicies_0();
+
+
+private static byte[] init__SyntheticAccessorFSM_trans_targs_0()
+{
+	return new byte [] {
+	    2,    0,   14,   15,   17,    3,    6,    7,    7,    7,    7,    7,
+	    7,    7,    7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
+	   11,    4,    4,    4,    4,    4,    4,    4,    4,    5,   17,    8,
+	    9,   17,   10,   12,   13,   17,   17,   16,   17,   17
+	};
+}
+
+private static final byte _SyntheticAccessorFSM_trans_targs[] = init__SyntheticAccessorFSM_trans_targs_0();
+
+
+private static byte[] init__SyntheticAccessorFSM_trans_actions_0()
+{
+	return new byte [] {
+	    0,    0,    1,    0,   51,    3,    0,   27,   39,    7,    9,   11,
+	   13,   15,   17,   19,   21,   23,   30,   42,   33,   45,   36,   48,
+	    5,   27,   39,   30,   42,   33,   45,   36,   48,    1,   63,    1,
+	    0,   66,    0,    1,    0,   60,   54,    0,   25,   57
+	};
+}
+
+private static final byte _SyntheticAccessorFSM_trans_actions[] = init__SyntheticAccessorFSM_trans_actions_0();
+
+
+static final int SyntheticAccessorFSM_start = 1;
+static final int SyntheticAccessorFSM_first_final = 17;
+static final int SyntheticAccessorFSM_error = 0;
+
+static final int SyntheticAccessorFSM_en_main = 1;
+
+
+// line 44 "SyntheticAccessorFSM.rl"
+
+    // math type constants
+    public static final int ADD = SyntheticAccessorResolver.ADD_ASSIGNMENT;
+    public static final int SUB = SyntheticAccessorResolver.SUB_ASSIGNMENT;
+    public static final int MUL = SyntheticAccessorResolver.MUL_ASSIGNMENT;
+    public static final int DIV = SyntheticAccessorResolver.DIV_ASSIGNMENT;
+    public static final int REM = SyntheticAccessorResolver.REM_ASSIGNMENT;
+    public static final int AND = SyntheticAccessorResolver.AND_ASSIGNMENT;
+    public static final int OR = SyntheticAccessorResolver.OR_ASSIGNMENT;
+    public static final int XOR = SyntheticAccessorResolver.XOR_ASSIGNMENT;
+    public static final int SHL = SyntheticAccessorResolver.SHL_ASSIGNMENT;
+    public static final int SHR = SyntheticAccessorResolver.SHR_ASSIGNMENT;
+    public static final int USHR = SyntheticAccessorResolver.USHR_ASSIGNMENT;
+
+    public static final int INT = 0;
+    public static final int LONG = 1;
+    public static final int FLOAT = 2;
+    public static final int DOUBLE = 3;
+
+    public static final int POSITIVE_ONE = 1;
+    public static final int NEGATIVE_ONE = -1;
+    public static final int OTHER = 0;
+
+    @Nonnull private final Opcodes opcodes;
+
+    public SyntheticAccessorFSM(@Nonnull Opcodes opcodes) {
+        this.opcodes = opcodes;
+    }
+
+    public int test(List<? extends Instruction> instructions) {
+        int accessorType = -1;
+        int cs, p = 0;
+        int pe = instructions.size();
+
+        // one of the math type constants representing the type of math operation being performed
+        int mathOp = -1;
+
+        // for increments an decrements, the type of value the math operation is on
+        int mathType = -1;
+
+        // for increments and decrements, the value of the constant that is used
+        long constantValue = 0;
+
+        // The source register for the put instruction
+        int putRegister = -1;
+        // The return register;
+        int returnRegister = -1;
+
+        
+// line 242 "/home/jesusfreke/projects/smali/dexlib2/src/main/java/org/jf/dexlib2/util/SyntheticAccessorFSM.java"
+	{
+	cs = SyntheticAccessorFSM_start;
+	}
+
+// line 247 "/home/jesusfreke/projects/smali/dexlib2/src/main/java/org/jf/dexlib2/util/SyntheticAccessorFSM.java"
+	{
+	int _klen;
+	int _trans = 0;
+	int _acts;
+	int _nacts;
+	int _keys;
+	int _goto_targ = 0;
+
+	_goto: while (true) {
+	switch ( _goto_targ ) {
+	case 0:
+	if ( p == pe ) {
+		_goto_targ = 4;
+		continue _goto;
+	}
+	if ( cs == 0 ) {
+		_goto_targ = 5;
+		continue _goto;
+	}
+case 1:
+	_match: do {
+	_keys = _SyntheticAccessorFSM_key_offsets[cs];
+	_trans = _SyntheticAccessorFSM_index_offsets[cs];
+	_klen = _SyntheticAccessorFSM_single_lengths[cs];
+	if ( _klen > 0 ) {
+		int _lower = _keys;
+		int _mid;
+		int _upper = _keys + _klen - 1;
+		while (true) {
+			if ( _upper < _lower )
+				break;
+
+			_mid = _lower + ((_upper-_lower) >> 1);
+			if ( ( opcodes.getOpcodeValue(instructions.get(p).getOpcode())) < _SyntheticAccessorFSM_trans_keys[_mid] )
+				_upper = _mid - 1;
+			else if ( ( opcodes.getOpcodeValue(instructions.get(p).getOpcode())) > _SyntheticAccessorFSM_trans_keys[_mid] )
+				_lower = _mid + 1;
+			else {
+				_trans += (_mid - _keys);
+				break _match;
+			}
+		}
+		_keys += _klen;
+		_trans += _klen;
+	}
+
+	_klen = _SyntheticAccessorFSM_range_lengths[cs];
+	if ( _klen > 0 ) {
+		int _lower = _keys;
+		int _mid;
+		int _upper = _keys + (_klen<<1) - 2;
+		while (true) {
+			if ( _upper < _lower )
+				break;
+
+			_mid = _lower + (((_upper-_lower) >> 1) & ~1);
+			if ( ( opcodes.getOpcodeValue(instructions.get(p).getOpcode())) < _SyntheticAccessorFSM_trans_keys[_mid] )
+				_upper = _mid - 2;
+			else if ( ( opcodes.getOpcodeValue(instructions.get(p).getOpcode())) > _SyntheticAccessorFSM_trans_keys[_mid+1] )
+				_lower = _mid + 2;
+			else {
+				_trans += ((_mid - _keys)>>1);
+				break _match;
+			}
+		}
+		_trans += _klen;
+	}
+	} while (false);
+
+	_trans = _SyntheticAccessorFSM_indicies[_trans];
+	cs = _SyntheticAccessorFSM_trans_targs[_trans];
+
+	if ( _SyntheticAccessorFSM_trans_actions[_trans] != 0 ) {
+		_acts = _SyntheticAccessorFSM_trans_actions[_trans];
+		_nacts = (int) _SyntheticAccessorFSM_actions[_acts++];
+		while ( _nacts-- > 0 )
+	{
+			switch ( _SyntheticAccessorFSM_actions[_acts++] )
+			{
+	case 0:
+// line 100 "SyntheticAccessorFSM.rl"
+	{
+                putRegister = ((OneRegisterInstruction)instructions.get(p)).getRegisterA();
+            }
+	break;
+	case 1:
+// line 107 "SyntheticAccessorFSM.rl"
+	{
+                constantValue = ((WideLiteralInstruction)instructions.get(p)).getWideLiteral();
+            }
+	break;
+	case 2:
+// line 111 "SyntheticAccessorFSM.rl"
+	{
+                mathType = INT;
+                mathOp = ADD;
+                constantValue = ((WideLiteralInstruction)instructions.get(p)).getWideLiteral();
+            }
+	break;
+	case 3:
+// line 117 "SyntheticAccessorFSM.rl"
+	{ mathType = INT; }
+	break;
+	case 4:
+// line 118 "SyntheticAccessorFSM.rl"
+	{ mathType = LONG; }
+	break;
+	case 5:
+// line 119 "SyntheticAccessorFSM.rl"
+	{ mathType = FLOAT; }
+	break;
+	case 6:
+// line 120 "SyntheticAccessorFSM.rl"
+	{mathType = DOUBLE; }
+	break;
+	case 7:
+// line 120 "SyntheticAccessorFSM.rl"
+	{
+                mathOp = ADD;
+            }
+	break;
+	case 8:
+// line 123 "SyntheticAccessorFSM.rl"
+	{ mathType = INT; }
+	break;
+	case 9:
+// line 124 "SyntheticAccessorFSM.rl"
+	{ mathType = LONG; }
+	break;
+	case 10:
+// line 125 "SyntheticAccessorFSM.rl"
+	{ mathType = FLOAT; }
+	break;
+	case 11:
+// line 126 "SyntheticAccessorFSM.rl"
+	{mathType = DOUBLE; }
+	break;
+	case 12:
+// line 126 "SyntheticAccessorFSM.rl"
+	{
+                mathOp = SUB;
+            }
+	break;
+	case 13:
+// line 130 "SyntheticAccessorFSM.rl"
+	{
+                mathOp = MUL;
+            }
+	break;
+	case 14:
+// line 134 "SyntheticAccessorFSM.rl"
+	{
+                mathOp = DIV;
+            }
+	break;
+	case 15:
+// line 138 "SyntheticAccessorFSM.rl"
+	{
+                mathOp = REM;
+            }
+	break;
+	case 16:
+// line 141 "SyntheticAccessorFSM.rl"
+	{
+                mathOp = AND;
+            }
+	break;
+	case 17:
+// line 144 "SyntheticAccessorFSM.rl"
+	{
+                mathOp = OR;
+            }
+	break;
+	case 18:
+// line 147 "SyntheticAccessorFSM.rl"
+	{
+                mathOp = XOR;
+            }
+	break;
+	case 19:
+// line 150 "SyntheticAccessorFSM.rl"
+	{
+                mathOp = SHL;
+            }
+	break;
+	case 20:
+// line 153 "SyntheticAccessorFSM.rl"
+	{
+                mathOp = SHR;
+            }
+	break;
+	case 21:
+// line 156 "SyntheticAccessorFSM.rl"
+	{
+                mathOp = USHR;
+            }
+	break;
+	case 22:
+// line 162 "SyntheticAccessorFSM.rl"
+	{
+                returnRegister = ((OneRegisterInstruction)instructions.get(p)).getRegisterA();
+            }
+	break;
+	case 23:
+// line 168 "SyntheticAccessorFSM.rl"
+	{
+                accessorType = SyntheticAccessorResolver.GETTER; { p += 1; _goto_targ = 5; if (true)  continue _goto;}
+            }
+	break;
+	case 24:
+// line 172 "SyntheticAccessorFSM.rl"
+	{
+                accessorType = SyntheticAccessorResolver.SETTER; { p += 1; _goto_targ = 5; if (true)  continue _goto;}
+            }
+	break;
+	case 25:
+// line 176 "SyntheticAccessorFSM.rl"
+	{
+                accessorType = SyntheticAccessorResolver.METHOD; { p += 1; _goto_targ = 5; if (true)  continue _goto;}
+            }
+	break;
+	case 26:
+// line 180 "SyntheticAccessorFSM.rl"
+	{
+                accessorType = getIncrementType(mathOp, mathType, constantValue, putRegister, returnRegister);
+            }
+	break;
+	case 27:
+// line 184 "SyntheticAccessorFSM.rl"
+	{
+                accessorType = getIncrementType(mathOp, mathType, constantValue, putRegister, returnRegister);
+            }
+	break;
+	case 28:
+// line 192 "SyntheticAccessorFSM.rl"
+	{
+                accessorType = mathOp; { p += 1; _goto_targ = 5; if (true)  continue _goto;}
+            }
+	break;
+// line 487 "/home/jesusfreke/projects/smali/dexlib2/src/main/java/org/jf/dexlib2/util/SyntheticAccessorFSM.java"
+			}
+		}
+	}
+
+case 2:
+	if ( cs == 0 ) {
+		_goto_targ = 5;
+		continue _goto;
+	}
+	if ( ++p != pe ) {
+		_goto_targ = 1;
+		continue _goto;
+	}
+case 4:
+case 5:
+	}
+	break; }
+	}
+
+// line 205 "SyntheticAccessorFSM.rl"
+
+
+        return accessorType;
+    }
+
+    private static int getIncrementType(int mathOp, int mathType, long constantValue, int putRegister,
+            int returnRegister) {
+        boolean isPrefix = putRegister == returnRegister;
+
+        boolean negativeConstant = false;
+
+        switch (mathType) {
+            case INT:
+            case LONG: {
+                if (constantValue == 1) {
+                    negativeConstant = false;
+                } else if (constantValue == -1) {
+                    negativeConstant = true;
+                } else {
+                    return -1;
+                }
+                break;
+            }
+            case FLOAT: {
+                float val = Float.intBitsToFloat((int)constantValue);
+                if (val == 1) {
+                    negativeConstant = false;
+                } else if (val == -1) {
+                    negativeConstant = true;
+                } else {
+                    return -1;
+                }
+                break;
+            }
+            case DOUBLE: {
+                double val = Double.longBitsToDouble(constantValue);
+                if (val == 1) {
+                    negativeConstant = false;
+                } else if (val == -1) {
+                    negativeConstant = true;
+                } else {
+                    return -1;
+                }
+                break;
+            }
+        }
+
+        boolean isAdd = ((mathOp == ADD) && !negativeConstant) ||
+                        ((mathOp == SUB) && negativeConstant);
+
+        if (isPrefix) {
+            if (isAdd) {
+                return SyntheticAccessorResolver.PREFIX_INCREMENT;
+            } else {
+                return SyntheticAccessorResolver.PREFIX_DECREMENT;
+            }
+        } else {
+            if (isAdd) {
+                return SyntheticAccessorResolver.POSTFIX_INCREMENT;
+            } else {
+                return SyntheticAccessorResolver.POSTFIX_DECREMENT;
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/util/SyntheticAccessorResolver.java b/dexlib2/src/main/java/org/jf/dexlib2/util/SyntheticAccessorResolver.java
new file mode 100644
index 0000000..7808f84
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/util/SyntheticAccessorResolver.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.util;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Maps;
+import org.jf.dexlib2.AccessFlags;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.Method;
+import org.jf.dexlib2.iface.MethodImplementation;
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.dexlib2.iface.instruction.ReferenceInstruction;
+import org.jf.dexlib2.iface.reference.MethodReference;
+import org.jf.dexlib2.iface.reference.Reference;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.List;
+import java.util.Map;
+
+public class SyntheticAccessorResolver {
+    public static final int METHOD = 0;
+    public static final int GETTER = 1;
+    public static final int SETTER = 2;
+    public static final int POSTFIX_INCREMENT = 3;
+    public static final int PREFIX_INCREMENT = 4;
+    public static final int POSTFIX_DECREMENT = 5;
+    public static final int PREFIX_DECREMENT = 6;
+    public static final int ADD_ASSIGNMENT = 7;
+    public static final int SUB_ASSIGNMENT = 8;
+    public static final int MUL_ASSIGNMENT = 9;
+    public static final int DIV_ASSIGNMENT = 10;
+    public static final int REM_ASSIGNMENT = 11;
+    public static final int AND_ASSIGNMENT = 12;
+    public static final int OR_ASSIGNMENT = 13;
+    public static final int XOR_ASSIGNMENT = 14;
+    public static final int SHL_ASSIGNMENT = 15;
+    public static final int SHR_ASSIGNMENT = 16;
+    public static final int USHR_ASSIGNMENT = 17;
+
+    private final SyntheticAccessorFSM syntheticAccessorFSM;
+    private final Map<String, ClassDef> classDefMap;
+    private final Map<String, AccessedMember> resolvedAccessors = Maps.newConcurrentMap();
+
+    public SyntheticAccessorResolver(@Nonnull Opcodes opcodes, @Nonnull Iterable<? extends ClassDef> classDefs) {
+        this.syntheticAccessorFSM = new SyntheticAccessorFSM(opcodes);
+        ImmutableMap.Builder<String, ClassDef> builder = ImmutableMap.builder();
+
+        for (ClassDef classDef: classDefs) {
+            builder.put(classDef.getType(), classDef);
+        }
+
+        this.classDefMap = builder.build();
+    }
+
+    public static boolean looksLikeSyntheticAccessor(String methodName) {
+        return methodName.startsWith("access$");
+    }
+
+    @Nullable
+    public AccessedMember getAccessedMember(@Nonnull MethodReference methodReference) {
+        String methodDescriptor = ReferenceUtil.getMethodDescriptor(methodReference);
+
+        AccessedMember accessedMember = resolvedAccessors.get(methodDescriptor);
+        if (accessedMember != null) {
+            return accessedMember;
+        }
+
+        String type = methodReference.getDefiningClass();
+        ClassDef classDef = classDefMap.get(type);
+        if (classDef == null) {
+            return null;
+        }
+
+        Method matchedMethod = null;
+        MethodImplementation matchedMethodImpl = null;
+        for (Method method: classDef.getMethods()) {
+            MethodImplementation methodImpl = method.getImplementation();
+            if (methodImpl != null) {
+                if (methodReferenceEquals(method, methodReference)) {
+                    matchedMethod = method;
+                    matchedMethodImpl = methodImpl;
+                    break;
+                }
+            }
+        }
+
+        if (matchedMethod == null) {
+            return null;
+        }
+
+        //A synthetic accessor will be marked synthetic
+        if (!AccessFlags.SYNTHETIC.isSet(matchedMethod.getAccessFlags())) {
+            return null;
+        }
+
+        List<Instruction> instructions = ImmutableList.copyOf(matchedMethodImpl.getInstructions());
+
+
+        int accessType = syntheticAccessorFSM.test(instructions);
+
+        if (accessType >= 0) {
+            AccessedMember member =
+                    new AccessedMember(accessType, ((ReferenceInstruction)instructions.get(0)).getReference());
+            resolvedAccessors.put(methodDescriptor, member);
+            return member;
+        }
+        return null;
+    }
+
+    public static class AccessedMember {
+        public final int accessedMemberType;
+        @Nonnull public final Reference accessedMember;
+
+        public AccessedMember(int accessedMemberType, @Nonnull Reference accessedMember) {
+            this.accessedMemberType = accessedMemberType;
+            this.accessedMember = accessedMember;
+        }
+    }
+
+    private static boolean methodReferenceEquals(@Nonnull MethodReference ref1, @Nonnull MethodReference ref2) {
+        // we already know the containing class matches
+        return ref1.getName().equals(ref2.getName()) &&
+               ref1.getReturnType().equals(ref2.getReturnType()) &&
+               ref1.getParameterTypes().equals(ref2.getParameterTypes());
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/util/TypeUtils.java b/dexlib2/src/main/java/org/jf/dexlib2/util/TypeUtils.java
new file mode 100644
index 0000000..6be21af
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/util/TypeUtils.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.util;
+
+import org.jf.dexlib2.AccessFlags;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.reference.TypeReference;
+
+import javax.annotation.Nonnull;
+
+public final class TypeUtils {
+    public static boolean isWideType(@Nonnull String type) {
+        char c = type.charAt(0);
+        return c == 'J' || c == 'D';
+    }
+
+    public static boolean isWideType(@Nonnull TypeReference type) {
+        return isWideType(type.getType());
+    }
+
+    public static boolean isPrimitiveType(String type) {
+        return type.length() == 1;
+    }
+
+    @Nonnull
+    public static String getPackage(@Nonnull String type) {
+        int lastSlash = type.lastIndexOf('/');
+        if (lastSlash < 0) {
+            return "";
+        }
+        return type.substring(1, lastSlash);
+    }
+
+    public static boolean canAccessClass(@Nonnull String accessorType, @Nonnull ClassDef accesseeClassDef) {
+        if (AccessFlags.PUBLIC.isSet(accesseeClassDef.getAccessFlags())) {
+            return true;
+        }
+
+        // Classes can only be public or package private. Any private or protected inner classes are actually
+        // package private.
+        return getPackage(accesseeClassDef.getType()).equals(getPackage(accessorType));
+    }
+
+    private TypeUtils() {}
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/AnnotationSection.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/AnnotationSection.java
new file mode 100644
index 0000000..0d8179c
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/AnnotationSection.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer;
+
+import javax.annotation.Nonnull;
+import java.util.Collection;
+
+public interface AnnotationSection<StringKey, TypeKey, AnnotationKey, AnnotationElement, EncodedValue>
+        extends OffsetSection<AnnotationKey> {
+    int getVisibility(@Nonnull AnnotationKey key);
+    @Nonnull TypeKey getType(@Nonnull AnnotationKey key);
+    @Nonnull Collection<? extends AnnotationElement> getElements(@Nonnull AnnotationKey key);
+
+    @Nonnull StringKey getElementName(@Nonnull AnnotationElement element);
+    @Nonnull EncodedValue getElementValue(@Nonnull AnnotationElement element);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/AnnotationSetSection.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/AnnotationSetSection.java
new file mode 100644
index 0000000..e42f067
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/AnnotationSetSection.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer;
+
+import org.jf.dexlib2.iface.Annotation;
+
+import javax.annotation.Nonnull;
+import java.util.Collection;
+
+public interface AnnotationSetSection<AnnotationKey extends Annotation, AnnotationSetKey>
+        extends NullableOffsetSection<AnnotationSetKey> {
+    @Nonnull Collection<? extends AnnotationKey> getAnnotations(@Nonnull AnnotationSetKey key);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/CallSiteSection.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/CallSiteSection.java
new file mode 100644
index 0000000..0860de4
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/CallSiteSection.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer;
+
+import org.jf.dexlib2.iface.reference.CallSiteReference;
+
+public interface CallSiteSection<CallSiteKey extends CallSiteReference, EncodedArrayKey>
+        extends IndexSection<CallSiteKey> {
+    EncodedArrayKey getEncodedCallSite(CallSiteKey callSiteReference);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/ClassSection.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/ClassSection.java
new file mode 100644
index 0000000..830b494
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/ClassSection.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer;
+
+import org.jf.dexlib2.HiddenApiRestriction;
+import org.jf.dexlib2.builder.MutableMethodImplementation;
+import org.jf.dexlib2.iface.ExceptionHandler;
+import org.jf.dexlib2.iface.TryBlock;
+import org.jf.dexlib2.iface.debug.DebugItem;
+import org.jf.dexlib2.iface.instruction.Instruction;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public interface ClassSection<StringKey extends CharSequence, TypeKey extends CharSequence, TypeListKey, ClassKey,
+        FieldKey, MethodKey, AnnotationSetKey, EncodedArrayKey> extends IndexSection<ClassKey> {
+    @Nonnull Collection<? extends ClassKey> getSortedClasses();
+
+    @Nullable Map.Entry<? extends ClassKey, Integer> getClassEntryByType(@Nullable TypeKey key);
+
+    @Nonnull TypeKey getType(@Nonnull ClassKey key);
+    int getAccessFlags(@Nonnull ClassKey key);
+    @Nullable TypeKey getSuperclass(@Nonnull ClassKey key);
+    @Nullable TypeListKey getInterfaces(@Nonnull ClassKey key);
+    @Nullable StringKey getSourceFile(@Nonnull ClassKey key);
+    @Nullable EncodedArrayKey getStaticInitializers(@Nonnull ClassKey key);
+
+    @Nonnull Collection<? extends FieldKey> getSortedStaticFields(@Nonnull ClassKey key);
+    @Nonnull Collection<? extends FieldKey> getSortedInstanceFields(@Nonnull ClassKey key);
+    @Nonnull Collection<? extends FieldKey> getSortedFields(@Nonnull ClassKey key);
+    @Nonnull Collection<? extends MethodKey> getSortedDirectMethods(@Nonnull ClassKey key);
+    @Nonnull Collection<? extends MethodKey> getSortedVirtualMethods(@Nonnull ClassKey key);
+    @Nonnull Collection<? extends MethodKey> getSortedMethods(@Nonnull ClassKey key);
+
+    int getFieldAccessFlags(@Nonnull FieldKey key);
+    int getMethodAccessFlags(@Nonnull MethodKey key);
+
+    @Nonnull Set<HiddenApiRestriction> getFieldHiddenApiRestrictions(@Nonnull FieldKey key);
+    @Nonnull Set<HiddenApiRestriction> getMethodHiddenApiRestrictions(@Nonnull MethodKey key);
+
+    @Nullable AnnotationSetKey getClassAnnotations(@Nonnull ClassKey key);
+    @Nullable AnnotationSetKey getFieldAnnotations(@Nonnull FieldKey key);
+    @Nullable AnnotationSetKey getMethodAnnotations(@Nonnull MethodKey key);
+    @Nullable List<? extends AnnotationSetKey> getParameterAnnotations(@Nonnull MethodKey key);
+
+    @Nullable Iterable<? extends DebugItem> getDebugItems(@Nonnull MethodKey key);
+    @Nullable Iterable<? extends StringKey> getParameterNames(@Nonnull MethodKey key);
+
+    int getRegisterCount(@Nonnull MethodKey key);
+    @Nullable Iterable<? extends Instruction> getInstructions(@Nonnull MethodKey key);
+    @Nonnull List<? extends TryBlock<? extends ExceptionHandler>> getTryBlocks(@Nonnull MethodKey key);
+    @Nullable TypeKey getExceptionType(@Nonnull ExceptionHandler handler);
+    @Nonnull MutableMethodImplementation makeMutableMethodImplementation(@Nonnull MethodKey key);
+
+    void setAnnotationDirectoryOffset(@Nonnull ClassKey key, int offset);
+    int getAnnotationDirectoryOffset(@Nonnull ClassKey key);
+
+    void setAnnotationSetRefListOffset(@Nonnull MethodKey key, int offset);
+    int getAnnotationSetRefListOffset(@Nonnull MethodKey key);
+
+    void setCodeItemOffset(@Nonnull MethodKey key, int offset);
+    int getCodeItemOffset(@Nonnull MethodKey key);
+
+    void writeDebugItem(@Nonnull DebugWriter<StringKey, TypeKey> writer, DebugItem debugItem) throws IOException;
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/DebugWriter.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/DebugWriter.java
new file mode 100644
index 0000000..683cc15
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/DebugWriter.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer;
+
+import org.jf.dexlib2.DebugItemType;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.IOException;
+
+public class DebugWriter<StringKey extends CharSequence, TypeKey extends CharSequence> {
+    @Nonnull private final StringSection<StringKey, ?> stringSection;
+    @Nonnull private final TypeSection<StringKey, TypeKey, ?> typeSection;
+    @Nonnull private final DexDataWriter writer;
+    private int currentAddress;
+    private int currentLine;
+
+    DebugWriter(@Nonnull StringSection<StringKey, ?> stringSection,
+                @Nonnull TypeSection<StringKey, TypeKey, ?> typeSection,
+                @Nonnull DexDataWriter writer) {
+        this.stringSection = stringSection;
+        this.typeSection = typeSection;
+        this.writer = writer;
+    }
+
+    void reset(int startLine) {
+        this.currentAddress = 0;
+        this.currentLine = startLine;
+    }
+
+    public void writeStartLocal(int codeAddress, int register,
+                                @Nullable StringKey name,
+                                @Nullable TypeKey type,
+                                @Nullable StringKey signature) throws IOException {
+        int nameIndex = stringSection.getNullableItemIndex(name);
+        int typeIndex = typeSection.getNullableItemIndex(type);
+        int signatureIndex = stringSection.getNullableItemIndex(signature);
+
+        writeAdvancePC(codeAddress);
+        if (signatureIndex == DexWriter.NO_INDEX) {
+            writer.write(DebugItemType.START_LOCAL);
+            writer.writeUleb128(register);
+            writer.writeUleb128(nameIndex + 1);
+            writer.writeUleb128(typeIndex + 1);
+        } else {
+            writer.write(DebugItemType.START_LOCAL_EXTENDED);
+            writer.writeUleb128(register);
+            writer.writeUleb128(nameIndex + 1);
+            writer.writeUleb128(typeIndex + 1);
+            writer.writeUleb128(signatureIndex + 1);
+        }
+    }
+
+    public void writeEndLocal(int codeAddress, int register) throws IOException {
+        writeAdvancePC(codeAddress);
+        writer.write(DebugItemType.END_LOCAL);
+        writer.writeUleb128(register);
+    }
+
+    public void writeRestartLocal(int codeAddress, int register) throws IOException {
+        writeAdvancePC(codeAddress);
+        writer.write(DebugItemType.RESTART_LOCAL);
+        writer.writeUleb128(register);
+    }
+
+    public void writePrologueEnd(int codeAddress) throws IOException {
+        writeAdvancePC(codeAddress);
+        writer.write(DebugItemType.PROLOGUE_END);
+    }
+
+    public void writeEpilogueBegin(int codeAddress) throws IOException {
+        writeAdvancePC(codeAddress);
+        writer.write(DebugItemType.EPILOGUE_BEGIN);
+    }
+
+    public void writeLineNumber(int codeAddress, int lineNumber) throws IOException {
+        int lineDelta = lineNumber - currentLine;
+        int addressDelta = codeAddress - currentAddress;
+
+        if (addressDelta < 0) {
+            throw new ExceptionWithContext("debug info items must have non-decreasing code addresses");
+        }
+        if (lineDelta < -4 || lineDelta > 10) {
+            writeAdvanceLine(lineNumber);
+            lineDelta = 0;
+        } // no else is intentional here. we might need to advance the PC as well as the line
+        if ((lineDelta < 2 && addressDelta > 16) || (lineDelta > 1 && addressDelta > 15)) {
+            writeAdvancePC(codeAddress);
+            addressDelta = 0;
+        }
+
+        // we need to emit the special opcode even if both lineDelta and addressDelta are 0, otherwise a positions
+        // entry isn't generated
+        writeSpecialOpcode(lineDelta, addressDelta);
+    }
+
+    public void writeSetSourceFile(int codeAddress, @Nullable StringKey sourceFile) throws IOException {
+        writeAdvancePC(codeAddress);
+        writer.write(DebugItemType.SET_SOURCE_FILE);
+        writer.writeUleb128(stringSection.getNullableItemIndex(sourceFile) + 1);
+    }
+
+    private void writeAdvancePC(int address) throws IOException {
+        int addressDelta = address - currentAddress;
+
+        if (addressDelta > 0) {
+            writer.write(1);
+            writer.writeUleb128(addressDelta);
+            currentAddress = address;
+        } /*else if (addressDelta < 0) {
+            throw new ExceptionWithContext("debug info items must have non-decreasing code addresses");
+        }*/
+    }
+
+    private void writeAdvanceLine(int line) throws IOException {
+        int lineDelta = line - currentLine;
+        if (lineDelta != 0) {
+            writer.write(2);
+            writer.writeSleb128(lineDelta);
+            currentLine = line;
+        }
+    }
+
+    private static final int LINE_BASE     = -4;
+    private static final int LINE_RANGE    = 15;
+    private static final int FIRST_SPECIAL = 0x0a;
+
+    private void writeSpecialOpcode(int lineDelta, int addressDelta) throws IOException {
+        writer.write((byte)(FIRST_SPECIAL + (addressDelta * LINE_RANGE) + (lineDelta - LINE_BASE)));
+        currentLine += lineDelta;
+        currentAddress += addressDelta;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/DexDataWriter.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/DexDataWriter.java
new file mode 100644
index 0000000..f33a3be
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/DexDataWriter.java
@@ -0,0 +1,282 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer;
+
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+public class DexDataWriter extends BufferedOutputStream {
+    /**
+     * The position within the file that we will write to next. This is only updated when the buffer is flushed to the
+     * outputStream.
+     */
+    private int filePosition;
+
+    /**
+     * A temporary buffer that can be used for larger writes. Can be replaced with a larger buffer if needed.
+     * Must be at least 8 bytes
+     */
+    private byte[] tempBuf = new byte[8];
+
+    /** A buffer of 0s to use for writing alignment values */
+    private byte[] zeroBuf = new byte[3];
+
+    /**
+     * Construct a new DexWriter instance that writes to output.
+     *
+     * @param output An OutputStream to write the data to.
+     * @param filePosition The position within the file that OutputStream will write to.
+     */
+    public DexDataWriter(@Nonnull OutputStream output, int filePosition) {
+        this(output, filePosition, 256 * 1024);
+    }
+
+    public DexDataWriter(@Nonnull OutputStream output, int filePosition, int bufferSize) {
+        super(output, bufferSize);
+
+        this.filePosition = filePosition;
+    }
+
+    @Override
+    public void write(int b) throws IOException {
+        filePosition++;
+        super.write(b);
+    }
+
+    @Override
+    public void write(byte[] b) throws IOException {
+        write(b, 0, b.length);
+    }
+
+    @Override
+    public void write(byte[] b, int off, int len) throws IOException {
+        filePosition += len;
+        super.write(b, off, len);
+    }
+
+    public void writeLong(long value) throws IOException {
+        writeInt((int)value);
+        writeInt((int)(value >> 32));
+    }
+
+    public static void writeInt(OutputStream out, int value) throws IOException {
+        out.write(value);
+        out.write(value >> 8);
+        out.write(value >> 16);
+        out.write(value >> 24);
+    }
+
+    public void writeInt(int value) throws IOException {
+        writeInt(this, value);
+    }
+
+    public void writeShort(int value) throws IOException {
+        if (value < Short.MIN_VALUE || value > Short.MAX_VALUE) {
+            throw new ExceptionWithContext("Short value out of range: %d", value);
+        }
+        write(value);
+        write(value >> 8);
+    }
+
+    public void writeUshort(int value) throws IOException {
+        if (value < 0 || value > 0xFFFF) {
+            throw new ExceptionWithContext("Unsigned short value out of range: %d", value);
+        }
+        write(value);
+        write(value >> 8);
+    }
+
+    public void writeUbyte(int value) throws IOException {
+        if (value < 0 || value > 0xFF) {
+            throw new ExceptionWithContext("Unsigned byte value out of range: %d", value);
+        }
+        write(value);
+    }
+
+    public static void writeUleb128(OutputStream out, int value) throws IOException {
+        while ((value & 0xffffffffL) > 0x7f) {
+            out.write((value & 0x7f) | 0x80);
+            value >>>= 7;
+        }
+        out.write(value);
+    }
+
+    public void writeUleb128(int value) throws IOException {
+        writeUleb128(this, value);
+    }
+
+    public static void writeSleb128(OutputStream out, int value) throws IOException {
+        if (value >= 0) {
+            while (value > 0x3f) {
+                out.write((value & 0x7f) | 0x80);
+                value >>>= 7;
+            }
+            out.write(value & 0x7f);
+        } else {
+            while (value < -0x40) {
+                out.write((value & 0x7f) | 0x80);
+                value >>= 7;
+            }
+            out.write(value & 0x7f);
+        }
+    }
+
+    public void writeSleb128(int value) throws IOException {
+        writeSleb128(this, value);
+    }
+
+    public void writeEncodedValueHeader(int valueType, int valueArg) throws IOException {
+        write(valueType | (valueArg << 5));
+    }
+
+    public void writeEncodedInt(int valueType, int value) throws IOException {
+        int index = 0;
+        if (value >= 0) {
+            while (value > 0x7f) {
+                tempBuf[index++] = (byte)value;
+                value >>= 8;
+            }
+        } else {
+            while (value < -0x80) {
+                tempBuf[index++] = (byte)value;
+                value >>= 8;
+            }
+        }
+        tempBuf[index++] = (byte)value;
+        writeEncodedValueHeader(valueType, index-1);
+        write(tempBuf, 0, index);
+    }
+
+    public void writeEncodedLong(int valueType, long value) throws IOException {
+        int index = 0;
+        if (value >= 0) {
+            while (value > 0x7f) {
+                tempBuf[index++] = (byte)value;
+                value >>= 8;
+            }
+        } else {
+            while (value < -0x80) {
+                tempBuf[index++] = (byte)value;
+                value >>= 8;
+            }
+        }
+        tempBuf[index++] = (byte)value;
+        writeEncodedValueHeader(valueType, index-1);
+        write(tempBuf, 0, index);
+    }
+
+    public void writeEncodedUint(int valueType, int value) throws IOException {
+        int index = 0;
+        do {
+            tempBuf[index++] = (byte)value;
+            value >>>= 8;
+        } while (value != 0);
+        writeEncodedValueHeader(valueType, index-1);
+        write(tempBuf, 0, index);
+    }
+
+    public void writeEncodedFloat(int valueType, float value) throws IOException {
+        writeRightZeroExtendedInt(valueType, Float.floatToRawIntBits(value));
+    }
+
+    protected void writeRightZeroExtendedInt(int valueType, int value) throws IOException {
+        int index = 3;
+        do {
+            tempBuf[index--] = (byte)((value & 0xFF000000) >>> 24);
+            value <<= 8;
+        } while (value != 0);
+
+        int firstElement = index+1;
+        int encodedLength = 4-firstElement;
+        writeEncodedValueHeader(valueType, encodedLength - 1);
+        write(tempBuf, firstElement, encodedLength);
+    }
+
+    public void writeEncodedDouble(int valueType, double value) throws IOException {
+        writeRightZeroExtendedLong(valueType, Double.doubleToRawLongBits(value));
+    }
+
+    protected void writeRightZeroExtendedLong(int valueType, long value) throws IOException {
+        int index = 7;
+        do {
+            tempBuf[index--] = (byte)((value & 0xFF00000000000000L) >>> 56);
+            value <<= 8;
+        } while (value != 0);
+
+        int firstElement = index+1;
+        int encodedLength = 8-firstElement;
+        writeEncodedValueHeader(valueType, encodedLength - 1);
+        write(tempBuf, firstElement, encodedLength);
+    }
+
+    public void writeString(String string) throws IOException {
+        int len = string.length();
+
+        // make sure we have enough room in the temporary buffer
+        if (tempBuf.length <= string.length()*3) {
+            tempBuf = new byte[string.length()*3];
+        }
+
+        final byte[] buf = tempBuf;
+
+        int bufPos = 0;
+        for (int i = 0; i < len; i++) {
+            char c = string.charAt(i);
+            if ((c != 0) && (c < 0x80)) {
+                buf[bufPos++] = (byte)c;
+            } else if (c < 0x800) {
+                buf[bufPos++] = (byte)(((c >> 6) & 0x1f) | 0xc0);
+                buf[bufPos++] = (byte)((c & 0x3f) | 0x80);
+            } else {
+                buf[bufPos++] = (byte)(((c >> 12) & 0x0f) | 0xe0);
+                buf[bufPos++] = (byte)(((c >> 6) & 0x3f) | 0x80);
+                buf[bufPos++] = (byte)((c & 0x3f) | 0x80);
+            }
+        }
+        write(buf, 0, bufPos);
+    }
+
+    public void align() throws IOException {
+        int zeros = (-getPosition()) & 3;
+        if (zeros > 0) {
+            write(zeroBuf, 0, zeros);
+        }
+    }
+
+    public int getPosition() {
+        return filePosition;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java
new file mode 100644
index 0000000..deb8b4a
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java
@@ -0,0 +1,1581 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Ordering;
+import com.google.common.primitives.Ints;
+import org.jf.dexlib2.*;
+import org.jf.dexlib2.base.BaseAnnotation;
+import org.jf.dexlib2.base.BaseAnnotationElement;
+import org.jf.dexlib2.builder.MutableMethodImplementation;
+import org.jf.dexlib2.builder.instruction.BuilderInstruction31c;
+import org.jf.dexlib2.dexbacked.raw.*;
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.iface.ExceptionHandler;
+import org.jf.dexlib2.iface.TryBlock;
+import org.jf.dexlib2.iface.debug.DebugItem;
+import org.jf.dexlib2.iface.debug.LineNumber;
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.dexlib2.iface.instruction.OneRegisterInstruction;
+import org.jf.dexlib2.iface.instruction.ReferenceInstruction;
+import org.jf.dexlib2.iface.instruction.VariableRegisterInstruction;
+import org.jf.dexlib2.iface.instruction.formats.*;
+import org.jf.dexlib2.iface.reference.*;
+import org.jf.dexlib2.util.InstructionUtil;
+import org.jf.dexlib2.util.MethodUtil;
+import org.jf.dexlib2.util.ReferenceUtil;
+import org.jf.dexlib2.writer.io.DeferredOutputStream;
+import org.jf.dexlib2.writer.io.DeferredOutputStreamFactory;
+import org.jf.dexlib2.writer.io.DexDataStore;
+import org.jf.dexlib2.writer.io.MemoryDeferredOutputStream;
+import org.jf.dexlib2.writer.util.TryListBuilder;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.*;
+import java.util.Map.Entry;
+import java.util.zip.Adler32;
+
+public abstract class DexWriter<
+        StringKey extends CharSequence, StringRef extends StringReference, TypeKey extends CharSequence,
+        TypeRef extends TypeReference, ProtoRefKey extends MethodProtoReference,
+        FieldRefKey extends FieldReference, MethodRefKey extends MethodReference,
+        ClassKey extends Comparable<? super ClassKey>,
+        CallSiteKey extends CallSiteReference,
+        MethodHandleKey extends MethodHandleReference,
+        AnnotationKey extends Annotation, AnnotationSetKey,
+        TypeListKey,
+        FieldKey, MethodKey,
+        EncodedArrayKey,
+        EncodedValue,
+        AnnotationElement extends org.jf.dexlib2.iface.AnnotationElement,
+        StringSectionType extends StringSection<StringKey, StringRef>,
+        TypeSectionType extends TypeSection<StringKey, TypeKey, TypeRef>,
+        ProtoSectionType extends ProtoSection<StringKey, TypeKey, ProtoRefKey, TypeListKey>,
+        FieldSectionType extends FieldSection<StringKey, TypeKey, FieldRefKey, FieldKey>,
+        MethodSectionType extends MethodSection<StringKey, TypeKey, ProtoRefKey, MethodRefKey, MethodKey>,
+        ClassSectionType extends ClassSection<StringKey, TypeKey, TypeListKey, ClassKey, FieldKey, MethodKey,
+                AnnotationSetKey, EncodedArrayKey>,
+        CallSiteSectionType extends CallSiteSection<CallSiteKey, EncodedArrayKey>,
+        MethodHandleSectionType extends MethodHandleSection<MethodHandleKey, FieldRefKey, MethodRefKey>,
+        TypeListSectionType extends TypeListSection<TypeKey, TypeListKey>,
+        AnnotationSectionType extends AnnotationSection<StringKey, TypeKey, AnnotationKey, AnnotationElement,
+                EncodedValue>,
+        AnnotationSetSectionType extends AnnotationSetSection<AnnotationKey, AnnotationSetKey>,
+        EncodedArraySectionType extends EncodedArraySection<EncodedArrayKey, EncodedValue>> {
+    public static final int NO_INDEX = -1;
+    public static final int NO_OFFSET = 0;
+
+    public static final int MAX_POOL_SIZE = (1 << 16);
+
+    protected final Opcodes opcodes;
+
+    protected int stringIndexSectionOffset = NO_OFFSET;
+    protected int typeSectionOffset = NO_OFFSET;
+    protected int protoSectionOffset = NO_OFFSET;
+    protected int fieldSectionOffset = NO_OFFSET;
+    protected int methodSectionOffset = NO_OFFSET;
+    protected int classIndexSectionOffset = NO_OFFSET;
+    protected int callSiteSectionOffset = NO_OFFSET;
+    protected int methodHandleSectionOffset = NO_OFFSET;
+
+    protected int stringDataSectionOffset = NO_OFFSET;
+    protected int classDataSectionOffset = NO_OFFSET;
+    protected int typeListSectionOffset = NO_OFFSET;
+    protected int encodedArraySectionOffset = NO_OFFSET;
+    protected int annotationSectionOffset = NO_OFFSET;
+    protected int annotationSetSectionOffset = NO_OFFSET;
+    protected int annotationSetRefSectionOffset = NO_OFFSET;
+    protected int annotationDirectorySectionOffset = NO_OFFSET;
+    protected int debugSectionOffset = NO_OFFSET;
+    protected int codeSectionOffset = NO_OFFSET;
+    protected int hiddenApiRestrictionsOffset = NO_OFFSET;
+    protected int mapSectionOffset = NO_OFFSET;
+
+    protected boolean hasHiddenApiRestrictions = false;
+
+    protected int numAnnotationSetRefItems = 0;
+    protected int numAnnotationDirectoryItems = 0;
+    protected int numDebugInfoItems = 0;
+    protected int numCodeItemItems = 0;
+    protected int numClassDataItems = 0;
+
+    // The sections defined here must be kept in sync with these section arrays:
+    // - DexWriter.overflowableSections
+    // - DexPool.sections
+
+    public final StringSectionType stringSection;
+    public final TypeSectionType typeSection;
+    public final ProtoSectionType protoSection;
+    public final FieldSectionType fieldSection;
+    public final MethodSectionType methodSection;
+    public final ClassSectionType classSection;
+    public final CallSiteSectionType callSiteSection;
+    public final MethodHandleSectionType methodHandleSection;
+
+    public final TypeListSectionType typeListSection;
+    public final AnnotationSectionType annotationSection;
+    public final AnnotationSetSectionType annotationSetSection;
+    public final EncodedArraySectionType encodedArraySection;
+
+    private final IndexSection<?>[] overflowableSections;
+
+    protected DexWriter(Opcodes opcodes) {
+        this.opcodes = opcodes;
+
+        SectionProvider sectionProvider = getSectionProvider();
+        this.stringSection = sectionProvider.getStringSection();
+        this.typeSection = sectionProvider.getTypeSection();
+        this.protoSection = sectionProvider.getProtoSection();
+        this.fieldSection = sectionProvider.getFieldSection();
+        this.methodSection = sectionProvider.getMethodSection();
+        this.classSection = sectionProvider.getClassSection();
+        this.callSiteSection = sectionProvider.getCallSiteSection();
+        this.methodHandleSection = sectionProvider.getMethodHandleSection();
+        this.typeListSection = sectionProvider.getTypeListSection();
+        this.annotationSection = sectionProvider.getAnnotationSection();
+        this.annotationSetSection = sectionProvider.getAnnotationSetSection();
+        this.encodedArraySection = sectionProvider.getEncodedArraySection();
+
+        overflowableSections = new IndexSection<?>[] {
+                //stringSection,            // supports jumbo indexes
+                typeSection,
+                protoSection,
+                fieldSection,
+                methodSection,
+                //classSection,             // redundant check: cannot be larger than typeSection
+                callSiteSection,
+                methodHandleSection,
+        };
+    }
+
+    @Nonnull protected abstract SectionProvider getSectionProvider();
+
+    protected abstract void writeEncodedValue(@Nonnull InternalEncodedValueWriter writer,
+                                              @Nonnull EncodedValue encodedValue) throws IOException;
+
+    private Comparator<Map.Entry<? extends CallSiteKey, Integer>> callSiteComparator =
+            new Comparator<Entry<? extends CallSiteKey, Integer>>() {
+                @Override
+                public int compare(Entry<? extends CallSiteKey, Integer> o1, Entry<? extends CallSiteKey, Integer> o2) {
+                    int offset1 = encodedArraySection.getItemOffset(callSiteSection.getEncodedCallSite(o1.getKey()));
+                    int offset2 = encodedArraySection.getItemOffset(callSiteSection.getEncodedCallSite(o2.getKey()));
+                    return Ints.compare(offset1, offset2);
+                }
+            };
+
+    private static Comparator<Map.Entry> toStringKeyComparator =
+            new Comparator<Map.Entry>() {
+                @Override public int compare(Entry o1, Entry o2) {
+                    return o1.getKey().toString().compareTo(o2.getKey().toString());
+                }
+            };
+
+    private static <T extends Comparable<? super T>> Comparator<Map.Entry<? extends T, ?>> comparableKeyComparator() {
+        return new Comparator<Entry<? extends T, ?>>() {
+            @Override public int compare(Entry<? extends T, ?> o1, Entry<? extends T, ?> o2) {
+                return o1.getKey().compareTo(o2.getKey());
+            }
+        };
+    }
+
+    protected class InternalEncodedValueWriter extends EncodedValueWriter<StringKey, TypeKey, FieldRefKey, MethodRefKey,
+            AnnotationElement, ProtoRefKey, MethodHandleKey, EncodedValue> {
+        private InternalEncodedValueWriter(@Nonnull DexDataWriter writer) {
+            super(writer, stringSection, typeSection, fieldSection, methodSection, protoSection, methodHandleSection,
+                    annotationSection);
+        }
+
+        @Override protected void writeEncodedValue(@Nonnull EncodedValue encodedValue) throws IOException {
+            DexWriter.this.writeEncodedValue(this, encodedValue);
+        }
+    }
+
+    private int getDataSectionOffset() {
+        return HeaderItem.ITEM_SIZE +
+                stringSection.getItemCount() * StringIdItem.ITEM_SIZE +
+                typeSection.getItemCount() * TypeIdItem.ITEM_SIZE +
+                protoSection.getItemCount() * ProtoIdItem.ITEM_SIZE +
+                fieldSection.getItemCount() * FieldIdItem.ITEM_SIZE +
+                methodSection.getItemCount() * MethodIdItem.ITEM_SIZE +
+                classSection.getItemCount() * ClassDefItem.ITEM_SIZE +
+                callSiteSection.getItemCount() * CallSiteIdItem.ITEM_SIZE +
+                methodHandleSection.getItemCount() * MethodHandleItem.ITEM_SIZE;
+    }
+
+    @Nonnull
+    public List<String> getMethodReferences() {
+        List<String> methodReferences = Lists.newArrayList();
+        for (Entry<? extends MethodRefKey, Integer> methodReference: methodSection.getItems()) {
+            methodReferences.add(ReferenceUtil.getMethodDescriptor(methodReference.getKey()));
+        }
+        return methodReferences;
+    }
+
+    @Nonnull
+    public List<String> getFieldReferences() {
+        List<String> fieldReferences = Lists.newArrayList();
+        for (Entry<? extends FieldRefKey, Integer> fieldReference: fieldSection.getItems()) {
+            fieldReferences.add(ReferenceUtil.getFieldDescriptor(fieldReference.getKey()));
+        }
+        return fieldReferences;
+    }
+
+    @Nonnull
+    public List<String> getTypeReferences() {
+        List<String> classReferences = Lists.newArrayList();
+        for (Entry<? extends TypeKey, Integer> typeReference: typeSection.getItems()) {
+            classReferences.add(typeReference.getKey().toString());
+        }
+        return classReferences;
+    }
+
+    /**
+     * Checks whether any of the size-sensitive constant pools have overflowed and have more than 64Ki entries.
+     *
+     * Note that even if this returns true, it may still be possible to successfully write the dex file, if the
+     * overflowed items are not referenced anywhere that uses a 16-bit index.
+     *
+     * @return true if any of the size-sensitive constant pools have overflowed
+     */
+    public boolean hasOverflowed() {
+        return hasOverflowed(MAX_POOL_SIZE);
+    }
+
+    /**
+     * Checks whether any of the size-sensitive constant pools have more than the supplied maximum number of entries.
+     *
+     * @param maxPoolSize the maximum number of entries allowed in any of the size-sensitive constant pools
+     * @return true if any of the size-sensitive constant pools have overflowed the supplied size limit
+     */
+    public boolean hasOverflowed(int maxPoolSize) {
+        for (IndexSection section: overflowableSections) {
+            if (section.getItemCount() > maxPoolSize) return true;
+        }
+        return false;
+    }
+
+    public void writeTo(@Nonnull DexDataStore dest) throws IOException {
+        this.writeTo(dest, MemoryDeferredOutputStream.getFactory());
+    }
+
+    public void writeTo(@Nonnull DexDataStore dest,
+                        @Nonnull DeferredOutputStreamFactory tempFactory) throws IOException {
+        try {
+            int dataSectionOffset = getDataSectionOffset();
+            DexDataWriter headerWriter = outputAt(dest, 0);
+            DexDataWriter indexWriter = outputAt(dest, HeaderItem.ITEM_SIZE);
+            DexDataWriter offsetWriter = outputAt(dest, dataSectionOffset);
+
+            try {
+                writeStrings(indexWriter, offsetWriter);
+                writeTypes(indexWriter);
+                writeTypeLists(offsetWriter);
+                writeProtos(indexWriter);
+                writeFields(indexWriter);
+                writeMethods(indexWriter);
+
+                // encoded arrays depend on method handles..
+                DexDataWriter methodHandleWriter = outputAt(dest, indexWriter.getPosition() +
+                        classSection.getItemCount() * ClassDefItem.ITEM_SIZE +
+                        callSiteSection.getItemCount() * CallSiteIdItem.ITEM_SIZE);
+                try {
+                    writeMethodHandles(methodHandleWriter);
+                } finally {
+                    methodHandleWriter.close();
+                }
+
+                // call sites depend on encoded arrays..
+                writeEncodedArrays(offsetWriter);
+
+                // class defs depend on method handles and call sites..
+                DexDataWriter callSiteWriter = outputAt(dest, indexWriter.getPosition() +
+                        classSection.getItemCount() * ClassDefItem.ITEM_SIZE);
+                try {
+                    writeCallSites(callSiteWriter);
+                } finally {
+                    callSiteWriter.close();
+                }
+
+                writeAnnotations(offsetWriter);
+                writeAnnotationSets(offsetWriter);
+                writeAnnotationSetRefs(offsetWriter);
+                writeAnnotationDirectories(offsetWriter);
+                writeDebugAndCodeItems(offsetWriter, tempFactory.makeDeferredOutputStream());
+                writeClasses(dest, indexWriter, offsetWriter);
+
+                writeMapItem(offsetWriter);
+                writeHeader(headerWriter, dataSectionOffset, offsetWriter.getPosition());
+            } finally {
+                headerWriter.close();
+                indexWriter.close();
+                offsetWriter.close();
+            }
+            updateSignature(dest);
+            updateChecksum(dest);
+        } finally {
+            dest.close();
+        }
+    }
+
+    private void updateSignature(@Nonnull DexDataStore dataStore) throws IOException {
+        MessageDigest md;
+        try {
+            md = MessageDigest.getInstance("SHA-1");
+        } catch (NoSuchAlgorithmException ex) {
+            throw new RuntimeException(ex);
+        }
+
+        byte[] buffer = new byte[4 * 1024];
+        InputStream input = dataStore.readAt(HeaderItem.SIGNATURE_DATA_START_OFFSET);
+        int bytesRead = input.read(buffer);
+        while (bytesRead >= 0) {
+            md.update(buffer, 0, bytesRead);
+            bytesRead = input.read(buffer);
+        }
+
+        byte[] signature = md.digest();
+        if (signature.length != HeaderItem.SIGNATURE_SIZE) {
+            throw new RuntimeException("unexpected digest write: " + signature.length + " bytes");
+        }
+
+        // write signature
+        OutputStream output = dataStore.outputAt(HeaderItem.SIGNATURE_OFFSET);
+        output.write(signature);
+        output.close();
+    }
+
+    private void updateChecksum(@Nonnull DexDataStore dataStore) throws IOException {
+        Adler32 a32 = new Adler32();
+
+        byte[] buffer = new byte[4 * 1024];
+        InputStream input = dataStore.readAt(HeaderItem.CHECKSUM_DATA_START_OFFSET);
+        int bytesRead = input.read(buffer);
+        while (bytesRead >= 0) {
+            a32.update(buffer, 0, bytesRead);
+            bytesRead = input.read(buffer);
+        }
+
+        // write checksum, utilizing logic in DexWriter to write the integer value properly
+        OutputStream output = dataStore.outputAt(HeaderItem.CHECKSUM_OFFSET);
+        DexDataWriter.writeInt(output, (int)a32.getValue());
+        output.close();
+    }
+
+    private static DexDataWriter outputAt(DexDataStore dataStore, int filePosition) throws IOException {
+        return new DexDataWriter(dataStore.outputAt(filePosition), filePosition);
+    }
+
+    private void writeStrings(@Nonnull DexDataWriter indexWriter, @Nonnull DexDataWriter offsetWriter) throws IOException {
+        stringIndexSectionOffset = indexWriter.getPosition();
+        stringDataSectionOffset = offsetWriter.getPosition();
+        int index = 0;
+        List<Entry<? extends StringKey, Integer>> stringEntries = Lists.newArrayList(stringSection.getItems());
+        Collections.sort(stringEntries, toStringKeyComparator);
+
+        for (Map.Entry<? extends StringKey, Integer>  entry: stringEntries) {
+            entry.setValue(index++);
+            indexWriter.writeInt(offsetWriter.getPosition());
+            String stringValue = entry.getKey().toString();
+            offsetWriter.writeUleb128(stringValue.length());
+            offsetWriter.writeString(stringValue);
+            offsetWriter.write(0);
+        }
+    }
+
+    private void writeTypes(@Nonnull DexDataWriter writer) throws IOException {
+        typeSectionOffset = writer.getPosition();
+        int index = 0;
+
+        List<Map.Entry<? extends TypeKey, Integer>> typeEntries = Lists.newArrayList(typeSection.getItems());
+        Collections.sort(typeEntries, toStringKeyComparator);
+
+        for (Map.Entry<? extends TypeKey, Integer> entry : typeEntries) {
+            entry.setValue(index++);
+            writer.writeInt(stringSection.getItemIndex(typeSection.getString(entry.getKey())));
+        }
+    }
+
+    private void writeProtos(@Nonnull DexDataWriter writer) throws IOException {
+        protoSectionOffset = writer.getPosition();
+        int index = 0;
+
+        List<Map.Entry<? extends ProtoRefKey, Integer>> protoEntries = Lists.newArrayList(protoSection.getItems());
+        Collections.sort(protoEntries, DexWriter.<ProtoRefKey>comparableKeyComparator());
+
+        for (Map.Entry<? extends ProtoRefKey, Integer> entry: protoEntries) {
+            entry.setValue(index++);
+            ProtoRefKey key = entry.getKey();
+            writer.writeInt(stringSection.getItemIndex(protoSection.getShorty(key)));
+            writer.writeInt(typeSection.getItemIndex(protoSection.getReturnType(key)));
+            writer.writeInt(typeListSection.getNullableItemOffset(protoSection.getParameters(key)));
+        }
+    }
+
+    private void writeFields(@Nonnull DexDataWriter writer) throws IOException {
+        fieldSectionOffset = writer.getPosition();
+        int index = 0;
+
+        List<Map.Entry<? extends FieldRefKey, Integer>> fieldEntries = Lists.newArrayList(fieldSection.getItems());
+        Collections.sort(fieldEntries, DexWriter.<FieldRefKey>comparableKeyComparator());
+        
+        for (Map.Entry<? extends FieldRefKey, Integer> entry: fieldEntries) {
+            entry.setValue(index++);
+            FieldRefKey key = entry.getKey();
+            writer.writeUshort(typeSection.getItemIndex(fieldSection.getDefiningClass(key)));
+            writer.writeUshort(typeSection.getItemIndex(fieldSection.getFieldType(key)));
+            writer.writeInt(stringSection.getItemIndex(fieldSection.getName(key)));
+        }
+    }
+
+    private void writeMethods(@Nonnull DexDataWriter writer) throws IOException {
+        methodSectionOffset = writer.getPosition();
+        int index = 0;
+
+        List<Map.Entry<? extends MethodRefKey, Integer>> methodEntries = Lists.newArrayList(methodSection.getItems());
+        Collections.sort(methodEntries, DexWriter.<MethodRefKey>comparableKeyComparator());
+        
+        for (Map.Entry<? extends MethodRefKey, Integer> entry: methodEntries) {
+            entry.setValue(index++);
+            MethodRefKey key = entry.getKey();
+            writer.writeUshort(typeSection.getItemIndex(methodSection.getDefiningClass(key)));
+            writer.writeUshort(protoSection.getItemIndex(methodSection.getPrototype(key)));
+            writer.writeInt(stringSection.getItemIndex(methodSection.getName(key)));
+        }
+    }
+
+    private void writeClasses(@Nonnull DexDataStore dataStore, @Nonnull DexDataWriter indexWriter,
+                              @Nonnull DexDataWriter offsetWriter) throws IOException {
+        classIndexSectionOffset = indexWriter.getPosition();
+        classDataSectionOffset = offsetWriter.getPosition();
+
+        List<Map.Entry<? extends ClassKey, Integer>> classEntries = Lists.newArrayList(classSection.getItems());
+        Collections.sort(classEntries, DexWriter.<ClassKey>comparableKeyComparator());
+
+        int index = 0;
+        for (Map.Entry<? extends ClassKey, Integer> key: classEntries) {
+            index = writeClass(indexWriter, offsetWriter, index, key);
+        }
+
+        if (!shouldWriteHiddenApiRestrictions()) {
+            return;
+        }
+
+        hiddenApiRestrictionsOffset = offsetWriter.getPosition();
+
+        RestrictionsWriter restrictionsWriter = new RestrictionsWriter(dataStore, offsetWriter, classEntries.size());
+
+        try {
+            for (Map.Entry<? extends ClassKey, Integer> key : classEntries) {
+
+                for (FieldKey fieldKey : classSection.getSortedStaticFields(key.getKey())) {
+                    restrictionsWriter.writeRestriction(classSection.getFieldHiddenApiRestrictions(fieldKey));
+                }
+
+                for (FieldKey fieldKey : classSection.getSortedInstanceFields(key.getKey())) {
+                    restrictionsWriter.writeRestriction(classSection.getFieldHiddenApiRestrictions(fieldKey));
+                }
+
+                for (MethodKey methodKey : classSection.getSortedDirectMethods(key.getKey())) {
+                    restrictionsWriter.writeRestriction(classSection.getMethodHiddenApiRestrictions(methodKey));
+                }
+
+                for (MethodKey methodKey : classSection.getSortedVirtualMethods(key.getKey())) {
+                    restrictionsWriter.writeRestriction(classSection.getMethodHiddenApiRestrictions(methodKey));
+                }
+
+                restrictionsWriter.finishClass();
+            }
+        } finally {
+            restrictionsWriter.close();
+        }
+    }
+
+    private boolean shouldWriteHiddenApiRestrictions() {
+        return hasHiddenApiRestrictions && opcodes.api >= 29;
+    }
+
+    private static class RestrictionsWriter {
+        private final int startOffset;
+
+        private final DexDataStore dataStore;
+        private final DexDataWriter offsetsWriter;
+        private final DexDataWriter restrictionsWriter;
+
+        private boolean writeRestrictionsForClass = false;
+        private int pendingBlankEntries = 0;
+
+        public RestrictionsWriter(DexDataStore dataStore, DexDataWriter offsetWriter, int numClasses)
+                throws IOException {
+            this.startOffset = offsetWriter.getPosition();
+            this.dataStore = dataStore;
+            this.restrictionsWriter = offsetWriter;
+
+            int offsetsSize = numClasses * HiddenApiClassDataItem.OFFSET_ITEM_SIZE;
+
+            // We don't know the size yet, so skip over it
+            restrictionsWriter.writeInt(0);
+
+            this.offsetsWriter = outputAt(dataStore, restrictionsWriter.getPosition());
+
+            // Skip over the offsets
+            for (int i=0; i<offsetsSize; i++) {
+                restrictionsWriter.write(0);
+            }
+            restrictionsWriter.flush();
+        }
+
+        public void finishClass() throws IOException {
+            if (!writeRestrictionsForClass) {
+                // Normally the offset gets written when the first non-blank restriction gets written. If only blank
+                // restrictions were added, nothing actually gets written, and we write out a blank offset here.
+                offsetsWriter.writeInt(0);
+            }
+
+            writeRestrictionsForClass = false;
+            pendingBlankEntries = 0;
+        }
+
+        private void addBlankEntry() throws IOException {
+            if (writeRestrictionsForClass) {
+                restrictionsWriter.writeUleb128(HiddenApiRestriction.WHITELIST.getValue());
+            } else {
+                pendingBlankEntries++;
+            }
+        }
+
+        public void writeRestriction(@Nonnull Set<HiddenApiRestriction> hiddenApiRestrictions) throws IOException {
+            if (hiddenApiRestrictions.isEmpty()) {
+                addBlankEntry();
+                return;
+            }
+
+            if (!writeRestrictionsForClass) {
+                writeRestrictionsForClass = true;
+                offsetsWriter.writeInt(restrictionsWriter.getPosition() - startOffset);
+
+                for (int i = 0; i < pendingBlankEntries; i++) {
+                    restrictionsWriter.writeUleb128(HiddenApiRestriction.WHITELIST.getValue());
+                }
+                pendingBlankEntries = 0;
+            }
+            restrictionsWriter.writeUleb128(HiddenApiRestriction.combineFlags(hiddenApiRestrictions));
+        }
+
+        public void close() throws IOException {
+            DexDataWriter writer = null;
+            offsetsWriter.close();
+            try {
+                writer = outputAt(dataStore, startOffset);
+                writer.writeInt(restrictionsWriter.getPosition() - startOffset);
+            } finally {
+                if (writer != null) {
+                    writer.close();
+                }
+            }
+        }
+    }
+
+    /**
+     * Writes out the class_def_item and class_data_item for the given class.
+     *
+     * This will recursively write out any unwritten superclass/interface before writing the class itself, as per the
+     * dex specification.
+     *
+     * @return the index for the next class to be written
+     */
+    private int writeClass(@Nonnull DexDataWriter indexWriter, @Nonnull DexDataWriter offsetWriter,
+                           int nextIndex, @Nullable Map.Entry<? extends ClassKey, Integer> entry) throws IOException {
+        if (entry == null) {
+            // class does not exist in this dex file, cannot write it
+            return nextIndex;
+        }
+
+        if (entry.getValue() != NO_INDEX) {
+            // class has already been written, no need to write it
+            return nextIndex;
+        }
+
+        ClassKey key = entry.getKey();
+
+        // set a bogus index, to make sure we don't recurse and double-write it
+        entry.setValue(0);
+
+        // first, try to write the superclass
+        Map.Entry<? extends ClassKey, Integer> superEntry =
+                classSection.getClassEntryByType(classSection.getSuperclass(key));
+        nextIndex = writeClass(indexWriter, offsetWriter, nextIndex, superEntry);
+
+        // then, try to write interfaces
+        for (TypeKey interfaceTypeKey: typeListSection.getTypes(classSection.getInterfaces(key))) {
+            Map.Entry<? extends ClassKey, Integer> interfaceEntry = classSection.getClassEntryByType(interfaceTypeKey);
+            nextIndex = writeClass(indexWriter, offsetWriter, nextIndex, interfaceEntry);
+        }
+
+        // now set the index for real
+        entry.setValue(nextIndex++);
+
+        // and finally, write the class itself
+        // first, the class_def_item
+        indexWriter.writeInt(typeSection.getItemIndex(classSection.getType(key)));
+        indexWriter.writeInt(classSection.getAccessFlags(key));
+        indexWriter.writeInt(typeSection.getNullableItemIndex(classSection.getSuperclass(key)));
+        indexWriter.writeInt(typeListSection.getNullableItemOffset(classSection.getInterfaces(key)));
+        indexWriter.writeInt(stringSection.getNullableItemIndex(classSection.getSourceFile(key)));
+        indexWriter.writeInt(classSection.getAnnotationDirectoryOffset(key));
+
+        Collection<? extends FieldKey> staticFields = classSection.getSortedStaticFields(key);
+        Collection<? extends FieldKey> instanceFields = classSection.getSortedInstanceFields(key);
+        Collection<? extends MethodKey> directMethods = classSection.getSortedDirectMethods(key);
+        Collection<? extends MethodKey> virtualMethods = classSection.getSortedVirtualMethods(key);
+        boolean classHasData = staticFields.size() > 0 ||
+                instanceFields.size() > 0 ||
+                directMethods.size() > 0 ||
+                virtualMethods.size() > 0;
+
+        if (classHasData) {
+            indexWriter.writeInt(offsetWriter.getPosition());
+        } else {
+            indexWriter.writeInt(NO_OFFSET);
+        }
+
+        EncodedArrayKey staticInitializers = classSection.getStaticInitializers(key);
+        if (staticInitializers != null) {
+            indexWriter.writeInt(encodedArraySection.getItemOffset(staticInitializers));
+        } else {
+            indexWriter.writeInt(NO_OFFSET);
+        }
+
+        // now write the class_data_item
+        if (classHasData) {
+            numClassDataItems++;
+
+            offsetWriter.writeUleb128(staticFields.size());
+            offsetWriter.writeUleb128(instanceFields.size());
+            offsetWriter.writeUleb128(directMethods.size());
+            offsetWriter.writeUleb128(virtualMethods.size());
+
+            writeEncodedFields(offsetWriter, staticFields);
+            writeEncodedFields(offsetWriter, instanceFields);
+            writeEncodedMethods(offsetWriter, directMethods);
+            writeEncodedMethods(offsetWriter, virtualMethods);
+        }
+
+        return nextIndex;
+    }
+
+    private void writeCallSites(DexDataWriter writer) throws IOException {
+        callSiteSectionOffset = writer.getPosition();
+
+        List<Map.Entry<? extends CallSiteKey, Integer>> callSiteEntries =
+                Lists.newArrayList(callSiteSection.getItems());
+        Collections.sort(callSiteEntries, callSiteComparator);
+
+        int index = 0;
+
+        for (Map.Entry<? extends CallSiteKey, Integer> callSite: callSiteEntries) {
+            callSite.setValue(index++);
+            writer.writeInt(encodedArraySection.getItemOffset(callSiteSection.getEncodedCallSite(callSite.getKey())));
+        }
+    }
+
+    private void writeMethodHandles(DexDataWriter writer) throws IOException {
+        methodHandleSectionOffset = writer.getPosition();
+
+        int index = 0;
+
+        for (Entry<? extends MethodHandleKey, Integer> entry: methodHandleSection.getItems()) {
+            entry.setValue(index++);
+            MethodHandleKey methodHandleReference = entry.getKey();
+            writer.writeUshort(methodHandleReference.getMethodHandleType());
+            writer.writeUshort(0);
+            int memberIndex;
+            switch (methodHandleReference.getMethodHandleType()) {
+                case MethodHandleType.STATIC_PUT:
+                case MethodHandleType.STATIC_GET:
+                case MethodHandleType.INSTANCE_PUT:
+                case MethodHandleType.INSTANCE_GET:
+                    memberIndex = fieldSection.getItemIndex(
+                            methodHandleSection.getFieldReference(methodHandleReference));
+                    break;
+                case MethodHandleType.INVOKE_STATIC:
+                case MethodHandleType.INVOKE_INSTANCE:
+                case MethodHandleType.INVOKE_CONSTRUCTOR:
+                case MethodHandleType.INVOKE_DIRECT:
+                case MethodHandleType.INVOKE_INTERFACE:
+                    memberIndex = methodSection.getItemIndex(
+                            methodHandleSection.getMethodReference(methodHandleReference));
+                    break;
+                default:
+                    throw new ExceptionWithContext("Invalid method handle type: %d",
+                            methodHandleReference.getMethodHandleType());
+            }
+
+            writer.writeUshort(memberIndex);
+            writer.writeUshort(0);
+        }
+    }
+
+    private void writeEncodedFields(@Nonnull DexDataWriter writer, @Nonnull Collection<? extends FieldKey> fields)
+            throws IOException {
+        int prevIndex = 0;
+        for (FieldKey key: fields) {
+            int index = fieldSection.getFieldIndex(key);
+            if (!classSection.getFieldHiddenApiRestrictions(key).isEmpty()) {
+                hasHiddenApiRestrictions = true;
+            }
+            writer.writeUleb128(index - prevIndex);
+            writer.writeUleb128(classSection.getFieldAccessFlags(key));
+            prevIndex = index;
+        }
+    }
+
+    private void writeEncodedMethods(@Nonnull DexDataWriter writer, @Nonnull Collection<? extends MethodKey> methods)
+            throws IOException {
+        int prevIndex = 0;
+        for (MethodKey key: methods) {
+            int index = methodSection.getMethodIndex(key);
+            if (!classSection.getMethodHiddenApiRestrictions(key).isEmpty()) {
+                hasHiddenApiRestrictions = true;
+            }
+            writer.writeUleb128(index-prevIndex);
+            writer.writeUleb128(classSection.getMethodAccessFlags(key));
+            writer.writeUleb128(classSection.getCodeItemOffset(key));
+            prevIndex = index;
+        }
+    }
+
+    private void writeTypeLists(@Nonnull DexDataWriter writer) throws IOException {
+        writer.align();
+        typeListSectionOffset = writer.getPosition();
+        for (Map.Entry<? extends TypeListKey, Integer> entry: typeListSection.getItems()) {
+            writer.align();
+            entry.setValue(writer.getPosition());
+
+            Collection<? extends TypeKey> types = typeListSection.getTypes(entry.getKey());
+            writer.writeInt(types.size());
+            for (TypeKey typeKey: types) {
+                writer.writeUshort(typeSection.getItemIndex(typeKey));
+            }
+        }
+    }
+
+    private void writeEncodedArrays(@Nonnull DexDataWriter writer) throws IOException {
+        InternalEncodedValueWriter encodedValueWriter = new InternalEncodedValueWriter(writer);
+        encodedArraySectionOffset = writer.getPosition();
+
+        for (Map.Entry<? extends EncodedArrayKey, Integer> entry: encodedArraySection.getItems()) {
+            entry.setValue(writer.getPosition());
+            List<? extends EncodedValue> encodedArray = encodedArraySection.getEncodedValueList(entry.getKey());
+            writer.writeUleb128(encodedArray.size());
+            for (EncodedValue value: encodedArray) {
+                writeEncodedValue(encodedValueWriter, value);
+            }
+        }
+    }
+
+    private void writeAnnotations(@Nonnull DexDataWriter writer) throws IOException {
+        InternalEncodedValueWriter encodedValueWriter = new InternalEncodedValueWriter(writer);
+
+        annotationSectionOffset = writer.getPosition();
+        for (Map.Entry<? extends AnnotationKey, Integer> entry: annotationSection.getItems()) {
+            entry.setValue(writer.getPosition());
+
+            AnnotationKey key = entry.getKey();
+
+            writer.writeUbyte(annotationSection.getVisibility(key));
+            writer.writeUleb128(typeSection.getItemIndex(annotationSection.getType(key)));
+
+            Collection<? extends AnnotationElement> elements = Ordering.from(BaseAnnotationElement.BY_NAME)
+                    .immutableSortedCopy(annotationSection.getElements(key));
+
+            writer.writeUleb128(elements.size());
+
+            for (AnnotationElement element: elements) {
+                writer.writeUleb128(stringSection.getItemIndex(annotationSection.getElementName(element)));
+                writeEncodedValue(encodedValueWriter, annotationSection.getElementValue(element));
+            }
+        }
+    }
+
+    private void writeAnnotationSets(@Nonnull DexDataWriter writer) throws IOException {
+        writer.align();
+        annotationSetSectionOffset = writer.getPosition();
+        if (shouldCreateEmptyAnnotationSet()) {
+            writer.writeInt(0);
+        }
+        for (Map.Entry<? extends AnnotationSetKey, Integer> entry: annotationSetSection.getItems()) {
+            Collection<? extends AnnotationKey> annotations = Ordering.from(BaseAnnotation.BY_TYPE)
+                    .immutableSortedCopy(annotationSetSection.getAnnotations(entry.getKey()));
+
+            writer.align();
+            entry.setValue(writer.getPosition());
+            writer.writeInt(annotations.size());
+            for (AnnotationKey annotationKey: annotations) {
+                writer.writeInt(annotationSection.getItemOffset(annotationKey));
+            }
+        }
+    }
+
+    private void writeAnnotationSetRefs(@Nonnull DexDataWriter writer) throws IOException {
+        writer.align();
+        annotationSetRefSectionOffset = writer.getPosition();
+        HashMap<List<? extends AnnotationSetKey>, Integer> internedItems = Maps.newHashMap();
+
+        for (ClassKey classKey: classSection.getSortedClasses()) {
+            for (MethodKey methodKey: classSection.getSortedMethods(classKey)) {
+                List<? extends AnnotationSetKey> parameterAnnotations = classSection.getParameterAnnotations(methodKey);
+                if (parameterAnnotations != null) {
+                    Integer prev = internedItems.get(parameterAnnotations);
+                    if (prev != null) {
+                        classSection.setAnnotationSetRefListOffset(methodKey, prev);
+                    } else {
+                        writer.align();
+                        int position = writer.getPosition();
+                        classSection.setAnnotationSetRefListOffset(methodKey, position);
+                        internedItems.put(parameterAnnotations, position);
+
+                        numAnnotationSetRefItems++;
+
+                        writer.writeInt(parameterAnnotations.size());
+                        for (AnnotationSetKey annotationSetKey: parameterAnnotations) {
+                            if (annotationSetSection.getAnnotations(annotationSetKey).size() > 0) {
+                                writer.writeInt(annotationSetSection.getItemOffset(annotationSetKey));
+                            } else if (shouldCreateEmptyAnnotationSet()) {
+                                writer.writeInt(annotationSetSectionOffset);
+                            } else {
+                                writer.writeInt(NO_OFFSET);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    private void writeAnnotationDirectories(@Nonnull DexDataWriter writer) throws IOException {
+        writer.align();
+        annotationDirectorySectionOffset = writer.getPosition();
+        HashMap<AnnotationSetKey, Integer> internedItems = Maps.newHashMap();
+
+        ByteBuffer tempBuffer = ByteBuffer.allocate(65536);
+        tempBuffer.order(ByteOrder.LITTLE_ENDIAN);
+
+        for (ClassKey key: classSection.getSortedClasses()) {
+            // first, we write the field/method/parameter items to a temporary buffer, so that we can get a count
+            // of each type, and determine if we even need to write an annotation directory for this class
+
+            Collection<? extends FieldKey> fields = classSection.getSortedFields(key);
+            Collection<? extends MethodKey> methods = classSection.getSortedMethods(key);
+
+            // this is how much space we'll need if every field and method has annotations.
+            int maxSize = fields.size() * 8 + methods.size() * 16;
+            if (maxSize > tempBuffer.capacity()) {
+                tempBuffer = ByteBuffer.allocate(maxSize);
+                tempBuffer.order(ByteOrder.LITTLE_ENDIAN);
+            }
+
+            tempBuffer.clear();
+
+            int fieldAnnotations = 0;
+            int methodAnnotations = 0;
+            int parameterAnnotations = 0;
+
+            for (FieldKey field: fields) {
+                AnnotationSetKey fieldAnnotationsKey = classSection.getFieldAnnotations(field);
+                if (fieldAnnotationsKey != null) {
+                    fieldAnnotations++;
+                    tempBuffer.putInt(fieldSection.getFieldIndex(field));
+                    tempBuffer.putInt(annotationSetSection.getItemOffset(fieldAnnotationsKey));
+                }
+            }
+
+            for (MethodKey method: methods) {
+                AnnotationSetKey methodAnnotationsKey = classSection.getMethodAnnotations(method);
+                if (methodAnnotationsKey != null) {
+                    methodAnnotations++;
+                    tempBuffer.putInt(methodSection.getMethodIndex(method));
+                    tempBuffer.putInt(annotationSetSection.getItemOffset(methodAnnotationsKey));
+                }
+            }
+
+            for (MethodKey method: methods) {
+                int offset = classSection.getAnnotationSetRefListOffset(method);
+                if (offset != DexWriter.NO_OFFSET) {
+                    parameterAnnotations++;
+                    tempBuffer.putInt(methodSection.getMethodIndex(method));
+                    tempBuffer.putInt(offset);
+                }
+            }
+
+            // now, we finally know how many field/method/parameter annotations were written to the temp buffer
+
+            AnnotationSetKey classAnnotationKey = classSection.getClassAnnotations(key);
+            if (fieldAnnotations == 0 && methodAnnotations == 0 && parameterAnnotations == 0) {
+                if (classAnnotationKey != null) {
+                    // This is an internable directory. Let's see if we've already written one like it
+                    Integer directoryOffset = internedItems.get(classAnnotationKey);
+                    if (directoryOffset != null) {
+                        classSection.setAnnotationDirectoryOffset(key, directoryOffset);
+                        continue;
+                    } else {
+                        internedItems.put(classAnnotationKey, writer.getPosition());
+                    }
+                } else {
+                    continue;
+                }
+            }
+
+            // yep, we need to write it out
+            numAnnotationDirectoryItems++;
+            classSection.setAnnotationDirectoryOffset(key, writer.getPosition());
+
+            writer.writeInt(annotationSetSection.getNullableItemOffset(classAnnotationKey));
+            writer.writeInt(fieldAnnotations);
+            writer.writeInt(methodAnnotations);
+            writer.writeInt(parameterAnnotations);
+            writer.write(tempBuffer.array(), 0, tempBuffer.position());
+        }
+    }
+
+    private static class CodeItemOffset<MethodKey> {
+        @Nonnull MethodKey method;
+        int codeOffset;
+
+        private CodeItemOffset(@Nonnull MethodKey method, int codeOffset) {
+            this.codeOffset = codeOffset;
+            this.method = method;
+        }
+    }
+
+    private void writeDebugAndCodeItems(@Nonnull DexDataWriter offsetWriter,
+                                        @Nonnull DeferredOutputStream temp) throws IOException {
+        ByteArrayOutputStream ehBuf = new ByteArrayOutputStream();
+        debugSectionOffset = offsetWriter.getPosition();
+        DebugWriter<StringKey, TypeKey> debugWriter =
+                new DebugWriter<StringKey, TypeKey>(stringSection, typeSection, offsetWriter);
+
+        DexDataWriter codeWriter = new DexDataWriter(temp, 0);
+
+        List<CodeItemOffset<MethodKey>> codeOffsets = Lists.newArrayList();
+
+        for (ClassKey classKey: classSection.getSortedClasses()) {
+            Collection<? extends MethodKey> directMethods = classSection.getSortedDirectMethods(classKey);
+            Collection<? extends MethodKey> virtualMethods = classSection.getSortedVirtualMethods(classKey);
+
+            Iterable<MethodKey> methods = Iterables.concat(directMethods, virtualMethods);
+
+            for (MethodKey methodKey: methods) {
+                List<? extends TryBlock<? extends ExceptionHandler>> tryBlocks =
+                        classSection.getTryBlocks(methodKey);
+                Iterable<? extends Instruction> instructions = classSection.getInstructions(methodKey);
+                Iterable<? extends DebugItem> debugItems = classSection.getDebugItems(methodKey);
+
+                if (instructions != null && stringSection.hasJumboIndexes()) {
+                    boolean needsFix = false;
+                    for (Instruction instruction: instructions) {
+                        if (instruction.getOpcode() == Opcode.CONST_STRING) {
+                            if (stringSection.getItemIndex(
+                                    (StringRef)((ReferenceInstruction)instruction).getReference()) >= 65536) {
+                                needsFix = true;
+                                break;
+                            }
+                        }
+                    }
+
+                    if (needsFix) {
+                        MutableMethodImplementation mutableMethodImplementation =
+                                classSection.makeMutableMethodImplementation(methodKey);
+                        fixInstructions(mutableMethodImplementation);
+
+                        instructions = mutableMethodImplementation.getInstructions();
+                        tryBlocks = mutableMethodImplementation.getTryBlocks();
+                        debugItems = mutableMethodImplementation.getDebugItems();
+                    }
+                }
+
+                int debugItemOffset = writeDebugItem(offsetWriter, debugWriter,
+                        classSection.getParameterNames(methodKey), debugItems);
+                int codeItemOffset;
+                try {
+                    codeItemOffset = writeCodeItem(
+                            codeWriter, ehBuf, methodKey, tryBlocks, instructions, debugItemOffset);
+                } catch (RuntimeException ex) {
+                    throw new ExceptionWithContext(ex, "Exception occurred while writing code_item for method %s",
+                            methodSection.getMethodReference(methodKey));
+                }
+
+                if (codeItemOffset != -1) {
+                    codeOffsets.add(new CodeItemOffset<MethodKey>(methodKey, codeItemOffset));
+                }
+            }
+        }
+
+        offsetWriter.align();
+        codeSectionOffset = offsetWriter.getPosition();
+
+        codeWriter.close();
+        temp.writeTo(offsetWriter);
+        temp.close();
+
+        for (CodeItemOffset<MethodKey> codeOffset: codeOffsets) {
+            classSection.setCodeItemOffset(codeOffset.method, codeSectionOffset + codeOffset.codeOffset);
+        }
+    }
+
+    private void fixInstructions(@Nonnull MutableMethodImplementation methodImplementation) {
+        List<? extends Instruction> instructions = methodImplementation.getInstructions();
+
+        for (int i=0; i<instructions.size(); i++) {
+            Instruction instruction = instructions.get(i);
+
+            if (instruction.getOpcode() == Opcode.CONST_STRING) {
+                if (stringSection.getItemIndex(
+                        (StringRef)((ReferenceInstruction)instruction).getReference()) >= 65536) {
+                    methodImplementation.replaceInstruction(i, new BuilderInstruction31c(Opcode.CONST_STRING_JUMBO,
+                            ((OneRegisterInstruction)instruction).getRegisterA(),
+                            ((ReferenceInstruction)instruction).getReference()));
+                }
+            }
+        }
+    }
+
+    private int writeDebugItem(@Nonnull DexDataWriter writer,
+                               @Nonnull DebugWriter<StringKey, TypeKey> debugWriter,
+                               @Nullable Iterable<? extends StringKey> parameterNames,
+                               @Nullable Iterable<? extends DebugItem> debugItems) throws IOException {
+        int parameterCount = 0;
+        int lastNamedParameterIndex = -1;
+        if (parameterNames != null) {
+            parameterCount = Iterables.size(parameterNames);
+            int index = 0;
+            for (StringKey parameterName: parameterNames) {
+                if (parameterName != null) {
+                    lastNamedParameterIndex = index;
+                }
+                index++;
+            }
+        }
+
+
+        if (lastNamedParameterIndex == -1 && (debugItems == null || Iterables.isEmpty(debugItems))) {
+            return NO_OFFSET;
+        }
+
+        numDebugInfoItems++;
+
+        int debugItemOffset = writer.getPosition();
+        int startingLineNumber = 0;
+
+        if (debugItems != null) {
+            for (org.jf.dexlib2.iface.debug.DebugItem debugItem: debugItems) {
+                if (debugItem instanceof LineNumber) {
+                    startingLineNumber = ((LineNumber)debugItem).getLineNumber();
+                    break;
+                }
+            }
+        }
+        writer.writeUleb128(startingLineNumber);
+
+        writer.writeUleb128(parameterCount);
+        if (parameterNames != null) {
+            int index = 0;
+            for (StringKey parameterName: parameterNames) {
+                if (index == parameterCount) {
+                    break;
+                }
+                index++;
+                writer.writeUleb128(stringSection.getNullableItemIndex(parameterName) + 1);
+            }
+        }
+
+        if (debugItems != null) {
+            debugWriter.reset(startingLineNumber);
+
+            for (DebugItem debugItem: debugItems) {
+                classSection.writeDebugItem(debugWriter, debugItem);
+            }
+        }
+        // write an END_SEQUENCE opcode, to end the debug item
+        writer.write(0);
+
+        return debugItemOffset;
+    }
+
+    private int writeCodeItem(@Nonnull DexDataWriter writer,
+                              @Nonnull ByteArrayOutputStream ehBuf,
+                              @Nonnull MethodKey methodKey,
+                              @Nonnull List<? extends TryBlock<? extends ExceptionHandler>> tryBlocks,
+                              @Nullable Iterable<? extends Instruction> instructions,
+                              int debugItemOffset) throws IOException {
+        if (instructions == null && debugItemOffset == NO_OFFSET) {
+            return -1;
+        }
+
+        numCodeItemItems++;
+
+        writer.align();
+
+        int codeItemOffset = writer.getPosition();
+
+        writer.writeUshort(classSection.getRegisterCount(methodKey));
+
+        boolean isStatic = AccessFlags.STATIC.isSet(classSection.getMethodAccessFlags(methodKey));
+        Collection<? extends TypeKey> parameters = typeListSection.getTypes(
+                protoSection.getParameters(methodSection.getPrototype(methodKey)));
+
+        writer.writeUshort(MethodUtil.getParameterRegisterCount(parameters, isStatic));
+
+        if (instructions != null) {
+            tryBlocks = TryListBuilder.massageTryBlocks(tryBlocks);
+
+            int outParamCount = 0;
+            int codeUnitCount = 0;
+            for (Instruction instruction: instructions) {
+                codeUnitCount += instruction.getCodeUnits();
+                if (instruction.getOpcode().referenceType == ReferenceType.METHOD) {
+                    ReferenceInstruction refInsn = (ReferenceInstruction)instruction;
+                    MethodReference methodRef = (MethodReference)refInsn.getReference();
+                    Opcode opcode = instruction.getOpcode();
+                    int paramCount;
+                    if (InstructionUtil.isInvokePolymorphic(opcode)) {
+                        paramCount = ((VariableRegisterInstruction)instruction).getRegisterCount();
+                    } else {
+                        paramCount = MethodUtil.getParameterRegisterCount(methodRef, InstructionUtil.isInvokeStatic(opcode));
+                    }
+                    if (paramCount > outParamCount) {
+                        outParamCount = paramCount;
+                    }
+                }
+            }
+
+            writer.writeUshort(outParamCount);
+            writer.writeUshort(tryBlocks.size());
+            writer.writeInt(debugItemOffset);
+
+            InstructionWriter instructionWriter =
+                    InstructionWriter.makeInstructionWriter(opcodes, writer, stringSection, typeSection, fieldSection,
+                            methodSection, protoSection, methodHandleSection, callSiteSection);
+
+            writer.writeInt(codeUnitCount);
+            int codeOffset = 0;
+            for (Instruction instruction: instructions) {
+                try {
+                    switch (instruction.getOpcode().format) {
+                        case Format10t:
+                            instructionWriter.write((Instruction10t)instruction);
+                            break;
+                        case Format10x:
+                            instructionWriter.write((Instruction10x)instruction);
+                            break;
+                        case Format11n:
+                            instructionWriter.write((Instruction11n)instruction);
+                            break;
+                        case Format11x:
+                            instructionWriter.write((Instruction11x)instruction);
+                            break;
+                        case Format12x:
+                            instructionWriter.write((Instruction12x)instruction);
+                            break;
+                        case Format20bc:
+                            instructionWriter.write((Instruction20bc)instruction);
+                            break;
+                        case Format20t:
+                            instructionWriter.write((Instruction20t)instruction);
+                            break;
+                        case Format21c:
+                            instructionWriter.write((Instruction21c)instruction);
+                            break;
+                        case Format21ih:
+                            instructionWriter.write((Instruction21ih)instruction);
+                            break;
+                        case Format21lh:
+                            instructionWriter.write((Instruction21lh)instruction);
+                            break;
+                        case Format21s:
+                            instructionWriter.write((Instruction21s)instruction);
+                            break;
+                        case Format21t:
+                            instructionWriter.write((Instruction21t)instruction);
+                            break;
+                        case Format22b:
+                            instructionWriter.write((Instruction22b)instruction);
+                            break;
+                        case Format22c:
+                            instructionWriter.write((Instruction22c)instruction);
+                            break;
+                        case Format22cs:
+                            instructionWriter.write((Instruction22cs)instruction);
+                            break;
+                        case Format22s:
+                            instructionWriter.write((Instruction22s)instruction);
+                            break;
+                        case Format22t:
+                            instructionWriter.write((Instruction22t)instruction);
+                            break;
+                        case Format22x:
+                            instructionWriter.write((Instruction22x)instruction);
+                            break;
+                        case Format23x:
+                            instructionWriter.write((Instruction23x)instruction);
+                            break;
+                        case Format30t:
+                            instructionWriter.write((Instruction30t)instruction);
+                            break;
+                        case Format31c:
+                            instructionWriter.write((Instruction31c)instruction);
+                            break;
+                        case Format31i:
+                            instructionWriter.write((Instruction31i)instruction);
+                            break;
+                        case Format31t:
+                            instructionWriter.write((Instruction31t)instruction);
+                            break;
+                        case Format32x:
+                            instructionWriter.write((Instruction32x)instruction);
+                            break;
+                        case Format35c:
+                            instructionWriter.write((Instruction35c)instruction);
+                            break;
+                        case Format35mi:
+                            instructionWriter.write((Instruction35mi)instruction);
+                            break;
+                        case Format35ms:
+                            instructionWriter.write((Instruction35ms)instruction);
+                            break;
+                        case Format3rc:
+                            instructionWriter.write((Instruction3rc)instruction);
+                            break;
+                        case Format3rmi:
+                            instructionWriter.write((Instruction3rmi)instruction);
+                            break;
+                        case Format3rms:
+                            instructionWriter.write((Instruction3rms)instruction);
+                            break;
+                        case Format45cc:
+                            instructionWriter.write((Instruction45cc)instruction);
+                            break;
+                        case Format4rcc:
+                            instructionWriter.write((Instruction4rcc)instruction);
+                            break;
+                        case Format51l:
+                            instructionWriter.write((Instruction51l)instruction);
+                            break;
+                        case ArrayPayload:
+                            instructionWriter.write((ArrayPayload)instruction);
+                            break;
+                        case PackedSwitchPayload:
+                            instructionWriter.write((PackedSwitchPayload)instruction);
+                            break;
+                        case SparseSwitchPayload:
+                            instructionWriter.write((SparseSwitchPayload)instruction);
+                            break;
+                        default:
+                            throw new ExceptionWithContext("Unsupported instruction format: %s",
+                                    instruction.getOpcode().format);
+                    }
+                } catch (RuntimeException ex) {
+                    throw new ExceptionWithContext(ex, "Error while writing instruction at code offset 0x%x", codeOffset);
+                }
+                codeOffset += instruction.getCodeUnits();
+            }
+
+            if (tryBlocks.size() > 0) {
+                writer.align();
+
+                // filter out unique lists of exception handlers
+                Map<List<? extends ExceptionHandler>, Integer> exceptionHandlerOffsetMap = Maps.newHashMap();
+                for (TryBlock<? extends ExceptionHandler> tryBlock: tryBlocks) {
+                    exceptionHandlerOffsetMap.put(tryBlock.getExceptionHandlers(), 0);
+                }
+                DexDataWriter.writeUleb128(ehBuf, exceptionHandlerOffsetMap.size());
+
+                for (TryBlock<? extends ExceptionHandler> tryBlock: tryBlocks) {
+                    int startAddress = tryBlock.getStartCodeAddress();
+                    int endAddress = startAddress + tryBlock.getCodeUnitCount();
+
+                    int tbCodeUnitCount = endAddress - startAddress;
+
+                    writer.writeInt(startAddress);
+                    writer.writeUshort(tbCodeUnitCount);
+
+                    if (tryBlock.getExceptionHandlers().size() == 0) {
+                        throw new ExceptionWithContext("No exception handlers for the try block!");
+                    }
+
+                    Integer offset = exceptionHandlerOffsetMap.get(tryBlock.getExceptionHandlers());
+                    if (offset != 0) {
+                        // exception handler has already been written out, just use it
+                        writer.writeUshort(offset);
+                    } else {
+                        // if offset has not been set yet, we are about to write out a new exception handler
+                        offset = ehBuf.size();
+                        writer.writeUshort(offset);
+                        exceptionHandlerOffsetMap.put(tryBlock.getExceptionHandlers(), offset);
+
+                        // check if the last exception handler is a catch-all and adjust the size accordingly
+                        int ehSize = tryBlock.getExceptionHandlers().size();
+                        ExceptionHandler ehLast = tryBlock.getExceptionHandlers().get(ehSize-1);
+                        if (ehLast.getExceptionType() == null) {
+                            ehSize = ehSize * (-1) + 1;
+                        }
+
+                        // now let's layout the exception handlers, assuming that catch-all is always last
+                        DexDataWriter.writeSleb128(ehBuf, ehSize);
+                        for (ExceptionHandler eh : tryBlock.getExceptionHandlers()) {
+                            TypeKey exceptionTypeKey = classSection.getExceptionType(eh);
+
+                            int codeAddress = eh.getHandlerCodeAddress();
+
+                            if (exceptionTypeKey != null) {
+                                //regular exception handling
+                                DexDataWriter.writeUleb128(ehBuf, typeSection.getItemIndex(exceptionTypeKey));
+                                DexDataWriter.writeUleb128(ehBuf, codeAddress);
+                            } else {
+                                //catch-all
+                                DexDataWriter.writeUleb128(ehBuf, codeAddress);
+                            }
+                        }
+                    }
+                }
+
+                if (ehBuf.size() > 0) {
+                    ehBuf.writeTo(writer);
+                    ehBuf.reset();
+                }
+            }
+        } else {
+            // no instructions, all we have is the debug item offset
+            writer.writeUshort(0);
+            writer.writeUshort(0);
+            writer.writeInt(debugItemOffset);
+            writer.writeInt(0);
+        }
+
+        return codeItemOffset;
+    }
+
+    private int calcNumItems() {
+        int numItems = 0;
+
+        // header item
+        numItems++;
+
+        if (stringSection.getItems().size() > 0) {
+            numItems += 2; // index and data
+        }
+        if (typeSection.getItems().size()  > 0) {
+            numItems++;
+        }
+        if (protoSection.getItems().size() > 0) {
+            numItems++;
+        }
+        if (fieldSection.getItems().size() > 0) {
+            numItems++;
+        }
+        if (methodSection.getItems().size() > 0) {
+            numItems++;
+        }
+        if (callSiteSection.getItems().size() > 0) {
+            numItems++;
+        }
+        if (methodHandleSection.getItems().size() > 0) {
+            numItems++;
+        }
+        if (typeListSection.getItems().size() > 0) {
+            numItems++;
+        }
+        if (encodedArraySection.getItems().size() > 0) {
+            numItems++;
+        }
+        if (annotationSection.getItems().size() > 0) {
+            numItems++;
+        }
+        if (annotationSetSection.getItems().size() > 0 || shouldCreateEmptyAnnotationSet()) {
+            numItems++;
+        }
+        if (numAnnotationSetRefItems > 0) {
+            numItems++;
+        }
+        if (numAnnotationDirectoryItems > 0) {
+            numItems++;
+        }
+        if (numDebugInfoItems > 0) {
+            numItems++;
+        }
+        if (numCodeItemItems > 0) {
+            numItems++;
+        }
+        if (classSection.getItems().size() > 0) {
+            numItems++;
+        }
+        if (numClassDataItems > 0) {
+            numItems++;
+        }
+        if (shouldWriteHiddenApiRestrictions()) {
+            numItems++;
+        }
+        // map item itself
+        numItems++;
+
+        return numItems;
+    }
+
+    private void writeMapItem(@Nonnull DexDataWriter writer) throws IOException{
+        writer.align();
+        mapSectionOffset = writer.getPosition();
+        int numItems = calcNumItems();
+
+        writer.writeInt(numItems);
+
+        // index section
+        writeMapItem(writer, ItemType.HEADER_ITEM, 1, 0);
+        writeMapItem(writer, ItemType.STRING_ID_ITEM, stringSection.getItems().size(), stringIndexSectionOffset);
+        writeMapItem(writer, ItemType.TYPE_ID_ITEM, typeSection.getItems().size(), typeSectionOffset);
+        writeMapItem(writer, ItemType.PROTO_ID_ITEM, protoSection.getItems().size(), protoSectionOffset);
+        writeMapItem(writer, ItemType.FIELD_ID_ITEM, fieldSection.getItems().size(), fieldSectionOffset);
+        writeMapItem(writer, ItemType.METHOD_ID_ITEM, methodSection.getItems().size(), methodSectionOffset);
+        writeMapItem(writer, ItemType.CLASS_DEF_ITEM, classSection.getItems().size(), classIndexSectionOffset);
+        writeMapItem(writer, ItemType.CALL_SITE_ID_ITEM, callSiteSection.getItems().size(), callSiteSectionOffset);
+        writeMapItem(writer, ItemType.METHOD_HANDLE_ITEM, methodHandleSection.getItems().size(),
+                methodHandleSectionOffset);
+
+        // data section
+        writeMapItem(writer, ItemType.STRING_DATA_ITEM, stringSection.getItems().size(), stringDataSectionOffset);
+        writeMapItem(writer, ItemType.TYPE_LIST, typeListSection.getItems().size(), typeListSectionOffset);
+        writeMapItem(writer, ItemType.ENCODED_ARRAY_ITEM, encodedArraySection.getItems().size(),
+                encodedArraySectionOffset);
+        writeMapItem(writer, ItemType.ANNOTATION_ITEM, annotationSection.getItems().size(), annotationSectionOffset);
+        writeMapItem(writer, ItemType.ANNOTATION_SET_ITEM,
+                annotationSetSection.getItems().size() + (shouldCreateEmptyAnnotationSet() ? 1 : 0),
+                annotationSetSectionOffset);
+        writeMapItem(writer, ItemType.ANNOTATION_SET_REF_LIST, numAnnotationSetRefItems, annotationSetRefSectionOffset);
+        writeMapItem(writer, ItemType.ANNOTATION_DIRECTORY_ITEM, numAnnotationDirectoryItems,
+                annotationDirectorySectionOffset);
+        writeMapItem(writer, ItemType.DEBUG_INFO_ITEM, numDebugInfoItems, debugSectionOffset);
+        writeMapItem(writer, ItemType.CODE_ITEM, numCodeItemItems, codeSectionOffset);
+        writeMapItem(writer, ItemType.CLASS_DATA_ITEM, numClassDataItems, classDataSectionOffset);
+
+        if (shouldWriteHiddenApiRestrictions()) {
+            writeMapItem(writer, ItemType.HIDDENAPI_CLASS_DATA_ITEM, 1, hiddenApiRestrictionsOffset);
+        }
+
+        writeMapItem(writer, ItemType.MAP_LIST, 1, mapSectionOffset);
+    }
+
+    private void writeMapItem(@Nonnull DexDataWriter writer, int type, int size, int offset) throws IOException {
+        if (size > 0) {
+            writer.writeUshort(type);
+            writer.writeUshort(0);
+            writer.writeInt(size);
+            writer.writeInt(offset);
+        }
+    }
+
+    private void writeHeader(@Nonnull DexDataWriter writer, int dataOffset, int fileSize) throws IOException {
+        // Write the appropriate header.
+        writer.write(HeaderItem.getMagicForApi(opcodes.api));
+
+        // checksum placeholder
+        writer.writeInt(0);
+
+        // signature placeholder
+        writer.write(new byte[20]);
+
+        writer.writeInt(fileSize);
+        writer.writeInt(HeaderItem.ITEM_SIZE);
+        writer.writeInt(HeaderItem.LITTLE_ENDIAN_TAG);
+
+        // link
+        writer.writeInt(0);
+        writer.writeInt(0);
+
+        // map
+        writer.writeInt(mapSectionOffset);
+
+        // index sections
+
+        writeSectionInfo(writer, stringSection.getItems().size(), stringIndexSectionOffset);
+        writeSectionInfo(writer, typeSection.getItems().size(), typeSectionOffset);
+        writeSectionInfo(writer, protoSection.getItems().size(), protoSectionOffset);
+        writeSectionInfo(writer, fieldSection.getItems().size(), fieldSectionOffset);
+        writeSectionInfo(writer, methodSection.getItems().size(), methodSectionOffset);
+        writeSectionInfo(writer, classSection.getItems().size(), classIndexSectionOffset);
+
+        // data section
+        writer.writeInt(fileSize - dataOffset);
+        writer.writeInt(dataOffset);
+    }
+
+    private void writeSectionInfo(DexDataWriter writer, int numItems, int offset) throws IOException {
+        writer.writeInt(numItems);
+        if (numItems > 0) {
+            writer.writeInt(offset);
+        } else {
+            writer.writeInt(0);
+        }
+    }
+
+    private boolean shouldCreateEmptyAnnotationSet() {
+        // Workaround for a crash in Dalvik VM before Jelly Bean MR1 (4.2)
+        // which is triggered by NO_OFFSET in parameter annotation list.
+        // (https://code.google.com/p/android/issues/detail?id=35304)
+        return (opcodes.api < 17);
+    }
+
+    public abstract class SectionProvider {
+        @Nonnull public abstract StringSectionType getStringSection();
+        @Nonnull public abstract TypeSectionType getTypeSection();
+        @Nonnull public abstract ProtoSectionType getProtoSection();
+        @Nonnull public abstract FieldSectionType getFieldSection();
+        @Nonnull public abstract MethodSectionType getMethodSection();
+        @Nonnull public abstract ClassSectionType getClassSection();
+        @Nonnull public abstract CallSiteSectionType getCallSiteSection();
+        @Nonnull public abstract MethodHandleSectionType getMethodHandleSection();
+        @Nonnull public abstract TypeListSectionType getTypeListSection();
+        @Nonnull public abstract AnnotationSectionType getAnnotationSection();
+        @Nonnull public abstract AnnotationSetSectionType getAnnotationSetSection();
+        @Nonnull public abstract EncodedArraySectionType getEncodedArraySection();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/EncodedArraySection.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/EncodedArraySection.java
new file mode 100644
index 0000000..49a5d15
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/EncodedArraySection.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer;
+
+import java.util.List;
+
+public interface EncodedArraySection<EncodedArrayKey, EncodedValue> extends OffsetSection<EncodedArrayKey> {
+    List<? extends EncodedValue> getEncodedValueList(EncodedArrayKey encodedArrayKey);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/EncodedValueWriter.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/EncodedValueWriter.java
new file mode 100644
index 0000000..3032acb
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/EncodedValueWriter.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer;
+
+import com.google.common.collect.Ordering;
+import org.jf.dexlib2.ValueType;
+import org.jf.dexlib2.base.BaseAnnotationElement;
+import org.jf.dexlib2.iface.reference.FieldReference;
+import org.jf.dexlib2.iface.reference.MethodHandleReference;
+import org.jf.dexlib2.iface.reference.MethodReference;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.util.Collection;
+
+public abstract class EncodedValueWriter<StringKey, TypeKey, FieldRefKey extends FieldReference,
+        MethodRefKey extends MethodReference, AnnotationElement extends org.jf.dexlib2.iface.AnnotationElement,
+        ProtoRefKey, MethodHandleKey extends MethodHandleReference, EncodedValue> {
+    @Nonnull private final DexDataWriter writer;
+    @Nonnull private final StringSection<StringKey, ?> stringSection;
+    @Nonnull private final TypeSection<?, TypeKey, ?> typeSection;
+    @Nonnull private final FieldSection<?, ?, FieldRefKey, ?> fieldSection;
+    @Nonnull private final MethodSection<?, ?, ?, MethodRefKey, ?> methodSection;
+    @Nonnull private final ProtoSection<?, ?, ProtoRefKey, ?> protoSection;
+    @Nonnull private final MethodHandleSection<MethodHandleKey, ?, ?> methodHandleSection;
+    @Nonnull private final AnnotationSection<StringKey, TypeKey, ?, AnnotationElement, EncodedValue> annotationSection;
+
+    public EncodedValueWriter(
+            @Nonnull DexDataWriter writer,
+            @Nonnull StringSection<StringKey, ?> stringSection,
+            @Nonnull TypeSection<?, TypeKey, ?> typeSection,
+            @Nonnull FieldSection<?, ?, FieldRefKey, ?> fieldSection,
+            @Nonnull MethodSection<?, ?, ?, MethodRefKey, ?> methodSection,
+            ProtoSection<?, ?, ProtoRefKey, ?> protoSection,
+            MethodHandleSection<MethodHandleKey, ?, ?> methodHandleSection,
+            @Nonnull AnnotationSection<StringKey, TypeKey, ?, AnnotationElement, EncodedValue> annotationSection) {
+        this.writer = writer;
+        this.stringSection = stringSection;
+        this.typeSection = typeSection;
+        this.fieldSection = fieldSection;
+        this.methodSection = methodSection;
+        this.protoSection = protoSection;
+        this.methodHandleSection = methodHandleSection;
+        this.annotationSection = annotationSection;
+    }
+
+    protected abstract void writeEncodedValue(@Nonnull EncodedValue encodedValue) throws IOException;
+
+    public void writeAnnotation(TypeKey annotationType,
+                                Collection<? extends AnnotationElement> elements) throws IOException {
+        writer.writeEncodedValueHeader(ValueType.ANNOTATION, 0);
+        writer.writeUleb128(typeSection.getItemIndex(annotationType));
+        writer.writeUleb128(elements.size());
+
+        Collection<? extends AnnotationElement> sortedElements = Ordering.from(BaseAnnotationElement.BY_NAME)
+                .immutableSortedCopy(elements);
+
+        for (AnnotationElement element: sortedElements) {
+            writer.writeUleb128(stringSection.getItemIndex(annotationSection.getElementName(element)));
+            writeEncodedValue(annotationSection.getElementValue(element));
+        }
+    }
+
+    public void writeArray(Collection<? extends EncodedValue> elements) throws IOException {
+        writer.writeEncodedValueHeader(ValueType.ARRAY, 0);
+        writer.writeUleb128(elements.size());
+        for (EncodedValue element: elements) {
+            writeEncodedValue(element);
+        }
+    }
+
+    public void writeBoolean(boolean value) throws IOException {
+        writer.writeEncodedValueHeader(ValueType.BOOLEAN, value ? 1 : 0);
+    }
+
+    public void writeByte(byte value) throws IOException {
+        writer.writeEncodedInt(ValueType.BYTE, value);
+    }
+
+    public void writeChar(char value) throws IOException {
+        writer.writeEncodedUint(ValueType.CHAR, value);
+    }
+
+    public void writeDouble(double value) throws IOException {
+        writer.writeEncodedDouble(ValueType.DOUBLE, value);
+    }
+
+    public void writeEnum(@Nonnull FieldRefKey value) throws IOException {
+        writer.writeEncodedUint(ValueType.ENUM, fieldSection.getItemIndex(value));
+    }
+    
+    public void writeField(@Nonnull FieldRefKey value) throws IOException {
+        writer.writeEncodedUint(ValueType.FIELD, fieldSection.getItemIndex(value));
+    }
+
+    public void writeFloat(float value) throws IOException {
+        writer.writeEncodedFloat(ValueType.FLOAT, value);
+    }
+
+    public void writeInt(int value) throws IOException {
+        writer.writeEncodedInt(ValueType.INT, value);
+    }
+
+    public void writeLong(long value) throws IOException {
+        writer.writeEncodedLong(ValueType.LONG, value);
+    }
+
+    public void writeMethod(@Nonnull MethodRefKey value) throws IOException {
+        writer.writeEncodedUint(ValueType.METHOD, methodSection.getItemIndex(value));
+    }
+
+    public void writeNull() throws IOException {
+        writer.write(ValueType.NULL);
+    }
+
+    public void writeShort(int value) throws IOException {
+        writer.writeEncodedInt(ValueType.SHORT, value);
+    }
+
+    public void writeString(@Nonnull StringKey value) throws IOException {
+        writer.writeEncodedUint(ValueType.STRING, stringSection.getItemIndex(value));
+    }
+
+    public void writeType(@Nonnull TypeKey value) throws IOException {
+        writer.writeEncodedUint(ValueType.TYPE, typeSection.getItemIndex(value));
+    }
+
+    public void writeMethodType(@Nonnull ProtoRefKey value) throws IOException {
+        writer.writeEncodedUint(ValueType.METHOD_TYPE, protoSection.getItemIndex(value));
+    }
+
+    public void writeMethodHandle(@Nonnull MethodHandleKey value) throws IOException {
+        writer.writeEncodedUint(ValueType.METHOD_HANDLE, methodHandleSection.getItemIndex(value));
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/FieldSection.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/FieldSection.java
new file mode 100644
index 0000000..4ca51ab
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/FieldSection.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer;
+
+import org.jf.dexlib2.iface.reference.FieldReference;
+
+import javax.annotation.Nonnull;
+
+public interface FieldSection<StringKey, TypeKey, FieldRefKey extends FieldReference, FieldKey>
+        extends IndexSection<FieldRefKey> {
+    @Nonnull TypeKey getDefiningClass(@Nonnull FieldRefKey key);
+    @Nonnull TypeKey getFieldType(@Nonnull FieldRefKey key);
+    @Nonnull StringKey getName(@Nonnull FieldRefKey key);
+    int getFieldIndex(@Nonnull FieldKey key);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/IndexSection.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/IndexSection.java
new file mode 100644
index 0000000..8abc776
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/IndexSection.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer;
+
+import javax.annotation.Nonnull;
+import java.util.Collection;
+import java.util.Map;
+
+public interface IndexSection<Key> {
+    int getItemIndex(@Nonnull Key key);
+    @Nonnull Collection<? extends Map.Entry<? extends Key, Integer>> getItems();
+    int getItemCount();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/InstructionFactory.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/InstructionFactory.java
new file mode 100644
index 0000000..31db1b8
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/InstructionFactory.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+package org.jf.dexlib2.writer;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.dexlib2.iface.instruction.SwitchElement;
+import org.jf.dexlib2.iface.reference.Reference;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.List;
+
+public interface InstructionFactory<Ref extends Reference> {
+    Instruction makeInstruction10t(@Nonnull Opcode opcode, int codeOffset);
+    Instruction makeInstruction10x(@Nonnull Opcode opcode);
+    Instruction makeInstruction11n(@Nonnull Opcode opcode, int registerA, int literal);
+    Instruction makeInstruction11x(@Nonnull Opcode opcode, int registerA);
+    Instruction makeInstruction12x(@Nonnull Opcode opcode, int registerA, int registerB);
+    Instruction makeInstruction20bc(@Nonnull Opcode opcode, int verificationError, @Nonnull Ref reference);
+    Instruction makeInstruction20t(@Nonnull Opcode opcode, int codeOffset);
+    Instruction makeInstruction21c(@Nonnull Opcode opcode, int registerA, @Nonnull Ref reference);
+    Instruction makeInstruction21ih(@Nonnull Opcode opcode, int registerA, int literal);
+    Instruction makeInstruction21lh(@Nonnull Opcode opcode, int registerA, long literal);
+    Instruction makeInstruction21s(@Nonnull Opcode opcode, int registerA, int literal);
+    Instruction makeInstruction21t(@Nonnull Opcode opcode, int registerA, int codeOffset);
+    Instruction makeInstruction22b(@Nonnull Opcode opcode, int registerA, int registerB, int literal);
+    Instruction makeInstruction22c(@Nonnull Opcode opcode, int registerA, int registerB, @Nonnull Ref reference);
+    Instruction makeInstruction22s(@Nonnull Opcode opcode, int registerA, int registerB, int literal);
+    Instruction makeInstruction22t(@Nonnull Opcode opcode, int registerA, int registerB, int codeOffset);
+    Instruction makeInstruction22x(@Nonnull Opcode opcode, int registerA, int registerB);
+    Instruction makeInstruction23x(@Nonnull Opcode opcode, int registerA, int registerB, int registerC);
+    Instruction makeInstruction30t(@Nonnull Opcode opcode, int codeOffset);
+    Instruction makeInstruction31c(@Nonnull Opcode opcode, int registerA, @Nonnull Ref reference);
+    Instruction makeInstruction31i(@Nonnull Opcode opcode, int registerA, int literal);
+    Instruction makeInstruction31t(@Nonnull Opcode opcode, int registerA, int codeOffset);
+    Instruction makeInstruction32x(@Nonnull Opcode opcode, int registerA, int registerB);
+    Instruction makeInstruction35c(@Nonnull Opcode opcode, int registerCount, int registerC, int registerD, int registerE,
+                            int registerF, int registerG, @Nonnull Ref reference);
+    Instruction makeInstruction3rc(@Nonnull Opcode opcode,  int startRegister, int registerCount,
+                            @Nonnull Ref reference);
+    Instruction makeInstruction51l(@Nonnull Opcode opcode, int registerA, long literal);
+    Instruction makeSparseSwitchPayload(@Nullable List<? extends SwitchElement> switchElements);
+    Instruction makePackedSwitchPayload(@Nullable List<? extends SwitchElement> switchElements);
+    Instruction makeArrayPayload(int elementWidth, @Nullable List<Number> arrayElements);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/InstructionWriter.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/InstructionWriter.java
new file mode 100644
index 0000000..f86f683
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/InstructionWriter.java
@@ -0,0 +1,570 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer;
+
+import com.google.common.collect.Ordering;
+import com.google.common.primitives.Ints;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.ReferenceType;
+import org.jf.dexlib2.iface.instruction.DualReferenceInstruction;
+import org.jf.dexlib2.iface.instruction.ReferenceInstruction;
+import org.jf.dexlib2.iface.instruction.SwitchElement;
+import org.jf.dexlib2.iface.instruction.formats.*;
+import org.jf.dexlib2.iface.reference.*;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.util.Comparator;
+import java.util.List;
+
+public class InstructionWriter<StringRef extends StringReference, TypeRef extends TypeReference,
+        FieldRefKey extends FieldReference, MethodRefKey extends MethodReference,
+        ProtoRefKey extends MethodProtoReference, MethodHandleKey extends MethodHandleReference,
+        CallSiteKey extends CallSiteReference> {
+    @Nonnull private final Opcodes opcodes;
+    @Nonnull private final DexDataWriter writer;
+    @Nonnull private final StringSection<?, StringRef> stringSection;
+    @Nonnull private final TypeSection<?, ?, TypeRef> typeSection;
+    @Nonnull private final FieldSection<?, ?, FieldRefKey, ?> fieldSection;
+    @Nonnull private final MethodSection<?, ?, ?, MethodRefKey, ?> methodSection;
+    @Nonnull private final ProtoSection<?, ?, ProtoRefKey, ?> protoSection;
+    @Nonnull private final MethodHandleSection<MethodHandleKey, ?, ?> methodHandleSection;
+    @Nonnull private final CallSiteSection<CallSiteKey, ?> callSiteSection;
+
+    @Nonnull static <StringRef extends StringReference, TypeRef extends TypeReference,
+            FieldRefKey extends FieldReference, MethodRefKey extends MethodReference,
+            ProtoRefKey extends MethodProtoReference, MethodHandleKey extends MethodHandleReference,
+            CallSiteKey extends CallSiteReference>
+            InstructionWriter<StringRef, TypeRef, FieldRefKey, MethodRefKey, ProtoRefKey, MethodHandleKey, CallSiteKey>
+            makeInstructionWriter(
+                @Nonnull Opcodes opcodes,
+                @Nonnull DexDataWriter writer,
+                @Nonnull StringSection<?, StringRef> stringSection,
+                @Nonnull TypeSection<?, ?, TypeRef> typeSection,
+                @Nonnull FieldSection<?, ?, FieldRefKey, ?> fieldSection,
+                @Nonnull MethodSection<?, ?, ?, MethodRefKey, ?> methodSection,
+                @Nonnull ProtoSection<?, ?, ProtoRefKey, ?> protoSection,
+                @Nonnull MethodHandleSection<MethodHandleKey, ?, ?> methodHandleSection,
+                @Nonnull CallSiteSection<CallSiteKey, ?> callSiteSection) {
+        return new InstructionWriter<
+                StringRef, TypeRef, FieldRefKey, MethodRefKey, ProtoRefKey, MethodHandleKey,CallSiteKey>(
+                        opcodes, writer, stringSection, typeSection, fieldSection, methodSection, protoSection,
+                        methodHandleSection, callSiteSection);
+    }
+
+    InstructionWriter(@Nonnull Opcodes opcodes,
+                      @Nonnull DexDataWriter writer,
+                      @Nonnull StringSection<?, StringRef> stringSection,
+                      @Nonnull TypeSection<?, ?, TypeRef> typeSection,
+                      @Nonnull FieldSection<?, ?, FieldRefKey, ?> fieldSection,
+                      @Nonnull MethodSection<?, ?, ?, MethodRefKey, ?> methodSection,
+                      @Nonnull ProtoSection<?, ?, ProtoRefKey, ?> protoSection,
+                      @Nonnull MethodHandleSection<MethodHandleKey, ?, ?> methodHandleSection,
+                      @Nonnull CallSiteSection<CallSiteKey, ?> callSiteSection) {
+        this.opcodes = opcodes;
+        this.writer = writer;
+        this.stringSection = stringSection;
+        this.typeSection = typeSection;
+        this.fieldSection = fieldSection;
+        this.methodSection = methodSection;
+        this.protoSection = protoSection;
+        this.methodHandleSection = methodHandleSection;
+        this.callSiteSection = callSiteSection;
+    }
+
+    private short getOpcodeValue(Opcode opcode) {
+        Short value = opcodes.getOpcodeValue(opcode);
+        if (value == null) {
+            throw new ExceptionWithContext("Instruction %s is invalid for api %d", opcode.name, opcodes.api);
+        }
+        return value;
+    }
+
+    public void write(@Nonnull Instruction10t instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(instruction.getCodeOffset());
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction10x instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(0);
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction11n instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(packNibbles(instruction.getRegisterA(), instruction.getNarrowLiteral()));
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction11x instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(instruction.getRegisterA());
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction12x instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(packNibbles(instruction.getRegisterA(), instruction.getRegisterB()));
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction20bc instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(instruction.getVerificationError());
+            writer.writeUshort(getReferenceIndex(instruction));
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction20t instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(0);
+            writer.writeShort(instruction.getCodeOffset());
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction21c instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(instruction.getRegisterA());
+            writer.writeUshort(getReferenceIndex(instruction));
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction21ih instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(instruction.getRegisterA());
+            writer.writeShort(instruction.getHatLiteral());
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction21lh instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(instruction.getRegisterA());
+            writer.writeShort(instruction.getHatLiteral());
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction21s instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(instruction.getRegisterA());
+            writer.writeShort(instruction.getNarrowLiteral());
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction21t instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(instruction.getRegisterA());
+            writer.writeShort(instruction.getCodeOffset());
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction22b instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(instruction.getRegisterA());
+            writer.write(instruction.getRegisterB());
+            writer.write(instruction.getNarrowLiteral());
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction22c instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(packNibbles(instruction.getRegisterA(), instruction.getRegisterB()));
+            writer.writeUshort(getReferenceIndex(instruction));
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction22cs instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(packNibbles(instruction.getRegisterA(), instruction.getRegisterB()));
+            writer.writeUshort(instruction.getFieldOffset());
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction22s instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(packNibbles(instruction.getRegisterA(), instruction.getRegisterB()));
+            writer.writeShort(instruction.getNarrowLiteral());
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction22t instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(packNibbles(instruction.getRegisterA(), instruction.getRegisterB()));
+            writer.writeShort(instruction.getCodeOffset());
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction22x instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(instruction.getRegisterA());
+            writer.writeUshort(instruction.getRegisterB());
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction23x instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(instruction.getRegisterA());
+            writer.write(instruction.getRegisterB());
+            writer.write(instruction.getRegisterC());
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction30t instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(0);
+            writer.writeInt(instruction.getCodeOffset());
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction31c instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(instruction.getRegisterA());
+            writer.writeInt(getReferenceIndex(instruction));
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction31i instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(instruction.getRegisterA());
+            writer.writeInt(instruction.getNarrowLiteral());
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction31t instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(instruction.getRegisterA());
+            writer.writeInt(instruction.getCodeOffset());
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction32x instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(0);
+            writer.writeUshort(instruction.getRegisterA());
+            writer.writeUshort(instruction.getRegisterB());
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction35c instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(packNibbles(instruction.getRegisterG(), instruction.getRegisterCount()));
+            writer.writeUshort(getReferenceIndex(instruction));
+            writer.write(packNibbles(instruction.getRegisterC(), instruction.getRegisterD()));
+            writer.write(packNibbles(instruction.getRegisterE(), instruction.getRegisterF()));
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction35mi instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(packNibbles(instruction.getRegisterG(), instruction.getRegisterCount()));
+            writer.writeUshort(instruction.getInlineIndex());
+            writer.write(packNibbles(instruction.getRegisterC(), instruction.getRegisterD()));
+            writer.write(packNibbles(instruction.getRegisterE(), instruction.getRegisterF()));
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction35ms instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(packNibbles(instruction.getRegisterG(), instruction.getRegisterCount()));
+            writer.writeUshort(instruction.getVtableIndex());
+            writer.write(packNibbles(instruction.getRegisterC(), instruction.getRegisterD()));
+            writer.write(packNibbles(instruction.getRegisterE(), instruction.getRegisterF()));
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction3rc instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(instruction.getRegisterCount());
+            writer.writeUshort(getReferenceIndex(instruction));
+            writer.writeUshort(instruction.getStartRegister());
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction3rmi instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(instruction.getRegisterCount());
+            writer.writeUshort(instruction.getInlineIndex());
+            writer.writeUshort(instruction.getStartRegister());
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+
+    public void write(@Nonnull Instruction3rms instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(instruction.getRegisterCount());
+            writer.writeUshort(instruction.getVtableIndex());
+            writer.writeUshort(instruction.getStartRegister());
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction45cc instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(packNibbles(instruction.getRegisterG(), instruction.getRegisterCount()));
+            writer.writeUshort(getReferenceIndex(instruction));
+            writer.write(packNibbles(instruction.getRegisterC(), instruction.getRegisterD()));
+            writer.write(packNibbles(instruction.getRegisterE(), instruction.getRegisterF()));
+            writer.writeUshort(getReference2Index(instruction));
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction4rcc instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(instruction.getRegisterCount());
+            writer.writeUshort(getReferenceIndex(instruction));
+            writer.writeUshort(instruction.getStartRegister());
+            writer.writeUshort(getReference2Index(instruction));
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull Instruction51l instruction) {
+        try {
+            writer.write(getOpcodeValue(instruction.getOpcode()));
+            writer.write(instruction.getRegisterA());
+            writer.writeLong(instruction.getWideLiteral());
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull ArrayPayload instruction) {
+        try {
+            writer.writeUshort(getOpcodeValue(instruction.getOpcode()));
+            writer.writeUshort(instruction.getElementWidth());
+            List<Number> elements = instruction.getArrayElements();
+            writer.writeInt(elements.size());
+            switch (instruction.getElementWidth()) {
+                case 1:
+                    for (Number element: elements) {
+                        writer.write(element.byteValue());
+                    }
+                    break;
+                case 2:
+                    for (Number element: elements) {
+                        writer.writeShort(element.shortValue());
+                    }
+                    break;
+                case 4:
+                    for (Number element: elements) {
+                        writer.writeInt(element.intValue());
+                    }
+                    break;
+                case 8:
+                    for (Number element: elements) {
+                        writer.writeLong(element.longValue());
+                    }
+                    break;
+            }
+            if ((writer.getPosition() & 1) != 0) {
+                writer.write(0);
+            }
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    public void write(@Nonnull SparseSwitchPayload instruction) {
+        try {
+            writer.writeUbyte(0);
+            writer.writeUbyte(getOpcodeValue(instruction.getOpcode()) >> 8);
+            List<? extends SwitchElement> elements = Ordering.from(switchElementComparator).immutableSortedCopy(
+                    instruction.getSwitchElements());
+            writer.writeUshort(elements.size());
+            for (SwitchElement element: elements) {
+                writer.writeInt(element.getKey());
+            }
+            for (SwitchElement element: elements) {
+                writer.writeInt(element.getOffset());
+            }
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    private final Comparator<SwitchElement> switchElementComparator = new Comparator<SwitchElement>() {
+        @Override public int compare(SwitchElement element1, SwitchElement element2) {
+            return Ints.compare(element1.getKey(), element2.getKey());
+        }
+    };
+
+    public void write(@Nonnull PackedSwitchPayload instruction) {
+        try {
+            writer.writeUbyte(0);
+            writer.writeUbyte(getOpcodeValue(instruction.getOpcode()) >> 8);
+            List<? extends SwitchElement> elements = instruction.getSwitchElements();
+            writer.writeUshort(elements.size());
+            if (elements.size() == 0) {
+                writer.writeInt(0);
+            } else {
+                writer.writeInt(elements.get(0).getKey());
+                for (SwitchElement element: elements) {
+                    writer.writeInt(element.getOffset());
+                }
+            }
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    private static int packNibbles(int a, int b) {
+        return (b << 4) | a;
+    }
+
+    private int getReferenceIndex(ReferenceInstruction referenceInstruction) {
+        return getReferenceIndex(referenceInstruction.getReferenceType(),
+                referenceInstruction.getReference());
+    }
+
+    private int getReference2Index(DualReferenceInstruction referenceInstruction) {
+        return getReferenceIndex(referenceInstruction.getReferenceType2(),
+                referenceInstruction.getReference2());
+    }
+
+    private int getReferenceIndex(int referenceType, Reference reference) {
+        switch (referenceType) {
+            case ReferenceType.FIELD:
+                return fieldSection.getItemIndex((FieldRefKey) reference);
+            case ReferenceType.METHOD:
+                return methodSection.getItemIndex((MethodRefKey) reference);
+            case ReferenceType.STRING:
+                return stringSection.getItemIndex((StringRef) reference);
+            case ReferenceType.TYPE:
+                return typeSection.getItemIndex((TypeRef) reference);
+            case ReferenceType.METHOD_PROTO:
+                return protoSection.getItemIndex((ProtoRefKey) reference);
+            case ReferenceType.METHOD_HANDLE:
+                return methodHandleSection.getItemIndex((MethodHandleKey) reference);
+            case ReferenceType.CALL_SITE:
+                return callSiteSection.getItemIndex((CallSiteKey) reference);
+            default:
+                throw new ExceptionWithContext("Unknown reference type: %d",  referenceType);
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/MethodHandleSection.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/MethodHandleSection.java
new file mode 100644
index 0000000..2190ab9
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/MethodHandleSection.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer;
+
+import org.jf.dexlib2.iface.reference.FieldReference;
+import org.jf.dexlib2.iface.reference.MethodHandleReference;
+import org.jf.dexlib2.iface.reference.MethodReference;
+
+public interface MethodHandleSection<MethodHandleKey extends MethodHandleReference, FieldRefKey extends FieldReference,
+        MethodRefKey extends MethodReference> extends IndexSection<MethodHandleKey> {
+    FieldRefKey getFieldReference(MethodHandleKey methodHandleReference);
+    MethodRefKey getMethodReference(MethodHandleKey methodHandleReference);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/MethodSection.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/MethodSection.java
new file mode 100644
index 0000000..f31e84c
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/MethodSection.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer;
+
+import org.jf.dexlib2.iface.reference.MethodProtoReference;
+import org.jf.dexlib2.iface.reference.MethodReference;
+
+import javax.annotation.Nonnull;
+
+public interface MethodSection<StringKey, TypeKey, ProtoRefKey extends MethodProtoReference,
+        MethodRefKey extends MethodReference, MethodKey>
+        extends IndexSection<MethodRefKey> {
+    @Nonnull MethodRefKey getMethodReference(@Nonnull MethodKey key);
+    @Nonnull TypeKey getDefiningClass(@Nonnull MethodRefKey key);
+    @Nonnull ProtoRefKey getPrototype(@Nonnull MethodRefKey key);
+    @Nonnull ProtoRefKey getPrototype(@Nonnull MethodKey key);
+    @Nonnull StringKey getName(@Nonnull MethodRefKey key);
+    int getMethodIndex(@Nonnull MethodKey key);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/NullableIndexSection.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/NullableIndexSection.java
new file mode 100644
index 0000000..f3b6510
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/NullableIndexSection.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer;
+
+import javax.annotation.Nullable;
+
+public interface NullableIndexSection<Key> extends IndexSection<Key> {
+    int getNullableItemIndex(@Nullable Key key);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/NullableOffsetSection.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/NullableOffsetSection.java
new file mode 100644
index 0000000..9762ee5
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/NullableOffsetSection.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer;
+
+import javax.annotation.Nullable;
+
+public interface NullableOffsetSection<Key> extends OffsetSection<Key> {
+    int getNullableItemOffset(@Nullable Key key);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/OffsetSection.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/OffsetSection.java
new file mode 100644
index 0000000..6d8d8f0
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/OffsetSection.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer;
+
+import javax.annotation.Nonnull;
+import java.util.Collection;
+import java.util.Map;
+
+public interface OffsetSection<Key> {
+    int getItemOffset(@Nonnull Key key);
+    @Nonnull Collection<? extends Map.Entry<? extends Key, Integer>> getItems();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/ProtoSection.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/ProtoSection.java
new file mode 100644
index 0000000..e9ca595
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/ProtoSection.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public interface ProtoSection<StringKey, TypeKey, ProtoKey, TypeListKey> extends IndexSection<ProtoKey> {
+    @Nonnull StringKey getShorty(@Nonnull ProtoKey key);
+    @Nonnull TypeKey getReturnType(@Nonnull ProtoKey key);
+    @Nullable TypeListKey getParameters(@Nonnull ProtoKey key);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/StringSection.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/StringSection.java
new file mode 100644
index 0000000..3f370ee
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/StringSection.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer;
+
+import org.jf.dexlib2.iface.reference.StringReference;
+
+import javax.annotation.Nonnull;
+
+public interface StringSection<StringKey, StringRef extends StringReference> extends NullableIndexSection<StringKey> {
+    int getItemIndex(@Nonnull StringRef key);
+    boolean hasJumboIndexes();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/TypeListSection.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/TypeListSection.java
new file mode 100644
index 0000000..18afa99
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/TypeListSection.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Collection;
+
+public interface TypeListSection<TypeKey, TypeListKey> extends NullableOffsetSection<TypeListKey> {
+    int getNullableItemOffset(@Nullable TypeListKey index);
+    @Nonnull Collection<? extends TypeKey> getTypes(@Nullable TypeListKey key);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/TypeSection.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/TypeSection.java
new file mode 100644
index 0000000..79ecd67
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/TypeSection.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer;
+
+import org.jf.dexlib2.iface.reference.TypeReference;
+
+import javax.annotation.Nonnull;
+
+public interface TypeSection<StringKey, TypeKey, TypeRef extends TypeReference> extends NullableIndexSection<TypeKey> {
+    @Nonnull StringKey getString(@Nonnull TypeKey key);
+    int getItemIndex(@Nonnull TypeRef key);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BaseBuilderPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BaseBuilderPool.java
new file mode 100644
index 0000000..64ba1d7
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BaseBuilderPool.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import javax.annotation.Nonnull;
+
+public class BaseBuilderPool {
+    @Nonnull protected final DexBuilder dexBuilder;
+
+    public BaseBuilderPool(@Nonnull DexBuilder dexBuilder) {
+        this.dexBuilder = dexBuilder;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotation.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotation.java
new file mode 100644
index 0000000..3b413b0
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotation.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import org.jf.dexlib2.base.BaseAnnotation;
+import org.jf.dexlib2.writer.DexWriter;
+
+import javax.annotation.Nonnull;
+import java.util.Set;
+
+class BuilderAnnotation extends BaseAnnotation {
+    int visibility;
+    @Nonnull final BuilderTypeReference type;
+    @Nonnull final Set<? extends BuilderAnnotationElement> elements;
+    int offset = DexWriter.NO_OFFSET;
+
+    public BuilderAnnotation(int visibility, @Nonnull BuilderTypeReference type,
+                             @Nonnull Set<? extends BuilderAnnotationElement> elements) {
+        this.visibility = visibility;
+        this.type = type;
+        this.elements = elements;
+    }
+
+    @Override public int getVisibility() {
+        return visibility;
+    }
+
+    @Nonnull @Override public String getType() {
+        return type.getType();
+    }
+
+    @Nonnull @Override public Set<? extends BuilderAnnotationElement> getElements() {
+        return elements;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationElement.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationElement.java
new file mode 100644
index 0000000..d758ddb
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationElement.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import org.jf.dexlib2.base.BaseAnnotationElement;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.dexlib2.writer.builder.BuilderEncodedValues.BuilderEncodedValue;
+
+import javax.annotation.Nonnull;
+
+public class BuilderAnnotationElement extends BaseAnnotationElement {
+    @Nonnull final BuilderStringReference name;
+    @Nonnull final BuilderEncodedValue value;
+
+    public BuilderAnnotationElement(@Nonnull BuilderStringReference name, @Nonnull BuilderEncodedValue value) {
+        this.name = name;
+        this.value = value;
+    }
+
+    @Nonnull @Override public String getName() {
+        return name.getString();
+    }
+
+    @Nonnull @Override public EncodedValue getValue() {
+        return value;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationPool.java
new file mode 100644
index 0000000..37e536c
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationPool.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import com.google.common.collect.Maps;
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.writer.AnnotationSection;
+import org.jf.dexlib2.writer.builder.BuilderEncodedValues.BuilderEncodedValue;
+
+import javax.annotation.Nonnull;
+import java.util.Collection;
+import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentMap;
+
+class BuilderAnnotationPool extends BaseBuilderPool implements AnnotationSection<BuilderStringReference,
+        BuilderTypeReference, BuilderAnnotation, BuilderAnnotationElement, BuilderEncodedValue> {
+    @Nonnull private final ConcurrentMap<Annotation, BuilderAnnotation> internedItems =
+            Maps.newConcurrentMap();
+
+    public BuilderAnnotationPool(@Nonnull DexBuilder dexBuilder) {
+        super(dexBuilder);
+    }
+
+    @Nonnull public BuilderAnnotation internAnnotation(@Nonnull Annotation annotation) {
+        BuilderAnnotation ret = internedItems.get(annotation);
+        if (ret != null) {
+            return ret;
+        }
+
+        BuilderAnnotation dexBuilderAnnotation = new BuilderAnnotation(
+                annotation.getVisibility(),
+                dexBuilder.typeSection.internType(annotation.getType()),
+                dexBuilder.internAnnotationElements(annotation.getElements()));
+        ret = internedItems.putIfAbsent(dexBuilderAnnotation, dexBuilderAnnotation);
+        return ret==null?dexBuilderAnnotation:ret;
+    }
+
+    @Override public int getVisibility(@Nonnull BuilderAnnotation key) {
+        return key.visibility;
+    }
+
+    @Nonnull @Override public BuilderTypeReference getType(@Nonnull BuilderAnnotation key) {
+        return key.type;
+    }
+
+    @Nonnull @Override
+    public Collection<? extends BuilderAnnotationElement> getElements(@Nonnull BuilderAnnotation key) {
+        return key.elements;
+    }
+
+    @Nonnull @Override
+    public BuilderStringReference getElementName(@Nonnull BuilderAnnotationElement element) {
+        return element.name;
+    }
+
+    @Nonnull @Override
+    public BuilderEncodedValue getElementValue(@Nonnull BuilderAnnotationElement element) {
+        return element.value;
+    }
+
+    @Override public int getItemOffset(@Nonnull BuilderAnnotation key) {
+        return key.offset;
+    }
+
+    @Nonnull @Override public Collection<? extends Entry<? extends BuilderAnnotation, Integer>> getItems() {
+        return new BuilderMapEntryCollection<BuilderAnnotation>(internedItems.values()) {
+            @Override protected int getValue(@Nonnull BuilderAnnotation key) {
+                return key.offset;
+            }
+
+            @Override protected int setValue(@Nonnull BuilderAnnotation key, int value) {
+                int prev = key.offset;
+                key.offset = value;
+                return prev;
+            }
+        };
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationSet.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationSet.java
new file mode 100644
index 0000000..ef9a9d6
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationSet.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import com.google.common.collect.ImmutableSet;
+import org.jf.dexlib2.writer.DexWriter;
+
+import javax.annotation.Nonnull;
+import java.util.AbstractSet;
+import java.util.Iterator;
+import java.util.Set;
+
+public class BuilderAnnotationSet extends AbstractSet<BuilderAnnotation> {
+    public static final BuilderAnnotationSet EMPTY =
+            new BuilderAnnotationSet(ImmutableSet.<BuilderAnnotation>of());
+
+    @Nonnull final Set<BuilderAnnotation> annotations;
+    int offset = DexWriter.NO_OFFSET;
+
+    public BuilderAnnotationSet(@Nonnull Set<BuilderAnnotation> annotations) {
+        this.annotations = annotations;
+    }
+
+    @Nonnull @Override public Iterator<BuilderAnnotation> iterator() {
+        return annotations.iterator();
+    }
+
+    @Override public int size() {
+        return annotations.size();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationSetPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationSetPool.java
new file mode 100644
index 0000000..45af5cf
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationSetPool.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import com.google.common.base.Function;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterators;
+import com.google.common.collect.Maps;
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.writer.AnnotationSetSection;
+import org.jf.dexlib2.writer.DexWriter;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Collection;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.concurrent.ConcurrentMap;
+
+class BuilderAnnotationSetPool extends BaseBuilderPool
+        implements AnnotationSetSection<BuilderAnnotation, BuilderAnnotationSet> {
+    @Nonnull private final ConcurrentMap<Set<? extends Annotation>, BuilderAnnotationSet> internedItems =
+            Maps.newConcurrentMap();
+
+    public BuilderAnnotationSetPool(@Nonnull DexBuilder dexBuilder) {
+        super(dexBuilder);
+    }
+
+    @Nonnull public BuilderAnnotationSet internAnnotationSet(@Nullable Set<? extends Annotation> annotations) {
+        if (annotations == null) {
+            return BuilderAnnotationSet.EMPTY;
+        }
+
+        BuilderAnnotationSet ret = internedItems.get(annotations);
+        if (ret != null) {
+            return ret;
+        }
+
+        BuilderAnnotationSet annotationSet = new BuilderAnnotationSet(
+                ImmutableSet.copyOf(Iterators.transform(annotations.iterator(),
+                        new Function<Annotation, BuilderAnnotation>() {
+                            @Nullable @Override public BuilderAnnotation apply(Annotation input) {
+                                return dexBuilder.annotationSection.internAnnotation(input);
+                            }
+                        })));
+
+        ret = internedItems.putIfAbsent(annotationSet, annotationSet);
+        return ret==null?annotationSet:ret;
+    }
+
+    @Nonnull @Override
+    public Collection<? extends BuilderAnnotation> getAnnotations(@Nonnull BuilderAnnotationSet key) {
+        return key.annotations; 
+    }
+
+    @Override public int getNullableItemOffset(@Nullable BuilderAnnotationSet key) {
+        return key==null?DexWriter.NO_OFFSET:key.offset;
+    }
+
+    @Override public int getItemOffset(@Nonnull BuilderAnnotationSet key) {
+        return key.offset;
+    }
+
+    @Nonnull @Override public Collection<? extends Entry<? extends BuilderAnnotationSet, Integer>> getItems() {
+        return new BuilderMapEntryCollection<BuilderAnnotationSet>(internedItems.values()) {
+            @Override protected int getValue(@Nonnull BuilderAnnotationSet key) {
+                return key.offset;
+            }
+
+            @Override protected int setValue(@Nonnull BuilderAnnotationSet key, int value) {
+                int prev = key.offset;
+                key.offset = value;
+                return prev;
+            }
+        };
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderCallSitePool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderCallSitePool.java
new file mode 100644
index 0000000..0c5c6ae
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderCallSitePool.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import com.google.common.collect.Maps;
+import org.jf.dexlib2.iface.reference.CallSiteReference;
+import org.jf.dexlib2.writer.CallSiteSection;
+import org.jf.dexlib2.writer.builder.BuilderEncodedValues.BuilderArrayEncodedValue;
+import org.jf.dexlib2.writer.util.CallSiteUtil;
+
+import javax.annotation.Nonnull;
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.ConcurrentMap;
+
+public class BuilderCallSitePool extends BaseBuilderPool
+        implements CallSiteSection<BuilderCallSiteReference, BuilderArrayEncodedValue> {
+    @Nonnull private final ConcurrentMap<CallSiteReference, BuilderCallSiteReference> internedItems =
+            Maps.newConcurrentMap();
+
+    public BuilderCallSitePool(@Nonnull DexBuilder dexBuilder) {
+        super(dexBuilder);
+    }
+
+    @Nonnull public BuilderCallSiteReference internCallSite(@Nonnull CallSiteReference callSiteReference) {
+        BuilderCallSiteReference internedCallSite = internedItems.get(callSiteReference);
+        if (internedCallSite != null) {
+            return internedCallSite;
+        }
+        BuilderArrayEncodedValue encodedCallSite = dexBuilder.encodedArraySection.internArrayEncodedValue(
+                CallSiteUtil.getEncodedCallSite(callSiteReference));
+        internedCallSite = new BuilderCallSiteReference(callSiteReference.getName(), encodedCallSite);
+        BuilderCallSiteReference existing = internedItems.putIfAbsent(internedCallSite, internedCallSite);
+        return existing == null ? internedCallSite : existing;
+    }
+
+    @Override
+    public BuilderArrayEncodedValue getEncodedCallSite(BuilderCallSiteReference callSiteReference) {
+        return callSiteReference.encodedCallSite;
+    }
+
+    @Override
+    public int getItemIndex(@Nonnull BuilderCallSiteReference builderCallSite) {
+        return builderCallSite.index;
+    }
+
+    @Nonnull
+    @Override
+    public Collection<? extends Map.Entry<? extends BuilderCallSiteReference, Integer>> getItems() {
+        return new BuilderMapEntryCollection<BuilderCallSiteReference>(internedItems.values()) {
+            @Override
+            protected int getValue(@Nonnull BuilderCallSiteReference builderCallSiteReference) {
+                return builderCallSiteReference.index;
+            }
+
+            @Override
+            protected int setValue(@Nonnull BuilderCallSiteReference builderCallSiteReference, int value) {
+                int prev = builderCallSiteReference.index;
+                builderCallSiteReference.index = value;
+                return prev;
+            }
+        };
+    }
+
+    @Override
+    public int getItemCount() {
+        return internedItems.size();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderCallSiteReference.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderCallSiteReference.java
new file mode 100644
index 0000000..76e5b38
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderCallSiteReference.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import com.google.common.collect.ImmutableList;
+import org.jf.dexlib2.base.reference.BaseCallSiteReference;
+import org.jf.dexlib2.iface.value.StringEncodedValue;
+import org.jf.dexlib2.writer.builder.BuilderEncodedValues.BuilderArrayEncodedValue;
+import org.jf.dexlib2.writer.builder.BuilderEncodedValues.BuilderEncodedValue;
+import org.jf.dexlib2.writer.builder.BuilderEncodedValues.BuilderMethodHandleEncodedValue;
+import org.jf.dexlib2.writer.builder.BuilderEncodedValues.BuilderMethodTypeEncodedValue;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+import static org.jf.dexlib2.writer.DexWriter.NO_INDEX;
+
+public class BuilderCallSiteReference extends BaseCallSiteReference implements BuilderReference {
+    @Nonnull final String name;
+    @Nonnull final BuilderArrayEncodedValue encodedCallSite;
+    int index = NO_INDEX;
+
+    public BuilderCallSiteReference(@Nonnull String name,
+                                    @Nonnull BuilderArrayEncodedValue encodedCallSite) {
+        this.name = name;
+        this.encodedCallSite = encodedCallSite;
+    }
+
+    @Nonnull @Override public String getName() {
+        return name;
+    }
+
+    @Nonnull @Override public BuilderMethodHandleReference getMethodHandle() {
+        return ((BuilderMethodHandleEncodedValue) encodedCallSite.elements.get(0)).getValue();
+    }
+
+    @Nonnull @Override public String getMethodName() {
+        return ((StringEncodedValue) encodedCallSite.elements.get(1)).getValue();
+    }
+
+    @Nonnull @Override public BuilderMethodProtoReference getMethodProto() {
+        return ((BuilderMethodTypeEncodedValue) encodedCallSite.elements.get(2)).getValue();
+    }
+
+    @Nonnull @Override public List<? extends BuilderEncodedValue> getExtraArguments() {
+        if (encodedCallSite.elements.size() <= 3) {
+            return ImmutableList.of();
+        }
+        return encodedCallSite.elements.subList(3, encodedCallSite.elements.size());
+    }
+
+    @Override public int getIndex() {
+        return index;
+    }
+
+    @Override public void setIndex(int index) {
+        this.index = index;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderClassDef.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderClassDef.java
new file mode 100644
index 0000000..1d85281
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderClassDef.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import com.google.common.base.Functions;
+import com.google.common.collect.*;
+import org.jf.dexlib2.base.reference.BaseTypeReference;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.util.MethodUtil;
+import org.jf.dexlib2.writer.DexWriter;
+import org.jf.dexlib2.writer.builder.BuilderEncodedValues.BuilderArrayEncodedValue;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.*;
+
+public class BuilderClassDef extends BaseTypeReference implements ClassDef {
+    @Nonnull final BuilderTypeReference type;
+    final int accessFlags;
+    @Nullable final BuilderTypeReference superclass;
+    @Nonnull final BuilderTypeList interfaces;
+    @Nullable final BuilderStringReference sourceFile;
+    @Nonnull final BuilderAnnotationSet annotations;
+    @Nonnull final SortedSet<BuilderField> staticFields;
+    @Nonnull final SortedSet<BuilderField> instanceFields;
+    @Nonnull final SortedSet<BuilderMethod> directMethods;
+    @Nonnull final SortedSet<BuilderMethod> virtualMethods;
+    @Nullable final BuilderArrayEncodedValue staticInitializers;
+
+    int classDefIndex = DexWriter.NO_INDEX;
+    int annotationDirectoryOffset = DexWriter.NO_OFFSET;
+
+    BuilderClassDef(@Nonnull BuilderTypeReference type,
+                    int accessFlags,
+                    @Nullable BuilderTypeReference superclass,
+                    @Nonnull BuilderTypeList interfaces,
+                    @Nullable BuilderStringReference sourceFile,
+                    @Nonnull BuilderAnnotationSet annotations,
+                    @Nullable SortedSet<BuilderField> staticFields,
+                    @Nullable SortedSet<BuilderField> instanceFields,
+                    @Nullable Iterable<? extends BuilderMethod> methods,
+                    @Nullable BuilderArrayEncodedValue staticInitializers) {
+        if (methods == null) {
+            methods = ImmutableList.of();
+        }
+        if (staticFields == null) {
+            staticFields = ImmutableSortedSet.of();
+        }
+        if (instanceFields == null) {
+            instanceFields = ImmutableSortedSet.of();
+        }
+
+        this.type = type;
+        this.accessFlags = accessFlags;
+        this.superclass = superclass;
+        this.interfaces = interfaces;
+        this.sourceFile = sourceFile;
+        this.annotations = annotations;
+        this.staticFields = staticFields;
+        this.instanceFields = instanceFields;
+        this.directMethods = ImmutableSortedSet.copyOf(Iterables.filter(methods, MethodUtil.METHOD_IS_DIRECT));
+        this.virtualMethods = ImmutableSortedSet.copyOf(Iterables.filter(methods, MethodUtil.METHOD_IS_VIRTUAL));
+        this.staticInitializers = staticInitializers;
+    }
+
+    @Nonnull @Override public String getType() { return type.getType(); }
+    @Override public int getAccessFlags() { return accessFlags; }
+    @Nullable @Override public String getSuperclass() { return superclass==null?null:superclass.getType(); }
+    @Nullable @Override public String getSourceFile() { return sourceFile==null?null:sourceFile.getString(); }
+    @Nonnull @Override public BuilderAnnotationSet getAnnotations() { return annotations; }
+    @Nonnull @Override public SortedSet<BuilderField> getStaticFields() { return staticFields; }
+    @Nonnull @Override public SortedSet<BuilderField> getInstanceFields() { return instanceFields; }
+    @Nonnull @Override public SortedSet<BuilderMethod> getDirectMethods() { return directMethods; }
+    @Nonnull @Override public SortedSet<BuilderMethod> getVirtualMethods() { return virtualMethods; }
+
+    @Nonnull @Override
+    public List<String> getInterfaces() {
+        return Lists.transform(this.interfaces, Functions.toStringFunction());
+    }
+
+    @Nonnull @Override public Collection<BuilderField> getFields() {
+        return new AbstractCollection<BuilderField>() {
+            @Nonnull @Override public Iterator<BuilderField> iterator() {
+                return Iterators.mergeSorted(
+                        ImmutableList.of(staticFields.iterator(), instanceFields.iterator()),
+                        Ordering.natural());
+            }
+
+            @Override public int size() {
+                return staticFields.size() + instanceFields.size();
+            }
+        };
+    }
+
+    @Nonnull @Override public Collection<BuilderMethod> getMethods() {
+        return new AbstractCollection<BuilderMethod>() {
+            @Nonnull @Override public Iterator<BuilderMethod> iterator() {
+                return Iterators.mergeSorted(
+                        ImmutableList.of(directMethods.iterator(), virtualMethods.iterator()),
+                        Ordering.natural());
+            }
+
+            @Override public int size() {
+                return directMethods.size() + virtualMethods.size();
+            }
+        };
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderClassPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderClassPool.java
new file mode 100644
index 0000000..deecf23
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderClassPool.java
@@ -0,0 +1,439 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.collect.*;
+import org.jf.dexlib2.DebugItemType;
+import org.jf.dexlib2.HiddenApiRestriction;
+import org.jf.dexlib2.builder.MutableMethodImplementation;
+import org.jf.dexlib2.iface.ExceptionHandler;
+import org.jf.dexlib2.iface.Field;
+import org.jf.dexlib2.iface.MethodImplementation;
+import org.jf.dexlib2.iface.TryBlock;
+import org.jf.dexlib2.iface.debug.*;
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.dexlib2.iface.reference.StringReference;
+import org.jf.dexlib2.iface.reference.TypeReference;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.dexlib2.util.EncodedValueUtils;
+import org.jf.dexlib2.writer.ClassSection;
+import org.jf.dexlib2.writer.DebugWriter;
+import org.jf.dexlib2.writer.builder.BuilderEncodedValues.BuilderArrayEncodedValue;
+import org.jf.dexlib2.writer.builder.BuilderEncodedValues.BuilderEncodedValue;
+import org.jf.util.AbstractForwardSequentialList;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.IOException;
+import java.util.*;
+import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentMap;
+
+public class BuilderClassPool extends BaseBuilderPool implements ClassSection<BuilderStringReference,
+        BuilderTypeReference, BuilderTypeList, BuilderClassDef, BuilderField, BuilderMethod, BuilderAnnotationSet,
+        BuilderArrayEncodedValue> {
+    @Nonnull private final ConcurrentMap<String, BuilderClassDef> internedItems =
+            Maps.newConcurrentMap();
+
+    public BuilderClassPool(@Nonnull DexBuilder dexBuilder) {
+        super(dexBuilder);
+    }
+
+    @Nonnull BuilderClassDef internClass(@Nonnull BuilderClassDef classDef) {
+        BuilderClassDef prev = internedItems.put(classDef.getType(), classDef);
+        if (prev != null) {
+            throw new ExceptionWithContext("Class %s has already been interned", classDef.getType());
+        }
+        return classDef;
+    }
+
+    private ImmutableList<BuilderClassDef> sortedClasses = null;
+    @Nonnull @Override public Collection<? extends BuilderClassDef> getSortedClasses() {
+        if (sortedClasses == null) {
+            sortedClasses = Ordering.natural().immutableSortedCopy(internedItems.values());
+        }
+        return sortedClasses;
+    }
+
+    @Nullable @Override
+    public Entry<? extends BuilderClassDef, Integer> getClassEntryByType(@Nullable BuilderTypeReference type) {
+        if (type == null) {
+            return null;
+        }
+
+        final BuilderClassDef classDef = internedItems.get(type.getType());
+        if (classDef == null) {
+            return null;
+        }
+
+        return new Map.Entry<BuilderClassDef, Integer>() {
+            @Override public BuilderClassDef getKey() {
+                return classDef;
+            }
+
+            @Override public Integer getValue() {
+                return classDef.classDefIndex;
+            }
+
+            @Override public Integer setValue(Integer value) {
+                return classDef.classDefIndex = value;
+            }
+        };
+    }
+
+    @Nonnull @Override public BuilderTypeReference getType(@Nonnull BuilderClassDef builderClassDef) {
+        return builderClassDef.type;
+    }
+
+    @Override public int getAccessFlags(@Nonnull BuilderClassDef builderClassDef) {
+        return builderClassDef.accessFlags;
+    }
+
+    @Nullable @Override public BuilderTypeReference getSuperclass(@Nonnull BuilderClassDef builderClassDef) {
+        return builderClassDef.superclass;
+    }
+
+    @Nullable @Override public BuilderTypeList getInterfaces(@Nonnull BuilderClassDef builderClassDef) {
+        return builderClassDef.interfaces;
+    }
+
+    @Nullable @Override public BuilderStringReference getSourceFile(@Nonnull BuilderClassDef builderClassDef) {
+        return builderClassDef.sourceFile;
+    }
+
+    private static final Predicate<Field> HAS_INITIALIZER = new Predicate<Field>() {
+        @Override
+        public boolean apply(Field input) {
+            EncodedValue encodedValue = input.getInitialValue();
+            return encodedValue != null && !EncodedValueUtils.isDefaultValue(encodedValue);
+        }
+    };
+
+    private static final Function<BuilderField, BuilderEncodedValue> GET_INITIAL_VALUE =
+            new Function<BuilderField, BuilderEncodedValue>() {
+                @Override
+                public BuilderEncodedValue apply(BuilderField input) {
+                    BuilderEncodedValue initialValue = input.getInitialValue();
+                    if (initialValue == null) {
+                        return BuilderEncodedValues.defaultValueForType(input.getType());
+                    }
+                    return initialValue;
+                }
+            };
+
+    @Nullable @Override
+    public BuilderArrayEncodedValue getStaticInitializers(@Nonnull BuilderClassDef classDef) {
+        return classDef.staticInitializers;
+    }
+
+    @Nonnull @Override
+    public Collection<? extends BuilderField> getSortedStaticFields(@Nonnull BuilderClassDef builderClassDef) {
+        return builderClassDef.getStaticFields();
+    }
+
+    @Nonnull @Override
+    public Collection<? extends BuilderField> getSortedInstanceFields(@Nonnull BuilderClassDef builderClassDef) {
+        return builderClassDef.getInstanceFields();
+    }
+
+    @Nonnull @Override
+    public Collection<? extends BuilderField> getSortedFields(@Nonnull BuilderClassDef builderClassDef) {
+        return builderClassDef.getFields();
+    }
+
+    @Nonnull @Override
+    public Collection<? extends BuilderMethod> getSortedDirectMethods(@Nonnull BuilderClassDef builderClassDef) {
+        return builderClassDef.getDirectMethods();
+    }
+
+    @Nonnull @Override
+    public Collection<? extends BuilderMethod> getSortedVirtualMethods(@Nonnull BuilderClassDef builderClassDef) {
+        return builderClassDef.getVirtualMethods();
+    }
+
+    @Nonnull @Override
+    public Collection<? extends BuilderMethod> getSortedMethods(@Nonnull BuilderClassDef builderClassDef) {
+        return builderClassDef.getMethods();
+    }
+
+    @Override public int getFieldAccessFlags(@Nonnull BuilderField builderField) {
+        return builderField.accessFlags;
+    }
+
+    @Override public int getMethodAccessFlags(@Nonnull BuilderMethod builderMethod) {
+        return builderMethod.accessFlags;
+    }
+
+    @Nonnull @Override
+    public Set<HiddenApiRestriction> getFieldHiddenApiRestrictions(@Nonnull BuilderField builderField) {
+        return builderField.getHiddenApiRestrictions();
+    }
+
+    @Nonnull @Override
+    public Set<HiddenApiRestriction> getMethodHiddenApiRestrictions(@Nonnull BuilderMethod builderMethod) {
+        return builderMethod.getHiddenApiRestrictions();
+    }
+
+    @Nullable @Override public BuilderAnnotationSet getClassAnnotations(@Nonnull BuilderClassDef builderClassDef) {
+        if (builderClassDef.annotations.isEmpty()) {
+            return null;
+        }
+        return builderClassDef.annotations;
+    }
+
+    @Nullable @Override public BuilderAnnotationSet getFieldAnnotations(@Nonnull BuilderField builderField) {
+        if (builderField.annotations.isEmpty()) {
+            return null;
+        }
+        return builderField.annotations;
+    }
+
+    @Nullable @Override public BuilderAnnotationSet getMethodAnnotations(@Nonnull BuilderMethod builderMethod) {
+        if (builderMethod.annotations.isEmpty()) {
+            return null;
+        }
+        return builderMethod.annotations;
+    }
+
+    private static final Predicate<BuilderMethodParameter> HAS_PARAMETER_ANNOTATIONS =
+            new Predicate<BuilderMethodParameter>() {
+                @Override
+                public boolean apply(BuilderMethodParameter input) {
+                    return input.getAnnotations().size() > 0;
+                }
+            };
+
+    private static final Function<BuilderMethodParameter, BuilderAnnotationSet> PARAMETER_ANNOTATIONS =
+            new Function<BuilderMethodParameter, BuilderAnnotationSet>() {
+                @Override
+                public BuilderAnnotationSet apply(BuilderMethodParameter input) {
+                    return input.getAnnotations();
+                }
+            };
+
+    @Nullable @Override public List<? extends BuilderAnnotationSet> getParameterAnnotations(
+            @Nonnull final BuilderMethod method) {
+        final List<? extends BuilderMethodParameter> parameters = method.getParameters();
+        boolean hasParameterAnnotations = Iterables.any(parameters, HAS_PARAMETER_ANNOTATIONS);
+
+        if (hasParameterAnnotations) {
+            return new AbstractForwardSequentialList<BuilderAnnotationSet>() {
+                @Nonnull @Override public Iterator<BuilderAnnotationSet> iterator() {
+                    return FluentIterable.from(parameters)
+                            .transform(PARAMETER_ANNOTATIONS).iterator();
+                }
+
+                @Override public int size() {
+                    return parameters.size();
+                }
+            };
+        }
+        return null;
+    }
+
+    @Nullable @Override
+    public Iterable<? extends DebugItem> getDebugItems(@Nonnull BuilderMethod builderMethod) {
+        MethodImplementation impl = builderMethod.getImplementation();
+        if (impl == null) {
+            return null;
+        }
+        return impl.getDebugItems();
+    }
+
+    @Nullable @Override
+    public Iterable<? extends BuilderStringReference> getParameterNames(@Nonnull BuilderMethod method) {
+        return Iterables.transform(method.getParameters(), new Function<BuilderMethodParameter, BuilderStringReference>() {
+            @Nullable @Override public BuilderStringReference apply(BuilderMethodParameter input) {
+                return input.name;
+            }
+        });
+    }
+
+    @Override public int getRegisterCount(@Nonnull BuilderMethod builderMethod) {
+        MethodImplementation impl = builderMethod.getImplementation();
+        if (impl == null) {
+            return 0;
+        }
+        return impl.getRegisterCount();
+    }
+
+    @Nullable @Override
+    public Iterable<? extends Instruction> getInstructions(@Nonnull BuilderMethod builderMethod) {
+        MethodImplementation impl = builderMethod.getImplementation();
+        if (impl == null) {
+            return null;
+        }
+        return impl.getInstructions();
+    }
+
+    @Nonnull @Override
+    public List<? extends TryBlock<? extends ExceptionHandler>> getTryBlocks(@Nonnull BuilderMethod builderMethod) {
+        MethodImplementation impl = builderMethod.getImplementation();
+        if (impl == null) {
+            return ImmutableList.of();
+        }
+        return impl.getTryBlocks();
+    }
+
+    @Nullable @Override public BuilderTypeReference getExceptionType(@Nonnull ExceptionHandler handler) {
+        return checkTypeReference(handler.getExceptionTypeReference());
+    }
+
+    @Nonnull @Override
+    public MutableMethodImplementation makeMutableMethodImplementation(@Nonnull BuilderMethod builderMethod) {
+        MethodImplementation impl = builderMethod.getImplementation();
+        if (impl instanceof MutableMethodImplementation) {
+            return (MutableMethodImplementation)impl;
+        }
+        return new MutableMethodImplementation(impl);
+    }
+
+    @Override public void setAnnotationDirectoryOffset(@Nonnull BuilderClassDef builderClassDef, int offset) {
+        builderClassDef.annotationDirectoryOffset = offset;
+    }
+
+    @Override public int getAnnotationDirectoryOffset(@Nonnull BuilderClassDef builderClassDef) {
+        return builderClassDef.annotationDirectoryOffset;
+    }
+
+    @Override public void setAnnotationSetRefListOffset(@Nonnull BuilderMethod builderMethod, int offset) {
+        builderMethod.annotationSetRefListOffset = offset;
+    }
+
+    @Override public int getAnnotationSetRefListOffset(@Nonnull BuilderMethod builderMethod) {
+        return builderMethod.annotationSetRefListOffset;
+    }
+
+    @Override public void setCodeItemOffset(@Nonnull BuilderMethod builderMethod, int offset) {
+        builderMethod.codeItemOffset = offset;
+    }
+
+    @Override public int getCodeItemOffset(@Nonnull BuilderMethod builderMethod) {
+        return builderMethod.codeItemOffset;
+    }
+
+    @Nullable private BuilderStringReference checkStringReference(@Nullable StringReference stringReference) {
+        if (stringReference == null) {
+            return null;
+        }
+        try {
+            return (BuilderStringReference)stringReference;
+        } catch (ClassCastException ex) {
+            throw new IllegalStateException("Only StringReference instances returned by " +
+                    "DexBuilder.internStringReference or DexBuilder.internNullableStringReference may be used.");
+        }
+    }
+
+    @Nullable private BuilderTypeReference checkTypeReference(@Nullable TypeReference typeReference) {
+        if (typeReference == null) {
+            return null;
+        }
+        try {
+            return (BuilderTypeReference)typeReference;
+        } catch (ClassCastException ex) {
+            throw new IllegalStateException("Only TypeReference instances returned by " +
+                    "DexBuilder.internTypeReference or DexBuilder.internNullableTypeReference may be used.");
+        }
+    }
+
+    @Override
+    public void writeDebugItem(@Nonnull DebugWriter<BuilderStringReference, BuilderTypeReference> writer,
+                               DebugItem debugItem) throws IOException {
+        switch (debugItem.getDebugItemType()) {
+            case DebugItemType.START_LOCAL: {
+                StartLocal startLocal = (StartLocal)debugItem;
+                writer.writeStartLocal(startLocal.getCodeAddress(),
+                        startLocal.getRegister(),
+                        checkStringReference(startLocal.getNameReference()),
+                        checkTypeReference(startLocal.getTypeReference()),
+                        checkStringReference(startLocal.getSignatureReference()));
+                break;
+            }
+            case DebugItemType.END_LOCAL: {
+                EndLocal endLocal = (EndLocal)debugItem;
+                writer.writeEndLocal(endLocal.getCodeAddress(), endLocal.getRegister());
+                break;
+            }
+            case DebugItemType.RESTART_LOCAL: {
+                RestartLocal restartLocal = (RestartLocal)debugItem;
+                writer.writeRestartLocal(restartLocal.getCodeAddress(), restartLocal.getRegister());
+                break;
+            }
+            case DebugItemType.PROLOGUE_END: {
+                writer.writePrologueEnd(debugItem.getCodeAddress());
+                break;
+            }
+            case DebugItemType.EPILOGUE_BEGIN: {
+                writer.writeEpilogueBegin(debugItem.getCodeAddress());
+                break;
+            }
+            case DebugItemType.LINE_NUMBER: {
+                LineNumber lineNumber = (LineNumber)debugItem;
+                writer.writeLineNumber(lineNumber.getCodeAddress(), lineNumber.getLineNumber());
+                break;
+            }
+            case DebugItemType.SET_SOURCE_FILE: {
+                SetSourceFile setSourceFile = (SetSourceFile)debugItem;
+                writer.writeSetSourceFile(setSourceFile.getCodeAddress(),
+                        checkStringReference(setSourceFile.getSourceFileReference()));
+                break;
+            }
+            default:
+                throw new ExceptionWithContext("Unexpected debug item type: %d", debugItem.getDebugItemType());
+        }
+    }
+
+    @Override public int getItemIndex(@Nonnull BuilderClassDef builderClassDef) {
+        return builderClassDef.classDefIndex;
+    }
+
+    @Nonnull @Override public Collection<? extends Entry<? extends BuilderClassDef, Integer>> getItems() {
+        return new BuilderMapEntryCollection<BuilderClassDef>(internedItems.values()) {
+            @Override protected int getValue(@Nonnull BuilderClassDef key) {
+                return key.classDefIndex;
+            }
+
+            @Override protected int setValue(@Nonnull BuilderClassDef key, int value) {
+                int prev = key.classDefIndex;
+                key.classDefIndex = value;
+                return prev;
+            }
+        };
+    }
+
+    @Override public int getItemCount() {
+        return internedItems.size();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderEncodedArrayPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderEncodedArrayPool.java
new file mode 100644
index 0000000..c6d0db8
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderEncodedArrayPool.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import com.google.common.collect.Maps;
+import org.jf.dexlib2.iface.value.ArrayEncodedValue;
+import org.jf.dexlib2.writer.EncodedArraySection;
+import org.jf.dexlib2.writer.builder.BuilderEncodedValues.BuilderArrayEncodedValue;
+import org.jf.dexlib2.writer.builder.BuilderEncodedValues.BuilderEncodedValue;
+
+import javax.annotation.Nonnull;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentMap;
+
+public class BuilderEncodedArrayPool extends BaseBuilderPool implements
+        EncodedArraySection<BuilderArrayEncodedValue, BuilderEncodedValue> {
+    @Nonnull private final ConcurrentMap<ArrayEncodedValue, BuilderArrayEncodedValue> internedItems =
+            Maps.newConcurrentMap();
+
+    public BuilderEncodedArrayPool(@Nonnull DexBuilder dexBuilder) {
+        super(dexBuilder);
+    }
+
+    @Nonnull public BuilderArrayEncodedValue internArrayEncodedValue(@Nonnull ArrayEncodedValue arrayEncodedValue) {
+        BuilderArrayEncodedValue builderArrayEncodedValue = internedItems.get(arrayEncodedValue);
+        if (builderArrayEncodedValue != null) {
+            return builderArrayEncodedValue;
+        }
+
+        builderArrayEncodedValue = (BuilderArrayEncodedValue)dexBuilder.internEncodedValue(arrayEncodedValue);
+        BuilderArrayEncodedValue previous = internedItems.putIfAbsent(
+                builderArrayEncodedValue, builderArrayEncodedValue);
+        return previous == null ? builderArrayEncodedValue : previous;
+    }
+
+    @Override
+    public int getItemOffset(@Nonnull BuilderArrayEncodedValue builderArrayEncodedValue) {
+        return builderArrayEncodedValue.offset;
+    }
+
+    @Nonnull
+    @Override
+    public Collection<? extends Map.Entry<? extends BuilderArrayEncodedValue, Integer>> getItems() {
+        return new BuilderMapEntryCollection<BuilderArrayEncodedValue>(internedItems.values()) {
+            @Override
+            protected int getValue(@Nonnull BuilderArrayEncodedValue builderArrayEncodedValue) {
+                return builderArrayEncodedValue.offset;
+            }
+
+            @Override
+            protected int setValue(@Nonnull BuilderArrayEncodedValue key, int value) {
+                int prev = key.offset;
+                key.offset = value;
+                return prev;
+            }
+        };
+    }
+
+    @Override
+    public List<? extends BuilderEncodedValue> getEncodedValueList(BuilderArrayEncodedValue builderArrayEncodedValue) {
+        return builderArrayEncodedValue.elements;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderEncodedValues.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderEncodedValues.java
new file mode 100644
index 0000000..5fae60c
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderEncodedValues.java
@@ -0,0 +1,266 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import org.jf.dexlib2.base.value.*;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.dexlib2.immutable.value.*;
+import org.jf.dexlib2.writer.DexWriter;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+import java.util.Set;
+
+public abstract class BuilderEncodedValues {
+    public static interface BuilderEncodedValue extends EncodedValue {
+    }
+
+    public static class BuilderAnnotationEncodedValue extends BaseAnnotationEncodedValue
+            implements BuilderEncodedValue {
+        @Nonnull final BuilderTypeReference typeReference;
+        @Nonnull final Set<? extends BuilderAnnotationElement> elements;
+
+        BuilderAnnotationEncodedValue(@Nonnull BuilderTypeReference typeReference,
+                                      @Nonnull Set<? extends BuilderAnnotationElement> elements) {
+            this.typeReference = typeReference;
+            this.elements = elements;
+        }
+
+        @Nonnull @Override public String getType() {
+            return typeReference.getType();
+        }
+
+        @Nonnull @Override public Set<? extends BuilderAnnotationElement> getElements() {
+            return elements;
+        }
+    }
+
+    public static class BuilderArrayEncodedValue extends BaseArrayEncodedValue implements BuilderEncodedValue {
+        @Nonnull final List<? extends BuilderEncodedValue> elements;
+        int offset = DexWriter.NO_OFFSET;
+
+        BuilderArrayEncodedValue(@Nonnull List<? extends BuilderEncodedValue> elements) {
+            this.elements = elements;
+        }
+
+        @Nonnull @Override public List<? extends EncodedValue> getValue() {
+            return elements;
+        }
+    }
+
+    @Nonnull
+    public static BuilderEncodedValue defaultValueForType(String type) {
+        switch (type.charAt(0)) {
+            case 'Z':
+                return BuilderBooleanEncodedValue.FALSE_VALUE;
+            case 'B':
+                return new BuilderByteEncodedValue((byte)0);
+            case 'S':
+                return new BuilderShortEncodedValue((short)0);
+            case 'C':
+                return new BuilderCharEncodedValue((char)0);
+            case 'I':
+                return new BuilderIntEncodedValue(0);
+            case 'J':
+                return new BuilderLongEncodedValue(0);
+            case 'F':
+                return new BuilderFloatEncodedValue(0);
+            case 'D':
+                return new BuilderDoubleEncodedValue(0);
+            case 'L':
+            case '[':
+                return BuilderNullEncodedValue.INSTANCE;
+            default:
+                throw new ExceptionWithContext("Unrecognized type: %s", type);
+        }
+    }
+
+    public static class BuilderBooleanEncodedValue extends BaseBooleanEncodedValue
+            implements BuilderEncodedValue {
+        public static final BuilderBooleanEncodedValue TRUE_VALUE = new BuilderBooleanEncodedValue(true);
+        public static final BuilderBooleanEncodedValue FALSE_VALUE = new BuilderBooleanEncodedValue(false);
+
+        private final boolean value;
+
+        private BuilderBooleanEncodedValue(boolean value) {
+            this.value = value;
+        }
+
+        @Override public boolean getValue() {
+            return value;
+        }
+    }
+
+    public static class BuilderByteEncodedValue extends ImmutableByteEncodedValue
+            implements BuilderEncodedValue {
+        public BuilderByteEncodedValue(byte value) {
+            super(value);
+        }
+    }
+
+    public static class BuilderCharEncodedValue extends ImmutableCharEncodedValue
+            implements BuilderEncodedValue {
+        public BuilderCharEncodedValue(char value) {
+            super(value);
+        }
+    }
+
+    public static class BuilderDoubleEncodedValue extends ImmutableDoubleEncodedValue
+            implements BuilderEncodedValue {
+        public BuilderDoubleEncodedValue(double value) {
+            super(value);
+        }
+    }
+
+    public static class BuilderEnumEncodedValue extends BaseEnumEncodedValue
+            implements BuilderEncodedValue {
+        @Nonnull final BuilderFieldReference enumReference;
+
+        BuilderEnumEncodedValue(@Nonnull BuilderFieldReference enumReference) {
+            this.enumReference = enumReference;
+        }
+
+        @Nonnull @Override public BuilderFieldReference getValue() {
+            return enumReference;
+        }
+    }
+
+    public static class BuilderFieldEncodedValue extends BaseFieldEncodedValue
+            implements BuilderEncodedValue {
+        @Nonnull final BuilderFieldReference fieldReference;
+
+        BuilderFieldEncodedValue(@Nonnull BuilderFieldReference fieldReference) {
+            this.fieldReference = fieldReference;
+        }
+
+        @Nonnull @Override public BuilderFieldReference getValue() {
+            return fieldReference;
+        }
+    }
+
+    public static class BuilderFloatEncodedValue extends ImmutableFloatEncodedValue
+            implements BuilderEncodedValue {
+        public BuilderFloatEncodedValue(float value) {
+            super(value);
+        }
+    }
+
+    public static class BuilderIntEncodedValue extends ImmutableIntEncodedValue
+            implements BuilderEncodedValue {
+        public BuilderIntEncodedValue(int value) {
+            super(value);
+        }
+    }
+
+    public static class BuilderLongEncodedValue extends ImmutableLongEncodedValue
+            implements BuilderEncodedValue {
+        public BuilderLongEncodedValue(long value) {
+            super(value);
+        }
+    }
+
+    public static class BuilderMethodEncodedValue extends BaseMethodEncodedValue
+            implements BuilderEncodedValue {
+        @Nonnull final BuilderMethodReference methodReference;
+
+        BuilderMethodEncodedValue(@Nonnull BuilderMethodReference methodReference) {
+            this.methodReference = methodReference;
+        }
+
+        @Override public BuilderMethodReference getValue() {
+            return methodReference;
+        }
+    }
+
+    public static class BuilderNullEncodedValue extends BaseNullEncodedValue
+            implements BuilderEncodedValue {
+        public static final BuilderNullEncodedValue INSTANCE = new BuilderNullEncodedValue();
+
+        private BuilderNullEncodedValue() {}
+    }
+
+    public static class BuilderShortEncodedValue extends ImmutableShortEncodedValue
+            implements BuilderEncodedValue {
+        public BuilderShortEncodedValue(short value) {
+            super(value);
+        }
+    }
+
+    public static class BuilderStringEncodedValue extends BaseStringEncodedValue
+            implements BuilderEncodedValue {
+        @Nonnull final BuilderStringReference stringReference;
+
+        BuilderStringEncodedValue(@Nonnull BuilderStringReference stringReference) {
+            this.stringReference = stringReference;
+        }
+
+        @Nonnull @Override public String getValue() {
+            return stringReference.getString();
+        }
+    }
+
+    public static class BuilderTypeEncodedValue extends BaseTypeEncodedValue
+            implements BuilderEncodedValue {
+        @Nonnull final BuilderTypeReference typeReference;
+
+        BuilderTypeEncodedValue(@Nonnull BuilderTypeReference typeReference) {
+            this.typeReference = typeReference;
+        }
+
+        @Nonnull @Override public String getValue() {
+            return typeReference.getType();
+        }
+    }
+
+    public static class BuilderMethodTypeEncodedValue extends BaseMethodTypeEncodedValue
+            implements BuilderEncodedValue {
+        @Nonnull final BuilderMethodProtoReference methodProtoReference;
+
+        public BuilderMethodTypeEncodedValue(@Nonnull BuilderMethodProtoReference methodProtoReference) {
+            this.methodProtoReference = methodProtoReference;
+        }
+
+        @Nonnull @Override public BuilderMethodProtoReference getValue() { return methodProtoReference; }
+    }
+
+    public static class BuilderMethodHandleEncodedValue extends BaseMethodHandleEncodedValue
+            implements BuilderEncodedValue {
+        @Nonnull final BuilderMethodHandleReference methodHandleReference;
+
+        public BuilderMethodHandleEncodedValue(@Nonnull BuilderMethodHandleReference methodHandleReference) {
+            this.methodHandleReference = methodHandleReference;
+        }
+
+        @Nonnull @Override public BuilderMethodHandleReference getValue() { return methodHandleReference; }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderExceptionHandler.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderExceptionHandler.java
new file mode 100644
index 0000000..713226b
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderExceptionHandler.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import org.jf.dexlib2.base.BaseExceptionHandler;
+
+import javax.annotation.Nullable;
+
+public class BuilderExceptionHandler extends BaseExceptionHandler {
+    @Nullable final BuilderTypeReference exceptionType;
+    final int handlerCodeAddress;
+
+    BuilderExceptionHandler(@Nullable BuilderTypeReference exceptionType, int handlerCodeAddress) {
+        this.exceptionType = exceptionType;
+        this.handlerCodeAddress = handlerCodeAddress;
+    }
+
+    @Nullable @Override public String getExceptionType() {
+        return exceptionType==null?null:exceptionType.getType();
+    }
+
+    @Override public int getHandlerCodeAddress() {
+        return handlerCodeAddress;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderField.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderField.java
new file mode 100644
index 0000000..3553c43
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderField.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import com.google.common.collect.ImmutableSet;
+import org.jf.dexlib2.HiddenApiRestriction;
+import org.jf.dexlib2.base.reference.BaseFieldReference;
+import org.jf.dexlib2.iface.Field;
+import org.jf.dexlib2.writer.builder.BuilderEncodedValues.BuilderEncodedValue;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Set;
+
+public class BuilderField extends BaseFieldReference implements Field {
+    @Nonnull final BuilderFieldReference fieldReference;
+    final int accessFlags;
+    @Nullable final BuilderEncodedValue initialValue;
+    @Nonnull final BuilderAnnotationSet annotations;
+    @Nonnull Set<HiddenApiRestriction> hiddenApiRestrictions;
+
+    BuilderField(@Nonnull BuilderFieldReference fieldReference,
+                 int accessFlags,
+                 @Nullable BuilderEncodedValue initialValue,
+                 @Nonnull BuilderAnnotationSet annotations,
+                 @Nonnull Set<HiddenApiRestriction> hiddenApiRestrictions) {
+        this.fieldReference = fieldReference;
+        this.accessFlags = accessFlags;
+        this.initialValue = initialValue;
+        this.annotations = annotations;
+        this.hiddenApiRestrictions = hiddenApiRestrictions;
+    }
+
+    @Override public int getAccessFlags() {
+        return accessFlags;
+    }
+
+    @Nullable @Override public BuilderEncodedValue getInitialValue() {
+        return initialValue;
+    }
+
+    @Nonnull @Override public BuilderAnnotationSet getAnnotations() {
+        return annotations;
+    }
+
+    @Nonnull @Override public String getDefiningClass() {
+        return fieldReference.definingClass.getType();
+    }
+
+    @Nonnull @Override public String getName() {
+        return fieldReference.name.getString();
+    }
+
+    @Nonnull @Override public String getType() {
+        return fieldReference.fieldType.getType();
+    }
+
+    @Nonnull @Override public Set<HiddenApiRestriction> getHiddenApiRestrictions() {
+        return hiddenApiRestrictions;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderFieldPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderFieldPool.java
new file mode 100644
index 0000000..3bc65cd
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderFieldPool.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import com.google.common.collect.Maps;
+import org.jf.dexlib2.iface.reference.FieldReference;
+import org.jf.dexlib2.immutable.reference.ImmutableFieldReference;
+import org.jf.dexlib2.writer.FieldSection;
+
+import javax.annotation.Nonnull;
+import java.util.Collection;
+import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentMap;
+
+public class BuilderFieldPool extends BaseBuilderPool
+        implements FieldSection<BuilderStringReference, BuilderTypeReference, BuilderFieldReference, BuilderField> {
+    @Nonnull private final ConcurrentMap<FieldReference, BuilderFieldReference> internedItems =
+            Maps.newConcurrentMap();
+
+    public BuilderFieldPool(@Nonnull DexBuilder dexBuilder) {
+        super(dexBuilder);
+    }
+
+    @Nonnull BuilderFieldReference internField(@Nonnull String definingClass, String name, String type) {
+        ImmutableFieldReference fieldReference = new ImmutableFieldReference(definingClass, name, type);
+        return internField(fieldReference);
+    }
+
+    @Nonnull public BuilderFieldReference internField(@Nonnull FieldReference fieldReference) {
+        BuilderFieldReference ret = internedItems.get(fieldReference);
+        if (ret != null) {
+            return ret;
+        }
+
+        BuilderFieldReference dexPoolFieldReference = new BuilderFieldReference(
+                dexBuilder.typeSection.internType(fieldReference.getDefiningClass()),
+                dexBuilder.stringSection.internString(fieldReference.getName()),
+                dexBuilder.typeSection.internType(fieldReference.getType()));
+        ret = internedItems.putIfAbsent(dexPoolFieldReference, dexPoolFieldReference);
+        return ret==null?dexPoolFieldReference:ret;
+    }
+
+    @Nonnull @Override
+    public BuilderTypeReference getDefiningClass(@Nonnull BuilderFieldReference key) {
+        return key.definingClass;
+    }
+
+    @Nonnull @Override public BuilderTypeReference getFieldType(@Nonnull BuilderFieldReference key) {
+        return key.fieldType;
+    }
+
+    @Nonnull @Override public BuilderStringReference getName(@Nonnull BuilderFieldReference key) {
+        return key.name;
+    }
+
+    @Override public int getFieldIndex(@Nonnull BuilderField builderField) {
+        return builderField.fieldReference.getIndex();
+    }
+
+    @Override public int getItemIndex(@Nonnull BuilderFieldReference key) {
+        return key.index;
+    }
+
+    @Nonnull @Override public Collection<? extends Entry<? extends BuilderFieldReference, Integer>> getItems() {
+        return new BuilderMapEntryCollection<BuilderFieldReference>(internedItems.values()) {
+            @Override protected int getValue(@Nonnull BuilderFieldReference key) {
+                return key.index;
+            }
+
+            @Override protected int setValue(@Nonnull BuilderFieldReference key, int value) {
+                int prev = key.index;
+                key.index = value;
+                return prev;
+            }
+        };
+    }
+
+    @Override public int getItemCount() {
+        return internedItems.size();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderFieldReference.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderFieldReference.java
new file mode 100644
index 0000000..e64aa67
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderFieldReference.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import org.jf.dexlib2.base.reference.BaseFieldReference;
+import org.jf.dexlib2.writer.DexWriter;
+
+import javax.annotation.Nonnull;
+
+public class BuilderFieldReference extends BaseFieldReference implements BuilderReference {
+    @Nonnull final BuilderTypeReference definingClass;
+    @Nonnull final BuilderStringReference name;
+    @Nonnull final BuilderTypeReference fieldType;
+    int index = DexWriter.NO_INDEX;
+
+    BuilderFieldReference(@Nonnull BuilderTypeReference definingClass,
+                          @Nonnull BuilderStringReference name,
+                          @Nonnull BuilderTypeReference fieldType) {
+        this.definingClass = definingClass;
+        this.name = name;
+        this.fieldType = fieldType;
+    }
+
+    @Nonnull @Override public String getDefiningClass() {
+        return definingClass.getType();
+    }
+
+    @Nonnull @Override public String getName() {
+        return name.getString();
+    }
+
+    @Nonnull @Override public String getType() {
+        return fieldType.getType();
+    }
+
+    @Override public int getIndex() {
+        return index;
+    }
+
+    @Override public void setIndex(int index) {
+        this.index = index;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMapEntryCollection.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMapEntryCollection.java
new file mode 100644
index 0000000..aea95a6
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMapEntryCollection.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import javax.annotation.Nonnull;
+import java.util.AbstractCollection;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Map;
+
+public abstract class BuilderMapEntryCollection<Key> extends AbstractCollection<Map.Entry<Key, Integer>> {
+    @Nonnull private final Collection<Key> keys;
+
+    public BuilderMapEntryCollection(@Nonnull Collection<Key> keys) {
+        this.keys = keys;
+    }
+
+    private class MapEntry implements Map.Entry<Key, Integer> {
+        @Nonnull private Key key;
+
+        @Nonnull @Override public Key getKey() {
+            return key;
+        }
+
+        @Override public Integer getValue() {
+            return BuilderMapEntryCollection.this.getValue(key);
+        }
+
+        @Override public Integer setValue(Integer value) {
+            return BuilderMapEntryCollection.this.setValue(key, value);
+        }
+    }
+
+    @Nonnull @Override public Iterator<Map.Entry<Key, Integer>> iterator() {
+        final Iterator<Key> iter = keys.iterator();
+
+        return new Iterator<Map.Entry<Key, Integer>>() {
+            @Override public boolean hasNext() {
+                return iter.hasNext();
+            }
+
+            @Override public Map.Entry<Key, Integer> next() {
+                MapEntry entry = new MapEntry();
+                entry.key = iter.next();
+                return entry;
+            }
+
+            @Override public void remove() {
+                throw new UnsupportedOperationException();
+            }
+        };
+    }
+
+    @Override public int size() {
+        return keys.size();
+    }
+
+    protected abstract int getValue(@Nonnull Key key);
+    protected abstract int setValue(@Nonnull Key key, int value);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMethod.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMethod.java
new file mode 100644
index 0000000..07a80e8
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMethod.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import org.jf.dexlib2.HiddenApiRestriction;
+import org.jf.dexlib2.base.reference.BaseMethodReference;
+import org.jf.dexlib2.iface.Method;
+import org.jf.dexlib2.iface.MethodImplementation;
+import org.jf.dexlib2.writer.DexWriter;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.List;
+import java.util.Set;
+
+public class BuilderMethod extends BaseMethodReference implements Method {
+    @Nonnull final BuilderMethodReference methodReference;
+    @Nonnull final List<? extends BuilderMethodParameter> parameters;
+    final int accessFlags;
+    @Nonnull final BuilderAnnotationSet annotations;
+    @Nonnull final Set<HiddenApiRestriction> hiddenApiRestrictions;
+    @Nullable final MethodImplementation methodImplementation;
+
+    int annotationSetRefListOffset = DexWriter.NO_OFFSET;
+    int codeItemOffset = DexWriter.NO_OFFSET;
+
+    BuilderMethod(@Nonnull BuilderMethodReference methodReference,
+                  @Nonnull List<? extends BuilderMethodParameter> parameters,
+                  int accessFlags,
+                  @Nonnull BuilderAnnotationSet annotations,
+                  @Nonnull Set<HiddenApiRestriction> hiddenApiRestrictions,
+                  @Nullable MethodImplementation methodImplementation) {
+        this.methodReference = methodReference;
+        this.parameters = parameters;
+        this.accessFlags = accessFlags;
+        this.annotations = annotations;
+        this.hiddenApiRestrictions = hiddenApiRestrictions;
+        this.methodImplementation = methodImplementation;
+    }
+
+    @Override @Nonnull public String getDefiningClass() { return methodReference.definingClass.getType(); }
+    @Override @Nonnull public String getName() { return methodReference.name.getString(); }
+    @Override @Nonnull public BuilderTypeList getParameterTypes() { return methodReference.proto.parameterTypes; }
+    @Nonnull @Override public String getReturnType() { return methodReference.proto.returnType.getType(); }
+    @Override @Nonnull public List<? extends BuilderMethodParameter> getParameters() { return parameters; }
+    @Override public int getAccessFlags() { return accessFlags; }
+    @Override @Nonnull public BuilderAnnotationSet getAnnotations() { return annotations; }
+    @Nonnull @Override public Set<HiddenApiRestriction> getHiddenApiRestrictions() { return hiddenApiRestrictions; }
+    @Override @Nullable public MethodImplementation getImplementation() { return methodImplementation; }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMethodHandlePool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMethodHandlePool.java
new file mode 100644
index 0000000..320344c
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMethodHandlePool.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import com.google.common.collect.Maps;
+import org.jf.dexlib2.MethodHandleType;
+import org.jf.dexlib2.iface.reference.FieldReference;
+import org.jf.dexlib2.iface.reference.MethodHandleReference;
+import org.jf.dexlib2.iface.reference.MethodReference;
+import org.jf.dexlib2.writer.MethodHandleSection;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.ConcurrentMap;
+
+public class BuilderMethodHandlePool extends BaseBuilderPool
+        implements MethodHandleSection<BuilderMethodHandleReference, BuilderFieldReference, BuilderMethodReference> {
+    @Nonnull private final ConcurrentMap<MethodHandleReference, BuilderMethodHandleReference> internedItems =
+            Maps.newConcurrentMap();
+
+    public BuilderMethodHandlePool(@Nonnull DexBuilder dexBuilder) {
+        super(dexBuilder);
+    }
+
+    public BuilderMethodHandleReference internMethodHandle(MethodHandleReference methodHandleReference) {
+        BuilderMethodHandleReference internedMethodHandle = internedItems.get(methodHandleReference);
+        if (internedMethodHandle != null) {
+            return internedMethodHandle;
+        }
+
+        BuilderReference memberReference;
+        switch (methodHandleReference.getMethodHandleType()) {
+            case MethodHandleType.STATIC_PUT:
+            case MethodHandleType.STATIC_GET:
+            case MethodHandleType.INSTANCE_PUT:
+            case MethodHandleType.INSTANCE_GET:
+                memberReference = dexBuilder.internFieldReference(
+                        (FieldReference) methodHandleReference.getMemberReference());
+                break;
+            case MethodHandleType.INVOKE_STATIC:
+            case MethodHandleType.INVOKE_INSTANCE:
+            case MethodHandleType.INVOKE_CONSTRUCTOR:
+            case MethodHandleType.INVOKE_DIRECT:
+            case MethodHandleType.INVOKE_INTERFACE:
+                memberReference = dexBuilder.internMethodReference(
+                        (MethodReference) methodHandleReference.getMemberReference());
+                break;
+            default:
+                throw new ExceptionWithContext("Invalid method handle type: %d",
+                        methodHandleReference.getMethodHandleType());
+        }
+
+        internedMethodHandle = new BuilderMethodHandleReference(methodHandleReference.getMethodHandleType(),
+                memberReference);
+        BuilderMethodHandleReference prev = internedItems.putIfAbsent(internedMethodHandle, internedMethodHandle);
+        return prev == null ? internedMethodHandle : prev;
+    }
+
+    @Override
+    public BuilderFieldReference getFieldReference(BuilderMethodHandleReference methodHandleReference) {
+        return (BuilderFieldReference) methodHandleReference.getMemberReference();
+    }
+
+    @Override
+    public BuilderMethodReference getMethodReference(BuilderMethodHandleReference methodHandleReference) {
+        return (BuilderMethodReference) methodHandleReference.getMemberReference();
+    }
+
+    @Override
+    public int getItemIndex(@Nonnull BuilderMethodHandleReference builderMethodHandleReference) {
+        return builderMethodHandleReference.index;
+    }
+
+    @Nonnull
+    @Override
+    public Collection<? extends Map.Entry<? extends BuilderMethodHandleReference, Integer>> getItems() {
+        return new BuilderMapEntryCollection<BuilderMethodHandleReference>(internedItems.values()) {
+            @Override
+            protected int getValue(@Nonnull BuilderMethodHandleReference builderMethodHandleReference) {
+                return builderMethodHandleReference.index;
+            }
+
+            @Override
+            protected int setValue(@Nonnull BuilderMethodHandleReference builderMethodHandleReference, int value) {
+                int prev = builderMethodHandleReference.index;
+                builderMethodHandleReference.index = value;
+                return prev;
+            }
+        };
+    }
+
+    @Override
+    public int getItemCount() {
+        return internedItems.size();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMethodHandleReference.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMethodHandleReference.java
new file mode 100644
index 0000000..4fe0e30
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMethodHandleReference.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import org.jf.dexlib2.base.reference.BaseMethodHandleReference;
+
+import javax.annotation.Nonnull;
+
+import static org.jf.dexlib2.writer.DexWriter.NO_INDEX;
+
+public class BuilderMethodHandleReference extends BaseMethodHandleReference implements BuilderReference {
+    final int methodHandleType;
+    @Nonnull final BuilderReference memberReference;
+    int index = NO_INDEX;
+
+    public BuilderMethodHandleReference(int methodHandleType, @Nonnull BuilderReference memberReference) {
+        this.methodHandleType = methodHandleType;
+        this.memberReference = memberReference;
+    }
+
+    @Override public int getMethodHandleType() {
+        return methodHandleType;
+    }
+
+    @Nonnull @Override public BuilderReference getMemberReference() {
+        return memberReference;
+    }
+
+    @Override public int getIndex() {
+        return index;
+    }
+
+    @Override public void setIndex(int index) {
+        this.index = index;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMethodParameter.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMethodParameter.java
new file mode 100644
index 0000000..2858662
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMethodParameter.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import org.jf.dexlib2.base.BaseMethodParameter;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class BuilderMethodParameter extends BaseMethodParameter {
+    @Nonnull final BuilderTypeReference type;
+    @Nullable final BuilderStringReference name;
+    @Nonnull final BuilderAnnotationSet annotations;
+
+    public BuilderMethodParameter(@Nonnull BuilderTypeReference type,
+                                  @Nullable BuilderStringReference name,
+                                  @Nonnull BuilderAnnotationSet annotations) {
+        this.type = type;
+        this.name = name;
+        this.annotations = annotations;
+    }
+
+    @Nonnull @Override public String getType() {
+        return type.getType();
+    }
+
+    @Nullable @Override public String getName() {
+        return name==null?null:name.getString();
+    }
+
+    @Nonnull @Override public BuilderAnnotationSet getAnnotations() {
+        return annotations;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMethodPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMethodPool.java
new file mode 100644
index 0000000..7f937fd
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMethodPool.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import com.google.common.collect.Maps;
+import org.jf.dexlib2.base.reference.BaseMethodReference;
+import org.jf.dexlib2.iface.reference.MethodReference;
+import org.jf.dexlib2.writer.MethodSection;
+
+import javax.annotation.Nonnull;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentMap;
+
+class BuilderMethodPool extends BaseBuilderPool implements MethodSection<BuilderStringReference, BuilderTypeReference,
+        BuilderMethodProtoReference, BuilderMethodReference, BuilderMethod>{
+    @Nonnull private final ConcurrentMap<MethodReference, BuilderMethodReference> internedItems =
+            Maps.newConcurrentMap();
+
+    public BuilderMethodPool(@Nonnull DexBuilder dexBuilder) {
+        super(dexBuilder);
+    }
+
+    @Nonnull public BuilderMethodReference internMethod(@Nonnull MethodReference methodReference) {
+        BuilderMethodReference ret = internedItems.get(methodReference);
+        if (ret != null) {
+            return ret;
+        }
+
+        BuilderMethodReference dexPoolMethodReference = new BuilderMethodReference(
+                dexBuilder.typeSection.internType(methodReference.getDefiningClass()),
+                dexBuilder.stringSection.internString(methodReference.getName()),
+                dexBuilder.protoSection.internMethodProto(methodReference));
+        ret = internedItems.putIfAbsent(dexPoolMethodReference, dexPoolMethodReference);
+        return ret==null?dexPoolMethodReference:ret;
+    }
+
+    @Nonnull public BuilderMethodReference internMethod(@Nonnull String definingClass, @Nonnull String name,
+                                                        @Nonnull List<? extends CharSequence> parameters,
+                                                        @Nonnull String returnType) {
+        return internMethod(new MethodKey(definingClass, name, parameters, returnType));
+    }
+
+    @Nonnull @Override public BuilderMethodReference getMethodReference(@Nonnull BuilderMethod builderMethod) {
+        return builderMethod.methodReference;
+    }
+
+    @Nonnull @Override
+    public BuilderTypeReference getDefiningClass(@Nonnull BuilderMethodReference key) {
+        return key.definingClass; 
+    }
+
+    @Nonnull @Override
+    public BuilderMethodProtoReference getPrototype(@Nonnull BuilderMethodReference key) {
+        return key.proto;
+    }
+
+    @Nonnull @Override public BuilderMethodProtoReference getPrototype(@Nonnull BuilderMethod builderMethod) {
+        return builderMethod.methodReference.proto;
+    }
+
+    @Nonnull @Override public BuilderStringReference getName(@Nonnull BuilderMethodReference key) {
+        return key.name;
+    }
+
+    @Override public int getMethodIndex(@Nonnull BuilderMethod builderMethod) {
+        return builderMethod.methodReference.index;
+    }
+
+    @Override public int getItemIndex(@Nonnull BuilderMethodReference key) {
+        return key.index;
+    }
+
+    @Nonnull @Override public Collection<? extends Entry<? extends BuilderMethodReference, Integer>> getItems() {
+        return new BuilderMapEntryCollection<BuilderMethodReference>(internedItems.values()) {
+            @Override protected int getValue(@Nonnull BuilderMethodReference key) {
+                return key.index;
+            }
+
+            @Override protected int setValue(@Nonnull BuilderMethodReference key, int value) {
+                int prev = key.index;
+                key.index = value;
+                return prev;
+            }
+        };
+    }
+
+    @Override public int getItemCount() {
+        return internedItems.size();
+    }
+
+    private static class MethodKey extends BaseMethodReference implements MethodReference {
+        @Nonnull private final String definingClass;
+        @Nonnull private final String name;
+        @Nonnull private final List<? extends CharSequence> parameterTypes;
+        @Nonnull private final String returnType;
+
+        public MethodKey(@Nonnull String definingClass, @Nonnull String name,
+                         @Nonnull List<? extends CharSequence> parameterTypes, @Nonnull String returnType) {
+            this.definingClass = definingClass;
+            this.name = name;
+            this.parameterTypes = parameterTypes;
+            this.returnType = returnType;
+        }
+
+        @Nonnull @Override public String getDefiningClass() {
+            return definingClass;
+        }
+
+        @Nonnull @Override public String getName() {
+            return name;
+        }
+
+        @Nonnull @Override public List<? extends CharSequence> getParameterTypes() {
+            return parameterTypes;
+        }
+
+        @Nonnull @Override public String getReturnType() {
+            return returnType;
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMethodProtoReference.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMethodProtoReference.java
new file mode 100644
index 0000000..a476c2c
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMethodProtoReference.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import com.google.common.collect.Ordering;
+import org.jf.dexlib2.base.reference.BaseMethodProtoReference;
+import org.jf.dexlib2.iface.reference.MethodProtoReference;
+import org.jf.dexlib2.writer.DexWriter;
+import org.jf.util.CharSequenceUtils;
+import org.jf.util.CollectionUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.List;
+
+public class BuilderMethodProtoReference extends BaseMethodProtoReference implements
+        MethodProtoReference, BuilderReference {
+    @Nonnull final BuilderStringReference shorty;
+    @Nonnull final BuilderTypeList parameterTypes;
+    @Nonnull final BuilderTypeReference returnType;
+    int index = DexWriter.NO_INDEX;
+
+    public BuilderMethodProtoReference(@Nonnull BuilderStringReference shorty, @Nonnull BuilderTypeList parameterTypes,
+                                       @Nonnull BuilderTypeReference returnType) {
+        this.shorty = shorty;
+        this.parameterTypes = parameterTypes;
+        this.returnType = returnType;
+    }
+
+    @Nonnull @Override public List<? extends CharSequence> getParameterTypes() {
+        return parameterTypes;
+    }
+
+    @Nonnull @Override public String getReturnType() {
+        return returnType.getType();
+    }
+
+    @Override
+    public int getIndex() {
+        return index;
+    }
+
+    @Override
+    public void setIndex(int index) {
+        this.index = index;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMethodReference.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMethodReference.java
new file mode 100644
index 0000000..9670844
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMethodReference.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import org.jf.dexlib2.base.reference.BaseMethodReference;
+import org.jf.dexlib2.writer.DexWriter;
+
+import javax.annotation.Nonnull;
+
+public class BuilderMethodReference extends BaseMethodReference implements BuilderReference {
+    @Nonnull final BuilderTypeReference definingClass;
+    @Nonnull final BuilderStringReference name;
+    @Nonnull final BuilderMethodProtoReference proto;
+    int index = DexWriter.NO_INDEX;
+
+    BuilderMethodReference(@Nonnull BuilderTypeReference definingClass,
+                           @Nonnull BuilderStringReference name,
+                           @Nonnull BuilderMethodProtoReference proto) {
+        this.definingClass = definingClass;
+        this.name = name;
+        this.proto = proto;
+    }
+
+    @Nonnull @Override public String getDefiningClass() {
+        return definingClass.getType();
+    }
+
+    @Nonnull @Override public String getName() {
+        return this.name.getString();
+    }
+
+    @Nonnull @Override public BuilderTypeList getParameterTypes() {
+        return proto.parameterTypes;
+    }
+
+    @Nonnull @Override public String getReturnType() {
+        return proto.returnType.getType();
+    }
+
+    @Override public int getIndex() {
+        return index;
+    }
+
+    @Override public void setIndex(int index) {
+        this.index = index;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderProtoPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderProtoPool.java
new file mode 100644
index 0000000..969f243
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderProtoPool.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import com.google.common.collect.Maps;
+import org.jf.dexlib2.iface.reference.MethodProtoReference;
+import org.jf.dexlib2.iface.reference.MethodReference;
+import org.jf.dexlib2.immutable.reference.ImmutableMethodProtoReference;
+import org.jf.dexlib2.util.MethodUtil;
+import org.jf.dexlib2.writer.ProtoSection;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Collection;
+import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentMap;
+
+class BuilderProtoPool extends BaseBuilderPool
+        implements ProtoSection<BuilderStringReference, BuilderTypeReference, BuilderMethodProtoReference, BuilderTypeList> {
+    @Nonnull private final ConcurrentMap<MethodProtoReference, BuilderMethodProtoReference> internedItems =
+            Maps.newConcurrentMap();
+
+    public BuilderProtoPool(@Nonnull DexBuilder dexBuilder) {
+        super(dexBuilder);
+    }
+
+    @Nonnull public BuilderMethodProtoReference internMethodProto(@Nonnull MethodProtoReference methodProto) {
+        BuilderMethodProtoReference ret = internedItems.get(methodProto);
+        if (ret != null) {
+            return ret;
+        }
+
+        BuilderMethodProtoReference protoReference = new BuilderMethodProtoReference(
+                dexBuilder.stringSection.internString(MethodUtil.getShorty(
+                        methodProto.getParameterTypes(), methodProto.getReturnType())),
+                dexBuilder.typeListSection.internTypeList(methodProto.getParameterTypes()),
+                dexBuilder.typeSection.internType(methodProto.getReturnType()));
+        ret = internedItems.putIfAbsent(protoReference, protoReference);
+        return ret==null?protoReference:ret;
+    }
+
+    @Nonnull public BuilderMethodProtoReference internMethodProto(@Nonnull MethodReference methodReference) {
+        return internMethodProto(new ImmutableMethodProtoReference(
+                methodReference.getParameterTypes(), methodReference.getReturnType()));
+    }
+
+    @Nonnull @Override public BuilderStringReference getShorty(@Nonnull BuilderMethodProtoReference proto) {
+        return proto.shorty;
+    }
+
+    @Nonnull @Override public BuilderTypeReference getReturnType(@Nonnull BuilderMethodProtoReference proto) {
+        return proto.returnType;
+    }
+
+    @Nullable @Override public BuilderTypeList getParameters(@Nonnull BuilderMethodProtoReference proto) {
+        return proto.parameterTypes;
+    }
+
+    @Override public int getItemIndex(@Nonnull BuilderMethodProtoReference proto) {
+        return proto.getIndex();
+    }
+
+    @Nonnull @Override public Collection<? extends Entry<? extends BuilderMethodProtoReference, Integer>> getItems() {
+        return new BuilderMapEntryCollection<BuilderMethodProtoReference>(internedItems.values()) {
+            @Override protected int getValue(@Nonnull BuilderMethodProtoReference key) {
+                return key.index;
+            }
+
+            @Override protected int setValue(@Nonnull BuilderMethodProtoReference key, int value) {
+                int prev = key.index;
+                key.index = value;
+                return prev;
+            }
+        };
+    }
+
+    @Override public int getItemCount() {
+        return internedItems.size();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderReference.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderReference.java
new file mode 100644
index 0000000..27ad5af
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderReference.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import org.jf.dexlib2.iface.reference.Reference;
+
+public interface BuilderReference extends Reference {
+    int getIndex();
+    void setIndex(int index);
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderStringPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderStringPool.java
new file mode 100644
index 0000000..95fe86f
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderStringPool.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import com.google.common.collect.Maps;
+import org.jf.dexlib2.writer.DexWriter;
+import org.jf.dexlib2.writer.StringSection;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Collection;
+import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentMap;
+
+class BuilderStringPool implements StringSection<BuilderStringReference, BuilderStringReference> {
+    @Nonnull private final ConcurrentMap<String, BuilderStringReference> internedItems = Maps.newConcurrentMap();
+
+    @Nonnull BuilderStringReference internString(@Nonnull String string) {
+        BuilderStringReference ret = internedItems.get(string);
+        if (ret != null) {
+            return ret;
+        }
+        BuilderStringReference stringReference = new BuilderStringReference(string);
+        ret = internedItems.putIfAbsent(string, stringReference);
+        return ret==null?stringReference:ret;
+    }
+
+    @Nullable BuilderStringReference internNullableString(@Nullable String string) {
+        if (string == null) {
+            return null;
+        }
+        return internString(string);
+    }
+
+    @Override public int getNullableItemIndex(@Nullable BuilderStringReference key) {
+        return key==null?DexWriter.NO_INDEX:key.index;
+    }
+
+    @Override public int getItemIndex(@Nonnull BuilderStringReference key) {
+        return key.index;
+    }
+
+    @Override public boolean hasJumboIndexes() {
+        return internedItems.size() > 65536;
+    }
+
+    @Nonnull @Override public Collection<? extends Entry<? extends BuilderStringReference, Integer>> getItems() {
+        return new BuilderMapEntryCollection<BuilderStringReference>(internedItems.values()) {
+            @Override protected int getValue(@Nonnull BuilderStringReference key) {
+                return key.index;
+            }
+
+            @Override protected int setValue(@Nonnull BuilderStringReference key, int value) {
+                int prev = key.index;
+                key.index = value;
+                return prev;
+            }
+        };
+    }
+
+    @Override public int getItemCount() {
+        return internedItems.size();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderStringReference.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderStringReference.java
new file mode 100644
index 0000000..eddb4a6
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderStringReference.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import org.jf.dexlib2.base.reference.BaseStringReference;
+import org.jf.dexlib2.writer.DexWriter;
+
+import javax.annotation.Nonnull;
+
+public class BuilderStringReference extends BaseStringReference implements BuilderReference {
+    @Nonnull final String string;
+    int index = DexWriter.NO_INDEX;
+
+    BuilderStringReference(@Nonnull String string) {
+        this.string = string;
+    }
+
+    @Nonnull @Override public String getString() {
+        return string;
+    }
+
+    @Override public int getIndex() {
+        return index;
+    }
+
+    @Override public void setIndex(int index) {
+        this.index = index;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTryBlock.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTryBlock.java
new file mode 100644
index 0000000..178357e
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTryBlock.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import org.jf.dexlib2.base.BaseTryBlock;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+public class BuilderTryBlock extends BaseTryBlock<BuilderExceptionHandler> {
+    private final int startCodeAddress;
+    private final int codeUnitCount;
+    @Nonnull private final List<? extends BuilderExceptionHandler> exceptionHandlers;
+
+    public BuilderTryBlock(int startCodeAddress, int codeUnitCount,
+                           @Nonnull List<? extends BuilderExceptionHandler> exceptionHandlers) {
+        this.startCodeAddress = startCodeAddress;
+        this.codeUnitCount = codeUnitCount;
+        this.exceptionHandlers = exceptionHandlers;
+    }
+
+    @Override public int getStartCodeAddress() {
+        return startCodeAddress;
+    }
+
+    @Override public int getCodeUnitCount() {
+        return codeUnitCount;
+    }
+
+    @Nonnull @Override public List<? extends BuilderExceptionHandler> getExceptionHandlers() {
+        return exceptionHandlers;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTypeList.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTypeList.java
new file mode 100644
index 0000000..87f7115
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTypeList.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import com.google.common.collect.ImmutableList;
+import org.jf.dexlib2.writer.DexWriter;
+
+import javax.annotation.Nonnull;
+import java.util.AbstractList;
+import java.util.List;
+
+public class BuilderTypeList extends AbstractList<BuilderTypeReference> {
+    static final BuilderTypeList EMPTY = new BuilderTypeList(ImmutableList.<BuilderTypeReference>of());
+
+    @Nonnull final List<? extends BuilderTypeReference> types;
+    int offset = DexWriter.NO_OFFSET;
+
+    public BuilderTypeList(@Nonnull List<? extends BuilderTypeReference> types) {
+        this.types = types;
+    }
+
+    @Override public BuilderTypeReference get(int index) {
+        return types.get(index);
+    }
+
+    @Override public int size() {
+        return types.size();
+    }
+
+    public int getOffset() {
+        return offset;
+    }
+
+    public void setOffset(int offset) {
+        this.offset = offset;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTypeListPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTypeListPool.java
new file mode 100644
index 0000000..604e39c
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTypeListPool.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import com.google.common.base.Function;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Maps;
+import org.jf.dexlib2.writer.DexWriter;
+import org.jf.dexlib2.writer.TypeListSection;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentMap;
+
+class BuilderTypeListPool extends BaseBuilderPool implements TypeListSection<BuilderTypeReference, BuilderTypeList> {
+    @Nonnull private final ConcurrentMap<List<? extends CharSequence>, BuilderTypeList> internedItems =
+            Maps.newConcurrentMap();
+
+    public BuilderTypeListPool(@Nonnull DexBuilder dexBuilder) {
+        super(dexBuilder);
+    }
+
+    @Nonnull public BuilderTypeList internTypeList(@Nullable List<? extends CharSequence> types) {
+        if (types == null || types.size() == 0) {
+            return BuilderTypeList.EMPTY;
+        }
+
+        BuilderTypeList ret = internedItems.get(types);
+        if (ret != null) {
+            return ret;
+        }
+
+        BuilderTypeList typeList = new BuilderTypeList(
+                ImmutableList.copyOf(Iterables.transform(types, new Function<CharSequence, BuilderTypeReference>() {
+                    @Nonnull @Override public BuilderTypeReference apply(CharSequence input) {
+                        return dexBuilder.typeSection.internType(input.toString());
+                    }
+                })));
+
+        ret = internedItems.putIfAbsent(typeList, typeList);
+        return ret==null?typeList:ret;
+    }
+
+    @Override public int getNullableItemOffset(@Nullable BuilderTypeList key) {
+        return (key==null||key.size()==0)?DexWriter.NO_OFFSET:key.offset;
+    }
+
+    @Nonnull @Override
+    public Collection<? extends BuilderTypeReference> getTypes(@Nullable BuilderTypeList key) {
+        return key==null?BuilderTypeList.EMPTY:key.types;
+    }
+
+    @Override public int getItemOffset(@Nonnull BuilderTypeList key) {
+        return key.offset;
+    }
+
+    @Nonnull @Override public Collection<? extends Entry<? extends BuilderTypeList, Integer>> getItems() {
+        return new BuilderMapEntryCollection<BuilderTypeList>(internedItems.values()) {
+            @Override protected int getValue(@Nonnull BuilderTypeList key) {
+                return key.offset;
+            }
+
+            @Override protected int setValue(@Nonnull BuilderTypeList key, int value) {
+                int prev = key.offset;
+                key.offset = value;
+                return prev;
+            }
+        };
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTypePool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTypePool.java
new file mode 100644
index 0000000..b9476de
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTypePool.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import com.google.common.collect.Maps;
+import org.jf.dexlib2.writer.DexWriter;
+import org.jf.dexlib2.writer.TypeSection;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Collection;
+import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentMap;
+
+class BuilderTypePool extends BaseBuilderPool
+        implements TypeSection<BuilderStringReference, BuilderTypeReference, BuilderTypeReference> {
+    @Nonnull private final ConcurrentMap<String, BuilderTypeReference> internedItems = Maps.newConcurrentMap();
+
+    public BuilderTypePool(@Nonnull DexBuilder dexBuilder) {
+        super(dexBuilder);
+    }
+
+    @Nonnull public BuilderTypeReference internType(@Nonnull String type) {
+        BuilderTypeReference ret = internedItems.get(type);
+        if (ret != null) {
+            return ret;
+        }
+        BuilderStringReference stringRef = dexBuilder.stringSection.internString(type);
+        BuilderTypeReference typeReference = new BuilderTypeReference(stringRef);
+        ret = internedItems.putIfAbsent(type, typeReference);
+        return ret==null?typeReference:ret;
+    }
+
+    @Nullable public BuilderTypeReference internNullableType(@Nullable String type) {
+        if (type == null) {
+            return null;
+        }
+        return internType(type);
+    }
+
+    @Nonnull @Override public BuilderStringReference getString(@Nonnull BuilderTypeReference key) {
+        return key.stringReference;
+    }
+
+    @Override public int getNullableItemIndex(@Nullable BuilderTypeReference key) {
+        return key==null?DexWriter.NO_INDEX:key.index;
+    }
+
+    @Override public int getItemIndex(@Nonnull BuilderTypeReference key) {
+        return key.getIndex();
+    }
+
+    @Nonnull @Override public Collection<? extends Entry<? extends BuilderTypeReference, Integer>> getItems() {
+        return new BuilderMapEntryCollection<BuilderTypeReference>(internedItems.values()) {
+            @Override protected int getValue(@Nonnull BuilderTypeReference key) {
+                return key.index;
+            }
+
+            @Override protected int setValue(@Nonnull BuilderTypeReference key, int value) {
+                int prev = key.index;
+                key.index = value;
+                return prev;
+            }
+        };
+    }
+
+    @Override public int getItemCount() {
+        return internedItems.size();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTypeReference.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTypeReference.java
new file mode 100644
index 0000000..c6561bf
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTypeReference.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import org.jf.dexlib2.base.reference.BaseTypeReference;
+import org.jf.dexlib2.writer.DexWriter;
+
+import javax.annotation.Nonnull;
+
+public class BuilderTypeReference extends BaseTypeReference implements BuilderReference {
+    @Nonnull final BuilderStringReference stringReference;
+    int index = DexWriter.NO_INDEX;
+
+    BuilderTypeReference(@Nonnull BuilderStringReference stringReference) {
+        this.stringReference = stringReference;
+    }
+
+    @Nonnull @Override public String getType() {
+        return stringReference.getString();
+    }
+
+    @Override public int getIndex() {
+        return index;
+    }
+
+    @Override public void setIndex(int index) {
+        this.index = index;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/DexBuilder.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/DexBuilder.java
new file mode 100644
index 0000000..0e3e0ba
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/DexBuilder.java
@@ -0,0 +1,469 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import com.google.common.base.Function;
+import com.google.common.collect.*;
+import org.jf.dexlib2.HiddenApiRestriction;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.ValueType;
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.iface.AnnotationElement;
+import org.jf.dexlib2.iface.MethodImplementation;
+import org.jf.dexlib2.iface.MethodParameter;
+import org.jf.dexlib2.iface.reference.*;
+import org.jf.dexlib2.iface.value.*;
+import org.jf.dexlib2.util.FieldUtil;
+import org.jf.dexlib2.writer.DexWriter;
+import org.jf.dexlib2.writer.builder.BuilderEncodedValues.*;
+import org.jf.dexlib2.writer.util.StaticInitializerUtil;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+public class DexBuilder extends DexWriter<BuilderStringReference, BuilderStringReference, BuilderTypeReference,
+        BuilderTypeReference, BuilderMethodProtoReference, BuilderFieldReference, BuilderMethodReference,
+        BuilderClassDef, BuilderCallSiteReference, BuilderMethodHandleReference, BuilderAnnotation, BuilderAnnotationSet, BuilderTypeList,
+        BuilderField, BuilderMethod, BuilderArrayEncodedValue, BuilderEncodedValue, BuilderAnnotationElement,
+        BuilderStringPool, BuilderTypePool, BuilderProtoPool, BuilderFieldPool, BuilderMethodPool, BuilderClassPool,
+        BuilderCallSitePool, BuilderMethodHandlePool, BuilderTypeListPool, BuilderAnnotationPool,
+        BuilderAnnotationSetPool, BuilderEncodedArrayPool> {
+
+    public DexBuilder(@Nonnull Opcodes opcodes) {
+        super(opcodes);
+    }
+
+    @Nonnull @Override protected SectionProvider getSectionProvider() {
+        return new DexBuilderSectionProvider();
+    }
+
+    @Nonnull public BuilderField internField(@Nonnull String definingClass,
+                                             @Nonnull String name,
+                                             @Nonnull String type,
+                                             int accessFlags,
+                                             @Nullable EncodedValue initialValue,
+                                             @Nonnull Set<? extends Annotation> annotations,
+                                             @Nonnull Set<HiddenApiRestriction> hiddenApiRestrictions) {
+        return new BuilderField(fieldSection.internField(definingClass, name, type),
+                accessFlags,
+                internNullableEncodedValue(initialValue),
+                annotationSetSection.internAnnotationSet(annotations),
+                hiddenApiRestrictions);
+    }
+
+    @Nonnull public BuilderMethod internMethod(@Nonnull String definingClass,
+                                               @Nonnull String name,
+                                               @Nullable List<? extends MethodParameter> parameters,
+                                               @Nonnull String returnType,
+                                               int accessFlags,
+                                               @Nonnull Set<? extends Annotation> annotations,
+                                               @Nonnull Set<HiddenApiRestriction> hiddenApiRestrictions,
+                                               @Nullable MethodImplementation methodImplementation) {
+        if (parameters == null) {
+            parameters = ImmutableList.of();
+        }
+        return new BuilderMethod(methodSection.internMethod(definingClass, name, parameters, returnType),
+                internMethodParameters(parameters),
+                accessFlags,
+                annotationSetSection.internAnnotationSet(annotations),
+                hiddenApiRestrictions,
+                methodImplementation);
+    }
+
+    @Nonnull public BuilderClassDef internClassDef(@Nonnull String type,
+                                                   int accessFlags,
+                                                   @Nullable String superclass,
+                                                   @Nullable List<String> interfaces,
+                                                   @Nullable String sourceFile,
+                                                   @Nonnull Set<? extends Annotation> annotations,
+                                                   @Nullable Iterable<? extends BuilderField> fields,
+                                                   @Nullable Iterable<? extends BuilderMethod> methods) {
+        if (interfaces == null) {
+            interfaces = ImmutableList.of();
+        } else {
+            Set<String> interfaces_copy = Sets.newHashSet(interfaces);
+            Iterator<String> interfaceIterator = interfaces.iterator();
+            while (interfaceIterator.hasNext()) {
+                String iface = interfaceIterator.next();
+                if (!interfaces_copy.contains(iface)) {
+                    interfaceIterator.remove();
+                } else {
+                    interfaces_copy.remove(iface);
+                }
+            }
+        }
+
+        ImmutableSortedSet<BuilderField> staticFields = null;
+        ImmutableSortedSet<BuilderField> instanceFields = null;
+        BuilderArrayEncodedValue internedStaticInitializers = null;
+        if (fields != null) {
+            staticFields = ImmutableSortedSet.copyOf(Iterables.filter(fields, FieldUtil.FIELD_IS_STATIC));
+            instanceFields = ImmutableSortedSet.copyOf(Iterables.filter(fields, FieldUtil.FIELD_IS_INSTANCE));
+            ArrayEncodedValue staticInitializers = StaticInitializerUtil.getStaticInitializers(staticFields);
+            if (staticInitializers != null) {
+                internedStaticInitializers = encodedArraySection.internArrayEncodedValue(staticInitializers);
+            }
+        }
+
+        return classSection.internClass(new BuilderClassDef(typeSection.internType(type),
+                accessFlags,
+                typeSection.internNullableType(superclass),
+                typeListSection.internTypeList(interfaces),
+                stringSection.internNullableString(sourceFile),
+                annotationSetSection.internAnnotationSet(annotations),
+                staticFields,
+                instanceFields,
+                methods,
+                internedStaticInitializers));
+    }
+
+    public BuilderCallSiteReference internCallSite(@Nonnull CallSiteReference callSiteReference) {
+        return callSiteSection.internCallSite(callSiteReference);
+    }
+
+    public BuilderMethodHandleReference internMethodHandle(@Nonnull MethodHandleReference methodHandleReference) {
+        return methodHandleSection.internMethodHandle(methodHandleReference);
+    }
+
+    @Nonnull public BuilderStringReference internStringReference(@Nonnull String string) {
+        return stringSection.internString(string);
+    }
+
+    @Nullable public BuilderStringReference internNullableStringReference(@Nullable String string) {
+        if (string != null) {
+            return internStringReference(string);
+        }
+        return null;
+    }
+
+    @Nonnull public BuilderTypeReference internTypeReference(@Nonnull String type) {
+        return typeSection.internType(type);
+    }
+
+    @Nullable public BuilderTypeReference internNullableTypeReference(@Nullable String type) {
+        if (type != null) {
+            return internTypeReference(type);
+        }
+        return null;
+    }
+
+    @Nonnull public BuilderFieldReference internFieldReference(@Nonnull FieldReference field) {
+        return fieldSection.internField(field);
+    }
+
+    @Nonnull public BuilderMethodReference internMethodReference(@Nonnull MethodReference method) {
+        return methodSection.internMethod(method);
+    }
+
+    @Nonnull public BuilderMethodProtoReference internMethodProtoReference(@Nonnull MethodProtoReference methodProto) {
+        return protoSection.internMethodProto(methodProto);
+    }
+
+    @Nonnull public BuilderReference internReference(@Nonnull Reference reference) {
+        if (reference instanceof StringReference) {
+            return internStringReference(((StringReference)reference).getString());
+        }
+        if (reference instanceof TypeReference) {
+            return internTypeReference(((TypeReference)reference).getType());
+        }
+        if (reference instanceof MethodReference) {
+            return internMethodReference((MethodReference)reference);
+        }
+        if (reference instanceof FieldReference) {
+            return internFieldReference((FieldReference)reference);
+        }
+        if (reference instanceof MethodProtoReference) {
+            return internMethodProtoReference((MethodProtoReference) reference);
+        }
+        if (reference instanceof CallSiteReference) {
+            return internCallSite((CallSiteReference) reference);
+        }
+        if (reference instanceof MethodHandleReference) {
+            return internMethodHandle((MethodHandleReference) reference);
+        }
+        throw new IllegalArgumentException("Could not determine type of reference");
+    }
+
+    @Nonnull private List<BuilderMethodParameter> internMethodParameters(
+            @Nullable List<? extends MethodParameter> methodParameters) {
+        if (methodParameters == null) {
+            return ImmutableList.of();
+        }
+        return ImmutableList.copyOf(Iterators.transform(methodParameters.iterator(),
+                new Function<MethodParameter, BuilderMethodParameter>() {
+                    @Nullable @Override public BuilderMethodParameter apply(MethodParameter input) {
+                        return internMethodParameter(input);
+                    }
+                }));
+    }
+
+    @Nonnull private BuilderMethodParameter internMethodParameter(@Nonnull MethodParameter methodParameter) {
+        return new BuilderMethodParameter(
+                typeSection.internType(methodParameter.getType()),
+                stringSection.internNullableString(methodParameter.getName()),
+                annotationSetSection.internAnnotationSet(methodParameter.getAnnotations()));
+    }
+
+    @Override protected void writeEncodedValue(@Nonnull InternalEncodedValueWriter writer,
+                                               @Nonnull BuilderEncodedValue encodedValue) throws IOException {
+        switch (encodedValue.getValueType()) {
+            case ValueType.ANNOTATION:
+                BuilderAnnotationEncodedValue annotationEncodedValue = (BuilderAnnotationEncodedValue)encodedValue;
+                writer.writeAnnotation(annotationEncodedValue.typeReference, annotationEncodedValue.elements);
+                break;
+            case ValueType.ARRAY:
+                BuilderArrayEncodedValue arrayEncodedValue = (BuilderArrayEncodedValue)encodedValue;
+                writer.writeArray(arrayEncodedValue.elements);
+                break;
+            case ValueType.BOOLEAN:
+                writer.writeBoolean(((BooleanEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.BYTE:
+                writer.writeByte(((ByteEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.CHAR:
+                writer.writeChar(((CharEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.DOUBLE:
+                writer.writeDouble(((DoubleEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.ENUM:
+                writer.writeEnum(((BuilderEnumEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.FIELD:
+                writer.writeField(((BuilderFieldEncodedValue)encodedValue).fieldReference);
+                break;
+            case ValueType.FLOAT:
+                writer.writeFloat(((FloatEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.INT:
+                writer.writeInt(((IntEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.LONG:
+                writer.writeLong(((LongEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.METHOD:
+                writer.writeMethod(((BuilderMethodEncodedValue)encodedValue).methodReference);
+                break;
+            case ValueType.NULL:
+                writer.writeNull();
+                break;
+            case ValueType.SHORT:
+                writer.writeShort(((ShortEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.STRING:
+                writer.writeString(((BuilderStringEncodedValue)encodedValue).stringReference);
+                break;
+            case ValueType.TYPE:
+                writer.writeType(((BuilderTypeEncodedValue)encodedValue).typeReference);
+                break;
+            case ValueType.METHOD_TYPE:
+                writer.writeMethodType(((BuilderMethodTypeEncodedValue) encodedValue).methodProtoReference);
+                break;
+            case ValueType.METHOD_HANDLE:
+                writer.writeMethodHandle(((BuilderMethodHandleEncodedValue) encodedValue).methodHandleReference);
+                break;
+            default:
+                throw new ExceptionWithContext("Unrecognized value type: %d", encodedValue.getValueType());
+        }
+    }
+
+    @Nonnull Set<? extends BuilderAnnotationElement> internAnnotationElements(
+            @Nonnull Set<? extends AnnotationElement> elements) {
+        return ImmutableSet.copyOf(
+                Iterators.transform(elements.iterator(),
+                        new Function<AnnotationElement, BuilderAnnotationElement>() {
+                            @Nullable @Override
+                            public BuilderAnnotationElement apply(AnnotationElement input) {
+                                return internAnnotationElement(input);
+                            }
+                        }));
+    }
+
+    @Nonnull private BuilderAnnotationElement internAnnotationElement(@Nonnull AnnotationElement annotationElement) {
+        return new BuilderAnnotationElement(stringSection.internString(annotationElement.getName()),
+                internEncodedValue(annotationElement.getValue()));
+    }
+
+    @Nullable BuilderEncodedValue internNullableEncodedValue(@Nullable EncodedValue encodedValue) {
+        if (encodedValue == null) {
+            return null;
+        }
+        return internEncodedValue(encodedValue);
+    }
+
+    @Nonnull BuilderEncodedValue internEncodedValue(@Nonnull EncodedValue encodedValue) {
+        switch (encodedValue.getValueType()) {
+            case ValueType.ANNOTATION:
+                return internAnnotationEncodedValue((AnnotationEncodedValue)encodedValue);
+            case ValueType.ARRAY:
+                return internArrayEncodedValue((ArrayEncodedValue)encodedValue);
+            case ValueType.BOOLEAN:
+                boolean value = ((BooleanEncodedValue)encodedValue).getValue();
+                return value?BuilderBooleanEncodedValue.TRUE_VALUE:BuilderBooleanEncodedValue.FALSE_VALUE;
+            case ValueType.BYTE:
+                return new BuilderByteEncodedValue(((ByteEncodedValue)encodedValue).getValue());
+            case ValueType.CHAR:
+                return new BuilderCharEncodedValue(((CharEncodedValue)encodedValue).getValue());
+            case ValueType.DOUBLE:
+                return new BuilderDoubleEncodedValue(((DoubleEncodedValue)encodedValue).getValue());
+            case ValueType.ENUM:
+                return internEnumEncodedValue((EnumEncodedValue)encodedValue);
+            case ValueType.FIELD:
+                return internFieldEncodedValue((FieldEncodedValue)encodedValue);
+            case ValueType.FLOAT:
+                return new BuilderFloatEncodedValue(((FloatEncodedValue)encodedValue).getValue());
+            case ValueType.INT:
+                return new BuilderIntEncodedValue(((IntEncodedValue)encodedValue).getValue());
+            case ValueType.LONG:
+                return new BuilderLongEncodedValue(((LongEncodedValue)encodedValue).getValue());
+            case ValueType.METHOD:
+                return internMethodEncodedValue((MethodEncodedValue)encodedValue);
+            case ValueType.NULL:
+                return BuilderNullEncodedValue.INSTANCE;
+            case ValueType.SHORT:
+                return new BuilderShortEncodedValue(((ShortEncodedValue)encodedValue).getValue());
+            case ValueType.STRING:
+                return internStringEncodedValue((StringEncodedValue)encodedValue);
+            case ValueType.TYPE:
+                return internTypeEncodedValue((TypeEncodedValue)encodedValue);
+            case ValueType.METHOD_TYPE:
+                return internMethodTypeEncodedValue((MethodTypeEncodedValue) encodedValue);
+            case ValueType.METHOD_HANDLE:
+                return internMethodHandleEncodedValue((MethodHandleEncodedValue) encodedValue);
+            default:
+                throw new ExceptionWithContext("Unexpected encoded value type: %d", encodedValue.getValueType());
+        }
+    }
+
+    @Nonnull private BuilderAnnotationEncodedValue internAnnotationEncodedValue(@Nonnull AnnotationEncodedValue value) {
+        return new BuilderAnnotationEncodedValue(
+                typeSection.internType(value.getType()),
+                internAnnotationElements(value.getElements()));
+    }
+
+    @Nonnull private BuilderArrayEncodedValue internArrayEncodedValue(@Nonnull ArrayEncodedValue value) {
+        return new BuilderArrayEncodedValue(
+                ImmutableList.copyOf(
+                        Iterators.transform(value.getValue().iterator(),
+                                new Function<EncodedValue, BuilderEncodedValue>() {
+                                    @Nullable @Override public BuilderEncodedValue apply(EncodedValue input) {
+                                        return internEncodedValue(input);
+                                    }
+                                })));
+    }
+
+    @Nonnull private BuilderEnumEncodedValue internEnumEncodedValue(@Nonnull EnumEncodedValue value) {
+        return new BuilderEnumEncodedValue(fieldSection.internField(value.getValue()));
+    }
+
+    @Nonnull private BuilderFieldEncodedValue internFieldEncodedValue(@Nonnull FieldEncodedValue value) {
+        return new BuilderFieldEncodedValue(fieldSection.internField(value.getValue()));
+    }
+
+    @Nonnull private BuilderMethodEncodedValue internMethodEncodedValue(@Nonnull MethodEncodedValue value) {
+        return new BuilderMethodEncodedValue(methodSection.internMethod(value.getValue()));
+    }
+
+    @Nonnull private BuilderStringEncodedValue internStringEncodedValue(@Nonnull StringEncodedValue string) {
+        return new BuilderStringEncodedValue(stringSection.internString(string.getValue()));
+    }
+
+    @Nonnull private BuilderTypeEncodedValue internTypeEncodedValue(@Nonnull TypeEncodedValue type) {
+        return new BuilderTypeEncodedValue(typeSection.internType(type.getValue()));
+    }
+
+    @Nonnull private BuilderMethodTypeEncodedValue internMethodTypeEncodedValue(
+            @Nonnull MethodTypeEncodedValue methodType) {
+        return new BuilderMethodTypeEncodedValue(protoSection.internMethodProto(methodType.getValue()));
+    }
+
+    @Nonnull private BuilderMethodHandleEncodedValue internMethodHandleEncodedValue(
+            @Nonnull MethodHandleEncodedValue methodHandle) {
+        return new BuilderMethodHandleEncodedValue(methodHandleSection.internMethodHandle(methodHandle.getValue()));
+    }
+
+    protected class DexBuilderSectionProvider extends SectionProvider {
+        @Nonnull @Override public BuilderStringPool getStringSection() {
+            return new BuilderStringPool();
+        }
+
+        @Nonnull @Override public BuilderTypePool getTypeSection() {
+            return new BuilderTypePool(DexBuilder.this);
+        }
+
+        @Nonnull @Override public BuilderProtoPool getProtoSection() {
+            return new BuilderProtoPool(DexBuilder.this);
+        }
+
+        @Nonnull @Override public BuilderFieldPool getFieldSection() {
+            return new BuilderFieldPool(DexBuilder.this);
+        }
+
+        @Nonnull @Override public BuilderMethodPool getMethodSection() {
+            return new BuilderMethodPool(DexBuilder.this);
+        }
+
+        @Nonnull @Override public BuilderClassPool getClassSection() {
+            return new BuilderClassPool(DexBuilder.this);
+        }
+
+        @Nonnull @Override public BuilderCallSitePool getCallSiteSection() {
+            return new BuilderCallSitePool(DexBuilder.this);
+        }
+
+        @Nonnull @Override public BuilderMethodHandlePool getMethodHandleSection() {
+            return new BuilderMethodHandlePool(DexBuilder.this);
+        }
+
+        @Nonnull @Override public BuilderTypeListPool getTypeListSection() {
+            return new BuilderTypeListPool(DexBuilder.this);
+        }
+
+        @Nonnull @Override public BuilderAnnotationPool getAnnotationSection() {
+            return new BuilderAnnotationPool(DexBuilder.this);
+        }
+
+        @Nonnull @Override public BuilderAnnotationSetPool getAnnotationSetSection() {
+            return new BuilderAnnotationSetPool(DexBuilder.this);
+        }
+
+        @Nonnull @Override public BuilderEncodedArrayPool getEncodedArraySection() {
+            return new BuilderEncodedArrayPool(DexBuilder.this);
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/io/DeferredOutputStream.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/io/DeferredOutputStream.java
new file mode 100644
index 0000000..2259146
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/io/DeferredOutputStream.java
@@ -0,0 +1,8 @@
+package org.jf.dexlib2.writer.io;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+public abstract class DeferredOutputStream extends OutputStream {
+    public abstract void writeTo(OutputStream output) throws IOException;
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/io/DeferredOutputStreamFactory.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/io/DeferredOutputStreamFactory.java
new file mode 100644
index 0000000..8204309
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/io/DeferredOutputStreamFactory.java
@@ -0,0 +1,7 @@
+package org.jf.dexlib2.writer.io;
+
+import java.io.IOException;
+
+public interface DeferredOutputStreamFactory {
+    DeferredOutputStream makeDeferredOutputStream() throws IOException;
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/io/DexDataStore.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/io/DexDataStore.java
new file mode 100644
index 0000000..0ca6930
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/io/DexDataStore.java
@@ -0,0 +1,12 @@
+package org.jf.dexlib2.writer.io;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+public interface DexDataStore {
+    @Nonnull OutputStream outputAt(int offset);
+    @Nonnull InputStream readAt(int offset);
+    void close() throws IOException;
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/io/FileDataStore.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/io/FileDataStore.java
new file mode 100644
index 0000000..38905df
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/io/FileDataStore.java
@@ -0,0 +1,28 @@
+package org.jf.dexlib2.writer.io;
+
+import org.jf.util.RandomAccessFileInputStream;
+import org.jf.util.RandomAccessFileOutputStream;
+
+import javax.annotation.Nonnull;
+import java.io.*;
+
+public class FileDataStore implements DexDataStore {
+    private final RandomAccessFile raf;
+
+    public FileDataStore(@Nonnull File file) throws FileNotFoundException, IOException {
+        this.raf = new RandomAccessFile(file, "rw");
+        this.raf.setLength(0);
+    }
+
+    @Nonnull @Override public OutputStream outputAt(int offset) {
+        return new RandomAccessFileOutputStream(raf, offset);
+    }
+
+    @Nonnull @Override public InputStream readAt(int offset) {
+        return new RandomAccessFileInputStream(raf, offset);
+    }
+
+    @Override public void close() throws IOException {
+        raf.close();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/io/FileDeferredOutputStream.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/io/FileDeferredOutputStream.java
new file mode 100644
index 0000000..0cccb04
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/io/FileDeferredOutputStream.java
@@ -0,0 +1,104 @@
+package org.jf.dexlib2.writer.io;
+
+import com.google.common.io.ByteStreams;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.*;
+
+/**
+ * A deferred output stream that uses a file as its backing store, with a in-memory intermediate buffer.
+ */
+public class FileDeferredOutputStream extends DeferredOutputStream {
+    private static final int DEFAULT_BUFFER_SIZE = 4 * 1024;
+
+    @Nonnull private final File backingFile;
+    @Nonnull private final NakedBufferedOutputStream output;
+    private int writtenBytes;
+
+    public FileDeferredOutputStream(@Nonnull File backingFile) throws FileNotFoundException {
+        this(backingFile, DEFAULT_BUFFER_SIZE);
+    }
+
+    public FileDeferredOutputStream(@Nonnull File backingFile, int bufferSize) throws FileNotFoundException {
+        this.backingFile = backingFile;
+        output = new NakedBufferedOutputStream(new FileOutputStream(backingFile), bufferSize);
+    }
+
+    @Override public void writeTo(@Nonnull OutputStream dest) throws IOException {
+        byte[] outBuf = output.getBuffer();
+        int count = output.getCount();
+        output.resetBuffer();
+        output.close();
+
+        // did we actually write something out to disk?
+        if (count != writtenBytes) {
+            InputStream fis = new FileInputStream(backingFile);
+            ByteStreams.copy(fis, dest);
+            backingFile.delete();
+        }
+
+        dest.write(outBuf, 0, count);
+    }
+
+    @Override public void write(int i) throws IOException {
+        output.write(i);
+        writtenBytes++;
+    }
+
+    @Override public void write(byte[] bytes) throws IOException {
+        output.write(bytes);
+        writtenBytes += bytes.length;
+    }
+
+    @Override public void write(byte[] bytes, int off, int len) throws IOException {
+        output.write(bytes, off, len);
+        writtenBytes += len;
+    }
+
+    @Override public void flush() throws IOException {
+        output.flush();
+    }
+
+    @Override public void close() throws IOException {
+        output.close();
+    }
+
+    private static class NakedBufferedOutputStream extends BufferedOutputStream {
+        public NakedBufferedOutputStream(OutputStream outputStream) {
+            super(outputStream);
+        }
+
+        public NakedBufferedOutputStream(OutputStream outputStream, int i) {
+            super(outputStream, i);
+        }
+
+        public int getCount() {
+            return count;
+        }
+
+        public void resetBuffer() {
+            count = 0;
+        }
+
+        public byte[] getBuffer() {
+            return buf;
+        }
+    }
+
+    @Nonnull
+    public static DeferredOutputStreamFactory getFactory(@Nullable File containingDirectory) {
+        return getFactory(containingDirectory, DEFAULT_BUFFER_SIZE);
+    }
+
+    @Nonnull
+    public static DeferredOutputStreamFactory getFactory(@Nullable final File containingDirectory,
+                                                         final int bufferSize) {
+        return new DeferredOutputStreamFactory() {
+            @Override public DeferredOutputStream makeDeferredOutputStream() throws IOException {
+                File tempFile = File.createTempFile("dexlibtmp", null, containingDirectory);
+                return new FileDeferredOutputStream(tempFile, bufferSize);
+            }
+        };
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/io/MemoryDataStore.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/io/MemoryDataStore.java
new file mode 100644
index 0000000..6780836
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/io/MemoryDataStore.java
@@ -0,0 +1,138 @@
+package org.jf.dexlib2.writer.io;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Arrays;
+
+public class MemoryDataStore implements DexDataStore {
+    private byte[] buf;
+    private int size = 0;
+
+    public MemoryDataStore() {
+        this(0);
+    }
+
+    public MemoryDataStore(int initialCapacity) {
+        buf = new byte[initialCapacity];
+    }
+
+    public byte[] getBuffer() {
+        return buf;
+    }
+
+    public int getSize() {
+        return size;
+    }
+
+    public byte[] getData() {
+        return Arrays.copyOf(buf, size);
+    }
+
+    @Nonnull @Override public OutputStream outputAt(final int offset) {
+        if (offset < 0) throw new IllegalArgumentException();
+        return new OutputStream() {
+            private int position = offset;
+            @Override public void write(int b) throws IOException {
+                growBufferIfNeeded(position + 1);
+                buf[position++] = (byte)b;
+            }
+
+            @Override public void write(byte[] b) throws IOException {
+                growBufferIfNeeded(position + b.length);
+                System.arraycopy(b, 0, buf, position, b.length);
+                position += b.length;
+            }
+
+            @Override public void write(byte[] b, int off, int len) throws IOException {
+                growBufferIfNeeded(position + len);
+                System.arraycopy(b, off, buf, position, len);
+                position += len;
+            }
+        };
+    }
+
+    private void growBufferIfNeeded(int minSize) {
+        if (minSize > size) {
+            if (minSize > buf.length) {
+                int newSize = getNewBufferSize(buf.length, minSize);
+                if (newSize < minSize) throw new IndexOutOfBoundsException();
+                buf = Arrays.copyOf(buf, newSize);
+            }
+            size = minSize;
+        }
+    }
+
+    protected int getNewBufferSize(int currentSize, int newMinSize) {
+        final int MIN_GROWTH_STEP = 256 * 1024;
+        return Math.max(newMinSize + (newMinSize >> 2), currentSize + MIN_GROWTH_STEP);
+    }
+
+    @Nonnull @Override public InputStream readAt(final int offset) {
+        if (offset < 0) throw new IllegalArgumentException();
+        return new InputStream() {
+            private int position = offset;
+            private int mark = offset;
+
+            @Override public int read() throws IOException {
+                if (position >= size) {
+                    return -1;
+                }
+                return buf[position++];
+            }
+
+            @Override public int read(byte[] b) throws IOException {
+                int readLength = Math.min(b.length, size - position);
+                if (readLength <= 0) {
+                    if (position >= size) {
+                        return -1;
+                    }
+                    return 0;
+                }
+                System.arraycopy(buf, position, b, 0, readLength);
+                position += readLength;
+                return readLength;
+            }
+
+            @Override public int read(byte[] b, int off, int len) throws IOException {
+                int readLength = Math.min(len, size - position);
+                if (readLength <= 0) {
+                    if (position >= size) {
+                        return -1;
+                    }
+                    return 0;
+                }
+                System.arraycopy(buf, position, b, off, readLength);
+                position += readLength;
+                return readLength;
+            }
+
+            @Override public long skip(long n) throws IOException {
+                int skipLength = (int)Math.max(0, Math.min(n, size - position));
+                position += skipLength;
+                return skipLength;
+            }
+
+            @Override public int available() throws IOException {
+                return Math.max(0, size - position);
+            }
+
+            @Override public void mark(int i) {
+                mark = position;
+            }
+
+            @Override public void reset() throws IOException {
+                position = mark;
+            }
+
+            @Override public boolean markSupported() {
+                return true;
+            }
+        };
+    }
+
+    @Override public void close() throws IOException {
+        // no-op
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/io/MemoryDeferredOutputStream.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/io/MemoryDeferredOutputStream.java
new file mode 100644
index 0000000..9e6e69b
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/io/MemoryDeferredOutputStream.java
@@ -0,0 +1,88 @@
+package org.jf.dexlib2.writer.io;
+
+import com.google.common.collect.Lists;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.List;
+
+/**
+ * A deferred output stream that is stored in memory
+ */
+public class MemoryDeferredOutputStream extends DeferredOutputStream {
+    private static final int DEFAULT_BUFFER_SIZE = 16 * 1024;
+
+    private final List<byte[]> buffers = Lists.newArrayList();
+    private byte[] currentBuffer;
+    private int currentPosition;
+
+    public MemoryDeferredOutputStream() {
+        this(DEFAULT_BUFFER_SIZE);
+    }
+
+    public MemoryDeferredOutputStream(int bufferSize) {
+        currentBuffer = new byte[bufferSize];
+    }
+
+    @Override public void writeTo(OutputStream output) throws IOException {
+        for (byte[] buffer: buffers) {
+            output.write(buffer);
+        }
+        if (currentPosition > 0) {
+            output.write(currentBuffer, 0, currentPosition);
+        }
+        buffers.clear();
+        currentPosition = 0;
+    }
+
+    @Override public void write(int i) throws IOException {
+        if (remaining() == 0) {
+            buffers.add(currentBuffer);
+            currentBuffer = new byte[currentBuffer.length];
+            currentPosition = 0;
+        }
+        currentBuffer[currentPosition++] = (byte)i;
+    }
+
+    @Override public void write(byte[] bytes) throws IOException {
+        write(bytes, 0, bytes.length);
+    }
+
+    @Override public void write(byte[] bytes, int offset, int length) throws IOException {
+        int remaining = remaining();
+        int written = 0;
+        while (length - written > 0) {
+            int toWrite = Math.min(remaining, (length - written));
+            System.arraycopy(bytes, offset + written, currentBuffer, currentPosition, toWrite);
+            written += toWrite;
+            currentPosition += toWrite;
+
+            remaining = remaining();
+            if (remaining == 0) {
+                buffers.add(currentBuffer);
+                currentBuffer = new byte[currentBuffer.length];
+                currentPosition = 0;
+                remaining = currentBuffer.length;
+            }
+        }
+    }
+
+    private int remaining() {
+        return currentBuffer.length - currentPosition;
+    }
+
+    @Nonnull
+    public static DeferredOutputStreamFactory getFactory() {
+        return getFactory(DEFAULT_BUFFER_SIZE);
+    }
+
+    @Nonnull
+    public static DeferredOutputStreamFactory getFactory(final int bufferSize) {
+        return new DeferredOutputStreamFactory() {
+            @Override public DeferredOutputStream makeDeferredOutputStream() {
+                return new MemoryDeferredOutputStream(bufferSize);
+            }
+        };
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/AnnotationPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/AnnotationPool.java
new file mode 100644
index 0000000..b2db889
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/AnnotationPool.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.pool;
+
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.iface.AnnotationElement;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.dexlib2.writer.AnnotationSection;
+
+import javax.annotation.Nonnull;
+import java.util.Collection;
+
+public class AnnotationPool extends BaseOffsetPool<Annotation>
+        implements AnnotationSection<CharSequence, CharSequence, Annotation, AnnotationElement, EncodedValue> {
+
+    public AnnotationPool(@Nonnull DexPool dexPool) {
+        super(dexPool);
+    }
+
+    public void intern(@Nonnull Annotation annotation) {
+        Integer prev = internedItems.put(annotation, 0);
+        if (prev == null) {
+            dexPool.typeSection.intern(annotation.getType());
+            for (AnnotationElement element: annotation.getElements()) {
+                dexPool.stringSection.intern(element.getName());
+                dexPool.internEncodedValue(element.getValue());
+            }
+        }
+    }
+
+    @Override public int getVisibility(@Nonnull Annotation annotation) {
+        return annotation.getVisibility();
+    }
+
+    @Nonnull @Override public CharSequence getType(@Nonnull Annotation annotation) {
+        return annotation.getType();
+    }
+
+    @Nonnull @Override public Collection<? extends AnnotationElement> getElements(@Nonnull Annotation annotation) {
+        return annotation.getElements();
+    }
+
+    @Nonnull @Override public CharSequence getElementName(@Nonnull AnnotationElement annotationElement) {
+        return annotationElement.getName();
+    }
+
+    @Nonnull @Override public EncodedValue getElementValue(@Nonnull AnnotationElement annotationElement) {
+        return annotationElement.getValue();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/AnnotationSetPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/AnnotationSetPool.java
new file mode 100644
index 0000000..2170b95
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/AnnotationSetPool.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.pool;
+
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.writer.AnnotationSetSection;
+
+import javax.annotation.Nonnull;
+import java.util.Collection;
+import java.util.Set;
+
+public class AnnotationSetPool extends BaseNullableOffsetPool<Set<? extends Annotation>>
+        implements AnnotationSetSection<Annotation, Set<? extends Annotation>> {
+
+    public AnnotationSetPool(@Nonnull DexPool dexPool) {
+        super(dexPool);
+    }
+
+    public void intern(@Nonnull Set<? extends Annotation> annotationSet) {
+        if (annotationSet.size() > 0) {
+            Integer prev = internedItems.put(annotationSet, 0);
+            if (prev == null) {
+                for (Annotation annotation: annotationSet) {
+                    dexPool.annotationSection.intern(annotation);
+                }
+            }
+        }
+    }
+
+    @Nonnull @Override public Collection<? extends Annotation> getAnnotations(
+            @Nonnull Set<? extends Annotation> annotations) {
+        return annotations;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseIndexPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseIndexPool.java
new file mode 100644
index 0000000..c07dcf1
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseIndexPool.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.pool;
+
+import org.jf.dexlib2.writer.IndexSection;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+import java.util.Collection;
+import java.util.Map;
+
+public abstract class BaseIndexPool<Key> extends BasePool<Key, Integer> implements IndexSection<Key> {
+
+    public BaseIndexPool(@Nonnull DexPool dexPool) {
+        super(dexPool);
+    }
+
+    @Nonnull @Override public Collection<? extends Map.Entry<? extends Key, Integer>> getItems() {
+        return internedItems.entrySet();
+    }
+
+    @Override public int getItemIndex(@Nonnull Key key) {
+        Integer index = internedItems.get(key);
+        if (index == null) {
+            throw new ExceptionWithContext("Item not found.: %s", getItemString(key));
+        }
+        return index;
+    }
+
+    @Nonnull protected String getItemString(@Nonnull Key key) {
+        return key.toString();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseNullableOffsetPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseNullableOffsetPool.java
new file mode 100644
index 0000000..b04060a
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseNullableOffsetPool.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.pool;
+
+import org.jf.dexlib2.writer.DexWriter;
+import org.jf.dexlib2.writer.NullableOffsetSection;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public abstract class BaseNullableOffsetPool<Key> extends BaseOffsetPool<Key>
+        implements NullableOffsetSection<Key> {
+
+    public BaseNullableOffsetPool(@Nonnull DexPool dexPool) {
+        super(dexPool);
+    }
+
+    @Override public int getNullableItemOffset(@Nullable Key key) {
+        if (key == null) {
+            return DexWriter.NO_OFFSET;
+        }
+        return getItemOffset(key);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseOffsetPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseOffsetPool.java
new file mode 100644
index 0000000..789c954
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseOffsetPool.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.pool;
+
+import org.jf.dexlib2.writer.OffsetSection;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+import java.util.Collection;
+import java.util.Map;
+
+public abstract class BaseOffsetPool<Key> extends BasePool<Key, Integer> implements OffsetSection<Key> {
+
+    public BaseOffsetPool(@Nonnull DexPool dexPool) {
+        super(dexPool);
+    }
+
+    @Nonnull @Override public Collection<? extends Map.Entry<? extends Key, Integer>> getItems() {
+        return internedItems.entrySet();
+    }
+
+    @Override public int getItemOffset(@Nonnull Key key) {
+        Integer offset = internedItems.get(key);
+        if (offset == null) {
+            throw new ExceptionWithContext("Item not found.: %s", getItemString(key));
+        }
+        return offset;
+    }
+
+    @Nonnull protected String getItemString(@Nonnull Key key) {
+        return key.toString();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BasePool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BasePool.java
new file mode 100644
index 0000000..4fa1810
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BasePool.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.pool;
+
+import com.google.common.collect.Maps;
+
+import javax.annotation.Nonnull;
+import java.util.Iterator;
+import java.util.Map;
+
+public class BasePool<Key, Value> implements Markable {
+    @Nonnull protected final DexPool dexPool;
+    @Nonnull protected final Map<Key, Value> internedItems = Maps.newLinkedHashMap();
+    private int markedItemCount = -1;
+
+    public BasePool(@Nonnull DexPool dexPool) {
+        this.dexPool = dexPool;
+    }
+
+    public void mark() {
+        markedItemCount = internedItems.size();
+    }
+
+    public void reset() {
+        if (markedItemCount < 0) {
+            throw new IllegalStateException("mark() must be called before calling reset()");
+        }
+
+        if (markedItemCount == internedItems.size()) {
+            return;
+        }
+
+        Iterator<Key> keys = internedItems.keySet().iterator();
+        for (int i=0; i<markedItemCount; i++) {
+            keys.next();
+        }
+        while (keys.hasNext()) {
+            keys.next();
+            keys.remove();
+        }
+    }
+
+    public int getItemCount() {
+        return internedItems.size();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/CallSitePool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/CallSitePool.java
new file mode 100644
index 0000000..83f8422
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/CallSitePool.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.pool;
+
+import org.jf.dexlib2.iface.reference.CallSiteReference;
+import org.jf.dexlib2.iface.value.ArrayEncodedValue;
+import org.jf.dexlib2.writer.CallSiteSection;
+import org.jf.dexlib2.writer.util.CallSiteUtil;
+
+import javax.annotation.Nonnull;
+
+public class CallSitePool extends BaseIndexPool<CallSiteReference>
+        implements CallSiteSection<CallSiteReference, ArrayEncodedValue> {
+
+    public CallSitePool(@Nonnull DexPool dexPool) {
+        super(dexPool);
+    }
+
+    public void intern(CallSiteReference callSiteReference) {
+        Integer prev = internedItems.put(callSiteReference, 0);
+        if (prev == null) {
+            dexPool.encodedArraySection.intern(getEncodedCallSite(callSiteReference));
+        }
+    }
+
+    @Override
+    public ArrayEncodedValue getEncodedCallSite(CallSiteReference callSiteReference) {
+        return CallSiteUtil.getEncodedCallSite(callSiteReference);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/ClassPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/ClassPool.java
new file mode 100644
index 0000000..7dacfbf
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/ClassPool.java
@@ -0,0 +1,527 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.pool;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Ordering;
+import org.jf.dexlib2.DebugItemType;
+import org.jf.dexlib2.HiddenApiRestriction;
+import org.jf.dexlib2.ReferenceType;
+import org.jf.dexlib2.builder.MutableMethodImplementation;
+import org.jf.dexlib2.iface.*;
+import org.jf.dexlib2.iface.debug.*;
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.dexlib2.iface.instruction.ReferenceInstruction;
+import org.jf.dexlib2.iface.reference.*;
+import org.jf.dexlib2.iface.value.ArrayEncodedValue;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.dexlib2.util.ReferenceUtil;
+import org.jf.dexlib2.writer.ClassSection;
+import org.jf.dexlib2.writer.DebugWriter;
+import org.jf.dexlib2.writer.util.StaticInitializerUtil;
+import org.jf.util.AbstractForwardSequentialList;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.IOException;
+import java.util.*;
+import java.util.Map.Entry;
+
+public class ClassPool extends BasePool<String, PoolClassDef> implements ClassSection<CharSequence, CharSequence,
+        TypeListPool.Key<? extends Collection<? extends CharSequence>>, PoolClassDef, Field, PoolMethod,
+        Set<? extends Annotation>, ArrayEncodedValue> {
+
+    public ClassPool(@Nonnull DexPool dexPool) {
+        super(dexPool);
+    }
+
+    public void intern(@Nonnull ClassDef classDef) {
+        PoolClassDef poolClassDef = new PoolClassDef(classDef);
+
+        PoolClassDef prev = internedItems.put(poolClassDef.getType(), poolClassDef);
+        if (prev != null) {
+            throw new ExceptionWithContext("Class %s has already been interned", poolClassDef.getType());
+        }
+
+        dexPool.typeSection.intern(poolClassDef.getType());
+        dexPool.typeSection.internNullable(poolClassDef.getSuperclass());
+        dexPool.typeListSection.intern(poolClassDef.getInterfaces());
+        dexPool.stringSection.internNullable(poolClassDef.getSourceFile());
+
+        HashSet<String> fields = new HashSet<String>();
+        for (Field field: poolClassDef.getFields()) {
+            String fieldDescriptor = ReferenceUtil.getShortFieldDescriptor(field);
+            if (!fields.add(fieldDescriptor)) {
+                throw new ExceptionWithContext("Multiple definitions for field %s->%s",
+                        poolClassDef.getType(), fieldDescriptor);
+            }
+            dexPool.fieldSection.intern(field);
+
+            EncodedValue initialValue = field.getInitialValue();
+            if (initialValue != null) {
+                dexPool.internEncodedValue(initialValue);
+            }
+
+            dexPool.annotationSetSection.intern(field.getAnnotations());
+
+            ArrayEncodedValue staticInitializers = getStaticInitializers(poolClassDef);
+            if (staticInitializers != null) {
+                dexPool.encodedArraySection.intern(staticInitializers);
+            }
+        }
+
+        HashSet<String> methods = new HashSet<String>();
+        for (PoolMethod method: poolClassDef.getMethods()) {
+            String methodDescriptor = ReferenceUtil.getMethodDescriptor(method, true);
+            if (!methods.add(methodDescriptor)) {
+                throw new ExceptionWithContext("Multiple definitions for method %s->%s",
+                        poolClassDef.getType(), methodDescriptor);
+            }
+            dexPool.methodSection.intern(method);
+            internCode(method);
+            internDebug(method);
+            dexPool.annotationSetSection.intern(method.getAnnotations());
+
+            for (MethodParameter parameter: method.getParameters()) {
+                dexPool.annotationSetSection.intern(parameter.getAnnotations());
+            }
+        }
+
+        dexPool.annotationSetSection.intern(poolClassDef.getAnnotations());
+    }
+
+    private void internCode(@Nonnull Method method) {
+        // this also handles parameter names, which aren't directly tied to the MethodImplementation, even though the debug items are
+        boolean hasInstruction = false;
+
+        MethodImplementation methodImpl = method.getImplementation();
+        if (methodImpl != null) {
+            for (Instruction instruction: methodImpl.getInstructions()) {
+                hasInstruction = true;
+                if (instruction instanceof ReferenceInstruction) {
+                    Reference reference = ((ReferenceInstruction)instruction).getReference();
+                    switch (instruction.getOpcode().referenceType) {
+                        case ReferenceType.STRING:
+                            dexPool.stringSection.intern((StringReference)reference);
+                            break;
+                        case ReferenceType.TYPE:
+                            dexPool.typeSection.intern((TypeReference)reference);
+                            break;
+                        case ReferenceType.FIELD:
+                            dexPool.fieldSection.intern((FieldReference) reference);
+                            break;
+                        case ReferenceType.METHOD:
+                            dexPool.methodSection.intern((MethodReference)reference);
+                            break;
+                        case ReferenceType.CALL_SITE:
+                            dexPool.callSiteSection.intern((CallSiteReference) reference);
+                            break;
+                        default:
+                            throw new ExceptionWithContext("Unrecognized reference type: %d",
+                                    instruction.getOpcode().referenceType);
+                    }
+                }
+            }
+
+            List<? extends TryBlock> tryBlocks = methodImpl.getTryBlocks();
+            if (!hasInstruction && tryBlocks.size() > 0) {
+                throw new ExceptionWithContext("Method %s has no instructions, but has try blocks.",
+                        ReferenceUtil.getMethodDescriptor(method));
+            }
+
+            for (TryBlock<? extends ExceptionHandler> tryBlock: methodImpl.getTryBlocks()) {
+                for (ExceptionHandler handler: tryBlock.getExceptionHandlers()) {
+                    dexPool.typeSection.internNullable(handler.getExceptionType());
+                }
+            }
+        }
+    }
+
+    private void internDebug(@Nonnull Method method) {
+        for (MethodParameter param: method.getParameters()) {
+            String paramName = param.getName();
+            if (paramName != null) {
+                dexPool.stringSection.intern(paramName);
+            }
+        }
+
+        MethodImplementation methodImpl = method.getImplementation();
+        if (methodImpl != null) {
+            for (DebugItem debugItem: methodImpl.getDebugItems()) {
+                switch (debugItem.getDebugItemType()) {
+                    case DebugItemType.START_LOCAL:
+                        StartLocal startLocal = (StartLocal)debugItem;
+                        dexPool.stringSection.internNullable(startLocal.getName());
+                        dexPool.typeSection.internNullable(startLocal.getType());
+                        dexPool.stringSection.internNullable(startLocal.getSignature());
+                        break;
+                    case DebugItemType.SET_SOURCE_FILE:
+                        dexPool.stringSection.internNullable(((SetSourceFile) debugItem).getSourceFile());
+                        break;
+                }
+            }
+        }
+    }
+
+    private ImmutableList<PoolClassDef> sortedClasses = null;
+    @Nonnull @Override public Collection<? extends PoolClassDef> getSortedClasses() {
+        if (sortedClasses == null) {
+            sortedClasses = Ordering.natural().immutableSortedCopy(internedItems.values());
+        }
+        return sortedClasses;
+    }
+
+    @Nullable @Override
+    public Map.Entry<? extends PoolClassDef, Integer> getClassEntryByType(@Nullable CharSequence name) {
+        if (name == null) {
+            return null;
+        }
+
+        final PoolClassDef classDef = internedItems.get(name.toString());
+        if (classDef == null) {
+            return null;
+        }
+
+        return new Map.Entry<PoolClassDef, Integer>() {
+            @Override public PoolClassDef getKey() {
+                return classDef;
+            }
+
+            @Override public Integer getValue() {
+                return classDef.classDefIndex;
+            }
+
+            @Override public Integer setValue(Integer value) {
+                return classDef.classDefIndex = value;
+            }
+        };
+    }
+
+    @Nonnull @Override public CharSequence getType(@Nonnull PoolClassDef classDef) {
+        return classDef.getType();
+    }
+
+    @Override public int getAccessFlags(@Nonnull PoolClassDef classDef) {
+        return classDef.getAccessFlags();
+    }
+
+    @Nullable @Override public CharSequence getSuperclass(@Nonnull PoolClassDef classDef) {
+        return classDef.getSuperclass();
+    }
+
+    @Nullable @Override public TypeListPool.Key<List<String>> getInterfaces(@Nonnull PoolClassDef classDef) {
+        return classDef.interfaces;
+    }
+
+    @Nullable @Override public CharSequence getSourceFile(@Nonnull PoolClassDef classDef) {
+        return classDef.getSourceFile();
+    }
+
+    @Nullable @Override public ArrayEncodedValue getStaticInitializers(
+            @Nonnull PoolClassDef classDef) {
+        return StaticInitializerUtil.getStaticInitializers(classDef.getStaticFields());
+    }
+
+    @Nonnull @Override public Collection<? extends Field> getSortedStaticFields(@Nonnull PoolClassDef classDef) {
+        return classDef.getStaticFields();
+    }
+
+    @Nonnull @Override public Collection<? extends Field> getSortedInstanceFields(@Nonnull PoolClassDef classDef) {
+        return classDef.getInstanceFields();
+    }
+
+    @Nonnull @Override public Collection<? extends Field> getSortedFields(@Nonnull PoolClassDef classDef) {
+        return classDef.getFields();
+    }
+
+    @Nonnull @Override public Collection<PoolMethod> getSortedDirectMethods(@Nonnull PoolClassDef classDef) {
+        return classDef.getDirectMethods();
+    }
+
+    @Nonnull @Override public Collection<PoolMethod> getSortedVirtualMethods(@Nonnull PoolClassDef classDef) {
+        return classDef.getVirtualMethods();
+    }
+
+    @Nonnull @Override public Collection<? extends PoolMethod> getSortedMethods(@Nonnull PoolClassDef classDef) {
+        return classDef.getMethods();
+    }
+
+    @Override public int getFieldAccessFlags(@Nonnull Field field) {
+        return field.getAccessFlags();
+    }
+
+    @Override public int getMethodAccessFlags(@Nonnull PoolMethod method) {
+        return method.getAccessFlags();
+    }
+
+    @Nonnull @Override public Set<HiddenApiRestriction> getFieldHiddenApiRestrictions(@Nonnull Field field) {
+        return field.getHiddenApiRestrictions();
+    }
+
+    @Nonnull @Override public Set<HiddenApiRestriction> getMethodHiddenApiRestrictions(@Nonnull PoolMethod poolMethod) {
+        return poolMethod.getHiddenApiRestrictions();
+    }
+
+    @Nullable @Override public Set<? extends Annotation> getClassAnnotations(@Nonnull PoolClassDef classDef) {
+        Set<? extends Annotation> annotations = classDef.getAnnotations();
+        if (annotations.size() == 0) {
+            return null;
+        }
+        return annotations;
+    }
+
+    @Nullable @Override public Set<? extends Annotation> getFieldAnnotations(@Nonnull Field field) {
+        Set<? extends Annotation> annotations = field.getAnnotations();
+        if (annotations.size() == 0) {
+            return null;
+        }
+        return annotations;
+    }
+
+    @Nullable @Override public Set<? extends Annotation> getMethodAnnotations(@Nonnull PoolMethod method) {
+        Set<? extends Annotation> annotations = method.getAnnotations();
+        if (annotations.size() == 0) {
+            return null;
+        }
+        return annotations;
+    }
+
+    private static final Predicate<MethodParameter> HAS_PARAMETER_ANNOTATIONS = new Predicate<MethodParameter>() {
+        @Override
+        public boolean apply(MethodParameter input) {
+            return input.getAnnotations().size() > 0;
+        }
+    };
+
+    private static final Function<MethodParameter, Set<? extends Annotation>> PARAMETER_ANNOTATIONS =
+            new Function<MethodParameter, Set<? extends Annotation>>() {
+                @Override
+                public Set<? extends Annotation> apply(MethodParameter input) {
+                    return input.getAnnotations();
+                }
+            };
+
+    @Nullable @Override public List<? extends Set<? extends Annotation>> getParameterAnnotations(
+            @Nonnull final PoolMethod method) {
+        final List<? extends MethodParameter> parameters = method.getParameters();
+        boolean hasParameterAnnotations = Iterables.any(parameters, HAS_PARAMETER_ANNOTATIONS);
+
+        if (hasParameterAnnotations) {
+            return new AbstractForwardSequentialList<Set<? extends Annotation>>() {
+                @Nonnull @Override public Iterator<Set<? extends Annotation>> iterator() {
+                    return FluentIterable.from(parameters)
+                            .transform(PARAMETER_ANNOTATIONS).iterator();
+                }
+
+                @Override public int size() {
+                    return parameters.size();
+                }
+            };
+        }
+        return null;
+    }
+
+    @Nullable @Override public Iterable<? extends DebugItem> getDebugItems(@Nonnull PoolMethod method) {
+        MethodImplementation impl = method.getImplementation();
+        if (impl != null) {
+            return impl.getDebugItems();
+        }
+        return null;
+    }
+
+    @Nullable @Override public Iterable<CharSequence> getParameterNames(@Nonnull PoolMethod method) {
+        return Iterables.transform(method.getParameters(), new Function<MethodParameter, CharSequence>() {
+            @Nullable @Override public CharSequence apply(MethodParameter input) {
+                return input.getName();
+            }
+        });
+    }
+
+    @Override public int getRegisterCount(@Nonnull PoolMethod method) {
+        MethodImplementation impl = method.getImplementation();
+        if (impl != null) {
+            return impl.getRegisterCount();
+        }
+        return 0;
+    }
+
+    @Nullable @Override public Iterable<? extends Instruction> getInstructions(@Nonnull PoolMethod method) {
+        MethodImplementation impl = method.getImplementation();
+        if (impl != null) {
+            return impl.getInstructions();
+        }
+        return null;
+    }
+
+    @Nonnull @Override public List<? extends TryBlock<? extends ExceptionHandler>> getTryBlocks(
+            @Nonnull PoolMethod method) {
+        MethodImplementation impl = method.getImplementation();
+        if (impl != null) {
+            return impl.getTryBlocks();
+        }
+        return ImmutableList.of();
+    }
+
+    @Nullable @Override public CharSequence getExceptionType(@Nonnull ExceptionHandler handler) {
+        return handler.getExceptionType();
+    }
+
+    @Nonnull @Override
+    public MutableMethodImplementation makeMutableMethodImplementation(@Nonnull PoolMethod poolMethod) {
+        return new MutableMethodImplementation(poolMethod.getImplementation());
+    }
+
+    @Override public void setAnnotationDirectoryOffset(@Nonnull PoolClassDef classDef, int offset) {
+        classDef.annotationDirectoryOffset = offset;
+    }
+
+    @Override public int getAnnotationDirectoryOffset(@Nonnull PoolClassDef classDef) {
+        return classDef.annotationDirectoryOffset;
+    }
+
+    @Override public void setAnnotationSetRefListOffset(@Nonnull PoolMethod method, int offset) {
+        method.annotationSetRefListOffset = offset;
+
+    }
+    @Override public int getAnnotationSetRefListOffset(@Nonnull PoolMethod method) {
+        return method.annotationSetRefListOffset;
+    }
+
+    @Override public void setCodeItemOffset(@Nonnull PoolMethod method, int offset) {
+        method.codeItemOffset = offset;
+    }
+
+    @Override public int getCodeItemOffset(@Nonnull PoolMethod method) {
+        return method.codeItemOffset;
+    }
+
+    @Override public void writeDebugItem(@Nonnull DebugWriter<CharSequence, CharSequence> writer,
+                                         DebugItem debugItem) throws IOException {
+        switch (debugItem.getDebugItemType()) {
+            case DebugItemType.START_LOCAL: {
+                StartLocal startLocal = (StartLocal)debugItem;
+                writer.writeStartLocal(startLocal.getCodeAddress(),
+                        startLocal.getRegister(),
+                        startLocal.getName(),
+                        startLocal.getType(),
+                        startLocal.getSignature());
+                break;
+            }
+            case DebugItemType.END_LOCAL: {
+                EndLocal endLocal = (EndLocal)debugItem;
+                writer.writeEndLocal(endLocal.getCodeAddress(), endLocal.getRegister());
+                break;
+            }
+            case DebugItemType.RESTART_LOCAL: {
+                RestartLocal restartLocal = (RestartLocal)debugItem;
+                writer.writeRestartLocal(restartLocal.getCodeAddress(), restartLocal.getRegister());
+                break;
+            }
+            case DebugItemType.PROLOGUE_END: {
+                writer.writePrologueEnd(debugItem.getCodeAddress());
+                break;
+            }
+            case DebugItemType.EPILOGUE_BEGIN: {
+                writer.writeEpilogueBegin(debugItem.getCodeAddress());
+                break;
+            }
+            case DebugItemType.LINE_NUMBER: {
+                LineNumber lineNumber = (LineNumber)debugItem;
+                writer.writeLineNumber(lineNumber.getCodeAddress(), lineNumber.getLineNumber());
+                break;
+            }
+            case DebugItemType.SET_SOURCE_FILE: {
+                SetSourceFile setSourceFile = (SetSourceFile)debugItem;
+                writer.writeSetSourceFile(setSourceFile.getCodeAddress(), setSourceFile.getSourceFile());
+            }
+            default:
+                throw new ExceptionWithContext("Unexpected debug item type: %d", debugItem.getDebugItemType());
+        }
+    }
+
+    @Override public int getItemIndex(@Nonnull PoolClassDef classDef) {
+        return classDef.classDefIndex;
+    }
+
+    @Nonnull @Override public Collection<? extends Map.Entry<PoolClassDef, Integer>> getItems() {
+        class MapEntry implements Map.Entry<PoolClassDef, Integer> {
+            @Nonnull private final PoolClassDef classDef;
+
+            public MapEntry(@Nonnull PoolClassDef classDef) {
+                this.classDef = classDef;
+            }
+
+            @Override public PoolClassDef getKey() {
+                return classDef;
+            }
+
+            @Override public Integer getValue() {
+                return classDef.classDefIndex;
+            }
+
+            @Override public Integer setValue(Integer value) {
+                int prev = classDef.classDefIndex;
+                classDef.classDefIndex = value;
+                return prev;
+            }
+        }
+
+        return new AbstractCollection<Entry<PoolClassDef, Integer>>() {
+            @Nonnull @Override public Iterator<Entry<PoolClassDef, Integer>> iterator() {
+                return new Iterator<Entry<PoolClassDef, Integer>>() {
+                    Iterator<PoolClassDef> iter = internedItems.values().iterator();
+
+                    @Override public boolean hasNext() {
+                        return iter.hasNext();
+                    }
+
+                    @Override public Entry<PoolClassDef, Integer> next() {
+                        return new MapEntry(iter.next());
+                    }
+
+                    @Override public void remove() {
+                        throw new UnsupportedOperationException();
+                    }
+                };
+            }
+
+            @Override public int size() {
+                return internedItems.size();
+            }
+        };
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/DexPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/DexPool.java
new file mode 100644
index 0000000..62ebb94
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/DexPool.java
@@ -0,0 +1,283 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.pool;
+
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.ValueType;
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.iface.AnnotationElement;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.Field;
+import org.jf.dexlib2.iface.reference.*;
+import org.jf.dexlib2.iface.value.*;
+import org.jf.dexlib2.writer.*;
+import org.jf.dexlib2.writer.io.DexDataStore;
+import org.jf.dexlib2.writer.io.FileDataStore;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Set;
+
+public class DexPool extends DexWriter<CharSequence, StringReference, CharSequence, TypeReference,
+        MethodProtoReference, FieldReference, MethodReference, PoolClassDef,
+        CallSiteReference, MethodHandleReference, Annotation, Set<? extends Annotation>,
+        TypeListPool.Key<? extends Collection<? extends CharSequence>>, Field, PoolMethod,
+        ArrayEncodedValue, EncodedValue, AnnotationElement, StringPool, TypePool, ProtoPool, FieldPool, MethodPool,
+        ClassPool, CallSitePool, MethodHandlePool, TypeListPool, AnnotationPool, AnnotationSetPool, EncodedArrayPool> {
+
+    private final BasePool<?, ?>[] sections = new BasePool<?, ?>[] {
+            stringSection,
+            typeSection,
+            protoSection,
+            fieldSection,
+            methodSection,
+            classSection,
+            callSiteSection,
+            methodHandleSection,
+
+            typeListSection,
+            annotationSection,
+            annotationSetSection,
+            encodedArraySection,
+    };
+
+    public DexPool(Opcodes opcodes) {
+        super(opcodes);
+    }
+
+    @Nonnull @Override protected SectionProvider getSectionProvider() {
+        return new DexPoolSectionProvider();
+    }
+
+    public static void writeTo(@Nonnull DexDataStore dataStore, @Nonnull org.jf.dexlib2.iface.DexFile input)
+            throws IOException {
+        DexPool dexPool = new DexPool(input.getOpcodes());
+        for (ClassDef classDef: input.getClasses()) {
+            dexPool.internClass(classDef);
+        }
+        dexPool.writeTo(dataStore);
+    }
+
+    public static void writeTo(@Nonnull String path, @Nonnull org.jf.dexlib2.iface.DexFile input) throws IOException {
+        DexPool dexPool = new DexPool(input.getOpcodes());
+        for (ClassDef classDef: input.getClasses()) {
+            dexPool.internClass(classDef);
+        }
+        dexPool.writeTo(new FileDataStore(new File(path)));
+    }
+
+    /**
+     * Interns a class into this DexPool
+     * @param classDef The class to intern
+     */
+    public void internClass(ClassDef classDef) {
+        classSection.intern(classDef);
+    }
+
+    /**
+     * Creates a marked state that can be returned to by calling reset()
+     *
+     * This is useful to rollback the last added class if it causes a method/field/type overflow
+     */
+    public void mark() {
+        for (Markable section: sections) {
+            section.mark();
+        }
+    }
+
+    /**
+     * Resets to the last marked state
+     *
+     * This is useful to rollback the last added class if it causes a method/field/type overflow
+     */
+    public void reset() {
+        for (Markable section: sections) {
+            section.reset();
+        }
+    }
+
+    @Override protected void writeEncodedValue(@Nonnull InternalEncodedValueWriter writer,
+                                               @Nonnull EncodedValue encodedValue) throws IOException {
+        switch (encodedValue.getValueType()) {
+            case ValueType.ANNOTATION:
+                AnnotationEncodedValue annotationEncodedValue = (AnnotationEncodedValue)encodedValue;
+                writer.writeAnnotation(annotationEncodedValue.getType(), annotationEncodedValue.getElements());
+                break;
+            case ValueType.ARRAY:
+                ArrayEncodedValue arrayEncodedValue = (ArrayEncodedValue)encodedValue;
+                writer.writeArray(arrayEncodedValue.getValue());
+                break;
+            case ValueType.BOOLEAN:
+                writer.writeBoolean(((BooleanEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.BYTE:
+                writer.writeByte(((ByteEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.CHAR:
+                writer.writeChar(((CharEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.DOUBLE:
+                writer.writeDouble(((DoubleEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.ENUM:
+                writer.writeEnum(((EnumEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.FIELD:
+                writer.writeField(((FieldEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.FLOAT:
+                writer.writeFloat(((FloatEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.INT:
+                writer.writeInt(((IntEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.LONG:
+                writer.writeLong(((LongEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.METHOD:
+                writer.writeMethod(((MethodEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.NULL:
+                writer.writeNull();
+                break;
+            case ValueType.SHORT:
+                writer.writeShort(((ShortEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.STRING:
+                writer.writeString(((StringEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.TYPE:
+                writer.writeType(((TypeEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.METHOD_TYPE:
+                writer.writeMethodType(((MethodTypeEncodedValue) encodedValue).getValue());
+                break;
+            case ValueType.METHOD_HANDLE:
+                writer.writeMethodHandle(((MethodHandleEncodedValue) encodedValue).getValue());
+                break;
+            default:
+                throw new ExceptionWithContext("Unrecognized value type: %d", encodedValue.getValueType());
+        }
+    }
+
+    void internEncodedValue(@Nonnull EncodedValue encodedValue) {
+        switch (encodedValue.getValueType()) {
+            case ValueType.ANNOTATION:
+                AnnotationEncodedValue annotationEncodedValue = (AnnotationEncodedValue)encodedValue;
+                typeSection.intern(annotationEncodedValue.getType());
+                for (AnnotationElement element: annotationEncodedValue.getElements()) {
+                    stringSection.intern(element.getName());
+                    internEncodedValue(element.getValue());
+                }
+                break;
+            case ValueType.ARRAY:
+                for (EncodedValue element: ((ArrayEncodedValue)encodedValue).getValue()) {
+                    internEncodedValue(element);
+                }
+                break;
+            case ValueType.STRING:
+                stringSection.intern(((StringEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.TYPE:
+                typeSection.intern(((TypeEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.ENUM:
+                fieldSection.intern(((EnumEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.FIELD:
+                fieldSection.intern(((FieldEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.METHOD:
+                methodSection.intern(((MethodEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.METHOD_HANDLE:
+                methodHandleSection.intern(((MethodHandleEncodedValue)encodedValue).getValue());
+                break;
+            case ValueType.METHOD_TYPE:
+                protoSection.intern(((MethodTypeEncodedValue)encodedValue).getValue());
+                break;
+        }
+    }
+
+    protected class DexPoolSectionProvider extends SectionProvider {
+        @Nonnull @Override public StringPool getStringSection() {
+            return new StringPool(DexPool.this);
+        }
+
+        @Nonnull @Override public TypePool getTypeSection() {
+            return new TypePool(DexPool.this);
+        }
+
+        @Nonnull @Override public ProtoPool getProtoSection() {
+            return new ProtoPool(DexPool.this);
+        }
+
+        @Nonnull @Override public FieldPool getFieldSection() {
+            return new FieldPool(DexPool.this);
+        }
+
+        @Nonnull @Override public MethodPool getMethodSection() {
+            return new MethodPool(DexPool.this);
+        }
+
+        @Nonnull @Override public ClassPool getClassSection() {
+            return new ClassPool(DexPool.this);
+        }
+
+        @Nonnull @Override public CallSitePool getCallSiteSection() {
+            return new CallSitePool(DexPool.this);
+        }
+
+        @Nonnull @Override public MethodHandlePool getMethodHandleSection() {
+            return new MethodHandlePool(DexPool.this);
+        }
+
+        @Nonnull @Override public TypeListPool getTypeListSection() {
+            return new TypeListPool(DexPool.this);
+        }
+
+        @Nonnull @Override public AnnotationPool getAnnotationSection() {
+            return new AnnotationPool(DexPool.this);
+        }
+
+        @Nonnull @Override public AnnotationSetPool getAnnotationSetSection() {
+            return new AnnotationSetPool(DexPool.this);
+        }
+
+        @Nonnull @Override public EncodedArrayPool getEncodedArraySection() {
+            return new EncodedArrayPool(DexPool.this);
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/EncodedArrayPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/EncodedArrayPool.java
new file mode 100644
index 0000000..0b33f98
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/EncodedArrayPool.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.pool;
+
+import org.jf.dexlib2.iface.value.ArrayEncodedValue;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.dexlib2.writer.EncodedArraySection;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+public class EncodedArrayPool extends BaseOffsetPool<ArrayEncodedValue>
+        implements EncodedArraySection<ArrayEncodedValue, EncodedValue> {
+
+    public EncodedArrayPool(@Nonnull DexPool dexPool) {
+        super(dexPool);
+    }
+
+    public void intern(@Nonnull ArrayEncodedValue arrayEncodedValue) {
+        Integer prev = internedItems.put(arrayEncodedValue, 0);
+        if (prev == null) {
+            for (EncodedValue value: arrayEncodedValue.getValue()) {
+                dexPool.internEncodedValue(value);
+            }
+        }
+    }
+
+    @Override
+    public List<? extends EncodedValue> getEncodedValueList(ArrayEncodedValue arrayEncodedValue) {
+        return arrayEncodedValue.getValue();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/FieldPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/FieldPool.java
new file mode 100644
index 0000000..135d79b
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/FieldPool.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.pool;
+
+import org.jf.dexlib2.iface.Field;
+import org.jf.dexlib2.iface.reference.FieldReference;
+import org.jf.dexlib2.writer.FieldSection;
+
+import javax.annotation.Nonnull;
+
+public class FieldPool extends BaseIndexPool<FieldReference>
+        implements FieldSection<CharSequence, CharSequence, FieldReference, Field> {
+
+    public FieldPool(@Nonnull DexPool dexPool) {
+        super(dexPool);
+    }
+
+    public void intern(@Nonnull FieldReference field) {
+        Integer prev = internedItems.put(field, 0);
+        if (prev == null) {
+            dexPool.typeSection.intern(field.getDefiningClass());
+            dexPool.stringSection.intern(field.getName());
+            dexPool.typeSection.intern(field.getType());
+        }
+    }
+
+    @Nonnull @Override public CharSequence getDefiningClass(@Nonnull FieldReference fieldReference) {
+        return fieldReference.getDefiningClass();
+    }
+
+    @Nonnull @Override public CharSequence getFieldType(@Nonnull FieldReference fieldReference) {
+        return fieldReference.getType();
+    }
+
+    @Nonnull @Override public CharSequence getName(@Nonnull FieldReference fieldReference) {
+        return fieldReference.getName();
+    }
+
+    @Override public int getFieldIndex(@Nonnull Field field) {
+        return getItemIndex(field);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/Markable.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/Markable.java
new file mode 100644
index 0000000..8b14574
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/Markable.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.pool;
+
+public interface Markable {
+    void mark();
+    void reset();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/MethodHandlePool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/MethodHandlePool.java
new file mode 100644
index 0000000..017b74d
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/MethodHandlePool.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.pool;
+
+import org.jf.dexlib2.MethodHandleType;
+import org.jf.dexlib2.iface.reference.FieldReference;
+import org.jf.dexlib2.iface.reference.MethodHandleReference;
+import org.jf.dexlib2.iface.reference.MethodReference;
+import org.jf.dexlib2.writer.MethodHandleSection;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+
+public class MethodHandlePool extends BaseIndexPool<MethodHandleReference>
+        implements MethodHandleSection<MethodHandleReference, FieldReference, MethodReference> {
+    public MethodHandlePool(@Nonnull DexPool dexPool) {
+        super(dexPool);
+    }
+
+    public void intern(MethodHandleReference methodHandleReference) {
+        Integer prev = internedItems.put(methodHandleReference, 0);
+        if (prev == null) {
+            switch (methodHandleReference.getMethodHandleType()) {
+                case MethodHandleType.STATIC_PUT:
+                case MethodHandleType.STATIC_GET:
+                case MethodHandleType.INSTANCE_PUT:
+                case MethodHandleType.INSTANCE_GET:
+                    dexPool.fieldSection.intern((FieldReference) methodHandleReference.getMemberReference());
+                    break;
+                case MethodHandleType.INVOKE_STATIC:
+                case MethodHandleType.INVOKE_INSTANCE:
+                case MethodHandleType.INVOKE_CONSTRUCTOR:
+                case MethodHandleType.INVOKE_DIRECT:
+                case MethodHandleType.INVOKE_INTERFACE:
+                    dexPool.methodSection.intern((MethodReference) methodHandleReference.getMemberReference());
+                    break;
+                default:
+                    throw new ExceptionWithContext(
+                            "Invalid method handle type: %d", methodHandleReference.getMethodHandleType());
+            }
+        }
+    }
+
+    @Override
+    public FieldReference getFieldReference(MethodHandleReference methodHandleReference) {
+        return (FieldReference) methodHandleReference.getMemberReference();
+    }
+
+    @Override
+    public MethodReference getMethodReference(MethodHandleReference methodHandleReference) {
+        return (MethodReference) methodHandleReference.getMemberReference();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/MethodPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/MethodPool.java
new file mode 100644
index 0000000..2801abd
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/MethodPool.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.pool;
+
+import org.jf.dexlib2.iface.reference.MethodProtoReference;
+import org.jf.dexlib2.iface.reference.MethodReference;
+import org.jf.dexlib2.writer.MethodSection;
+
+import javax.annotation.Nonnull;
+
+public class MethodPool extends BaseIndexPool<MethodReference>
+        implements MethodSection<CharSequence, CharSequence, MethodProtoReference, MethodReference, PoolMethod> {
+
+    public MethodPool(@Nonnull DexPool dexPool) {
+        super(dexPool);
+    }
+
+    public void intern(@Nonnull MethodReference method) {
+        Integer prev = internedItems.put(method, 0);
+        if (prev == null) {
+            dexPool.typeSection.intern(method.getDefiningClass());
+            dexPool.protoSection.intern(new PoolMethodProto(method));
+            dexPool.stringSection.intern(method.getName());
+        }
+    }
+
+    @Nonnull @Override public MethodReference getMethodReference(@Nonnull PoolMethod poolMethod) {
+        return poolMethod;
+    }
+
+    @Nonnull @Override public CharSequence getDefiningClass(@Nonnull MethodReference methodReference) {
+        return methodReference.getDefiningClass();
+    }
+
+    @Nonnull @Override public MethodProtoReference getPrototype(@Nonnull MethodReference methodReference) {
+        return new PoolMethodProto(methodReference);
+    }
+
+    @Nonnull @Override public MethodProtoReference getPrototype(@Nonnull PoolMethod poolMethod) {
+        return new PoolMethodProto(poolMethod);
+    }
+
+    @Nonnull @Override public CharSequence getName(@Nonnull MethodReference methodReference) {
+        return methodReference.getName();
+    }
+
+    @Override public int getMethodIndex(@Nonnull PoolMethod poolMethod) {
+        return getItemIndex(poolMethod);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/PoolClassDef.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/PoolClassDef.java
new file mode 100644
index 0000000..02f2210
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/PoolClassDef.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.pool;
+
+import com.google.common.collect.*;
+import org.jf.dexlib2.base.reference.BaseTypeReference;
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.Field;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.*;
+
+class PoolClassDef extends BaseTypeReference implements ClassDef {
+    @Nonnull final ClassDef classDef;
+    @Nonnull final TypeListPool.Key<List<String>> interfaces;
+    @Nonnull final ImmutableSortedSet<Field> staticFields;
+    @Nonnull final ImmutableSortedSet<Field> instanceFields;
+    @Nonnull final ImmutableSortedSet<PoolMethod> directMethods;
+    @Nonnull final ImmutableSortedSet<PoolMethod> virtualMethods;
+
+    int classDefIndex = DexPool.NO_INDEX;
+    int annotationDirectoryOffset = DexPool.NO_OFFSET;
+
+    PoolClassDef(@Nonnull ClassDef classDef) {
+        this.classDef = classDef;
+
+        interfaces = new TypeListPool.Key<List<String>>(ImmutableList.copyOf(classDef.getInterfaces()));
+        staticFields = ImmutableSortedSet.copyOf(classDef.getStaticFields());
+        instanceFields = ImmutableSortedSet.copyOf(classDef.getInstanceFields());
+        directMethods = ImmutableSortedSet.copyOf(
+                Iterables.transform(classDef.getDirectMethods(), PoolMethod.TRANSFORM));
+        virtualMethods = ImmutableSortedSet.copyOf(
+                Iterables.transform(classDef.getVirtualMethods(), PoolMethod.TRANSFORM));
+    }
+
+    @Nonnull @Override public String getType() {
+        return classDef.getType();
+    }
+
+    @Override public int getAccessFlags() {
+        return classDef.getAccessFlags();
+    }
+
+    @Nullable @Override public String getSuperclass() {
+        return classDef.getSuperclass();
+    }
+
+    @Nonnull @Override public List<String> getInterfaces() {
+        return interfaces.types;
+    }
+
+    @Nullable @Override public String getSourceFile() {
+        return classDef.getSourceFile();
+    }
+
+    @Nonnull @Override public Set<? extends Annotation> getAnnotations() {
+        return classDef.getAnnotations();
+    }
+
+    @Nonnull @Override public SortedSet<Field> getStaticFields() {
+        return staticFields;
+    }
+
+    @Nonnull @Override public SortedSet<Field> getInstanceFields() {
+        return instanceFields;
+    }
+
+    @Nonnull @Override public Collection<Field> getFields() {
+        return new AbstractCollection<Field>() {
+            @Nonnull @Override public Iterator<Field> iterator() {
+                return Iterators.mergeSorted(
+                        ImmutableList.of(staticFields.iterator(), instanceFields.iterator()),
+                        Ordering.natural());
+            }
+
+            @Override public int size() {
+                return staticFields.size() + instanceFields.size();
+            }
+        };
+    }
+
+    @Nonnull @Override public SortedSet<PoolMethod> getDirectMethods() {
+        return directMethods;
+    }
+
+    @Nonnull @Override public SortedSet<PoolMethod> getVirtualMethods() {
+        return virtualMethods;
+    }
+
+    @Nonnull @Override public Collection<PoolMethod> getMethods() {
+        return new AbstractCollection<PoolMethod>() {
+            @Nonnull @Override public Iterator<PoolMethod> iterator() {
+                return Iterators.mergeSorted(
+                        ImmutableList.of(directMethods.iterator(), virtualMethods.iterator()),
+                        Ordering.natural());
+            }
+
+            @Override public int size() {
+                return directMethods.size() + virtualMethods.size();
+            }
+        };
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/PoolMethod.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/PoolMethod.java
new file mode 100644
index 0000000..e7e73a5
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/PoolMethod.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.pool;
+
+import com.google.common.base.Function;
+import org.jf.dexlib2.HiddenApiRestriction;
+import org.jf.dexlib2.base.reference.BaseMethodReference;
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.iface.Method;
+import org.jf.dexlib2.iface.MethodImplementation;
+import org.jf.dexlib2.iface.MethodParameter;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.List;
+import java.util.Set;
+
+
+class PoolMethod extends BaseMethodReference implements Method {
+    @Nonnull private final Method method;
+    protected int annotationSetRefListOffset = DexPool.NO_OFFSET;
+    protected int codeItemOffset = DexPool.NO_OFFSET;
+
+    public static final Function<Method, PoolMethod> TRANSFORM = new Function<Method, PoolMethod>() {
+        @Override public PoolMethod apply(Method method) {
+            return new PoolMethod(method);
+        }
+    };
+
+    PoolMethod(@Nonnull Method method) {
+        this.method = method;
+    }
+
+    @Override @Nonnull public String getDefiningClass() {
+        return method.getDefiningClass();
+    }
+
+    @Override @Nonnull public String getName() {
+        return method.getName();
+    }
+
+    @Override @Nonnull public List<? extends CharSequence> getParameterTypes() {
+        return method.getParameterTypes();
+    }
+
+    @Override @Nonnull public List<? extends MethodParameter> getParameters() {
+        return method.getParameters();
+    }
+
+    @Override @Nonnull public String getReturnType() {
+        return method.getReturnType();
+    }
+
+    @Override public int getAccessFlags() {
+        return method.getAccessFlags();
+    }
+
+    @Override @Nonnull public Set<? extends Annotation> getAnnotations() {
+        return method.getAnnotations();
+    }
+
+    @Nonnull @Override public Set<HiddenApiRestriction> getHiddenApiRestrictions() {
+        return method.getHiddenApiRestrictions();
+    }
+
+    @Override @Nullable public MethodImplementation getImplementation() {
+        return method.getImplementation();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/PoolMethodProto.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/PoolMethodProto.java
new file mode 100644
index 0000000..d180be1
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/PoolMethodProto.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.pool;
+
+import org.jf.dexlib2.base.reference.BaseMethodProtoReference;
+import org.jf.dexlib2.iface.reference.MethodProtoReference;
+import org.jf.dexlib2.iface.reference.MethodReference;
+
+import java.util.List;
+
+public class PoolMethodProto extends BaseMethodProtoReference implements MethodProtoReference {
+    private final MethodReference methodReference;
+
+    public PoolMethodProto(MethodReference methodReference) {
+        this.methodReference = methodReference;
+    }
+
+    @Override
+    public List<? extends CharSequence> getParameterTypes() {
+        return methodReference.getParameterTypes();
+    }
+
+    @Override
+    public String getReturnType() {
+        return methodReference.getReturnType();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/ProtoPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/ProtoPool.java
new file mode 100644
index 0000000..1209bd9
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/ProtoPool.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.pool;
+
+import org.jf.dexlib2.iface.reference.MethodProtoReference;
+import org.jf.dexlib2.util.MethodUtil;
+import org.jf.dexlib2.writer.ProtoSection;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Collection;
+import java.util.List;
+
+public class ProtoPool extends BaseIndexPool<MethodProtoReference>
+        implements ProtoSection<CharSequence, CharSequence, MethodProtoReference,
+        TypeListPool.Key<? extends Collection<? extends CharSequence>>> {
+
+    public ProtoPool(@Nonnull DexPool dexPool) {
+        super(dexPool);
+    }
+
+    public void intern(@Nonnull MethodProtoReference reference) {
+        Integer prev = internedItems.put(reference, 0);
+        if (prev == null) {
+            dexPool.stringSection.intern(getShorty(reference));
+            dexPool.typeSection.intern(reference.getReturnType());
+            dexPool.typeListSection.intern(reference.getParameterTypes());
+        }
+    }
+
+    @Nonnull @Override public CharSequence getShorty(@Nonnull MethodProtoReference reference) {
+        return MethodUtil.getShorty(reference.getParameterTypes(), reference.getReturnType());
+    }
+
+    @Nonnull @Override public CharSequence getReturnType(@Nonnull MethodProtoReference protoReference) {
+        return protoReference.getReturnType();
+    }
+
+    @Nullable @Override public TypeListPool.Key<List<? extends CharSequence>> getParameters(
+            @Nonnull MethodProtoReference methodProto) {
+        return new TypeListPool.Key<List<? extends CharSequence>>(methodProto.getParameterTypes());
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/StringPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/StringPool.java
new file mode 100644
index 0000000..61f1502
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/StringPool.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.pool;
+
+import org.jf.dexlib2.iface.reference.StringReference;
+import org.jf.dexlib2.writer.StringSection;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class StringPool extends StringTypeBasePool implements StringSection<CharSequence, StringReference> {
+
+    public StringPool(@Nonnull DexPool dexPool) {
+        super(dexPool);
+    }
+
+    public void intern(@Nonnull CharSequence string) {
+        internedItems.put(string.toString(), 0);
+    }
+
+    public void internNullable(@Nullable CharSequence string) {
+        if (string != null) {
+            intern(string);
+        }
+    }
+
+    @Override public int getItemIndex(@Nonnull StringReference key) {
+        Integer index = internedItems.get(key.toString());
+        if (index == null) {
+            throw new ExceptionWithContext("Item not found.: %s", key.toString());
+        }
+        return index;
+    }
+
+    @Override public boolean hasJumboIndexes() {
+        return internedItems.size() > 65536;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/StringTypeBasePool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/StringTypeBasePool.java
new file mode 100644
index 0000000..54c6cea
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/StringTypeBasePool.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.pool;
+
+import org.jf.dexlib2.writer.DexWriter;
+import org.jf.dexlib2.writer.NullableIndexSection;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Collection;
+import java.util.Map;
+
+public abstract class StringTypeBasePool extends BasePool<String, Integer>
+        implements NullableIndexSection<CharSequence>, Markable {
+
+    public StringTypeBasePool(@Nonnull DexPool dexPool) {
+        super(dexPool);
+    }
+
+    @Nonnull @Override public Collection<Map.Entry<String, Integer>> getItems() {
+        return internedItems.entrySet();
+    }
+
+    @Override public int getItemIndex(@Nonnull CharSequence key) {
+        Integer index = internedItems.get(key.toString());
+        if (index == null) {
+            throw new ExceptionWithContext("Item not found.: %s", key.toString());
+        }
+        return index;
+    }
+
+    @Override public int getNullableItemIndex(@Nullable CharSequence key) {
+        if (key == null) {
+            return DexWriter.NO_INDEX;
+        }
+        return getItemIndex(key);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/TypeListPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/TypeListPool.java
new file mode 100644
index 0000000..038f4d1
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/TypeListPool.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.pool;
+
+import com.google.common.collect.ImmutableList;
+import org.jf.dexlib2.writer.DexWriter;
+import org.jf.dexlib2.writer.TypeListSection;
+import org.jf.dexlib2.writer.pool.TypeListPool.Key;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Collection;
+import java.util.Iterator;
+
+public class TypeListPool extends BaseNullableOffsetPool<Key<? extends Collection<? extends CharSequence>>>
+        implements TypeListSection<CharSequence, Key<? extends Collection<? extends CharSequence>>> {
+
+
+    public TypeListPool(@Nonnull DexPool dexPool) {
+        super(dexPool);
+    }
+
+    public void intern(@Nonnull Collection<? extends CharSequence> types) {
+        if (types.size() > 0) {
+            Key<? extends Collection<? extends CharSequence>> key = new Key<Collection<? extends CharSequence>>(types);
+            Integer prev = internedItems.put(key, 0);
+            if (prev == null) {
+                for (CharSequence type: types) {
+                    dexPool.typeSection.intern(type);
+                }
+            }
+        }
+    }
+
+    @Nonnull @Override
+    public Collection<? extends CharSequence> getTypes(Key<? extends Collection<? extends CharSequence>> typesKey) {
+        if (typesKey == null) {
+            return ImmutableList.of();
+        }
+        return typesKey.types;
+    }
+
+    @Override public int getNullableItemOffset(@Nullable Key<? extends Collection<? extends CharSequence>> key) {
+        if (key == null || key.types.size() == 0) {
+            return DexWriter.NO_OFFSET;
+        } else {
+            return super.getNullableItemOffset(key);
+        }
+    }
+
+    public static class Key<TypeCollection extends Collection<? extends CharSequence>>
+            implements Comparable<Key<? extends Collection<? extends CharSequence>>> {
+        @Nonnull TypeCollection types;
+
+        public Key(@Nonnull TypeCollection types) {
+            this.types = types;
+        }
+
+        @Override
+        public int hashCode() {
+            int hashCode = 1;
+            for (CharSequence type: types) {
+                hashCode = hashCode*31 + type.toString().hashCode();
+            }
+            return hashCode;
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (o instanceof Key) {
+                Key<? extends Collection<? extends CharSequence>> other =
+                        (Key<? extends Collection<? extends CharSequence>>)o;
+                if (types.size() != other.types.size()) {
+                    return false;
+                }
+                Iterator<? extends CharSequence> otherTypes = other.types.iterator();
+                for (CharSequence type: types) {
+                    if (!type.toString().equals(otherTypes.next().toString())) {
+                        return false;
+                    }
+                }
+                return true;
+            }
+            return false;
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            for (CharSequence type: types) {
+                sb.append(type.toString());
+            }
+            return sb.toString();
+        }
+
+        @Override
+        public int compareTo(Key<? extends Collection<? extends CharSequence>> o) {
+            Iterator<? extends CharSequence> other = o.types.iterator();
+            for (CharSequence type: types) {
+                if (!other.hasNext()) {
+                    return 1;
+                }
+                int comparison = type.toString().compareTo(other.next().toString());
+                if (comparison != 0) {
+                    return comparison;
+                }
+            }
+            if (other.hasNext()) {
+                return -1;
+            }
+            return 0;
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/TypePool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/TypePool.java
new file mode 100644
index 0000000..7e43208
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/TypePool.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.pool;
+
+import org.jf.dexlib2.iface.reference.TypeReference;
+import org.jf.dexlib2.writer.TypeSection;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class TypePool extends StringTypeBasePool
+        implements TypeSection<CharSequence, CharSequence, TypeReference> {
+
+
+    public TypePool(@Nonnull DexPool dexPool) {
+        super(dexPool);
+    }
+
+    public void intern(@Nonnull CharSequence type) {
+        String typeString = type.toString();
+        Integer prev = internedItems.put(typeString, 0);
+        if (prev == null) {
+            dexPool.stringSection.intern(typeString);
+        }
+    }
+
+    public void internNullable(@Nullable CharSequence type) {
+        if (type != null) {
+            intern(type);
+        }
+    }
+
+    @Override public int getItemIndex(@Nonnull TypeReference key) {
+        return getItemIndex(key.getType());
+    }
+
+    @Nonnull @Override public CharSequence getString(@Nonnull CharSequence type) {
+        return type;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/util/CallSiteUtil.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/util/CallSiteUtil.java
new file mode 100644
index 0000000..73dbc40
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/util/CallSiteUtil.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.util;
+
+import com.google.common.collect.Lists;
+import org.jf.dexlib2.base.value.BaseArrayEncodedValue;
+import org.jf.dexlib2.base.value.BaseMethodHandleEncodedValue;
+import org.jf.dexlib2.base.value.BaseMethodTypeEncodedValue;
+import org.jf.dexlib2.iface.reference.CallSiteReference;
+import org.jf.dexlib2.iface.reference.MethodHandleReference;
+import org.jf.dexlib2.iface.reference.MethodProtoReference;
+import org.jf.dexlib2.iface.value.ArrayEncodedValue;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.dexlib2.immutable.value.ImmutableStringEncodedValue;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+public class CallSiteUtil {
+    public static ArrayEncodedValue getEncodedCallSite(CallSiteReference callSiteReference) {
+        return new BaseArrayEncodedValue() {
+            @Nonnull
+            @Override
+            public List<? extends EncodedValue> getValue() {
+                List<EncodedValue> encodedCallSite = Lists.newArrayList();
+
+                encodedCallSite.add(new BaseMethodHandleEncodedValue() {
+                    @Nonnull
+                    @Override
+                    public MethodHandleReference getValue() {
+                        return callSiteReference.getMethodHandle();
+                    }
+                });
+                encodedCallSite.add(new ImmutableStringEncodedValue(callSiteReference.getMethodName()));
+                encodedCallSite.add(new BaseMethodTypeEncodedValue() {
+                    @Nonnull
+                    @Override
+                    public MethodProtoReference getValue() {
+                        return callSiteReference.getMethodProto();
+                    }
+                });
+                encodedCallSite.addAll(callSiteReference.getExtraArguments());
+                return encodedCallSite;
+            }
+        };
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/util/StaticInitializerUtil.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/util/StaticInitializerUtil.java
new file mode 100644
index 0000000..e292264
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/util/StaticInitializerUtil.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.util;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.collect.FluentIterable;
+import org.jf.dexlib2.base.value.BaseArrayEncodedValue;
+import org.jf.dexlib2.iface.Field;
+import org.jf.dexlib2.iface.value.ArrayEncodedValue;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.dexlib2.immutable.value.ImmutableEncodedValueFactory;
+import org.jf.dexlib2.util.EncodedValueUtils;
+import org.jf.util.AbstractForwardSequentialList;
+import org.jf.util.CollectionUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.SortedSet;
+
+public class StaticInitializerUtil {
+
+    @Nullable public static ArrayEncodedValue getStaticInitializers(
+            @Nonnull SortedSet<? extends Field> sortedStaticFields) {
+        final int lastIndex = CollectionUtils.lastIndexOf(sortedStaticFields, HAS_INITIALIZER);
+        if (lastIndex > -1) {
+            return new BaseArrayEncodedValue() {
+                @Nonnull
+                @Override
+                public List<? extends EncodedValue> getValue() {
+                    return new AbstractForwardSequentialList<EncodedValue>() {
+                        @Nonnull @Override public Iterator<EncodedValue> iterator() {
+                            return FluentIterable.from(sortedStaticFields)
+                                    .limit(lastIndex+1)
+                                    .transform(GET_INITIAL_VALUE).iterator();
+                        }
+
+                        @Override public int size() {
+                            return lastIndex+1;
+                        }
+                    };
+                }
+            };
+        }
+        return null;
+    }
+
+    private static final Predicate<Field> HAS_INITIALIZER = new Predicate<Field>() {
+        @Override
+        public boolean apply(Field input) {
+            EncodedValue encodedValue = input.getInitialValue();
+            return encodedValue != null && !EncodedValueUtils.isDefaultValue(encodedValue);
+        }
+    };
+
+    private static final Function<Field, EncodedValue> GET_INITIAL_VALUE = new Function<Field, EncodedValue>() {
+        @Override
+        public EncodedValue apply(Field input) {
+            EncodedValue initialValue = input.getInitialValue();
+            if (initialValue == null) {
+                return ImmutableEncodedValueFactory.defaultValueForType(input.getType());
+            }
+            return initialValue;
+        }
+    };
+
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/util/TryListBuilder.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/util/TryListBuilder.java
new file mode 100644
index 0000000..9a4c811
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/util/TryListBuilder.java
@@ -0,0 +1,367 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.util;
+
+import com.google.common.collect.Lists;
+import org.jf.dexlib2.base.BaseTryBlock;
+import org.jf.dexlib2.iface.ExceptionHandler;
+import org.jf.dexlib2.iface.TryBlock;
+import org.jf.util.ExceptionWithContext;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+public class TryListBuilder<EH extends ExceptionHandler>
+{
+    // Linked list sentinels that don't represent an actual try block
+    // Their values are never modified, only their links
+    private final MutableTryBlock<EH> listStart;
+    private final MutableTryBlock<EH> listEnd;
+
+    public TryListBuilder() {
+        listStart = new MutableTryBlock<EH>(0, 0);
+        listEnd = new MutableTryBlock<EH>(0, 0);
+        listStart.next = listEnd;
+        listEnd.prev = listStart;
+    }
+
+    public static <EH extends ExceptionHandler> List<TryBlock<EH>> massageTryBlocks(
+            List<? extends TryBlock<? extends EH>> tryBlocks) {
+        TryListBuilder<EH> tlb = new TryListBuilder<EH>();
+
+        for (TryBlock<? extends EH> tryBlock: tryBlocks) {
+            int startAddress = tryBlock.getStartCodeAddress();
+            int endAddress = startAddress + tryBlock.getCodeUnitCount();
+
+            for (EH exceptionHandler: tryBlock.getExceptionHandlers()) {
+                tlb.addHandler(startAddress, endAddress, exceptionHandler);
+            }
+        }
+        return tlb.getTryBlocks();
+    }
+
+    private static class TryBounds<EH extends ExceptionHandler> {
+        @Nonnull public final MutableTryBlock<EH> start;
+        @Nonnull public final MutableTryBlock<EH> end;
+
+        public TryBounds(@Nonnull MutableTryBlock<EH> start, @Nonnull MutableTryBlock<EH> end) {
+            this.start = start;
+            this.end = end;
+        }
+    }
+
+    public static class InvalidTryException extends ExceptionWithContext {
+        public InvalidTryException(Throwable cause) {
+            super(cause);
+        }
+
+        public InvalidTryException(Throwable cause, String message, Object... formatArgs) {
+            super(cause, message, formatArgs);
+        }
+
+        public InvalidTryException(String message, Object... formatArgs) {
+            super(message, formatArgs);
+        }
+    }
+
+    private static class MutableTryBlock<EH extends ExceptionHandler> extends BaseTryBlock<EH> {
+        public MutableTryBlock<EH> prev = null;
+        public MutableTryBlock<EH> next = null;
+
+        public int startCodeAddress;
+        public int endCodeAddress;
+        @Nonnull public List<EH> exceptionHandlers = Lists.newArrayList();
+
+        public MutableTryBlock(int startCodeAddress, int endCodeAddress) {
+            this.startCodeAddress = startCodeAddress;
+            this.endCodeAddress = endCodeAddress;
+        }
+
+        public MutableTryBlock(int startCodeAddress, int endCodeAddress,
+                               @Nonnull List<EH> exceptionHandlers) {
+            this.startCodeAddress = startCodeAddress;
+            this.endCodeAddress = endCodeAddress;
+            this.exceptionHandlers = Lists.newArrayList(exceptionHandlers);
+        }
+
+        @Override public int getStartCodeAddress() {
+            return startCodeAddress;
+        }
+
+        @Override public int getCodeUnitCount() {
+            return endCodeAddress - startCodeAddress;
+        }
+
+        @Nonnull @Override public List<EH> getExceptionHandlers() {
+            return exceptionHandlers;
+        }
+
+        @Nonnull
+        public MutableTryBlock<EH> split(int splitAddress) {
+            MutableTryBlock<EH> newTryBlock = new MutableTryBlock<EH>(splitAddress, endCodeAddress, exceptionHandlers);
+            endCodeAddress = splitAddress;
+            append(newTryBlock);
+            return newTryBlock;
+        }
+
+        public void delete() {
+            next.prev = prev;
+            prev.next = next;
+        }
+
+        public void mergeNext() {
+            //assert next.startCodeAddress == this.endCodeAddress;
+            this.endCodeAddress = next.endCodeAddress;
+            next.delete();
+        }
+
+        public void append(@Nonnull MutableTryBlock<EH> tryBlock) {
+            next.prev = tryBlock;
+            tryBlock.next = next;
+            tryBlock.prev = this;
+            next = tryBlock;
+        }
+
+        public void prepend(@Nonnull MutableTryBlock<EH> tryBlock) {
+            prev.next = tryBlock;
+            tryBlock.prev = prev;
+            tryBlock.next = this;
+            prev = tryBlock;
+        }
+
+        public void addHandler(@Nonnull EH handler) {
+            for (ExceptionHandler existingHandler: exceptionHandlers) {
+                String existingType = existingHandler.getExceptionType();
+                String newType = handler.getExceptionType();
+
+                if (existingType == null) {
+                    if (newType == null) {
+                        if (existingHandler.getHandlerCodeAddress() != handler.getHandlerCodeAddress()) {
+                            throw new InvalidTryException(
+                                    "Multiple overlapping catch all handlers with different handlers");
+                        }
+                        return;
+                    }
+                } else if (existingType.equals(newType)) {
+                    // dalvik doesn't reject cases when there are multiple catches with the same exception
+                    // but different handlers. In practice, the first handler "wins". Since the later
+                    // handler will never be used, we don't add it.
+                    return;
+                }
+            }
+
+            exceptionHandlers.add(handler);
+        }
+    }
+
+    private TryBounds<EH> getBoundingRanges(int startAddress, int endAddress) {
+        MutableTryBlock<EH> startBlock = null;
+
+        MutableTryBlock<EH> tryBlock = listStart.next;
+        while (tryBlock != listEnd) {
+            int currentStartAddress = tryBlock.startCodeAddress;
+            int currentEndAddress = tryBlock.endCodeAddress;
+
+            if (startAddress == currentStartAddress) {
+                //|-----|
+                //^------
+                /*Bam. We hit the start of the range right on the head*/
+                startBlock = tryBlock;
+                break;
+            } else if (startAddress > currentStartAddress && startAddress < currentEndAddress) {
+                //|-----|
+                //  ^----
+                /*Almost. The start of the range being added is in the middle
+                of an existing try range. We need to split the existing range
+                at the start address of the range being added*/
+                startBlock = tryBlock.split(startAddress);
+                break;
+            }else if (startAddress < currentStartAddress) {
+                if (endAddress <= currentStartAddress) {
+                    //      |-----|
+                    //^--^
+                    /*Oops, totally too far! The new range doesn't overlap any existing
+                    ones, so we just add it and return*/
+                    startBlock = new MutableTryBlock<EH>(startAddress, endAddress);
+                    tryBlock.prepend(startBlock);
+                    return new TryBounds<EH>(startBlock, startBlock);
+                } else {
+                    //   |-----|
+                    //^---------
+                    /*Oops, too far! We've passed the start of the range being added, but
+                     the new range does overlap this one. We need to add a new range just
+                     before this one*/
+                    startBlock = new MutableTryBlock<EH>(startAddress, currentStartAddress);
+                    tryBlock.prepend(startBlock);
+                    break;
+                }
+            }
+
+            tryBlock = tryBlock.next;
+        }
+
+        //|-----|
+        //        ^-----
+        /*Either the list of tries is blank, or all the tries in the list
+        end before the range being added starts. In either case, we just need
+        to add a new range at the end of the list*/
+        if (startBlock == null) {
+            startBlock = new MutableTryBlock<EH>(startAddress, endAddress);
+            listEnd.prepend(startBlock);
+            return new TryBounds<EH>(startBlock, startBlock);
+        }
+
+        tryBlock = startBlock;
+        while (tryBlock != listEnd) {
+            int currentStartAddress = tryBlock.startCodeAddress;
+            int currentEndAddress = tryBlock.endCodeAddress;
+
+            if (endAddress == currentEndAddress) {
+                //|-----|
+                //------^
+                /*Bam! We hit the end right on the head... err, tail.*/
+                return new TryBounds<EH>(startBlock, tryBlock);
+            } else if (endAddress > currentStartAddress && endAddress < currentEndAddress) {
+                //|-----|
+                //--^
+                /*Almost. The range being added ends in the middle of an
+                existing range. We need to split the existing range
+                at the end of the range being added.*/
+                tryBlock.split(endAddress);
+                return new TryBounds<EH>(startBlock, tryBlock);
+            } else if (endAddress <= currentStartAddress) {
+                //|-----|       |-----|
+                //-----------^
+                /*Oops, too far! The current range starts after the range being added
+                ends. We need to create a new range that starts at the end of the
+                previous range, and ends at the end of the range being added*/
+                MutableTryBlock<EH> endBlock = new MutableTryBlock<EH>(tryBlock.prev.endCodeAddress, endAddress);
+                tryBlock.prepend(endBlock);
+                return new TryBounds<EH>(startBlock, endBlock);
+            }
+            tryBlock = tryBlock.next;
+        }
+
+        //|-----|
+        //--------^
+        /*The last range in the list ended before the end of the range being added.
+        We need to add a new range that starts at the end of the last range in the
+        list, and ends at the end of the range being added.*/
+        MutableTryBlock<EH> endBlock = new MutableTryBlock<EH>(listEnd.prev.endCodeAddress, endAddress);
+        listEnd.prepend(endBlock);
+        return new TryBounds<EH>(startBlock, endBlock);
+    }
+
+    public void addHandler(int startAddress, int endAddress, EH handler) {
+        TryBounds<EH> bounds = getBoundingRanges(startAddress, endAddress);
+
+        MutableTryBlock<EH> startBlock = bounds.start;
+        MutableTryBlock<EH> endBlock = bounds.end;
+
+        int previousEnd = startAddress;
+        MutableTryBlock<EH> tryBlock = startBlock;
+
+        /*Now we have the start and end ranges that exactly match the start and end
+        of the range being added. We need to iterate over all the ranges from the start
+        to end range inclusively, and append the handler to the end of each range's handler
+        list. We also need to create a new range for any "holes" in the existing ranges*/
+        do
+        {
+            //is there a hole? If so, add a new range to fill the hole
+            if (tryBlock.startCodeAddress > previousEnd) {
+                MutableTryBlock<EH> newBlock = new MutableTryBlock<EH>(previousEnd, tryBlock.startCodeAddress);
+                tryBlock.prepend(newBlock);
+                tryBlock = newBlock;
+            }
+
+            tryBlock.addHandler(handler);
+            previousEnd = tryBlock.endCodeAddress;
+            tryBlock = tryBlock.next;
+        } while (tryBlock.prev != endBlock);
+    }
+
+    public List<TryBlock<EH>> getTryBlocks() {
+        return Lists.newArrayList(new Iterator<TryBlock<EH>>() {
+            // The next TryBlock to return. This has already been merged, if needed.
+            @Nullable private MutableTryBlock<EH> next;
+
+            {
+                next = listStart;
+                next = readNextItem();
+            }
+
+            /**
+             * Read the item that comes after the current value of the next field.
+             * @return The next item, or null if there is no next item
+             */
+            @Nullable protected MutableTryBlock<EH> readNextItem() {
+                // We can assume that next is not null, due to the way iteration happens
+                MutableTryBlock<EH> ret = next.next;
+
+                if (ret == listEnd) {
+                    return null;
+                }
+
+                while (ret.next != listEnd) {
+                    if (ret.endCodeAddress == ret.next.startCodeAddress &&
+                            ret.getExceptionHandlers().equals(ret.next.getExceptionHandlers())) {
+                        ret.mergeNext();
+                    } else {
+                        break;
+                    }
+                }
+                return ret;
+            }
+
+            @Override public boolean hasNext() {
+                return next != null;
+            }
+
+            @Override @Nonnull public TryBlock<EH> next() {
+                if (!hasNext()) {
+                    throw new NoSuchElementException();
+                }
+                TryBlock<EH> ret = next;
+                next = readNextItem();
+                // ret can't be null (ret=next and hasNext returned true)
+                return ret;
+            }
+
+            @Override public void remove() {
+                throw new UnsupportedOperationException();
+            }
+        });
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/util/AbstractForwardSequentialList.java b/dexlib2/src/main/java/org/jf/util/AbstractForwardSequentialList.java
new file mode 100644
index 0000000..19739e6
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/util/AbstractForwardSequentialList.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.AbstractSequentialList;
+import java.util.Iterator;
+import java.util.ListIterator;
+import java.util.NoSuchElementException;
+
+public abstract class AbstractForwardSequentialList<T> extends AbstractSequentialList<T> {
+
+    @Nonnull private Iterator<T> iterator(int index) {
+        if (index < 0) {
+            throw new NoSuchElementException();
+        }
+
+        Iterator<T> it = iterator();
+        for (int i=0; i<index; i++) {
+            it.next();
+        }
+        return it;
+    }
+
+    @Override @Nonnull public abstract Iterator<T> iterator();
+
+    @Override @Nonnull public ListIterator<T> listIterator(final int initialIndex) {
+
+        final Iterator<T> initialIterator;
+        try {
+            initialIterator = iterator(initialIndex);
+        } catch (NoSuchElementException ex) {
+            throw new IndexOutOfBoundsException();
+        }
+
+        return new AbstractListIterator<T>() {
+            private int index = initialIndex - 1;
+            @Nullable private Iterator<T> forwardIterator = initialIterator;
+
+            @Nonnull
+            private Iterator<T> getForwardIterator() {
+                if (forwardIterator == null) {
+                    try {
+                        forwardIterator = iterator(index+1);
+                    } catch (IndexOutOfBoundsException ex) {
+                        throw new NoSuchElementException();
+                    }
+                }
+                return forwardIterator;
+            }
+
+            @Override public boolean hasNext() {
+                return getForwardIterator().hasNext();
+            }
+
+            @Override public boolean hasPrevious() {
+                return index >= 0;
+            }
+
+            @Override public T next() {
+                T ret = getForwardIterator().next();
+                index++;
+                return ret;
+            }
+
+            @Override public int nextIndex() {
+                return index+1;
+            }
+
+            @Override public T previous() {
+                forwardIterator = null;
+                try {
+                    return iterator(index--).next();
+                } catch (IndexOutOfBoundsException ex) {
+                    throw new NoSuchElementException();
+                }
+            }
+
+            @Override public int previousIndex() {
+                return index;
+            }
+        };
+    }
+
+    @Override @Nonnull public ListIterator<T> listIterator() {
+        return listIterator(0);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/util/AbstractListIterator.java b/dexlib2/src/main/java/org/jf/util/AbstractListIterator.java
new file mode 100644
index 0000000..240bf66
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/util/AbstractListIterator.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+import java.util.ListIterator;
+
+public abstract class AbstractListIterator<T> implements ListIterator<T> {
+    @Override
+    public boolean hasNext() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public T next() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public boolean hasPrevious() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public T previous() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public int nextIndex() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public int previousIndex() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void remove() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void set(T t) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void add(T t) {
+        throw new UnsupportedOperationException();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/util/ArraySortedSet.java b/dexlib2/src/main/java/org/jf/util/ArraySortedSet.java
new file mode 100644
index 0000000..a0a82f1
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/util/ArraySortedSet.java
@@ -0,0 +1,198 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+import com.google.common.collect.Iterators;
+
+import javax.annotation.Nonnull;
+import java.util.*;
+
+public class ArraySortedSet<T> implements SortedSet<T> {
+    @Nonnull private final Comparator<? super T> comparator;
+    @Nonnull private final Object[] arr;
+
+    private ArraySortedSet(@Nonnull Comparator<? super T> comparator, @Nonnull T[] arr) {
+        // we assume arr is already sorted by comparator, and all entries are unique
+        this.comparator = comparator;
+        this.arr = arr;
+    }
+
+    public static <T> ArraySortedSet<T> of(@Nonnull Comparator<? super T> comparator, @Nonnull T[] arr) {
+        return new ArraySortedSet<T>(comparator, arr);
+    }
+
+    @Override
+    public int size() {
+        return arr.length;
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return arr.length > 0;
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public boolean contains(Object o) {
+        return Arrays.binarySearch((T[])arr, (T)o, comparator) >= 0;
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public Iterator<T> iterator() {
+        return Iterators.forArray((T[])arr);
+    }
+
+    @Override
+    public Object[] toArray() {
+        return arr.clone();
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public <T> T[] toArray(T[] a) {
+        if (a.length <= arr.length) {
+            System.arraycopy(arr, 0, (Object[])a, 0, arr.length);
+            return a;
+        }
+        return Arrays.copyOf((T[])arr, arr.length);
+    }
+
+    @Override
+    public boolean add(T t) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public boolean remove(Object o) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public boolean containsAll(Collection<?> c) {
+        for (Object o: c) {
+            if (!contains(o)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public boolean addAll(Collection<? extends T> c) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public boolean retainAll(Collection<?> c) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public boolean removeAll(Collection<?> c) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void clear() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public Comparator<? super T> comparator() {
+        return comparator;
+    }
+
+    @Override
+    public SortedSet<T> subSet(T fromElement, T toElement) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public SortedSet<T> headSet(T toElement) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public SortedSet<T> tailSet(T fromElement) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public T first() {
+        if (arr.length == 0) {
+            throw new NoSuchElementException();
+        }
+        return (T)arr[0];
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public T last() {
+        if (arr.length == 0) {
+            throw new NoSuchElementException();
+        }
+        return (T)arr[arr.length-1];
+    }
+
+    @Override
+    public int hashCode() {
+        int result = 0;
+        for (Object o: arr) {
+            result += o.hashCode();
+        }
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o == null) {
+            return false;
+        }
+        if (o instanceof SortedSet) {
+            SortedSet other = (SortedSet)o;
+            if (arr.length != other.size()) {
+                return false;
+            }
+            return Iterators.elementsEqual(iterator(), other.iterator());
+        }
+        if (o instanceof Set) {
+            Set other = (Set)o;
+            if (arr.length != other.size()) {
+                return false;
+            }
+            return this.containsAll(other);
+        }
+        return false;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/util/BitSetUtils.java b/dexlib2/src/main/java/org/jf/util/BitSetUtils.java
new file mode 100644
index 0000000..777a857
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/util/BitSetUtils.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+import java.util.BitSet;
+
+public class BitSetUtils {
+    public static BitSet bitSetOfIndexes(int... indexes) {
+        BitSet bitSet = new BitSet();
+        for (int index: indexes) {
+            bitSet.set(index);
+        }
+        return bitSet;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/util/CharSequenceUtils.java b/dexlib2/src/main/java/org/jf/util/CharSequenceUtils.java
new file mode 100644
index 0000000..f78d9be
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/util/CharSequenceUtils.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+import com.google.common.base.Function;
+import com.google.common.base.Functions;
+import com.google.common.collect.Lists;
+
+import java.util.List;
+
+public class CharSequenceUtils {
+    private static final Function<Object, String> TO_STRING = Functions.toStringFunction();
+
+    public static int listHashCode(List<? extends CharSequence> list) {
+        return Lists.transform(list, TO_STRING).hashCode();
+    }
+
+    public static boolean listEquals(List<? extends CharSequence> list1, List<? extends CharSequence> list2) {
+        return Lists.transform(list1, TO_STRING).equals(
+                Lists.transform(list2, TO_STRING));
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/util/CollectionUtils.java b/dexlib2/src/main/java/org/jf/util/CollectionUtils.java
new file mode 100644
index 0000000..23e23dc
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/util/CollectionUtils.java
@@ -0,0 +1,224 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableSortedSet;
+import com.google.common.collect.Ordering;
+import com.google.common.primitives.Ints;
+
+import javax.annotation.Nonnull;
+import java.util.*;
+
+public class CollectionUtils {
+    public static <T> int listHashCode(@Nonnull Iterable<T> iterable) {
+        int hashCode = 1;
+        for (T item: iterable) {
+            hashCode = hashCode*31 + item.hashCode();
+        }
+        return hashCode;
+    }
+
+    public static <T> int lastIndexOf(@Nonnull Iterable<T> iterable, @Nonnull Predicate<? super T> predicate) {
+        int index = 0;
+        int lastMatchingIndex = -1;
+        for (T item: iterable) {
+            if (predicate.apply(item)) {
+                lastMatchingIndex = index;
+            }
+            index++;
+        }
+        return lastMatchingIndex;
+    }
+
+    public static <T extends Comparable<? super T>> int compareAsList(@Nonnull Collection<? extends T> list1,
+                                                                      @Nonnull Collection<? extends T> list2) {
+        int res = Ints.compare(list1.size(), list2.size());
+        if (res != 0) return res;
+        Iterator<? extends T> elements2 = list2.iterator();
+        for (T element1: list1) {
+            res = element1.compareTo(elements2.next());
+            if (res != 0) return res;
+        }
+        return 0;
+    }
+
+    public static <T> int compareAsIterable(@Nonnull Comparator<? super T> comparator,
+                                            @Nonnull Iterable<? extends T> it1,
+                                            @Nonnull Iterable<? extends T> it2) {
+        Iterator<? extends T> elements2 = it2.iterator();
+        for (T element1: it1) {
+            T element2;
+            try {
+                element2 = elements2.next();
+            } catch (NoSuchElementException ex) {
+                return 1;
+            }
+            int res = comparator.compare(element1, element2);
+            if (res != 0) return res;
+        }
+        if (elements2.hasNext()) {
+            return -1;
+        }
+        return 0;
+    }
+
+    public static <T extends Comparable<? super T>> int compareAsIterable(@Nonnull Iterable<? extends T> it1,
+                                                                          @Nonnull Iterable<? extends T> it2) {
+        Iterator<? extends T> elements2 = it2.iterator();
+        for (T element1: it1) {
+            T element2;
+            try {
+                element2 = elements2.next();
+            } catch (NoSuchElementException ex) {
+                return 1;
+            }
+            int res = element1.compareTo(element2);
+            if (res != 0) return res;
+        }
+        if (elements2.hasNext()) {
+            return -1;
+        }
+        return 0;
+    }
+
+    public static <T> int compareAsList(@Nonnull Comparator<? super T> elementComparator,
+                                        @Nonnull Collection<? extends T> list1,
+                                        @Nonnull Collection<? extends T> list2) {
+        int res = Ints.compare(list1.size(), list2.size());
+        if (res != 0) return res;
+        Iterator<? extends T> elements2 = list2.iterator();
+        for (T element1: list1) {
+            res = elementComparator.compare(element1, elements2.next());
+            if (res != 0) return res;
+        }
+        return 0;
+    }
+
+    @Nonnull
+    public static <T> Comparator<Collection<? extends T>> listComparator(
+            @Nonnull final Comparator<? super T> elementComparator) {
+        return new Comparator<Collection<? extends T>>() {
+            @Override
+            public int compare(Collection<? extends T> list1, Collection<? extends T> list2) {
+                return compareAsList(elementComparator, list1, list2);
+            }
+        };
+    }
+
+    public static <T> boolean isNaturalSortedSet(@Nonnull Iterable<? extends T> it) {
+        if (it instanceof SortedSet) {
+            SortedSet<? extends T> sortedSet = (SortedSet<? extends T>)it;
+            Comparator<?> comparator = sortedSet.comparator();
+            return (comparator == null) || comparator.equals(Ordering.natural());
+        }
+        return false;
+    }
+
+    public static <T> boolean isSortedSet(@Nonnull Comparator<? extends T> elementComparator,
+                                          @Nonnull Iterable<? extends T> it) {
+        if (it instanceof SortedSet) {
+            SortedSet<? extends T> sortedSet = (SortedSet<? extends T>)it;
+            Comparator<?> comparator = sortedSet.comparator();
+            if (comparator == null) {
+                return elementComparator.equals(Ordering.natural());
+            }
+            return elementComparator.equals(comparator);
+        }
+        return false;
+    }
+
+    @Nonnull
+    private static <T> SortedSet<? extends T> toNaturalSortedSet(@Nonnull Collection<? extends T> collection) {
+        if (isNaturalSortedSet(collection)) {
+            return (SortedSet<? extends T>)collection;
+        }
+        return ImmutableSortedSet.copyOf(collection);
+    }
+
+    @Nonnull
+    private static <T> SortedSet<? extends T> toSortedSet(@Nonnull Comparator<? super T> elementComparator,
+                                                          @Nonnull Collection<? extends T> collection) {
+        if (collection instanceof SortedSet) {
+            SortedSet<? extends T> sortedSet = (SortedSet<? extends T>)collection;
+            Comparator<?> comparator = sortedSet.comparator();
+            if (comparator != null && comparator.equals(elementComparator)) {
+                return sortedSet;
+            }
+        }
+        return ImmutableSortedSet.copyOf(elementComparator, collection);
+    }
+
+    @Nonnull
+    public static <T> Comparator<Collection<? extends T>> setComparator(
+            @Nonnull final Comparator<? super T> elementComparator) {
+        return new Comparator<Collection<? extends T>>() {
+            @Override
+            public int compare(Collection<? extends T> list1, Collection<? extends T> list2) {
+                return compareAsSet(elementComparator, list1, list2);
+            }
+        };
+    }
+
+    public static <T extends Comparable<T>> int compareAsSet(@Nonnull Collection<? extends T> set1,
+                                                             @Nonnull Collection<? extends T> set2) {
+        int res = Ints.compare(set1.size(), set2.size());
+        if (res != 0) return res;
+
+        SortedSet<? extends T> sortedSet1 = toNaturalSortedSet(set1);
+        SortedSet<? extends T> sortedSet2 = toNaturalSortedSet(set2);
+
+        Iterator<? extends T> elements2 = set2.iterator();
+        for (T element1: set1) {
+            res = element1.compareTo(elements2.next());
+            if (res != 0) return res;
+        }
+        return 0;
+    }
+
+    public static <T> int compareAsSet(@Nonnull Comparator<? super T> elementComparator,
+                                       @Nonnull Collection<? extends T> list1,
+                                       @Nonnull Collection<? extends T> list2) {
+        int res = Ints.compare(list1.size(), list2.size());
+        if (res != 0) return res;
+
+        SortedSet<? extends T> set1 = toSortedSet(elementComparator, list1);
+        SortedSet<? extends T> set2 = toSortedSet(elementComparator, list2);
+
+        Iterator<? extends T> elements2 = set2.iterator();
+        for (T element1: set1) {
+            res = elementComparator.compare(element1, elements2.next());
+            if (res != 0) return res;
+        }
+        return 0;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/util/ExceptionWithContext.java b/dexlib2/src/main/java/org/jf/util/ExceptionWithContext.java
new file mode 100644
index 0000000..ae80388
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/util/ExceptionWithContext.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * As per the Apache license requirements, this file has been modified
+ * from its original state.
+ *
+ * Such modifications are Copyright (C) 2010 Ben Gruver, and are released
+ * under the original license
+ */
+
+package org.jf.util;
+
+import java.io.PrintStream;
+import java.io.PrintWriter;
+
+/**
+ * Exception which carries around structured context.
+ */
+public class ExceptionWithContext
+        extends RuntimeException {
+    /** non-null; human-oriented context of the exception */
+    private StringBuffer context;
+
+    /**
+     * Augments the given exception with the given context, and return the
+     * result. The result is either the given exception if it was an
+     * {@link ExceptionWithContext}, or a newly-constructed exception if it
+     * was not.
+     *
+     * @param ex non-null; the exception to augment
+     * @param str non-null; context to add
+     * @return non-null; an appropriate instance
+     */
+    public static ExceptionWithContext withContext(Throwable ex, String str, Object... formatArgs) {
+        ExceptionWithContext ewc;
+
+        if (ex instanceof ExceptionWithContext) {
+            ewc = (ExceptionWithContext) ex;
+        } else {
+            ewc = new ExceptionWithContext(ex);
+        }
+
+        ewc.addContext(String.format(str, formatArgs));
+        return ewc;
+    }
+
+    /**
+     * Constructs an instance.
+     *
+     * @param message human-oriented message
+     */
+    public ExceptionWithContext(String message, Object... formatArgs) {
+        this(null, message, formatArgs);
+    }
+
+    /**
+     * Constructs an instance.
+     *
+     * @param cause null-ok; exception that caused this one
+     */
+    public ExceptionWithContext(Throwable cause) {
+        this(cause, null);
+    }
+
+    /**
+     * Constructs an instance.
+     *
+     * @param message human-oriented message
+     * @param cause null-ok; exception that caused this one
+     */
+    public ExceptionWithContext(Throwable cause, String message, Object... formatArgs) {
+        super((message != null) ? formatMessage(message, formatArgs) :
+              (cause != null) ? cause.getMessage() : null,
+              cause);
+
+        if (cause instanceof ExceptionWithContext) {
+            String ctx = ((ExceptionWithContext) cause).context.toString();
+            context = new StringBuffer(ctx.length() + 200);
+            context.append(ctx);
+        } else {
+            context = new StringBuffer(200);
+        }
+    }
+
+    private static String formatMessage(String message, Object... formatArgs) {
+        if (message == null) {
+            return null;
+        }
+        return String.format(message, formatArgs);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public void printStackTrace(PrintStream out) {
+        super.printStackTrace(out);
+        out.println(context);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public void printStackTrace(PrintWriter out) {
+        super.printStackTrace(out);
+        out.println(context);
+    }
+
+    /**
+     * Adds a line of context to this instance.
+     *
+     * @param str non-null; new context
+     */
+    public void addContext(String str) {
+        if (str == null) {
+            throw new NullPointerException("str == null");
+        }
+
+        context.append(str);
+        if (!str.endsWith("\n")) {
+            context.append('\n');
+        }
+    }
+
+    /**
+     * Gets the context.
+     *
+     * @return non-null; the context
+     */
+    public String getContext() {
+        return context.toString();
+    }
+
+    /**
+     * Prints the message and context.
+     *
+     * @param out non-null; where to print to
+     */
+    public void printContext(PrintStream out) {
+        out.println(getMessage());
+        out.print(context);
+    }
+
+    /**
+     * Prints the message and context.
+     *
+     * @param out non-null; where to print to
+     */
+    public void printContext(PrintWriter out) {
+        out.println(getMessage());
+        out.print(context);
+    }
+}
\ No newline at end of file
diff --git a/dexlib2/src/main/java/org/jf/util/Hex.java b/dexlib2/src/main/java/org/jf/util/Hex.java
new file mode 100644
index 0000000..19727cd
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/util/Hex.java
@@ -0,0 +1,315 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+/**
+ * Utilities for formatting numbers as hexadecimal.
+ */
+public final class Hex {
+    /**
+     * This class is uninstantiable.
+     */
+    private Hex() {
+        // This space intentionally left blank.
+    }
+
+    /**
+     * Formats a <code>long</code> as an 8-byte unsigned hex value.
+     *
+     * @param v value to format
+     * @return non-null; formatted form
+     */
+    public static String u8(long v) {
+        char[] result = new char[16];
+        for (int i = 0; i < 16; i++) {
+            result[15 - i] = Character.forDigit((int) v & 0x0f, 16);
+            v >>= 4;
+        }
+
+        return new String(result);
+    }
+
+    /**
+     * Formats an <code>int</code> as a 4-byte unsigned hex value.
+     *
+     * @param v value to format
+     * @return non-null; formatted form
+     */
+    public static String u4(int v) {
+        char[] result = new char[8];
+        for (int i = 0; i < 8; i++) {
+            result[7 - i] = Character.forDigit(v & 0x0f, 16);
+            v >>= 4;
+        }
+
+        return new String(result);
+    }
+
+    /**
+     * Formats an <code>int</code> as a 3-byte unsigned hex value.
+     *
+     * @param v value to format
+     * @return non-null; formatted form
+     */
+    public static String u3(int v) {
+        char[] result = new char[6];
+        for (int i = 0; i < 6; i++) {
+            result[5 - i] = Character.forDigit(v & 0x0f, 16);
+            v >>= 4;
+        }
+
+        return new String(result);
+    }
+
+    /**
+     * Formats an <code>int</code> as a 2-byte unsigned hex value.
+     *
+     * @param v value to format
+     * @return non-null; formatted form
+     */
+    public static String u2(int v) {
+        char[] result = new char[4];
+        for (int i = 0; i < 4; i++) {
+            result[3 - i] = Character.forDigit(v & 0x0f, 16);
+            v >>= 4;
+        }
+
+        return new String(result);
+    }
+
+    /**
+     * Formats an <code>int</code> as either a 2-byte unsigned hex value
+     * (if the value is small enough) or a 4-byte unsigned hex value (if
+     * not).
+     *
+     * @param v value to format
+     * @return non-null; formatted form
+     */
+    public static String u2or4(int v) {
+        if (v == (char) v) {
+            return u2(v);
+        } else {
+            return u4(v);
+        }
+    }
+
+    /**
+     * Formats an <code>int</code> as a 1-byte unsigned hex value.
+     *
+     * @param v value to format
+     * @return non-null; formatted form
+     */
+    public static String u1(int v) {
+        char[] result = new char[2];
+        for (int i = 0; i < 2; i++) {
+            result[1 - i] = Character.forDigit(v & 0x0f, 16);
+            v >>= 4;
+        }
+
+        return new String(result);
+    }
+
+    /**
+     * Formats an <code>int</code> as a 4-bit unsigned hex nibble.
+     *
+     * @param v value to format
+     * @return non-null; formatted form
+     */
+    public static String uNibble(int v) {
+        char[] result = new char[1];
+
+        result[0] = Character.forDigit(v & 0x0f, 16);
+        return new String(result);
+    }
+
+    /**
+     * Formats a <code>long</code> as an 8-byte signed hex value.
+     *
+     * @param v value to format
+     * @return non-null; formatted form
+     */
+    public static String s8(long v) {
+        char[] result = new char[17];
+
+        if (v < 0) {
+            result[0] = '-';
+            v = -v;
+        } else {
+            result[0] = '+';
+        }
+
+        for (int i = 0; i < 16; i++) {
+            result[16 - i] = Character.forDigit((int) v & 0x0f, 16);
+            v >>= 4;
+        }
+
+        return new String(result);
+    }
+
+    /**
+     * Formats an <code>int</code> as a 4-byte signed hex value.
+     *
+     * @param v value to format
+     * @return non-null; formatted form
+     */
+    public static String s4(int v) {
+        char[] result = new char[9];
+
+        if (v < 0) {
+            result[0] = '-';
+            v = -v;
+        } else {
+            result[0] = '+';
+        }
+
+        for (int i = 0; i < 8; i++) {
+            result[8 - i] = Character.forDigit(v & 0x0f, 16);
+            v >>= 4;
+        }
+
+        return new String(result);
+    }
+
+    /**
+     * Formats an <code>int</code> as a 2-byte signed hex value.
+     *
+     * @param v value to format
+     * @return non-null; formatted form
+     */
+    public static String s2(int v) {
+        char[] result = new char[5];
+
+        if (v < 0) {
+            result[0] = '-';
+            v = -v;
+        } else {
+            result[0] = '+';
+        }
+
+        for (int i = 0; i < 4; i++) {
+            result[4 - i] = Character.forDigit(v & 0x0f, 16);
+            v >>= 4;
+        }
+
+        return new String(result);
+    }
+
+    /**
+     * Formats an <code>int</code> as a 1-byte signed hex value.
+     *
+     * @param v value to format
+     * @return non-null; formatted form
+     */
+    public static String s1(int v) {
+        char[] result = new char[3];
+
+        if (v < 0) {
+            result[0] = '-';
+            v = -v;
+        } else {
+            result[0] = '+';
+        }
+
+        for (int i = 0; i < 2; i++) {
+            result[2 - i] = Character.forDigit(v & 0x0f, 16);
+            v >>= 4;
+        }
+
+        return new String(result);
+    }
+
+    /**
+     * Formats a hex dump of a portion of a <code>byte[]</code>. The result
+     * is always newline-terminated, unless the passed-in length was zero,
+     * in which case the result is always the empty string (<code>""</code>).
+     *
+     * @param arr non-null; array to format
+     * @param offset &gt;= 0; offset to the part to dump
+     * @param length &gt;= 0; number of bytes to dump
+     * @param outOffset &gt;= 0; first output offset to print
+     * @param bpl &gt;= 0; number of bytes of output per line
+     * @param addressLength {2,4,6,8}; number of characters for each address
+     * header
+     * @return non-null; a string of the dump
+     */
+    public static String dump(byte[] arr, int offset, int length,
+                              int outOffset, int bpl, int addressLength) {
+        int end = offset + length;
+
+        // twos-complement math trick: ((x < 0) || (y < 0)) <=> ((x|y) < 0)
+        if (((offset | length | end) < 0) || (end > arr.length)) {
+            throw new IndexOutOfBoundsException("arr.length " +
+                                                arr.length + "; " +
+                                                offset + "..!" + end);
+        }
+
+        if (outOffset < 0) {
+            throw new IllegalArgumentException("outOffset < 0");
+        }
+
+        if (length == 0) {
+            return "";
+        }
+
+        StringBuffer sb = new StringBuffer(length * 4 + 6);
+        boolean bol = true;
+        int col = 0;
+
+        while (length > 0) {
+            if (col == 0) {
+                String astr;
+                switch (addressLength) {
+                    case 2:  astr = Hex.u1(outOffset); break;
+                    case 4:  astr = Hex.u2(outOffset); break;
+                    case 6:  astr = Hex.u3(outOffset); break;
+                    default: astr = Hex.u4(outOffset); break;
+                }
+                sb.append(astr);
+                sb.append(": ");
+            } else if ((col & 1) == 0) {
+                sb.append(' ');
+            }
+            sb.append(Hex.u1(arr[offset]));
+            outOffset++;
+            offset++;
+            col++;
+            if (col == bpl) {
+                sb.append('\n');
+                col = 0;
+            }
+            length--;
+        }
+
+        if (col != 0) {
+            sb.append('\n');
+        }
+
+        return sb.toString();
+    }
+}
\ No newline at end of file
diff --git a/dexlib2/src/main/java/org/jf/util/ImmutableConverter.java b/dexlib2/src/main/java/org/jf/util/ImmutableConverter.java
new file mode 100644
index 0000000..d8d8800
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/util/ImmutableConverter.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSortedSet;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.SortedSet;
+
+public abstract class ImmutableConverter<ImmutableItem, Item> {
+    protected abstract boolean isImmutable(@Nonnull Item item);
+    @Nonnull protected abstract ImmutableItem makeImmutable(@Nonnull Item item);
+
+    @Nonnull
+    public ImmutableList<ImmutableItem> toList(@Nullable final Iterable<? extends Item> iterable) {
+        if (iterable == null) {
+            return ImmutableList.of();
+        }
+
+        boolean needsCopy = false;
+        if (iterable instanceof ImmutableList) {
+            for (Item element: iterable) {
+                if (!isImmutable(element)) {
+                    needsCopy = true;
+                    break;
+                }
+            }
+        } else {
+            needsCopy = true;
+        }
+
+        if (!needsCopy) {
+            return (ImmutableList<ImmutableItem>)iterable;
+        }
+
+        final Iterator<? extends Item> iter = iterable.iterator();
+
+        return ImmutableList.copyOf(new Iterator<ImmutableItem>() {
+            @Override public boolean hasNext() { return iter.hasNext(); }
+            @Override public ImmutableItem next() { return makeImmutable(iter.next()); }
+            @Override public void remove() { iter.remove(); }
+        });
+    }
+
+    @Nonnull
+    public ImmutableSet<ImmutableItem> toSet(@Nullable final Iterable<? extends Item> iterable) {
+        if (iterable == null) {
+            return ImmutableSet.of();
+        }
+
+        boolean needsCopy = false;
+        if (iterable instanceof ImmutableSet) {
+            for (Item element: iterable) {
+                if (!isImmutable(element)) {
+                    needsCopy = true;
+                    break;
+                }
+            }
+        } else {
+            needsCopy = true;
+        }
+
+        if (!needsCopy) {
+            return (ImmutableSet<ImmutableItem>)iterable;
+        }
+
+        final Iterator<? extends Item> iter = iterable.iterator();
+
+        return ImmutableSet.copyOf(new Iterator<ImmutableItem>() {
+            @Override public boolean hasNext() { return iter.hasNext(); }
+            @Override public ImmutableItem next() { return makeImmutable(iter.next()); }
+            @Override public void remove() { iter.remove(); }
+        });
+    }
+
+    @Nonnull
+    public ImmutableSortedSet<ImmutableItem> toSortedSet(@Nonnull Comparator<? super ImmutableItem> comparator,
+                                                         @Nullable final Iterable<? extends Item> iterable) {
+        if (iterable == null) {
+            return ImmutableSortedSet.of();
+        }
+
+        boolean needsCopy = false;
+        if (iterable instanceof ImmutableSortedSet &&
+                ((ImmutableSortedSet)iterable).comparator().equals(comparator)) {
+            for (Item element: iterable) {
+                if (!isImmutable(element)) {
+                    needsCopy = true;
+                    break;
+                }
+            }
+        } else {
+            needsCopy = true;
+        }
+
+        if (!needsCopy) {
+            return (ImmutableSortedSet<ImmutableItem>)iterable;
+        }
+
+        final Iterator<? extends Item> iter = iterable.iterator();
+
+
+        return ImmutableSortedSet.copyOf(comparator, new Iterator<ImmutableItem>() {
+            @Override public boolean hasNext() { return iter.hasNext(); }
+            @Override public ImmutableItem next() { return makeImmutable(iter.next()); }
+            @Override public void remove() { iter.remove(); }
+        });
+    }
+
+    @Nonnull
+    public SortedSet<ImmutableItem> toSortedSet(@Nonnull Comparator<? super ImmutableItem> comparator,
+                                                @Nullable final SortedSet<? extends Item> sortedSet) {
+        if (sortedSet == null || sortedSet.size() == 0) {
+            return ImmutableSortedSet.of();
+        }
+
+        @SuppressWarnings("unchecked")
+        ImmutableItem[] newItems = (ImmutableItem[])new Object[sortedSet.size()];
+        int index = 0;
+        for (Item item: sortedSet) {
+            newItems[index++] = makeImmutable(item);
+        }
+
+        return ArraySortedSet.of(comparator, newItems);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/util/ImmutableUtils.java b/dexlib2/src/main/java/org/jf/util/ImmutableUtils.java
new file mode 100644
index 0000000..8f4371f
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/util/ImmutableUtils.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSortedSet;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class ImmutableUtils {
+    @Nonnull public static <T> ImmutableList<T> nullToEmptyList(@Nullable ImmutableList<T> list) {
+        if (list == null) {
+            return ImmutableList.of();
+        }
+        return list;
+    }
+
+    @Nonnull public static <T> ImmutableSet<T> nullToEmptySet(@Nullable ImmutableSet<T> set) {
+        if (set == null) {
+            return ImmutableSet.of();
+        }
+        return set;
+    }
+
+    @Nonnull public static <T> ImmutableSortedSet<T> nullToEmptySortedSet(@Nullable ImmutableSortedSet<T> set) {
+        if (set == null) {
+            return ImmutableSortedSet.of();
+        }
+        return set;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/util/IndentingWriter.java b/dexlib2/src/main/java/org/jf/util/IndentingWriter.java
new file mode 100644
index 0000000..8e4ca62
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/util/IndentingWriter.java
@@ -0,0 +1,244 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+import java.io.IOException;
+import java.io.Writer;
+
+public class IndentingWriter extends Writer {
+    protected final Writer writer;
+    protected final char[] buffer = new char[24];
+    protected int indentLevel = 0;
+    private boolean beginningOfLine = true;
+    private static final String newLine = System.getProperty("line.separator");
+
+    public IndentingWriter(Writer writer) {
+        this.writer = writer;
+    }
+
+    protected void writeIndent() throws IOException {
+        for (int i=0; i<indentLevel; i++) {
+            writer.write(' ');
+        }
+    }
+
+    @Override
+    public void write(int chr) throws IOException {
+        if (chr == '\n') {
+            writer.write(newLine);
+            beginningOfLine = true;
+        } else {
+            if (beginningOfLine) {
+                writeIndent();
+            }
+            beginningOfLine = false;
+            writer.write(chr);
+        }
+    }
+
+    /**
+     * Writes out a block of text that contains no newlines
+     */
+    private void writeLine(char[] chars, int start, int len) throws IOException {
+        if (beginningOfLine && len > 0) {
+            writeIndent();
+            beginningOfLine = false;
+        }
+        writer.write(chars, start, len);
+    }
+
+
+    /**
+     * Writes out a block of text that contains no newlines
+     */
+    private void writeLine(String str, int start, int len) throws IOException {
+        if (beginningOfLine && len > 0) {
+            writeIndent();
+            beginningOfLine = false;
+        }
+        writer.write(str, start, len);
+    }
+
+    @Override
+    public void write(char[] chars) throws IOException {
+        write(chars, 0, chars.length);
+    }
+
+    @Override
+    public void write(char[] chars, int start, int len) throws IOException {
+        final int end = start+len;
+        int pos = start;
+        while (pos < end) {
+            if (chars[pos] == '\n') {
+                writeLine(chars, start, pos-start);
+
+                writer.write(newLine);
+                beginningOfLine = true;
+                pos++;
+                start = pos;
+            } else {
+                pos++;
+            }
+        }
+        writeLine(chars, start, pos-start);
+    }
+
+    @Override
+    public void write(String s) throws IOException {
+        write(s, 0, s.length());
+    }
+
+    @Override
+    public void write(String str, int start, int len) throws IOException {
+        final int end = start+len;
+        int pos = start;
+        while (pos < end) {
+            pos = str.indexOf('\n', start);
+            if (pos == -1 || pos >= end) {
+                writeLine(str, start, end-start);
+                return;
+            } else {
+                writeLine(str, start, pos-start);
+                writer.write(newLine);
+                beginningOfLine = true;
+                start = pos+1;
+            }
+        }
+    }
+
+    @Override
+    public Writer append(CharSequence charSequence) throws IOException {
+        write(charSequence.toString());
+        return this;
+    }
+
+    @Override
+    public Writer append(CharSequence charSequence, int start, int len) throws IOException {
+        write(charSequence.subSequence(start, len).toString());
+        return this;
+    }
+
+    @Override
+    public Writer append(char c) throws IOException {
+        write(c);
+        return this;
+    }
+
+    @Override
+    public void flush() throws IOException {
+        writer.flush();
+    }
+
+    @Override
+    public void close() throws IOException {
+        writer.close();
+    }
+
+    public void indent(int indentAmount) {
+        this.indentLevel += indentAmount;
+        if (indentLevel < 0) {
+            indentLevel = 0;
+        }
+    }
+
+    public void deindent(int indentAmount) {
+        this.indentLevel -= indentAmount;
+        if (indentLevel < 0) {
+            indentLevel = 0;
+        }
+    }
+
+    public void printUnsignedLongAsHex(long value) throws IOException {
+        int bufferIndex = 23;
+        do {
+            int digit = (int)(value & 15);
+            if (digit < 10) {
+                buffer[bufferIndex--] = (char)(digit + '0');
+            } else {
+                buffer[bufferIndex--] = (char)((digit - 10) + 'a');
+            }
+
+            value >>>= 4;
+        } while (value != 0);
+
+        bufferIndex++;
+
+        writeLine(buffer, bufferIndex, 24-bufferIndex);
+    }
+
+    public void printSignedLongAsDec(long value) throws IOException {
+        int bufferIndex = 23;
+
+        if (value < 0) {
+            value *= -1;
+            write('-');
+        }
+
+        do {
+            long digit = value % 10;
+            buffer[bufferIndex--] = (char)(digit + '0');
+
+            value = value / 10;
+        } while (value != 0);
+
+        bufferIndex++;
+
+        writeLine(buffer, bufferIndex, 24-bufferIndex);
+    }
+
+    public void printSignedIntAsDec(int value) throws IOException {
+        int bufferIndex = 15;
+
+        if (value < 0) {
+            value *= -1;
+            write('-');
+        }
+
+        do {
+            int digit = value % 10;
+            buffer[bufferIndex--] = (char)(digit + '0');
+
+            value = value / 10;
+        } while (value != 0);
+
+        bufferIndex++;
+
+        writeLine(buffer, bufferIndex, 16-bufferIndex);
+    }
+
+    public void printUnsignedIntAsDec(int value) throws IOException {
+        int bufferIndex = 15;
+
+        if (value < 0) {
+            printSignedLongAsDec(value & 0xFFFFFFFFL);
+        } else {
+            printSignedIntAsDec(value);
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/util/NibbleUtils.java b/dexlib2/src/main/java/org/jf/util/NibbleUtils.java
new file mode 100644
index 0000000..f06c117
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/util/NibbleUtils.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+public abstract class NibbleUtils {
+    /**
+     * Extracts the high signed 4-bit nibble from the least significant
+     * byte of the given value
+     * @param value the value to extract the nibble from
+     * @return the extracted signed nibble value
+     */
+    public static int extractHighSignedNibble(int value) {
+        return (value << 24) >> 28;
+    }
+
+    /**
+     * Extracts the low signed 4-bit nibble from the least significant
+     * byte of the given value
+     * @param value the value to extract the nibble from
+     * @return the extracted signed nibble value
+     */
+    public static int extractLowSignedNibble(int value) {
+        return (value << 28) >> 28;
+    }
+
+    /**
+     * Extracts the high unsigned 4-bit nibble from the least significant
+     * byte of the given value
+     * @param value the value to extract the nibble from
+     * @return the extracted unsigned nibble value
+     */
+    public static int extractHighUnsignedNibble(int value) {
+        return (value & 0xF0) >>> 4;
+    }
+
+    /**
+     * Extracts the low unsigned 4-bit nibble from the least significant
+     * byte of the given value
+     * @param value the value to extract the nibble from
+     * @return the extracted unsigned nibble value
+     */
+    public static int extractLowUnsignedNibble(int value) {
+        return value & 0x0F;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/util/NumberUtils.java b/dexlib2/src/main/java/org/jf/util/NumberUtils.java
new file mode 100644
index 0000000..401de92
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/util/NumberUtils.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+import java.text.DecimalFormat;
+
+public class NumberUtils {
+    private static final int canonicalFloatNaN = Float.floatToRawIntBits(Float.NaN);
+    private static final int maxFloat = Float.floatToRawIntBits(Float.MAX_VALUE);
+    private static final int piFloat = Float.floatToRawIntBits((float)Math.PI);
+    private static final int eFloat = Float.floatToRawIntBits((float)Math.E);
+
+    private static final long canonicalDoubleNaN = Double.doubleToRawLongBits(Double.NaN);
+    private static final long maxDouble = Double.doubleToLongBits(Double.MAX_VALUE);
+    private static final long piDouble = Double.doubleToLongBits(Math.PI);
+    private static final long eDouble = Double.doubleToLongBits(Math.E);
+
+    private static final DecimalFormat format = new DecimalFormat("0.####################E0");
+
+    public static boolean isLikelyFloat(int value) {
+        // Check for some common named float values
+        // We don't check for Float.MIN_VALUE, which has an integer representation of 1
+        if (value == canonicalFloatNaN ||
+                value == maxFloat ||
+                value == piFloat ||
+                value == eFloat) {
+            return true;
+        }
+
+        // Check for some named integer values
+        if (value == Integer.MAX_VALUE || value == Integer.MIN_VALUE) {
+            return false;
+        }
+
+
+        // Check for likely resource id
+        int packageId = value >> 24;
+        int resourceType = value >> 16 & 0xff;
+        int resourceId = value & 0xffff;
+        if ((packageId == 0x7f || packageId == 1) && resourceType < 0x1f && resourceId < 0xfff) {
+            return false;
+        }
+
+        // a non-canocical NaN is more likely to be an integer
+        float floatValue = Float.intBitsToFloat(value);
+        if (Float.isNaN(floatValue)) {
+            return false;
+        }
+
+        // Otherwise, whichever has a shorter scientific notation representation is more likely.
+        // Integer wins the tie
+        String asInt = format.format(value);
+        String asFloat = format.format(floatValue);
+
+        // try to strip off any small imprecision near the end of the mantissa
+        int decimalPoint = asFloat.indexOf('.');
+        int exponent = asFloat.indexOf("E");
+        int zeros = asFloat.indexOf("000");
+        if (zeros > decimalPoint && zeros < exponent) {
+            asFloat = asFloat.substring(0, zeros) + asFloat.substring(exponent);
+        } else {
+            int nines = asFloat.indexOf("999");
+            if (nines > decimalPoint && nines < exponent) {
+                asFloat = asFloat.substring(0, nines) + asFloat.substring(exponent);
+            }
+        }
+
+        return asFloat.length() < asInt.length();
+    }
+
+    public static boolean isLikelyDouble(long value) {
+        // Check for some common named double values
+        // We don't check for Double.MIN_VALUE, which has a long representation of 1
+        if (value == canonicalDoubleNaN ||
+                value == maxDouble ||
+                value == piDouble ||
+                value == eDouble) {
+            return true;
+        }
+
+        // Check for some named long values
+        if (value == Long.MAX_VALUE || value == Long.MIN_VALUE) {
+            return false;
+        }
+
+        // a non-canocical NaN is more likely to be an long
+        double doubleValue = Double.longBitsToDouble(value);
+        if (Double.isNaN(doubleValue)) {
+            return false;
+        }
+
+        // Otherwise, whichever has a shorter scientific notation representation is more likely.
+        // Long wins the tie
+        String asLong = format.format(value);
+        String asDouble = format.format(doubleValue);
+
+        // try to strip off any small imprecision near the end of the mantissa
+        int decimalPoint = asDouble.indexOf('.');
+        int exponent = asDouble.indexOf("E");
+        int zeros = asDouble.indexOf("000");
+        if (zeros > decimalPoint && zeros < exponent) {
+            asDouble = asDouble.substring(0, zeros) + asDouble.substring(exponent);
+        } else {
+            int nines = asDouble.indexOf("999");
+            if (nines > decimalPoint && nines < exponent) {
+                asDouble = asDouble.substring(0, nines) + asDouble.substring(exponent);
+            }
+        }
+
+        return asDouble.length() < asLong.length();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/util/RandomAccessFileInputStream.java b/dexlib2/src/main/java/org/jf/util/RandomAccessFileInputStream.java
new file mode 100644
index 0000000..e10f7c2
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/util/RandomAccessFileInputStream.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.RandomAccessFile;
+
+public class RandomAccessFileInputStream extends InputStream {
+    private int filePosition;
+    @Nonnull private final RandomAccessFile raf;
+
+    public RandomAccessFileInputStream(@Nonnull RandomAccessFile raf, int filePosition) {
+        this.filePosition = filePosition;
+        this.raf = raf;
+    }
+
+    @Override public int read() throws IOException {
+        raf.seek(filePosition);
+        filePosition++;
+        return raf.read();
+    }
+
+    @Override public int read(byte[] bytes) throws IOException {
+        raf.seek(filePosition);
+        int bytesRead = raf.read(bytes);
+        filePosition += bytesRead;
+        return bytesRead;
+    }
+
+    @Override public int read(byte[] bytes, int offset, int length) throws IOException {
+        raf.seek(filePosition);
+        int bytesRead = raf.read(bytes, offset, length);
+        filePosition += bytesRead;
+        return bytesRead;
+    }
+
+    @Override public long skip(long l) throws IOException {
+        int skipBytes = Math.min((int)l, available());
+        filePosition += skipBytes;
+        return skipBytes;
+    }
+
+    @Override public int available() throws IOException {
+        return (int)raf.length() - filePosition;
+    }
+
+    @Override public boolean markSupported() {
+        return false;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/util/RandomAccessFileOutputStream.java b/dexlib2/src/main/java/org/jf/util/RandomAccessFileOutputStream.java
new file mode 100644
index 0000000..b804d26
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/util/RandomAccessFileOutputStream.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.RandomAccessFile;
+
+public class RandomAccessFileOutputStream extends OutputStream {
+    private int filePosition;
+    @Nonnull private final RandomAccessFile raf;
+
+    public RandomAccessFileOutputStream(@Nonnull RandomAccessFile raf, int startFilePosition) {
+        this.filePosition = startFilePosition;
+        this.raf = raf;
+    }
+
+    @Override public void write(int b) throws IOException {
+        raf.seek(filePosition);
+        filePosition++;
+        raf.write(b);
+    }
+
+    @Override public void write(byte[] b) throws IOException {
+        raf.seek(filePosition);
+        filePosition += b.length;
+        raf.write(b);
+    }
+
+    @Override public void write(byte[] b, int off, int len) throws IOException {
+        raf.seek(filePosition);
+        filePosition += len;
+        raf.write(b, off, len);
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/util/SparseArray.java b/dexlib2/src/main/java/org/jf/util/SparseArray.java
new file mode 100644
index 0000000..474e21c
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/util/SparseArray.java
@@ -0,0 +1,373 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * SparseArrays map integers to Objects.  Unlike a normal array of Objects,
+ * there can be gaps in the indices.  It is intended to be more efficient
+ * than using a HashMap to map Integers to Objects.
+ */
+public class SparseArray<E> {
+    private static final Object DELETED = new Object();
+    private boolean mGarbage = false;
+
+    /**
+     * Creates a new SparseArray containing no mappings.
+     */
+    public SparseArray() {
+        this(10);
+    }
+
+    /**
+     * Creates a new SparseArray containing no mappings that will not
+     * require any additional memory allocation to store the specified
+     * number of mappings.
+     */
+    public SparseArray(int initialCapacity) {
+        mKeys = new int[initialCapacity];
+        mValues = new Object[initialCapacity];
+        mSize = 0;
+    }
+
+    /**
+     * Gets the Object mapped from the specified key, or <code>null</code>
+     * if no such mapping has been made.
+     */
+    public E get(int key) {
+        return get(key, null);
+    }
+
+    /**
+     * Gets the Object mapped from the specified key, or the specified Object
+     * if no such mapping has been made.
+     */
+    public E get(int key, E valueIfKeyNotFound) {
+        int i = binarySearch(mKeys, 0, mSize, key);
+
+        if (i < 0 || mValues[i] == DELETED) {
+            return valueIfKeyNotFound;
+        } else {
+            return (E) mValues[i];
+        }
+    }
+
+    /**
+     * Removes the mapping from the specified key, if there was any.
+     */
+    public void delete(int key) {
+        int i = binarySearch(mKeys, 0, mSize, key);
+
+        if (i >= 0) {
+            if (mValues[i] != DELETED) {
+                mValues[i] = DELETED;
+                mGarbage = true;
+            }
+        }
+    }
+
+    /**
+     * Alias for {@link #delete(int)}.
+     */
+    public void remove(int key) {
+        delete(key);
+    }
+
+    private void gc() {
+        // Log.e("SparseArray", "gc start with " + mSize);
+
+        int n = mSize;
+        int o = 0;
+        int[] keys = mKeys;
+        Object[] values = mValues;
+
+        for (int i = 0; i < n; i++) {
+            Object val = values[i];
+
+            if (val != DELETED) {
+                if (i != o) {
+                    keys[o] = keys[i];
+                    values[o] = val;
+                }
+
+                o++;
+            }
+        }
+
+        mGarbage = false;
+        mSize = o;
+
+        // Log.e("SparseArray", "gc end with " + mSize);
+    }
+
+    /**
+     * Adds a mapping from the specified key to the specified value,
+     * replacing the previous mapping from the specified key if there
+     * was one.
+     */
+    public void put(int key, E value) {
+        int i = binarySearch(mKeys, 0, mSize, key);
+
+        if (i >= 0) {
+            mValues[i] = value;
+        } else {
+            i = ~i;
+
+            if (i < mSize && mValues[i] == DELETED) {
+                mKeys[i] = key;
+                mValues[i] = value;
+                return;
+            }
+
+            if (mGarbage && mSize >= mKeys.length) {
+                gc();
+
+                // Search again because indices may have changed.
+                i = ~binarySearch(mKeys, 0, mSize, key);
+            }
+
+            if (mSize >= mKeys.length) {
+                int n = Math.max(mSize + 1, mKeys.length * 2);
+
+                int[] nkeys = new int[n];
+                Object[] nvalues = new Object[n];
+
+                // Log.e("SparseArray", "grow " + mKeys.length + " to " + n);
+                System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length);
+                System.arraycopy(mValues, 0, nvalues, 0, mValues.length);
+
+                mKeys = nkeys;
+                mValues = nvalues;
+            }
+
+            if (mSize - i != 0) {
+                // Log.e("SparseArray", "move " + (mSize - i));
+                System.arraycopy(mKeys, i, mKeys, i + 1, mSize - i);
+                System.arraycopy(mValues, i, mValues, i + 1, mSize - i);
+            }
+
+            mKeys[i] = key;
+            mValues[i] = value;
+            mSize++;
+        }
+    }
+
+    /**
+     * Returns the number of key-value mappings that this SparseArray
+     * currently stores.
+     */
+    public int size() {
+        if (mGarbage) {
+            gc();
+        }
+
+        return mSize;
+    }
+
+    /**
+     * Given an index in the range <code>0...size()-1</code>, returns
+     * the key from the <code>index</code>th key-value mapping that this
+     * SparseArray stores.
+     */
+    public int keyAt(int index) {
+        if (mGarbage) {
+            gc();
+        }
+
+        return mKeys[index];
+    }
+
+    /**
+     * Given an index in the range <code>0...size()-1</code>, returns
+     * the value from the <code>index</code>th key-value mapping that this
+     * SparseArray stores.
+     */
+    public E valueAt(int index) {
+        if (mGarbage) {
+            gc();
+        }
+
+        return (E) mValues[index];
+    }
+
+    /**
+     * Given an index in the range <code>0...size()-1</code>, sets a new
+     * value for the <code>index</code>th key-value mapping that this
+     * SparseArray stores.
+     */
+    public void setValueAt(int index, E value) {
+        if (mGarbage) {
+            gc();
+        }
+
+        mValues[index] = value;
+    }
+
+    /**
+     * Returns the index for which {@link #keyAt} would return the
+     * specified key, or a negative number if the specified
+     * key is not mapped.
+     */
+    public int indexOfKey(int key) {
+        if (mGarbage) {
+            gc();
+        }
+
+        return binarySearch(mKeys, 0, mSize, key);
+    }
+
+    /**
+     * Returns an index for which {@link #valueAt} would return the
+     * specified key, or a negative number if no keys map to the
+     * specified value.
+     * Beware that this is a linear search, unlike lookups by key,
+     * and that multiple keys can map to the same value and this will
+     * find only one of them.
+     */
+    public int indexOfValue(E value) {
+        if (mGarbage) {
+            gc();
+        }
+
+        for (int i = 0; i < mSize; i++)
+            if (mValues[i] == value)
+                return i;
+
+        return -1;
+    }
+
+    /**
+     * Removes all key-value mappings from this SparseArray.
+     */
+    public void clear() {
+        int n = mSize;
+        Object[] values = mValues;
+
+        for (int i = 0; i < n; i++) {
+            values[i] = null;
+        }
+
+        mSize = 0;
+        mGarbage = false;
+    }
+
+    /**
+     * Puts a key/value pair into the array, optimizing for the case where
+     * the key is greater than all existing keys in the array.
+     */
+    public void append(int key, E value) {
+        if (mSize != 0 && key <= mKeys[mSize - 1]) {
+            put(key, value);
+            return;
+        }
+
+        if (mGarbage && mSize >= mKeys.length) {
+            gc();
+        }
+
+        int pos = mSize;
+        if (pos >= mKeys.length) {
+            int n = Math.max(pos + 1, mKeys.length * 2);
+
+            int[] nkeys = new int[n];
+            Object[] nvalues = new Object[n];
+
+            // Log.e("SparseArray", "grow " + mKeys.length + " to " + n);
+            System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length);
+            System.arraycopy(mValues, 0, nvalues, 0, mValues.length);
+
+            mKeys = nkeys;
+            mValues = nvalues;
+        }
+
+        mKeys[pos] = key;
+        mValues[pos] = value;
+        mSize = pos + 1;
+    }
+
+    /**
+     * Increases the size of the underlying storage if needed, to ensure that it can
+     * hold the specified number of items without having to allocate additional memory
+     * @param capacity the number of items
+     */
+    public void ensureCapacity(int capacity) {
+        if (mGarbage && mSize >= mKeys.length) {
+            gc();
+        }
+
+        if (mKeys.length < capacity) {
+            int[] nkeys = new int[capacity];
+            Object[] nvalues = new Object[capacity];
+
+            System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length);
+            System.arraycopy(mValues, 0, nvalues, 0, mValues.length);
+
+            mKeys = nkeys;
+            mValues = nvalues;
+        }
+    }
+
+    private static int binarySearch(int[] a, int start, int len, int key) {
+        int high = start + len, low = start - 1, guess;
+
+        while (high - low > 1) {
+            guess = (high + low) / 2;
+
+            if (a[guess] < key)
+                low = guess;
+            else
+                high = guess;
+        }
+
+        if (high == start + len)
+            return ~(start + len);
+        else if (a[high] == key)
+            return high;
+        else
+            return ~high;
+    }
+
+    /**
+     * @return a read-only list of the values in this SparseArray which are in ascending order, based on their
+     * associated key
+     */
+    public List<E> getValues() {
+        return Collections.unmodifiableList(Arrays.asList((E[])mValues));
+    }
+
+    private int[] mKeys;
+    private Object[] mValues;
+    private int mSize;
+}
diff --git a/dexlib2/src/main/java/org/jf/util/SparseIntArray.java b/dexlib2/src/main/java/org/jf/util/SparseIntArray.java
new file mode 100644
index 0000000..2b8b5e0
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/util/SparseIntArray.java
@@ -0,0 +1,268 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+/**
+ * SparseIntArrays map integers to integers.  Unlike a normal array of integers,
+ * there can be gaps in the indices.  It is intended to be more efficient
+ * than using a HashMap to map Integers to Integers.
+ */
+public class SparseIntArray {
+    /**
+     * Creates a new SparseIntArray containing no mappings.
+     */
+    public SparseIntArray() {
+        this(10);
+    }
+
+    /**
+     * Creates a new SparseIntArray containing no mappings that will not
+     * require any additional memory allocation to store the specified
+     * number of mappings.
+     */
+    public SparseIntArray(int initialCapacity) {
+        mKeys = new int[initialCapacity];
+        mValues = new int[initialCapacity];
+        mSize = 0;
+    }
+
+    /**
+     * Gets the int mapped from the specified key, or <code>0</code>
+     * if no such mapping has been made.
+     */
+    public int get(int key) {
+        return get(key, 0);
+    }
+
+    /**
+     * Gets the int mapped from the specified key, or the specified value
+     * if no such mapping has been made.
+     */
+    public int get(int key, int valueIfKeyNotFound) {
+        int i = binarySearch(mKeys, 0, mSize, key);
+
+        if (i < 0) {
+            return valueIfKeyNotFound;
+        } else {
+            return mValues[i];
+        }
+    }
+
+    /**
+     * Gets the int mapped from the specified key, or if not present, the
+     * closest key that is less than the specified key.
+     */
+    public int getClosestSmaller(int key) {
+        int i = binarySearch(mKeys, 0, mSize, key);
+
+        if (i < 0) {
+            i = ~i;
+            if (i > 0) {
+                i--;
+            }
+            return mValues[i];
+        } else {
+            return mValues[i];
+        }
+    }
+
+    /**
+     * Removes the mapping from the specified key, if there was any.
+     */
+    public void delete(int key) {
+        int i = binarySearch(mKeys, 0, mSize, key);
+
+        if (i >= 0) {
+            removeAt(i);
+        }
+    }
+
+    /**
+     * Removes the mapping at the given index.
+     */
+    public void removeAt(int index) {
+        System.arraycopy(mKeys, index + 1, mKeys, index, mSize - (index + 1));
+        System.arraycopy(mValues, index + 1, mValues, index, mSize - (index + 1));
+        mSize--;
+    }
+
+    /**
+     * Adds a mapping from the specified key to the specified value,
+     * replacing the previous mapping from the specified key if there
+     * was one.
+     */
+    public void put(int key, int value) {
+        int i = binarySearch(mKeys, 0, mSize, key);
+
+        if (i >= 0) {
+            mValues[i] = value;
+        } else {
+            i = ~i;
+
+            if (mSize >= mKeys.length) {
+                int n = Math.max(mSize + 1, mKeys.length * 2);
+
+                int[] nkeys = new int[n];
+                int[] nvalues = new int[n];
+
+                // Log.e("SparseIntArray", "grow " + mKeys.length + " to " + n);
+                System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length);
+                System.arraycopy(mValues, 0, nvalues, 0, mValues.length);
+
+                mKeys = nkeys;
+                mValues = nvalues;
+            }
+
+            if (mSize - i != 0) {
+                // Log.e("SparseIntArray", "move " + (mSize - i));
+                System.arraycopy(mKeys, i, mKeys, i + 1, mSize - i);
+                System.arraycopy(mValues, i, mValues, i + 1, mSize - i);
+            }
+
+            mKeys[i] = key;
+            mValues[i] = value;
+            mSize++;
+        }
+    }
+
+    /**
+     * Returns the number of key-value mappings that this SparseIntArray
+     * currently stores.
+     */
+    public int size() {
+        return mSize;
+    }
+
+    /**
+     * Given an index in the range <code>0...size()-1</code>, returns
+     * the key from the <code>index</code>th key-value mapping that this
+     * SparseIntArray stores.
+     */
+    public int keyAt(int index) {
+        return mKeys[index];
+    }
+
+    /**
+     * Given an index in the range <code>0...size()-1</code>, returns
+     * the value from the <code>index</code>th key-value mapping that this
+     * SparseIntArray stores.
+     */
+    public int valueAt(int index) {
+        return mValues[index];
+    }
+
+    /**
+     * Returns the index for which {@link #keyAt} would return the
+     * specified key, or a negative number if the specified
+     * key is not mapped.
+     */
+    public int indexOfKey(int key) {
+        return binarySearch(mKeys, 0, mSize, key);
+    }
+
+    /**
+     * Returns an index for which {@link #valueAt} would return the
+     * specified key, or a negative number if no keys map to the
+     * specified value.
+     * Beware that this is a linear search, unlike lookups by key,
+     * and that multiple keys can map to the same value and this will
+     * find only one of them.
+     */
+    public int indexOfValue(int value) {
+        for (int i = 0; i < mSize; i++)
+            if (mValues[i] == value)
+                return i;
+
+        return -1;
+    }
+
+    /**
+     * Removes all key-value mappings from this SparseIntArray.
+     */
+    public void clear() {
+        mSize = 0;
+    }
+
+    /**
+     * Puts a key/value pair into the array, optimizing for the case where
+     * the key is greater than all existing keys in the array.
+     */
+    public void append(int key, int value) {
+        if (mSize != 0 && key <= mKeys[mSize - 1]) {
+            put(key, value);
+            return;
+        }
+
+        int pos = mSize;
+        if (pos >= mKeys.length) {
+            int n = Math.max(pos + 1, mKeys.length * 2);
+
+            int[] nkeys = new int[n];
+            int[] nvalues = new int[n];
+
+            // Log.e("SparseIntArray", "grow " + mKeys.length + " to " + n);
+            System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length);
+            System.arraycopy(mValues, 0, nvalues, 0, mValues.length);
+
+            mKeys = nkeys;
+            mValues = nvalues;
+        }
+
+        mKeys[pos] = key;
+        mValues[pos] = value;
+        mSize = pos + 1;
+    }
+
+    private static int binarySearch(int[] a, int start, int len, int key) {
+        int high = start + len, low = start - 1, guess;
+
+        while (high - low > 1) {
+            guess = (high + low) / 2;
+
+            if (a[guess] < key)
+                low = guess;
+            else
+                high = guess;
+        }
+
+        if (high == start + len)
+            return ~(start + len);
+        else if (a[high] == key)
+            return high;
+        else
+            return ~high;
+    }
+
+    private int[] mKeys;
+    private int[] mValues;
+    private int mSize;
+}
diff --git a/dexlib2/src/main/java/org/jf/util/StringUtils.java b/dexlib2/src/main/java/org/jf/util/StringUtils.java
new file mode 100644
index 0000000..4de6d9d
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/util/StringUtils.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+import java.io.IOException;
+import java.io.Writer;
+
+public class StringUtils {
+    public static void writeEscapedChar(Writer writer, char c) throws IOException {
+        if ((c >= ' ') && (c < 0x7f)) {
+            if ((c == '\'') || (c == '\"') || (c == '\\')) {
+                writer.write('\\');
+            }
+            writer.write(c);
+            return;
+        } else if (c <= 0x7f) {
+            switch (c) {
+                case '\n': writer.write("\\n"); return;
+                case '\r': writer.write("\\r"); return;
+                case '\t': writer.write("\\t"); return;
+            }
+        }
+
+        writer.write("\\u");
+        writer.write(Character.forDigit(c >> 12, 16));
+        writer.write(Character.forDigit((c >> 8) & 0x0f, 16));
+        writer.write(Character.forDigit((c >> 4) & 0x0f, 16));
+        writer.write(Character.forDigit(c & 0x0f, 16));
+    }
+
+    public static void writeEscapedString(Writer writer, String value) throws IOException {
+        for (int i = 0; i < value.length(); i++) {
+            char c = value.charAt(i);
+
+            if ((c >= ' ') && (c < 0x7f)) {
+                if ((c == '\'') || (c == '\"') || (c == '\\')) {
+                    writer.write('\\');
+                }
+                writer.write(c);
+                continue;
+            } else if (c <= 0x7f) {
+                switch (c) {
+                    case '\n': writer.write("\\n"); continue;
+                    case '\r': writer.write("\\r"); continue;
+                    case '\t': writer.write("\\t"); continue;
+                }
+            }
+
+            writer.write("\\u");
+            writer.write(Character.forDigit(c >> 12, 16));
+            writer.write(Character.forDigit((c >> 8) & 0x0f, 16));
+            writer.write(Character.forDigit((c >> 4) & 0x0f, 16));
+            writer.write(Character.forDigit(c & 0x0f, 16));
+        }
+    }
+
+    public static String escapeString(String value) {
+        int len = value.length();
+        StringBuilder sb = new StringBuilder(len * 3 / 2);
+
+        for (int i = 0; i < len; i++) {
+            char c = value.charAt(i);
+
+            if ((c >= ' ') && (c < 0x7f)) {
+                if ((c == '\'') || (c == '\"') || (c == '\\')) {
+                    sb.append('\\');
+                }
+                sb.append(c);
+                continue;
+            } else if (c <= 0x7f) {
+                switch (c) {
+                    case '\n': sb.append("\\n"); continue;
+                    case '\r': sb.append("\\r"); continue;
+                    case '\t': sb.append("\\t"); continue;
+                }
+            }
+
+            sb.append("\\u");
+            sb.append(Character.forDigit(c >> 12, 16));
+            sb.append(Character.forDigit((c >> 8) & 0x0f, 16));
+            sb.append(Character.forDigit((c >> 4) & 0x0f, 16));
+            sb.append(Character.forDigit(c & 0x0f, 16));
+        }
+
+        return sb.toString();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/util/StringWrapper.java b/dexlib2/src/main/java/org/jf/util/StringWrapper.java
new file mode 100644
index 0000000..05226de
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/util/StringWrapper.java
@@ -0,0 +1,195 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.PrintStream;
+import java.text.BreakIterator;
+import java.util.Iterator;
+
+public class StringWrapper {
+    /**
+     * Splits the given string into lines of maximum width maxWidth. The splitting is done using the current locale's
+     * rules for splitting lines.
+     *
+     * @param string The string to split
+     * @param maxWidth The maximum length of any line
+     * @return An iterable of Strings containing the wrapped lines
+     */
+    public static Iterable<String> wrapStringOnBreaks(@Nonnull final String string, final int maxWidth) {
+        // TODO: should we strip any trailing newlines?
+        final BreakIterator breakIterator = BreakIterator.getLineInstance();
+        breakIterator.setText(string);
+
+        return new Iterable<String>() {
+            @Override
+            public Iterator<String> iterator() {
+                return new Iterator<String>() {
+                    private int currentLineStart = 0;
+                    private boolean nextLineSet = false;
+                    private String nextLine;
+
+                    @Override
+                    public boolean hasNext() {
+                        if (!nextLineSet) {
+                            calculateNext();
+                        }
+                        return nextLine != null;
+                    }
+
+                    private void calculateNext() {
+                        int lineEnd = currentLineStart;
+                        while (true) {
+                            lineEnd = breakIterator.following(lineEnd);
+                            if (lineEnd == BreakIterator.DONE) {
+                                lineEnd = breakIterator.last();
+                                if (lineEnd <= currentLineStart) {
+                                    nextLine = null;
+                                    nextLineSet = true;
+                                    return;
+                                }
+                                break;
+                            }
+
+                            if (lineEnd - currentLineStart > maxWidth) {
+                                lineEnd = breakIterator.preceding(lineEnd);
+                                if (lineEnd <= currentLineStart) {
+                                    lineEnd = currentLineStart + maxWidth;
+                                }
+                                break;
+                            }
+
+                            if (string.charAt(lineEnd-1) == '\n') {
+                                nextLine = string.substring(currentLineStart, lineEnd-1);
+                                nextLineSet = true;
+                                currentLineStart = lineEnd;
+                                return;
+                            }
+                        }
+                        nextLine = string.substring(currentLineStart, lineEnd);
+                        nextLineSet = true;
+                        currentLineStart = lineEnd;
+                    }
+
+                    @Override
+                    public String next() {
+                        String ret = nextLine;
+                        nextLine = null;
+                        nextLineSet = false;
+                        return ret;
+                    }
+
+                    @Override
+                    public void remove() {
+                        throw new UnsupportedOperationException();
+                    }
+                };
+            }
+        };
+    }
+
+    /**
+     * Splits the given string into lines using on any embedded newlines, and wrapping the text as needed to conform to
+     * the given maximum line width.
+     *
+     * This uses and assumes unix-style newlines
+     *
+     * @param str The string to split
+     * @param maxWidth The maximum length of any line
+     * @param output If given, try to use this array as the return value. If there are more values than will fit
+     *               into the array, a new array will be allocated and returned, while the given array will be filled
+     *               with as many lines as would fit.
+     * @return The split lines from the original, as an array of Strings. The returned array may be larger than the
+     *         number of lines. If this is the case, the end of the split lines will be denoted by a null entry in the
+     *         array. If there is no null entry, then the size of the array exactly matches the number of lines.
+     *         The returned lines will not contain an ending newline
+     */
+    public static String[] wrapString(@Nonnull String str, int maxWidth, @Nullable String[] output) {
+        if (output == null) {
+            output = new String[(int)((str.length() / maxWidth) * 1.5d + 1)];
+        }
+
+        int lineStart = 0;
+        int arrayIndex = 0;
+        int i;
+        for (i=0; i<str.length(); i++) {
+            char c = str.charAt(i);
+
+            if (c == '\n') {
+                output = addString(output, str.substring(lineStart, i), arrayIndex++);
+                lineStart = i+1;
+            } else if (i - lineStart == maxWidth) {
+                output = addString(output, str.substring(lineStart, i), arrayIndex++);
+                lineStart = i;
+            }
+        }
+        if (lineStart != i || i == 0) {
+            output = addString(output, str.substring(lineStart), arrayIndex++, output.length+1);
+        }
+
+        if (arrayIndex < output.length) {
+            output[arrayIndex] = null;
+        }
+        return output;
+    }
+
+    private static String[] addString(@Nonnull String[] arr, String str, int index) {
+        if (index >= arr.length) {
+            arr = enlargeArray(arr, (int)(Math.ceil((arr.length + 1) * 1.5)));
+        }
+
+        arr[index] = str;
+        return arr;
+    }
+
+    private static String[] addString(@Nonnull String[] arr, String str, int index, int newLength) {
+        if (index >= arr.length) {
+            arr = enlargeArray(arr, newLength);
+        }
+
+        arr[index] = str;
+        return arr;
+    }
+
+    private static String[] enlargeArray(String[] arr, int newLength) {
+        String[] newArr = new String[newLength];
+        System.arraycopy(arr, 0, newArr, 0, arr.length);
+        return newArr;
+    }
+
+    public static void printWrappedString(@Nonnull PrintStream stream, @Nonnull String string, int maxWidth) {
+        for (String str: wrapStringOnBreaks(string, maxWidth)) {
+            stream.println(str);
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/util/TwoColumnOutput.java b/dexlib2/src/main/java/org/jf/util/TwoColumnOutput.java
new file mode 100644
index 0000000..a04d9a5
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/util/TwoColumnOutput.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+
+/**
+ * Class that takes a combined output destination and provides two
+ * output writers, one of which ends up writing to the left column and
+ * one which goes on the right.
+ */
+public final class TwoColumnOutput {
+    /** non-null; underlying writer for final output */
+    private final Writer out;
+
+    /** &gt; 0; the left column width */
+    private final int leftWidth;
+
+    private final int rightWidth;
+
+    private final String spacer;
+
+    /**
+     * Constructs an instance.
+     *
+     * @param out non-null; writer to send final output to
+     * @param leftWidth &gt; 0; width of the left column, in characters
+     * @param rightWidth &gt; 0; width of the right column, in characters
+     * @param spacer non-null; spacer string to sit between the two columns
+     */
+    public TwoColumnOutput(@Nonnull Writer out, int leftWidth, int rightWidth,
+                           @Nonnull String spacer) {
+
+        if (leftWidth < 1) {
+            throw new IllegalArgumentException("leftWidth < 1");
+        }
+
+        if (rightWidth < 1) {
+            throw new IllegalArgumentException("rightWidth < 1");
+        }
+
+        this.out = out;
+        this.leftWidth = leftWidth;
+        this.rightWidth = rightWidth;
+        this.spacer = spacer;
+    }
+
+    /**
+     * Constructs an instance.
+     *
+     * @param out non-null; stream to send final output to
+     * @param leftWidth &gt;= 1; width of the left column, in characters
+     * @param rightWidth &gt;= 1; width of the right column, in characters
+     * @param spacer non-null; spacer string to sit between the two columns
+     */
+    public TwoColumnOutput(OutputStream out, int leftWidth, int rightWidth,
+                           String spacer) {
+        this(new OutputStreamWriter(out), leftWidth, rightWidth, spacer);
+    }
+
+    private String[] leftLines = null;
+    private String[] rightLines = null;
+    public void write(String left, String right) throws IOException {
+        leftLines = StringWrapper.wrapString(left, leftWidth, leftLines);
+        rightLines = StringWrapper.wrapString(right, rightWidth, rightLines);
+        int leftCount = leftLines.length;
+        int rightCount = rightLines.length;
+
+        for (int i=0; i<leftCount || i <rightCount; i++) {
+            String leftLine = null;
+            String rightLine = null;
+
+            if (i < leftCount) {
+                leftLine = leftLines[i];
+                if (leftLine == null) {
+                    leftCount = i;
+                }
+            }
+
+            if (i < rightCount) {
+                rightLine = rightLines[i];
+                if (rightLine == null) {
+                    rightCount = i;
+                }
+            }
+
+            if (leftLine != null || rightLine != null) {
+                int written = 0;
+                if (leftLine != null) {
+                    out.write(leftLine);
+                    written = leftLine.length();
+                }
+
+                int remaining = leftWidth - written;
+                if (remaining > 0) {
+                    writeSpaces(out, remaining);
+                }
+
+                out.write(spacer);
+
+                if (rightLine != null) {
+                    out.write(rightLine);
+                }
+
+                out.write('\n');
+            }
+        }
+    }
+
+    /**
+     * Writes the given number of spaces to the given writer.
+     *
+     * @param out non-null; where to write
+     * @param amt &gt;= 0; the number of spaces to write
+     */
+    private static void writeSpaces(Writer out, int amt) throws IOException {
+        while (amt > 0) {
+            out.write(' ');
+            amt--;
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/util/Utf8Utils.java b/dexlib2/src/main/java/org/jf/util/Utf8Utils.java
new file mode 100644
index 0000000..957e535
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/util/Utf8Utils.java
@@ -0,0 +1,286 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * As per the Apache license requirements, this file has been modified
+ * from its original state.
+ *
+ * Such modifications are Copyright (C) 2010 Ben Gruver, and are released
+ * under the original license
+ */
+
+package org.jf.util;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * Constants of type <code>CONSTANT_Utf8_info</code>.
+ */
+public final class Utf8Utils {
+    /**
+     * Converts a string into its Java-style UTF-8 form. Java-style UTF-8
+     * differs from normal UTF-8 in the handling of character '\0' and
+     * surrogate pairs.
+     *
+     * @param string non-null; the string to convert
+     * @return non-null; the UTF-8 bytes for it
+     */
+    public static byte[] stringToUtf8Bytes(String string) {
+        int len = string.length();
+        byte[] bytes = new byte[len * 3]; // Avoid having to reallocate.
+        int outAt = 0;
+
+        for (int i = 0; i < len; i++) {
+            char c = string.charAt(i);
+            if ((c != 0) && (c < 0x80)) {
+                bytes[outAt] = (byte) c;
+                outAt++;
+            } else if (c < 0x800) {
+                bytes[outAt] = (byte) (((c >> 6) & 0x1f) | 0xc0);
+                bytes[outAt + 1] = (byte) ((c & 0x3f) | 0x80);
+                outAt += 2;
+            } else {
+                bytes[outAt] = (byte) (((c >> 12) & 0x0f) | 0xe0);
+                bytes[outAt + 1] = (byte) (((c >> 6) & 0x3f) | 0x80);
+                bytes[outAt + 2] = (byte) ((c & 0x3f) | 0x80);
+                outAt += 3;
+            }
+        }
+
+        byte[] result = new byte[outAt];
+        System.arraycopy(bytes, 0, result, 0, outAt);
+        return result;
+    }
+
+    private static final ThreadLocal<char[]> localBuffer =
+            new ThreadLocal<char[]> () {
+                @Override protected char[] initialValue() {
+                    // A reasonably sized initial value
+                    return new char[256];
+                }
+            };
+
+    /**
+     * Converts an array of UTF-8 bytes into a string.
+     *
+     * @param bytes non-null; the bytes to convert
+     * @param start the start index of the utf8 string to convert
+     * @param length the length of the utf8 string to convert, not including any null-terminator that might be present
+     * @return non-null; the converted string
+     */
+    public static String utf8BytesToString(byte[] bytes, int start, int length) {
+        char[] chars = localBuffer.get();
+        if (chars == null || chars.length < length) {
+            chars = new char[length];
+            localBuffer.set(chars);
+        }
+        int outAt = 0;
+
+        for (int at = start; length > 0; /*at*/) {
+            int v0 = bytes[at] & 0xFF;
+            char out;
+            switch (v0 >> 4) {
+                case 0x00: case 0x01: case 0x02: case 0x03:
+                case 0x04: case 0x05: case 0x06: case 0x07: {
+                    // 0XXXXXXX -- single-byte encoding
+                    length--;
+                    if (v0 == 0) {
+                        // A single zero byte is illegal.
+                        return throwBadUtf8(v0, at);
+                    }
+                    out = (char) v0;
+                    at++;
+                    break;
+                }
+                case 0x0c: case 0x0d: {
+                    // 110XXXXX -- two-byte encoding
+                    length -= 2;
+                    if (length < 0) {
+                        return throwBadUtf8(v0, at);
+                    }
+                    int v1 = bytes[at + 1] & 0xFF;
+                    if ((v1 & 0xc0) != 0x80) {
+                        return throwBadUtf8(v1, at + 1);
+                    }
+                    int value = ((v0 & 0x1f) << 6) | (v1 & 0x3f);
+                    if ((value != 0) && (value < 0x80)) {
+                        /*
+                         * This should have been represented with
+                         * one-byte encoding.
+                         */
+                        return throwBadUtf8(v1, at + 1);
+                    }
+                    out = (char) value;
+                    at += 2;
+                    break;
+                }
+                case 0x0e: {
+                    // 1110XXXX -- three-byte encoding
+                    length -= 3;
+                    if (length < 0) {
+                        return throwBadUtf8(v0, at);
+                    }
+                    int v1 = bytes[at + 1] & 0xFF;
+                    if ((v1 & 0xc0) != 0x80) {
+                        return throwBadUtf8(v1, at + 1);
+                    }
+                    int v2 = bytes[at + 2] & 0xFF;
+                    if ((v2 & 0xc0) != 0x80) {
+                        return throwBadUtf8(v2, at + 2);
+                    }
+                    int value = ((v0 & 0x0f) << 12) | ((v1 & 0x3f) << 6) |
+                            (v2 & 0x3f);
+                    if (value < 0x800) {
+                        /*
+                         * This should have been represented with one- or
+                         * two-byte encoding.
+                         */
+                        return throwBadUtf8(v2, at + 2);
+                    }
+                    out = (char) value;
+                    at += 3;
+                    break;
+                }
+                default: {
+                    // 10XXXXXX, 1111XXXX -- illegal
+                    return throwBadUtf8(v0, at);
+                }
+            }
+            chars[outAt] = out;
+            outAt++;
+        }
+
+        return new String(chars, 0, outAt);
+    }
+
+    /**
+     * Converts an array of UTF-8 bytes into a string.
+     *
+     * @param bytes non-null; the bytes to convert
+     * @param start the start index of the utf8 string to convert
+     * @param utf16Length the number of utf16 characters in the string to decode
+     * @return non-null; the converted string
+     */
+    public static String utf8BytesWithUtf16LengthToString(@Nonnull byte[] bytes, int start, int utf16Length) {
+        return utf8BytesWithUtf16LengthToString(bytes, start, utf16Length, null);
+    }
+
+    /**
+     * Converts an array of UTF-8 bytes into a string.
+     *
+     * @param bytes non-null; the bytes to convert
+     * @param start the start index of the utf8 string to convert
+     * @param utf16Length the number of utf16 characters in the string to decode
+     * @param readLength If non-null, the first element will contain the number of bytes read after the method exits
+     * @return non-null; the converted string
+     */
+    public static String utf8BytesWithUtf16LengthToString(@Nonnull byte[] bytes, int start, int utf16Length,
+                                                          @Nullable int[] readLength) {
+        char[] chars = localBuffer.get();
+        if (chars == null || chars.length < utf16Length) {
+            chars = new char[utf16Length];
+            localBuffer.set(chars);
+        }
+        int outAt = 0;
+
+        int at = 0;
+        for (at = start; utf16Length > 0; utf16Length--) {
+            int v0 = bytes[at] & 0xFF;
+            char out;
+            switch (v0 >> 4) {
+                case 0x00: case 0x01: case 0x02: case 0x03:
+                case 0x04: case 0x05: case 0x06: case 0x07: {
+                    // 0XXXXXXX -- single-byte encoding
+                    if (v0 == 0) {
+                        // A single zero byte is illegal.
+                        return throwBadUtf8(v0, at);
+                    }
+                    out = (char) v0;
+                    at++;
+                    break;
+                }
+                case 0x0c: case 0x0d: {
+                    // 110XXXXX -- two-byte encoding
+                    int v1 = bytes[at + 1] & 0xFF;
+                    if ((v1 & 0xc0) != 0x80) {
+                        return throwBadUtf8(v1, at + 1);
+                    }
+                    int value = ((v0 & 0x1f) << 6) | (v1 & 0x3f);
+                    if ((value != 0) && (value < 0x80)) {
+                        /*
+                         * This should have been represented with
+                         * one-byte encoding.
+                         */
+                        return throwBadUtf8(v1, at + 1);
+                    }
+                    out = (char) value;
+                    at += 2;
+                    break;
+                }
+                case 0x0e: {
+                    // 1110XXXX -- three-byte encoding
+                    int v1 = bytes[at + 1] & 0xFF;
+                    if ((v1 & 0xc0) != 0x80) {
+                        return throwBadUtf8(v1, at + 1);
+                    }
+                    int v2 = bytes[at + 2] & 0xFF;
+                    if ((v2 & 0xc0) != 0x80) {
+                        return throwBadUtf8(v2, at + 2);
+                    }
+                    int value = ((v0 & 0x0f) << 12) | ((v1 & 0x3f) << 6) |
+                        (v2 & 0x3f);
+                    if (value < 0x800) {
+                        /*
+                         * This should have been represented with one- or
+                         * two-byte encoding.
+                         */
+                        return throwBadUtf8(v2, at + 2);
+                    }
+                    out = (char) value;
+                    at += 3;
+                    break;
+                }
+                default: {
+                    // 10XXXXXX, 1111XXXX -- illegal
+                    return throwBadUtf8(v0, at);
+                }
+            }
+            chars[outAt] = out;
+            outAt++;
+        }
+
+        if (readLength != null && readLength.length > 0) {
+            readLength[0] = at - start;
+            readLength[0] = at - start;
+        }
+        return new String(chars, 0, outAt);
+    }
+
+    /**
+     * Helper for {@link #utf8BytesToString}, which throws the right
+     * exception for a bogus utf-8 byte.
+     *
+     * @param value the byte value
+     * @param offset the file offset
+     * @return never
+     * @throws IllegalArgumentException always thrown
+     */
+    private static String throwBadUtf8(int value, int offset) {
+        throw new IllegalArgumentException("bad utf-8 byte " + Hex.u1(value) +
+                                           " at offset " + Hex.u4(offset));
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/util/WrappedIndentingWriter.java b/dexlib2/src/main/java/org/jf/util/WrappedIndentingWriter.java
new file mode 100644
index 0000000..df4575b
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/util/WrappedIndentingWriter.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+import com.google.common.collect.Lists;
+
+import java.io.FilterWriter;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.List;
+
+public class WrappedIndentingWriter extends FilterWriter {
+
+    private final int maxIndent;
+    private final int maxWidth;
+
+    private int currentIndent = 0;
+    private final StringBuilder line = new StringBuilder();
+
+    public WrappedIndentingWriter(Writer out, int maxIndent, int maxWidth) {
+        super(out);
+        this.maxIndent = maxIndent;
+        this.maxWidth = maxWidth;
+    }
+
+    private void writeIndent() throws IOException {
+        for (int i=0; i<getIndent(); i++) {
+            write(' ');
+        }
+    }
+
+    private int getIndent() {
+        if (currentIndent < 0) {
+            return 0;
+        }
+        if (currentIndent > maxIndent) {
+            return maxIndent;
+        }
+        return currentIndent;
+    }
+
+    public void indent(int indent) {
+        currentIndent += indent;
+    }
+
+    public void deindent(int indent) {
+        currentIndent -= indent;
+    }
+
+    private void wrapLine() throws IOException {
+        List<String> wrapped = Lists.newArrayList(StringWrapper.wrapStringOnBreaks(line.toString(), maxWidth));
+        out.write(wrapped.get(0), 0, wrapped.get(0).length());
+        out.write('\n');
+
+        line.replace(0, line.length(), "");
+        writeIndent();
+        for (int i=1; i<wrapped.size(); i++) {
+            if (i > 1) {
+                write('\n');
+            }
+            write(wrapped.get(i));
+        }
+    }
+
+    @Override public void write(int c) throws IOException {
+        if (c == '\n') {
+            out.write(line.toString());
+            out.write(c);
+            line.replace(0, line.length(), "");
+            writeIndent();
+        } else {
+            line.append((char)c);
+            if (line.length() > maxWidth) {
+                wrapLine();
+            }
+        }
+    }
+
+    @Override public void write(char[] cbuf, int off, int len) throws IOException {
+        for (int i=0; i<len; i++) {
+            write(cbuf[i+off]);
+        }
+    }
+
+    @Override public void write(String str, int off, int len) throws IOException {
+        for (int i=0; i<len; i++) {
+            write(str.charAt(i+off));
+        }
+    }
+
+    @Override public void flush() throws IOException {
+        out.write(line.toString());
+        line.replace(0, line.length(), "");
+    }
+}
diff --git a/dexlib2/src/main/ragel/Opcodes.rl b/dexlib2/src/main/ragel/Opcodes.rl
new file mode 100644
index 0000000..250c06c
--- /dev/null
+++ b/dexlib2/src/main/ragel/Opcodes.rl
@@ -0,0 +1,246 @@
+define nop 0
+define move 1
+define move_from16 2
+define move_16 3
+define move_wide 4
+define move_wide_from16 5
+define move_wide_16 6
+define move_object 7
+define move_object_from16 8
+define move_object_16 9
+define move_result 10
+define move_result_wide 11
+define move_result_object 12
+define move_exception 13
+define return_void 14
+define return 15
+define return_wide 16
+define return_object 17
+define const_4 18
+define const_16 19
+define const 20
+define const_high16 21
+define const_wide_16 22
+define const_wide_32 23
+define const_wide 24
+define const_wide_high16 25
+define const_string 26
+define const_string_jumbo 27
+define const_class 28
+define monitor_enter 29
+define monitor_exit 30
+define check_cast 31
+define instance_of 32
+define array_length 33
+define new_instance 34
+define new_array 35
+define filled_new_array 36
+define filled_new_array_range 37
+define fill_array_data 38
+define throw 39
+define goto 40
+define goto_16 41
+define goto_32 42
+define packed_switch 43
+define sparse_switch 44
+define cmpl_float 45
+define cmpg_float 46
+define cmpl_double 47
+define cmpg_double 48
+define cmp_long 49
+define if_eq 50
+define if_ne 51
+define if_lt 52
+define if_ge 53
+define if_gt 54
+define if_le 55
+define if_eqz 56
+define if_nez 57
+define if_ltz 58
+define if_gez 59
+define if_gtz 60
+define if_lez 61
+define aget 68
+define aget_wide 69
+define aget_object 70
+define aget_boolean 71
+define aget_byte 72
+define aget_char 73
+define aget_short 74
+define aput 75
+define aput_wide 76
+define aput_object 77
+define aput_boolean 78
+define aput_byte 79
+define aput_char 80
+define aput_short 81
+define iget 82
+define iget_wide 83
+define iget_object 84
+define iget_boolean 85
+define iget_byte 86
+define iget_char 87
+define iget_short 88
+define iput 89
+define iput_wide 90
+define iput_object 91
+define iput_boolean 92
+define iput_byte 93
+define iput_char 94
+define iput_short 95
+define sget 96
+define sget_wide 97
+define sget_object 98
+define sget_boolean 99
+define sget_byte 100
+define sget_char 101
+define sget_short 102
+define sput 103
+define sput_wide 104
+define sput_object 105
+define sput_boolean 106
+define sput_byte 107
+define sput_char 108
+define sput_short 109
+define invoke_virtual 110
+define invoke_super 111
+define invoke_direct 112
+define invoke_static 113
+define invoke_interface 114
+define invoke_virtual_range 116
+define invoke_super_range 117
+define invoke_direct_range 118
+define invoke_static_range 119
+define invoke_interface_range 120
+define neg_int 123
+define not_int 124
+define neg_long 125
+define not_long 126
+define neg_float 127
+define neg_double 128
+define int_to_long 129
+define int_to_float 130
+define int_to_double 131
+define long_to_int 132
+define long_to_float 133
+define long_to_double 134
+define float_to_int 135
+define float_to_long 136
+define float_to_double 137
+define double_to_int 138
+define double_to_long 139
+define double_to_float 140
+define int_to_byte 141
+define int_to_char 142
+define int_to_short 143
+define add_int 144
+define sub_int 145
+define mul_int 146
+define div_int 147
+define rem_int 148
+define and_int 149
+define or_int 150
+define xor_int 151
+define shl_int 152
+define shr_int 153
+define ushr_int 154
+define add_long 155
+define sub_long 156
+define mul_long 157
+define div_long 158
+define rem_long 159
+define and_long 160
+define or_long 161
+define xor_long 162
+define shl_long 163
+define shr_long 164
+define ushr_long 165
+define add_float 166
+define sub_float 167
+define mul_float 168
+define div_float 169
+define rem_float 170
+define add_double 171
+define sub_double 172
+define mul_double 173
+define div_double 174
+define rem_double 175
+define add_int_2addr 176
+define sub_int_2addr 177
+define mul_int_2addr 178
+define div_int_2addr 179
+define rem_int_2addr 180
+define and_int_2addr 181
+define or_int_2addr 182
+define xor_int_2addr 183
+define shl_int_2addr 184
+define shr_int_2addr 185
+define ushr_int_2addr 186
+define add_long_2addr 187
+define sub_long_2addr 188
+define mul_long_2addr 189
+define div_long_2addr 190
+define rem_long_2addr 191
+define and_long_2addr 192
+define or_long_2addr 193
+define xor_long_2addr 194
+define shl_long_2addr 195
+define shr_long_2addr 196
+define ushr_long_2addr 197
+define add_float_2addr 198
+define sub_float_2addr 199
+define mul_float_2addr 200
+define div_float_2addr 201
+define rem_float_2addr 202
+define add_double_2addr 203
+define sub_double_2addr 204
+define mul_double_2addr 205
+define div_double_2addr 206
+define rem_double_2addr 207
+define add_int_lit16 208
+define rsub_int 209
+define mul_int_lit16 210
+define div_int_lit16 211
+define rem_int_lit16 212
+define and_int_lit16 213
+define or_int_lit16 214
+define xor_int_lit16 215
+define add_int_lit8 216
+define rsub_int_lit8 217
+define mul_int_lit8 218
+define div_int_lit8 219
+define rem_int_lit8 220
+define and_int_lit8 221
+define or_int_lit8 222
+define xor_int_lit8 223
+define shl_int_lit8 224
+define shr_int_lit8 225
+define ushr_int_lit8 226
+define iget_volatile 227
+define iput_volatile 228
+define sget_volatile 229
+define sput_volatile 230
+define iget_object_volatile 231
+define iget_wide_volatile 232
+define iput_wide_volatile 233
+define sget_wide_volatile 234
+define sput_wide_volatile 235
+define throw_verification_error 237
+define execute_inline 238
+define execute_inline_range 239
+define invoke_direct_empty 240
+define invoke_object_init_range 240
+define return_void_barrier 241
+define iget_quick 242
+define iget_wide_quick 243
+define iget_object_quick 244
+define iput_quick 245
+define iput_wide_quick 246
+define iput_object_quick 247
+define invoke_virtual_quick 248
+define invoke_virtual_quick_range 249
+define invoke_super_quick 250
+define invoke_super_quick_range 251
+define iput_object_volatile 252
+define sget_object_volatile 253
+define sput_object_volatile 254
\ No newline at end of file
diff --git a/dexlib2/src/main/ragel/SyntheticAccessorFSM.rl b/dexlib2/src/main/ragel/SyntheticAccessorFSM.rl
new file mode 100644
index 0000000..96ac536
--- /dev/null
+++ b/dexlib2/src/main/ragel/SyntheticAccessorFSM.rl
@@ -0,0 +1,269 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.util;
+
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.dexlib2.iface.instruction.OneRegisterInstruction;
+import org.jf.dexlib2.iface.instruction.WideLiteralInstruction;
+import org.jf.dexlib2.Opcodes;
+
+import java.util.List;
+
+public class SyntheticAccessorFSM {
+    %% machine SyntheticAccessorFSM;
+    %% write data;
+
+    // math type constants
+    public static final int ADD = SyntheticAccessorResolver.ADD_ASSIGNMENT;
+    public static final int SUB = SyntheticAccessorResolver.SUB_ASSIGNMENT;
+    public static final int MUL = SyntheticAccessorResolver.MUL_ASSIGNMENT;
+    public static final int DIV = SyntheticAccessorResolver.DIV_ASSIGNMENT;
+    public static final int REM = SyntheticAccessorResolver.REM_ASSIGNMENT;
+    public static final int AND = SyntheticAccessorResolver.AND_ASSIGNMENT;
+    public static final int OR = SyntheticAccessorResolver.OR_ASSIGNMENT;
+    public static final int XOR = SyntheticAccessorResolver.XOR_ASSIGNMENT;
+    public static final int SHL = SyntheticAccessorResolver.SHL_ASSIGNMENT;
+    public static final int SHR = SyntheticAccessorResolver.SHR_ASSIGNMENT;
+    public static final int USHR = SyntheticAccessorResolver.USHR_ASSIGNMENT;
+
+    public static final int INT = 0;
+    public static final int LONG = 1;
+    public static final int FLOAT = 2;
+    public static final int DOUBLE = 3;
+
+    public static final int POSITIVE_ONE = 1;
+    public static final int NEGATIVE_ONE = -1;
+    public static final int OTHER = 0;
+
+    @Nonnull private final Opcodes opcodes;
+
+    public SyntheticAccessorFSM(@Nonnull Opcodes opcodes) {
+        this.opcodes = opcodes;
+    }
+
+    public int test(List<? extends Instruction> instructions) {
+        int accessorType = -1;
+        int cs, p = 0;
+        int pe = instructions.size();
+
+        // one of the math type constants representing the type of math operation being performed
+        int mathOp = -1;
+
+        // for increments an decrements, the type of value the math operation is on
+        int mathType = -1;
+
+        // for increments and decrements, the value of the constant that is used
+        long constantValue = 0;
+
+        // The source register for the put instruction
+        int putRegister = -1;
+        // The return register;
+        int returnRegister = -1;
+
+        %%{
+            import "Opcodes.rl";
+            alphtype short;
+            getkey opcodes.getOpcodeValue(instructions.get(p).getOpcode());
+
+            get = (0x52 .. 0x58) | (0x60 .. 0x66); # all igets/sgets
+
+            # all iputs/sputs
+            put = ((0x59 .. 0x5f) | (0x67 .. 0x6d)) @ {
+                putRegister = ((OneRegisterInstruction)instructions.get(p)).getRegisterA();
+            };
+
+            invoke = (0x6e .. 0x72) | (0x74 .. 0x78); # all invokes
+
+            # all numeric const instructions
+            const_literal = (0x12 .. 0x19) @ {
+                constantValue = ((WideLiteralInstruction)instructions.get(p)).getWideLiteral();
+            };
+
+            add_const = (add_int_lit8 | add_int_lit16) @ {
+                mathType = INT;
+                mathOp = ADD;
+                constantValue = ((WideLiteralInstruction)instructions.get(p)).getWideLiteral();
+            };
+
+            arbitrary_add = (((add_int | add_int_2addr) @ { mathType = INT; }) |
+                             ((add_long | add_long_2addr) @ { mathType = LONG; }) |
+                             ((add_float | add_float_2addr) @ { mathType = FLOAT; }) |
+                             ((add_double | add_double_2addr) @ {mathType = DOUBLE; })) @ {
+                mathOp = ADD;
+            };
+            arbitrary_sub = (((sub_int | sub_int_2addr) @ { mathType = INT; }) |
+                             ((sub_long | sub_long_2addr) @ { mathType = LONG; }) |
+                             ((sub_float | sub_float_2addr) @ { mathType = FLOAT; }) |
+                             ((sub_double | sub_double_2addr) @ {mathType = DOUBLE; })) @ {
+                mathOp = SUB;
+            };
+            arbitrary_mul = (mul_int | mul_int_2addr | mul_long | mul_long_2addr |
+                            mul_float | mul_float_2addr | mul_double | mul_double_2addr) @ {
+                mathOp = MUL;
+            };
+            arbitrary_div = (div_int | div_int_2addr | div_long | div_long_2addr |
+                            div_float | div_float_2addr | div_double | div_double_2addr) @ {
+                mathOp = DIV;
+            };
+            arbitrary_rem = (rem_int | rem_int_2addr | rem_long | rem_long_2addr |
+                            rem_float | rem_float_2addr | rem_double | rem_double_2addr) @ {
+                mathOp = REM;
+            };
+            arbitrary_and = (and_int | and_int_2addr | and_long | and_long_2addr) @ {
+                mathOp = AND;
+            };
+            arbitrary_or = (or_int | or_int_2addr | or_long | or_long_2addr) @ {
+                mathOp = OR;
+            };
+            arbitrary_xor = (xor_int | xor_int_2addr | xor_long | xor_long_2addr) @ {
+                mathOp = XOR;
+            };
+            arbitrary_shl = (shl_int | shl_int_2addr | shl_long | shl_long_2addr) @ {
+                mathOp = SHL;
+            };
+            arbitrary_shr = (shr_int | shr_int_2addr | shr_long | shr_long_2addr) @ {
+                mathOp = SHR;
+            };
+            arbitrary_ushr = (ushr_int | ushr_int_2addr | ushr_long | ushr_long_2addr) @ {
+                mathOp = USHR;
+            };
+
+            type_conversion = 0x81 .. 0x8f; # all type-conversion opcodes
+
+            return_something = (return | return_wide | return_object) @ {
+                returnRegister = ((OneRegisterInstruction)instructions.get(p)).getRegisterA();
+            };
+
+            any_move_result = move_result | move_result_wide | move_result_object;
+
+            get_accessor = get return_something @ {
+                accessorType = SyntheticAccessorResolver.GETTER; fbreak;
+            };
+
+            put_accessor = put return_something @ {
+                accessorType = SyntheticAccessorResolver.SETTER; fbreak;
+            };
+
+            invoke_accessor = invoke (return_void | (any_move_result return_something)) @ {
+                accessorType = SyntheticAccessorResolver.METHOD; fbreak;
+            };
+
+            increment_accessor = get add_const type_conversion? put return_something @ {
+                accessorType = getIncrementType(mathOp, mathType, constantValue, putRegister, returnRegister);
+            };
+
+            alt_increment_accessor = get const_literal (arbitrary_add | arbitrary_sub) put return_something @ {
+                accessorType = getIncrementType(mathOp, mathType, constantValue, putRegister, returnRegister);
+            };
+
+            math_assignment_accessor = get type_conversion?
+                                       (arbitrary_add | arbitrary_sub | arbitrary_mul | arbitrary_div | arbitrary_rem |
+                                        arbitrary_and | arbitrary_or | arbitrary_xor | arbitrary_shl | arbitrary_shr |
+                                        arbitrary_ushr)
+                                        type_conversion{0,2} put return_something @ {
+                accessorType = mathOp; fbreak;
+            };
+
+            main := get_accessor |
+                    put_accessor |
+                    invoke_accessor |
+                    increment_accessor |
+                    alt_increment_accessor |
+                    math_assignment_accessor;
+
+            write init;
+            write exec;
+        }%%
+
+        return accessorType;
+    }
+
+    private static int getIncrementType(int mathOp, int mathType, long constantValue, int putRegister,
+            int returnRegister) {
+        boolean isPrefix = putRegister == returnRegister;
+
+        boolean negativeConstant = false;
+
+        switch (mathType) {
+            case INT:
+            case LONG: {
+                if (constantValue == 1) {
+                    negativeConstant = false;
+                } else if (constantValue == -1) {
+                    negativeConstant = true;
+                } else {
+                    return -1;
+                }
+                break;
+            }
+            case FLOAT: {
+                float val = Float.intBitsToFloat((int)constantValue);
+                if (val == 1) {
+                    negativeConstant = false;
+                } else if (val == -1) {
+                    negativeConstant = true;
+                } else {
+                    return -1;
+                }
+                break;
+            }
+            case DOUBLE: {
+                double val = Double.longBitsToDouble(constantValue);
+                if (val == 1) {
+                    negativeConstant = false;
+                } else if (val == -1) {
+                    negativeConstant = true;
+                } else {
+                    return -1;
+                }
+                break;
+            }
+        }
+
+        boolean isAdd = ((mathOp == ADD) && !negativeConstant) ||
+                        ((mathOp == SUB) && negativeConstant);
+
+        if (isPrefix) {
+            if (isAdd) {
+                return SyntheticAccessorResolver.PREFIX_INCREMENT;
+            } else {
+                return SyntheticAccessorResolver.PREFIX_DECREMENT;
+            }
+        } else {
+            if (isAdd) {
+                return SyntheticAccessorResolver.POSTFIX_INCREMENT;
+            } else {
+                return SyntheticAccessorResolver.POSTFIX_DECREMENT;
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/AccessorTest.java b/dexlib2/src/test/java/org/jf/dexlib2/AccessorTest.java
new file mode 100644
index 0000000..ff832c2
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/dexlib2/AccessorTest.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2;
+
+import com.google.common.collect.ImmutableMap;
+import junit.framework.Assert;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.DexFile;
+import org.jf.dexlib2.iface.Method;
+import org.jf.dexlib2.iface.MethodImplementation;
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.dexlib2.iface.instruction.ReferenceInstruction;
+import org.jf.dexlib2.iface.reference.FieldReference;
+import org.jf.dexlib2.iface.reference.MethodReference;
+import org.jf.dexlib2.util.SyntheticAccessorResolver;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class AccessorTest {
+    private Pattern accessorMethodPattern = Pattern.compile("([a-zA-Z]*)_([a-zA-Z]*)");
+
+    private static final Map<String, Integer> operationTypes;
+
+    static {
+        ImmutableMap.Builder<String, Integer> builder = ImmutableMap.builder();
+        builder.put("postinc", SyntheticAccessorResolver.POSTFIX_INCREMENT);
+        builder.put("preinc", SyntheticAccessorResolver.PREFIX_INCREMENT);
+        builder.put("postdec", SyntheticAccessorResolver.POSTFIX_DECREMENT);
+        builder.put("predec", SyntheticAccessorResolver.PREFIX_DECREMENT);
+        builder.put("add", SyntheticAccessorResolver.ADD_ASSIGNMENT);
+        builder.put("sub", SyntheticAccessorResolver.SUB_ASSIGNMENT);
+        builder.put("mul", SyntheticAccessorResolver.MUL_ASSIGNMENT);
+        builder.put("div", SyntheticAccessorResolver.DIV_ASSIGNMENT);
+        builder.put("rem", SyntheticAccessorResolver.REM_ASSIGNMENT);
+        builder.put("and", SyntheticAccessorResolver.AND_ASSIGNMENT);
+        builder.put("or", SyntheticAccessorResolver.OR_ASSIGNMENT);
+        builder.put("xor", SyntheticAccessorResolver.XOR_ASSIGNMENT);
+        builder.put("shl", SyntheticAccessorResolver.SHL_ASSIGNMENT);
+        builder.put("shr", SyntheticAccessorResolver.SHR_ASSIGNMENT);
+        builder.put("ushr", SyntheticAccessorResolver.USHR_ASSIGNMENT);
+        operationTypes = builder.build();
+    }
+
+    @Test
+    public void testAccessors() throws IOException {
+        URL url = AccessorTest.class.getClassLoader().getResource("accessorTest.dex");
+        Assert.assertNotNull(url);
+        DexFile f = DexFileFactory.loadDexFile(url.getFile(), Opcodes.getDefault());
+
+        SyntheticAccessorResolver sar = new SyntheticAccessorResolver(f.getOpcodes(), f.getClasses());
+
+        ClassDef accessorTypesClass = null;
+        ClassDef accessorsClass = null;
+
+        for (ClassDef classDef: f.getClasses()) {
+            String className = classDef.getType();
+
+            if (className.equals("Lorg/jf/dexlib2/AccessorTypes;")) {
+                accessorTypesClass = classDef;
+            } else if (className.equals("Lorg/jf/dexlib2/AccessorTypes$Accessors;")) {
+                accessorsClass = classDef;
+            }
+        }
+
+        Assert.assertNotNull(accessorTypesClass);
+        Assert.assertNotNull(accessorsClass);
+
+        for (Method method: accessorsClass.getMethods()) {
+            Matcher m = accessorMethodPattern.matcher(method.getName());
+            if (!m.matches()) {
+                continue;
+            }
+            String type = m.group(1);
+            String operation = m.group(2);
+
+            MethodImplementation methodImpl = method.getImplementation();
+            Assert.assertNotNull(methodImpl);
+
+            for (Instruction instruction: methodImpl.getInstructions()) {
+                Opcode opcode = instruction.getOpcode();
+                if (opcode == Opcode.INVOKE_STATIC || opcode == Opcode.INVOKE_STATIC_RANGE) {
+                    MethodReference accessorMethod =
+                            (MethodReference)((ReferenceInstruction) instruction).getReference();
+
+                    SyntheticAccessorResolver.AccessedMember accessedMember = sar.getAccessedMember(accessorMethod);
+
+                    Assert.assertNotNull(String.format("Could not resolve accessor for %s_%s", type, operation),
+                            accessedMember);
+
+                    int operationType = operationTypes.get(operation);
+                    Assert.assertEquals(operationType, accessedMember.accessedMemberType);
+
+                    Assert.assertEquals(String.format("%s_val", type),
+                            ((FieldReference)accessedMember.accessedMember).getName());
+                }
+            }
+        }
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/DexEntryFinderTest.java b/dexlib2/src/test/java/org/jf/dexlib2/DexEntryFinderTest.java
new file mode 100644
index 0000000..3386067
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/dexlib2/DexEntryFinderTest.java
@@ -0,0 +1,255 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import org.jf.dexlib2.DexFileFactory.DexEntryFinder;
+import org.jf.dexlib2.DexFileFactory.DexFileNotFoundException;
+import org.jf.dexlib2.DexFileFactory.MultipleMatchingDexEntriesException;
+import org.jf.dexlib2.DexFileFactory.UnsupportedFileTypeException;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.MultiDexContainer;
+import org.junit.Assert;
+import org.junit.Test;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import static org.mockito.Mockito.mock;
+
+public class DexEntryFinderTest {
+
+    @Test
+    public void testNormalStuff() throws Exception {
+        Map<String, DexBackedDexFile> entries = Maps.newHashMap();
+        DexBackedDexFile dexFile1 = mock(DexBackedDexFile.class);
+        entries.put("/system/framework/framework.jar", dexFile1);
+        DexBackedDexFile dexFile2 = mock(DexBackedDexFile.class);
+        entries.put("/system/framework/framework.jar:classes2.dex", dexFile2);
+        DexEntryFinder testFinder = new DexEntryFinder("blah.oat", new TestMultiDexContainer(entries));
+
+        Assert.assertEquals(dexFile1, testFinder.findEntry("/system/framework/framework.jar", true).getDexFile());
+
+        assertEntryNotFound(testFinder, "system/framework/framework.jar", true);
+        assertEntryNotFound(testFinder, "/framework/framework.jar", true);
+        assertEntryNotFound(testFinder, "framework/framework.jar", true);
+        assertEntryNotFound(testFinder, "/framework.jar", true);
+        assertEntryNotFound(testFinder, "framework.jar", true);
+
+        Assert.assertEquals(dexFile1, testFinder.findEntry("system/framework/framework.jar", false).getDexFile());
+        Assert.assertEquals(dexFile1, testFinder.findEntry("/framework/framework.jar", false).getDexFile());
+        Assert.assertEquals(dexFile1, testFinder.findEntry("framework/framework.jar", false).getDexFile());
+        Assert.assertEquals(dexFile1, testFinder.findEntry("/framework.jar", false).getDexFile());
+        Assert.assertEquals(dexFile1, testFinder.findEntry("framework.jar", false).getDexFile());
+
+        assertEntryNotFound(testFinder, "ystem/framework/framework.jar", false);
+        assertEntryNotFound(testFinder, "ssystem/framework/framework.jar", false);
+        assertEntryNotFound(testFinder, "ramework/framework.jar", false);
+        assertEntryNotFound(testFinder, "ramework.jar", false);
+        assertEntryNotFound(testFinder, "framework", false);
+
+        Assert.assertEquals(dexFile2,
+                testFinder.findEntry("/system/framework/framework.jar:classes2.dex", true).getDexFile());
+
+        assertEntryNotFound(testFinder, "system/framework/framework.jar:classes2.dex", true);
+        assertEntryNotFound(testFinder, "framework.jar:classes2.dex", true);
+        assertEntryNotFound(testFinder, "classes2.dex", true);
+
+        Assert.assertEquals(dexFile2,
+                testFinder.findEntry("system/framework/framework.jar:classes2.dex", false).getDexFile());
+        Assert.assertEquals(dexFile2,
+                testFinder.findEntry("/framework/framework.jar:classes2.dex", false).getDexFile());
+        Assert.assertEquals(dexFile2, testFinder.findEntry("framework/framework.jar:classes2.dex", false).getDexFile());
+        Assert.assertEquals(dexFile2, testFinder.findEntry("/framework.jar:classes2.dex", false).getDexFile());
+        Assert.assertEquals(dexFile2, testFinder.findEntry("framework.jar:classes2.dex", false).getDexFile());
+        Assert.assertEquals(dexFile2, testFinder.findEntry(":classes2.dex", false).getDexFile());
+        Assert.assertEquals(dexFile2, testFinder.findEntry("classes2.dex", false).getDexFile());
+
+        assertEntryNotFound(testFinder, "ystem/framework/framework.jar:classes2.dex", false);
+        assertEntryNotFound(testFinder, "ramework.jar:classes2.dex", false);
+        assertEntryNotFound(testFinder, "lasses2.dex", false);
+        assertEntryNotFound(testFinder, "classes2", false);
+    }
+
+    @Test
+    public void testSimilarEntries() throws Exception {
+        Map<String, DexBackedDexFile> entries = Maps.newHashMap();
+        DexBackedDexFile dexFile1 = mock(DexBackedDexFile.class);
+        entries.put("/system/framework/framework.jar", dexFile1);
+        DexBackedDexFile dexFile2 = mock(DexBackedDexFile.class);
+        entries.put("system/framework/framework.jar", dexFile2);
+        DexEntryFinder testFinder = new DexEntryFinder("blah.oat", new TestMultiDexContainer(entries));
+
+        Assert.assertEquals(dexFile1, testFinder.findEntry("/system/framework/framework.jar", true).getDexFile());
+        Assert.assertEquals(dexFile2, testFinder.findEntry("system/framework/framework.jar", true).getDexFile());
+
+        assertMultipleMatchingEntries(testFinder, "/system/framework/framework.jar");
+        assertMultipleMatchingEntries(testFinder, "system/framework/framework.jar");
+
+        assertMultipleMatchingEntries(testFinder, "/framework/framework.jar");
+        assertMultipleMatchingEntries(testFinder, "framework/framework.jar");
+        assertMultipleMatchingEntries(testFinder, "/framework.jar");
+        assertMultipleMatchingEntries(testFinder, "framework.jar");
+    }
+
+    @Test
+    public void testMatchingSuffix() throws Exception {
+        Map<String, DexBackedDexFile> entries = Maps.newHashMap();
+        DexBackedDexFile dexFile1 = mock(DexBackedDexFile.class);
+        entries.put("/system/framework/framework.jar", dexFile1);
+        DexBackedDexFile dexFile2 = mock(DexBackedDexFile.class);
+        entries.put("/framework/framework.jar", dexFile2);
+        DexEntryFinder testFinder = new DexEntryFinder("blah.oat", new TestMultiDexContainer(entries));
+
+        Assert.assertEquals(dexFile1, testFinder.findEntry("/system/framework/framework.jar", true).getDexFile());
+        Assert.assertEquals(dexFile2, testFinder.findEntry("/framework/framework.jar", true).getDexFile());
+
+        Assert.assertEquals(dexFile2, testFinder.findEntry("/framework/framework.jar", false).getDexFile());
+        Assert.assertEquals(dexFile2, testFinder.findEntry("framework/framework.jar", false).getDexFile());
+
+        assertMultipleMatchingEntries(testFinder, "/framework.jar");
+        assertMultipleMatchingEntries(testFinder, "framework.jar");
+    }
+
+    @Test
+    public void testNonDexEntries() throws Exception {
+        Map<String, DexBackedDexFile> entries = Maps.newHashMap();
+        DexBackedDexFile dexFile1 = mock(DexBackedDexFile.class);
+        entries.put("classes.dex", dexFile1);
+        entries.put("/blah/classes.dex", null);
+        DexEntryFinder testFinder = new DexEntryFinder("blah.oat", new TestMultiDexContainer(entries));
+
+        Assert.assertEquals(dexFile1, testFinder.findEntry("classes.dex", true).getDexFile());
+        Assert.assertEquals(dexFile1, testFinder.findEntry("classes.dex", false).getDexFile());
+
+        assertUnsupportedFileType(testFinder, "/blah/classes.dex", true);
+        assertDexFileNotFound(testFinder, "/blah/classes.dex", false);
+    }
+
+    private void assertEntryNotFound(DexEntryFinder finder, String entry, boolean exactMatch) throws IOException {
+        try {
+            finder.findEntry(entry, exactMatch);
+            Assert.fail();
+        } catch (DexFileNotFoundException ex) {
+            // expected exception
+        }
+    }
+
+    private void assertMultipleMatchingEntries(DexEntryFinder finder, String entry) throws IOException {
+        try {
+            finder.findEntry(entry, false);
+            Assert.fail();
+        } catch (MultipleMatchingDexEntriesException ex) {
+            // expected exception
+        }
+    }
+
+    private void assertUnsupportedFileType(DexEntryFinder finder, String entry, boolean exactMatch) throws IOException {
+        try {
+            finder.findEntry(entry, exactMatch);
+            Assert.fail();
+        } catch (UnsupportedFileTypeException ex) {
+            // expected exception
+        }
+    }
+
+    private void assertDexFileNotFound(DexEntryFinder finder, String entry, boolean exactMatch) throws IOException {
+        try {
+            finder.findEntry(entry, exactMatch);
+            Assert.fail();
+        } catch (DexFileNotFoundException ex) {
+            // expected exception
+        }
+    }
+
+    public static class TestMultiDexContainer implements MultiDexContainer<DexBackedDexFile> {
+        @Nonnull private final Map<String, DexBackedDexFile> entries;
+
+        public TestMultiDexContainer(@Nonnull Map<String, DexBackedDexFile> entries) {
+            this.entries = entries;
+        }
+
+        @Nonnull @Override public List<String> getDexEntryNames() throws IOException {
+            List<String> entryNames = Lists.newArrayList();
+
+            for (Entry<String, DexBackedDexFile> entry: entries.entrySet()) {
+                if (entry.getValue() != null) {
+                    entryNames.add(entry.getKey());
+                }
+            }
+
+            return entryNames;
+        }
+
+        @Nullable
+        @Override
+        public DexEntry<DexBackedDexFile> getEntry(@Nonnull String entryName) throws IOException {
+            if (entries.containsKey(entryName)) {
+                DexBackedDexFile dexFile = entries.get(entryName);
+                if (dexFile == null) {
+                    throw new DexBackedDexFile.NotADexFile();
+                }
+
+                return new DexEntry<DexBackedDexFile>() {
+                    @Nonnull
+                    @Override
+                    public String getEntryName() {
+                        return "classes.dex";
+                    }
+
+                    @Nonnull
+                    @Override
+                    public DexBackedDexFile getDexFile() {
+                        return dexFile;
+                    }
+
+                    @Nonnull
+                    @Override
+                    public MultiDexContainer<? extends DexBackedDexFile> getContainer() {
+                        return TestMultiDexContainer.this;
+                    }
+                };
+            }
+            return null;
+
+
+
+        }
+
+
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/analysis/CommonSuperclassTest.java b/dexlib2/src/test/java/org/jf/dexlib2/analysis/CommonSuperclassTest.java
new file mode 100644
index 0000000..d69dd81
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/dexlib2/analysis/CommonSuperclassTest.java
@@ -0,0 +1,333 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
+import junit.framework.Assert;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.immutable.ImmutableDexFile;
+import org.junit.Test;
+
+import java.io.IOException;
+
+public class CommonSuperclassTest {
+    // object tree:
+    // object
+    //   one
+    //     onetwo
+    //       onetwothree
+    //     onethree
+    // five (undefined class)
+    //   fivetwo
+    //     fivetwothree
+    //   fivethree
+
+    private final ClassPath oldClassPath;
+    private final ClassPath newClassPath;
+
+
+    public CommonSuperclassTest() throws IOException {
+        ImmutableSet<ClassDef> classes = ImmutableSet.of(
+                TestUtils.makeClassDef("Ljava/lang/Object;", null),
+                TestUtils.makeClassDef("Ltest/one;", "Ljava/lang/Object;"),
+                TestUtils.makeClassDef("Ltest/two;", "Ljava/lang/Object;"),
+                TestUtils.makeClassDef("Ltest/onetwo;", "Ltest/one;"),
+                TestUtils.makeClassDef("Ltest/onetwothree;", "Ltest/onetwo;"),
+                TestUtils.makeClassDef("Ltest/onethree;", "Ltest/one;"),
+                TestUtils.makeClassDef("Ltest/fivetwo;", "Ltest/five;"),
+                TestUtils.makeClassDef("Ltest/fivetwothree;", "Ltest/fivetwo;"),
+                TestUtils.makeClassDef("Ltest/fivethree;", "Ltest/five;"),
+                TestUtils.makeInterfaceDef("Ljava/lang/Cloneable;"),
+                TestUtils.makeInterfaceDef("Ljava/io/Serializable;"),
+
+                // basic class and interface
+                TestUtils.makeClassDef("Liface/classiface1;", "Ljava/lang/Object;", "Liface/iface1;"),
+                TestUtils.makeInterfaceDef("Liface/iface1;"),
+
+                // a more complex interface tree
+                TestUtils.makeInterfaceDef("Liface/base1;"),
+                // implements undefined interface
+                TestUtils.makeInterfaceDef("Liface/sub1;", "Liface/base1;", "Liface/base2;"),
+                // this implements sub1, so that its interfaces can't be fully resolved either
+                TestUtils.makeInterfaceDef("Liface/sub2;", "Liface/base1;", "Liface/sub1;"),
+                TestUtils.makeInterfaceDef("Liface/sub3;", "Liface/base1;"),
+                TestUtils.makeInterfaceDef("Liface/sub4;", "Liface/base1;", "Liface/sub3;"),
+                TestUtils.makeClassDef("Liface/classsub1;", "Ljava/lang/Object;", "Liface/sub1;"),
+                TestUtils.makeClassDef("Liface/classsub2;", "Ljava/lang/Object;", "Liface/sub2;"),
+                TestUtils.makeClassDef("Liface/classsub3;", "Ljava/lang/Object;", "Liface/sub3;",
+                        "Liface/base;"),
+                TestUtils.makeClassDef("Liface/classsub4;", "Ljava/lang/Object;", "Liface/sub3;",
+                        "Liface/sub4;"),
+                TestUtils.makeClassDef("Liface/classsubsub4;", "Liface/classsub4;"),
+                TestUtils.makeClassDef("Liface/classsub1234;", "Ljava/lang/Object;", "Liface/sub1;",
+                        "Liface/sub2;", "Liface/sub3;", "Liface/sub4;"));
+
+        oldClassPath = new ClassPath(new DexClassProvider(new ImmutableDexFile(Opcodes.getDefault(), classes)));
+        newClassPath = new ClassPath(Lists.newArrayList(new DexClassProvider(
+                new ImmutableDexFile(Opcodes.forArtVersion(72), classes))), true, 72);
+    }
+
+    public void superclassTest(ClassPath classPath, String commonSuperclass,
+                               String type1, String type2) {
+        TypeProto commonSuperclassProto = classPath.getClass(commonSuperclass);
+        TypeProto type1Proto = classPath.getClass(type1);
+        TypeProto type2Proto = classPath.getClass(type2);
+
+        Assert.assertSame(commonSuperclassProto, type1Proto.getCommonSuperclass(type2Proto));
+        Assert.assertSame(commonSuperclassProto, type2Proto.getCommonSuperclass(type1Proto));
+    }
+
+    public void superclassTest(String commonSuperclass, String type1, String type2) {
+        superclassTest(oldClassPath, commonSuperclass, type1, type2);
+        superclassTest(newClassPath, commonSuperclass, type1, type2);
+    }
+
+    @Test
+    public void testGetCommonSuperclass() throws IOException {
+        String object = "Ljava/lang/Object;";
+        String unknown = "Ujava/lang/Object;";
+        String one = "Ltest/one;";
+        String two = "Ltest/two;";
+        String onetwo = "Ltest/onetwo;";
+        String onetwothree = "Ltest/onetwothree;";
+        String onethree = "Ltest/onethree;";
+        String five = "Ltest/five;";
+        String fivetwo = "Ltest/fivetwo;";
+        String fivetwothree = "Ltest/fivetwothree;";
+        String fivethree = "Ltest/fivethree;";
+
+        // same object        
+        superclassTest(object, object, object);
+        superclassTest(unknown, unknown, unknown);
+        superclassTest(one, one, one);
+        superclassTest(onetwo, onetwo, onetwo);
+        superclassTest(onetwothree, onetwothree, onetwothree);
+        superclassTest(onethree, onethree, onethree);
+        superclassTest(five, five, five);
+        superclassTest(fivetwo, fivetwo, fivetwo);
+        superclassTest(fivetwothree, fivetwothree, fivetwothree);
+        superclassTest(fivethree, fivethree, fivethree);
+        
+        // same value, but different object
+        Assert.assertEquals(
+                onetwo,
+                oldClassPath.getClass(onetwo).getCommonSuperclass(new ClassProto(oldClassPath, onetwo)).getType());
+
+        Assert.assertEquals(
+                onetwo,
+                newClassPath.getClass(onetwo).getCommonSuperclass(new ClassProto(newClassPath, onetwo)).getType());
+
+        // other object is superclass
+        superclassTest(object, object, one);
+
+        // other object is superclass two levels up
+        superclassTest(object, object, onetwo);
+
+        // unknown and non-object class
+        superclassTest(unknown, one, unknown);
+
+        // unknown and object class
+        superclassTest(object, object, unknown);
+
+        // siblings
+        superclassTest(one, onetwo, onethree);
+
+        // nephew
+        superclassTest(one, onethree, onetwothree);
+
+        // unrelated
+        superclassTest(object, one, two);
+
+        // undefined superclass and object
+        superclassTest(object, fivetwo, object);
+
+        // undefined class and unrelated type
+        superclassTest(unknown, one, five);
+
+        // undefined superclass and unrelated type
+        superclassTest(unknown, one, fivetwo);
+
+        // undefined ancestor and unrelated type
+        superclassTest(unknown, one, fivetwothree);
+
+        // undefined class and direct subclass
+        superclassTest(five, five, fivetwo);
+
+        // undefined class and descendent
+        superclassTest(five, five, fivetwothree);
+
+        // undefined superclass and direct subclass
+        superclassTest(fivetwo, fivetwo, fivetwothree);
+
+        // siblings with undefined superclass
+        superclassTest(five, fivetwo, fivethree);
+
+        // undefined superclass and nephew
+        superclassTest(five, fivethree, fivetwothree);
+    }
+
+    @Test
+    public void testGetCommonSuperclass_interfaces() {
+        String classiface1 = "Liface/classiface1;";
+        String iface1 = "Liface/iface1;";
+        String base1 = "Liface/base1;";
+        String base2 = "Liface/base2;";
+        String sub1 = "Liface/sub1;";
+        String sub2 = "Liface/sub2;";
+        String sub3 = "Liface/sub3;";
+        String sub4 = "Liface/sub4;";
+        String classsub1 = "Liface/classsub1;";
+        String classsub2 = "Liface/classsub2;";
+        String classsub3 = "Liface/classsub3;";
+        String classsub4 = "Liface/classsub4;";
+        String classsubsub4 = "Liface/classsubsub4;";
+        String classsub1234 = "Liface/classsub1234;";
+        String object = "Ljava/lang/Object;";
+        String unknown = "Ujava/lang/Object;";
+
+        superclassTest(iface1, classiface1, iface1);
+
+        superclassTest(base1, base1, base1);
+        superclassTest(base1, base1, sub1);
+        superclassTest(base1, base1, classsub1);
+        superclassTest(base1, base1, sub2);
+        superclassTest(base1, base1, classsub2);
+        superclassTest(base1, base1, sub3);
+        superclassTest(base1, base1, classsub3);
+        superclassTest(base1, base1, sub4);
+        superclassTest(base1, base1, classsub4);
+        superclassTest(base1, base1, classsubsub4);
+        superclassTest(base1, base1, classsub1234);
+
+        superclassTest(object, sub3, iface1);
+        superclassTest(unknown, sub2, iface1);
+        superclassTest(unknown, sub1, iface1);
+
+        superclassTest(base2, base2, sub1);
+        superclassTest(base2, base2, classsub1);
+        superclassTest(base2, base2, sub2);
+        superclassTest(base2, base2, classsub2);
+        superclassTest(base2, base2, classsub1234);
+
+        superclassTest(unknown, iface1, classsub1234);
+
+        superclassTest(sub1, sub1, classsub1);
+
+        superclassTest(sub2, sub2, classsub2);
+        superclassTest(sub1, sub1, classsub2);
+
+        superclassTest(sub3, sub3, classsub3);
+
+        superclassTest(sub4, sub4, classsub4);
+        superclassTest(sub3, sub3, classsub4);
+        superclassTest(object, sub2, classsub4);
+        superclassTest(object, sub1, classsub4);
+
+        superclassTest(sub1, sub2, sub1);
+
+        superclassTest(sub1, sub1, classsub1234);
+        superclassTest(sub2, sub2, classsub1234);
+        superclassTest(sub3, sub3, classsub1234);
+        superclassTest(sub4, sub4, classsub1234);
+
+        superclassTest(unknown, sub3, classsub1);
+        superclassTest(unknown, sub4, classsub1);
+        superclassTest(unknown, sub3, classsub2);
+        superclassTest(unknown, sub4, classsub2);
+
+        superclassTest(unknown, sub4, base2);
+        superclassTest(unknown, classsub4, base2);
+    }
+
+    @Test
+    public void testGetCommonSuperclass_arrays() throws IOException {
+        String object = "Ljava/lang/Object;";
+        String one = "Ltest/one;";
+        String unknown = "Ujava/lang/Object;";
+
+        String cloneable = "Ljava/lang/Cloneable;";
+        String serializable = "Ljava/io/Serializable;";
+
+        String object1 = "[Ljava/lang/Object;";
+        String one1 = "[Ltest/one;";
+        String one2 = "[[Ltest/one;";
+        String two1 = "[Ltest/two;";
+        String onetwo1 = "[Ltest/onetwo;";
+        String onetwo2 = "[[Ltest/onetwo;";
+        String onethree1 = "[Ltest/onethree;";
+        String onethree2 = "[[Ltest/onethree;";
+        String five = "Ltest/five;";
+        String five1 = "[Ltest/five;";
+        String unknown1 = "[Ujava/lang/Object;";
+
+        String int1 = "[I";
+        String int2 = "[[I";
+        String float1 = "[F";
+
+        superclassTest(one1, one1, one1);
+        superclassTest(object1, object1, one1);
+        superclassTest(one1, onetwo1, onethree1);
+        superclassTest(one1, one1, onethree1);
+        superclassTest(object1, one1, two1);
+
+        superclassTest(one2, one2, one2);
+        superclassTest(one2, one2, onetwo2);
+        superclassTest(one2, onetwo2, onethree2);
+        superclassTest(object1, one1, one2);
+        superclassTest(object1, two1, one2);
+
+        superclassTest(unknown1, five1, one1);
+        superclassTest(object1, five1, one2);
+
+        superclassTest(unknown1, one1, unknown1);
+
+        superclassTest(object, one1, one);
+        superclassTest(object, object1, one);
+        superclassTest(object, onetwo1, one);
+        superclassTest(object, five1, one);
+        superclassTest(object, one2, one);
+
+        superclassTest(object, one1, unknown);
+        superclassTest(object, unknown1, unknown);
+
+        superclassTest(cloneable, one1, cloneable);
+        superclassTest(serializable, one1, serializable);
+
+        superclassTest(object, one1, five);
+
+        superclassTest(int1, int1, int1);
+        superclassTest(object, int1, float1);
+        superclassTest(object, int1, int2);
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/analysis/CustomMethodInlineTableTest.java b/dexlib2/src/test/java/org/jf/dexlib2/analysis/CustomMethodInlineTableTest.java
new file mode 100644
index 0000000..cef54fb
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/dexlib2/analysis/CustomMethodInlineTableTest.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
+import org.jf.dexlib2.AccessFlags;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction35c;
+import org.jf.dexlib2.iface.reference.MethodReference;
+import org.jf.dexlib2.immutable.*;
+import org.jf.dexlib2.immutable.instruction.ImmutableInstruction;
+import org.jf.dexlib2.immutable.instruction.ImmutableInstruction10x;
+import org.jf.dexlib2.immutable.instruction.ImmutableInstruction35mi;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.List;
+
+public class CustomMethodInlineTableTest {
+    @Test
+    public void testCustomMethodInlineTable_Virtual() throws IOException {
+        List<ImmutableInstruction> instructions = Lists.newArrayList(
+                new ImmutableInstruction35mi(Opcode.EXECUTE_INLINE, 1, 0, 0, 0, 0, 0, 0),
+                new ImmutableInstruction10x(Opcode.RETURN_VOID));
+
+        ImmutableMethodImplementation methodImpl = new ImmutableMethodImplementation(1, instructions, null, null);
+        ImmutableMethod method = new ImmutableMethod("Lblah;", "blah", null, "V", AccessFlags.PUBLIC.getValue(), null,
+                null, methodImpl);
+
+        ClassDef classDef = new ImmutableClassDef("Lblah;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null,
+                null, null, null, null, null, ImmutableList.of(method));
+
+        ImmutableDexFile dexFile = new ImmutableDexFile(Opcodes.getDefault(), ImmutableList.of(classDef));
+
+        ImmutableMultiDexContainer container = new ImmutableMultiDexContainer(ImmutableMap.of("classes.dex", dexFile));
+
+        ClassPathResolver resolver = new ClassPathResolver(ImmutableList.<String>of(),
+                ImmutableList.<String>of(), ImmutableList.<String>of(), container.getEntry("classes.dex"));
+        ClassPath classPath = new ClassPath(resolver.getResolvedClassProviders(), false, ClassPath.NOT_ART);
+
+        InlineMethodResolver inlineMethodResolver = new CustomInlineMethodResolver(classPath, "Lblah;->blah()V");
+        MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, inlineMethodResolver, false);
+
+        Instruction deodexedInstruction = methodAnalyzer.getInstructions().get(0);
+        Assert.assertEquals(Opcode.INVOKE_VIRTUAL, deodexedInstruction.getOpcode());
+
+        MethodReference methodReference = (MethodReference)((Instruction35c)deodexedInstruction).getReference();
+        Assert.assertEquals(method, methodReference);
+    }
+
+    @Test
+    public void testCustomMethodInlineTable_Static() throws IOException {
+        List<ImmutableInstruction> instructions = Lists.newArrayList(
+                new ImmutableInstruction35mi(Opcode.EXECUTE_INLINE, 1, 0, 0, 0, 0, 0, 0),
+                new ImmutableInstruction10x(Opcode.RETURN_VOID));
+
+        ImmutableMethodImplementation methodImpl = new ImmutableMethodImplementation(1, instructions, null, null);
+        ImmutableMethod method = new ImmutableMethod("Lblah;", "blah", null, "V", AccessFlags.STATIC.getValue(), null,
+                null, methodImpl);
+
+        ClassDef classDef = new ImmutableClassDef("Lblah;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null,
+                null, null, null, null, ImmutableList.of(method), null);
+
+        ImmutableDexFile dexFile = new ImmutableDexFile(Opcodes.getDefault(), ImmutableList.of(classDef));
+
+        ImmutableMultiDexContainer container = new ImmutableMultiDexContainer(ImmutableMap.of("classes.dex", dexFile));
+
+        ClassPathResolver resolver = new ClassPathResolver(ImmutableList.<String>of(),
+                ImmutableList.<String>of(), ImmutableList.<String>of(), container.getEntry("classes.dex"));
+        ClassPath classPath = new ClassPath(resolver.getResolvedClassProviders(), false, ClassPath.NOT_ART);
+
+        InlineMethodResolver inlineMethodResolver = new CustomInlineMethodResolver(classPath, "Lblah;->blah()V");
+        MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, inlineMethodResolver, false);
+
+        Instruction deodexedInstruction = methodAnalyzer.getInstructions().get(0);
+        Assert.assertEquals(Opcode.INVOKE_STATIC, deodexedInstruction.getOpcode());
+
+        MethodReference methodReference = (MethodReference)((Instruction35c)deodexedInstruction).getReference();
+        Assert.assertEquals(method, methodReference);
+    }
+
+    @Test
+    public void testCustomMethodInlineTable_Direct() throws IOException {
+        List<ImmutableInstruction> instructions = Lists.newArrayList(
+                new ImmutableInstruction35mi(Opcode.EXECUTE_INLINE, 1, 0, 0, 0, 0, 0, 0),
+                new ImmutableInstruction10x(Opcode.RETURN_VOID));
+
+        ImmutableMethodImplementation methodImpl = new ImmutableMethodImplementation(1, instructions, null, null);
+        ImmutableMethod method = new ImmutableMethod("Lblah;", "blah", null, "V", AccessFlags.PRIVATE.getValue(), null,
+                null, methodImpl);
+
+        ClassDef classDef = new ImmutableClassDef("Lblah;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null,
+                null, null, null, null, ImmutableList.of(method), null);
+
+        ImmutableDexFile dexFile = new ImmutableDexFile(Opcodes.getDefault(), ImmutableList.of(classDef));
+
+        ImmutableMultiDexContainer container = new ImmutableMultiDexContainer(ImmutableMap.of("classes.dex", dexFile));
+
+        ClassPathResolver resolver = new ClassPathResolver(ImmutableList.<String>of(),
+                ImmutableList.<String>of(), ImmutableList.<String>of(), container.getEntry("classes.dex"));
+        ClassPath classPath = new ClassPath(resolver.getResolvedClassProviders(), false, ClassPath.NOT_ART);
+
+        InlineMethodResolver inlineMethodResolver = new CustomInlineMethodResolver(classPath, "Lblah;->blah()V");
+        MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, inlineMethodResolver, false);
+
+        Instruction deodexedInstruction = methodAnalyzer.getInstructions().get(0);
+        Assert.assertEquals(Opcode.INVOKE_DIRECT, deodexedInstruction.getOpcode());
+
+        MethodReference methodReference = (MethodReference)((Instruction35c)deodexedInstruction).getReference();
+        Assert.assertEquals(method, methodReference);
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/analysis/MethodAnalyzerTest.java b/dexlib2/src/test/java/org/jf/dexlib2/analysis/MethodAnalyzerTest.java
new file mode 100644
index 0000000..ae8281a
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/dexlib2/analysis/MethodAnalyzerTest.java
@@ -0,0 +1,260 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis;
+
+import com.google.common.collect.Lists;
+import org.jf.dexlib2.AccessFlags;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.builder.MethodImplementationBuilder;
+import org.jf.dexlib2.builder.instruction.BuilderInstruction10x;
+import org.jf.dexlib2.builder.instruction.BuilderInstruction12x;
+import org.jf.dexlib2.builder.instruction.BuilderInstruction21t;
+import org.jf.dexlib2.builder.instruction.BuilderInstruction22c;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.DexFile;
+import org.jf.dexlib2.iface.Method;
+import org.jf.dexlib2.iface.MethodImplementation;
+import org.jf.dexlib2.immutable.ImmutableClassDef;
+import org.jf.dexlib2.immutable.ImmutableDexFile;
+import org.jf.dexlib2.immutable.ImmutableMethod;
+import org.jf.dexlib2.immutable.ImmutableMethodParameter;
+import org.jf.dexlib2.immutable.reference.ImmutableTypeReference;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+
+import static org.jf.dexlib2.Opcodes.forArtVersion;
+
+public class MethodAnalyzerTest {
+
+    @Test
+    public void testInstanceOfNarrowingEqz_art() throws IOException {
+        MethodImplementationBuilder builder = new MethodImplementationBuilder(2);
+
+        builder.addInstruction(new BuilderInstruction22c(Opcode.INSTANCE_OF, 0, 1,
+                new ImmutableTypeReference("Lmain;")));
+        builder.addInstruction(new BuilderInstruction21t(Opcode.IF_EQZ, 0, builder.getLabel("not_instance_of")));
+        builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID));
+
+        builder.addLabel("not_instance_of");
+        builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID));
+
+        MethodImplementation methodImplementation = builder.getMethodImplementation();
+
+        Method method = new ImmutableMethod("Lmain;", "narrowing",
+                Collections.singletonList(new ImmutableMethodParameter("Ljava/lang/Object;", null, null)), "V",
+                AccessFlags.PUBLIC.getValue(), null, null, methodImplementation);
+        ClassDef classDef = new ImmutableClassDef("Lmain;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null,
+                null, null, null, Collections.singletonList(method));
+        DexFile dexFile = new ImmutableDexFile(forArtVersion(56), Collections.singletonList(classDef));
+
+        ClassPath classPath = new ClassPath(Lists.newArrayList(new DexClassProvider(dexFile)), true, 56);
+        MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, null, false);
+
+        List<AnalyzedInstruction> analyzedInstructions = methodAnalyzer.getAnalyzedInstructions();
+        Assert.assertEquals("Lmain;", analyzedInstructions.get(2).getPreInstructionRegisterType(1).type.getType());
+
+        Assert.assertEquals("Ljava/lang/Object;",
+                analyzedInstructions.get(3).getPreInstructionRegisterType(1).type.getType());
+    }
+
+    @Test
+    public void testInstanceOfNarrowingEqz_dalvik() throws IOException {
+        MethodImplementationBuilder builder = new MethodImplementationBuilder(2);
+
+        builder.addInstruction(new BuilderInstruction22c(Opcode.INSTANCE_OF, 0, 1,
+                new ImmutableTypeReference("Lmain;")));
+        builder.addInstruction(new BuilderInstruction21t(Opcode.IF_EQZ, 0, builder.getLabel("not_instance_of")));
+        builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID));
+
+        builder.addLabel("not_instance_of");
+        builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID));
+
+        MethodImplementation methodImplementation = builder.getMethodImplementation();
+
+        Method method = new ImmutableMethod("Lmain;", "narrowing",
+                Collections.singletonList(new ImmutableMethodParameter("Ljava/lang/Object;", null, null)), "V",
+                AccessFlags.PUBLIC.getValue(), null, null, methodImplementation);
+        ClassDef classDef = new ImmutableClassDef("Lmain;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null,
+                null, null, null, Collections.singletonList(method));
+        DexFile dexFile = new ImmutableDexFile(Opcodes.forApi(19), Collections.singletonList(classDef));
+
+        ClassPath classPath = new ClassPath(new DexClassProvider(dexFile));
+        MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, null, false);
+
+        List<AnalyzedInstruction> analyzedInstructions = methodAnalyzer.getAnalyzedInstructions();
+        Assert.assertEquals("Ljava/lang/Object;",
+                analyzedInstructions.get(2).getPreInstructionRegisterType(1).type.getType());
+
+        Assert.assertEquals("Ljava/lang/Object;",
+                analyzedInstructions.get(3).getPreInstructionRegisterType(1).type.getType());
+    }
+
+    @Test
+    public void testInstanceOfNarrowingNez_art() throws IOException {
+        MethodImplementationBuilder builder = new MethodImplementationBuilder(2);
+
+        builder.addInstruction(new BuilderInstruction22c(Opcode.INSTANCE_OF, 0, 1,
+                new ImmutableTypeReference("Lmain;")));
+        builder.addInstruction(new BuilderInstruction21t(Opcode.IF_NEZ, 0, builder.getLabel("instance_of")));
+        builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID));
+
+        builder.addLabel("instance_of");
+        builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID));
+
+        MethodImplementation methodImplementation = builder.getMethodImplementation();
+
+        Method method = new ImmutableMethod("Lmain;", "narrowing",
+                Collections.singletonList(new ImmutableMethodParameter("Ljava/lang/Object;", null, null)), "V",
+                AccessFlags.PUBLIC.getValue(), null, null, methodImplementation);
+        ClassDef classDef = new ImmutableClassDef("Lmain;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null,
+                null, null, null, Collections.singletonList(method));
+        DexFile dexFile = new ImmutableDexFile(forArtVersion(56), Collections.singletonList(classDef));
+
+        ClassPath classPath = new ClassPath(Lists.newArrayList(new DexClassProvider(dexFile)), true, 56);
+        MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, null, false);
+
+        List<AnalyzedInstruction> analyzedInstructions = methodAnalyzer.getAnalyzedInstructions();
+        Assert.assertEquals("Ljava/lang/Object;",
+                analyzedInstructions.get(2).getPreInstructionRegisterType(1).type.getType());
+
+        Assert.assertEquals("Lmain;", analyzedInstructions.get(3).getPreInstructionRegisterType(1).type.getType());
+    }
+
+    @Test
+    public void testInstanceOfNarrowingNez_dalvik() throws IOException {
+        MethodImplementationBuilder builder = new MethodImplementationBuilder(2);
+
+        builder.addInstruction(new BuilderInstruction22c(Opcode.INSTANCE_OF, 0, 1,
+                new ImmutableTypeReference("Lmain;")));
+        builder.addInstruction(new BuilderInstruction21t(Opcode.IF_NEZ, 0, builder.getLabel("instance_of")));
+        builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID));
+
+        builder.addLabel("instance_of");
+        builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID));
+
+        MethodImplementation methodImplementation = builder.getMethodImplementation();
+
+        Method method = new ImmutableMethod("Lmain;", "narrowing",
+                Collections.singletonList(new ImmutableMethodParameter("Ljava/lang/Object;", null, null)), "V",
+                AccessFlags.PUBLIC.getValue(), null, null, methodImplementation);
+        ClassDef classDef = new ImmutableClassDef("Lmain;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null,
+                null, null, null, Collections.singletonList(method));
+        DexFile dexFile = new ImmutableDexFile(Opcodes.getDefault(), Collections.singletonList(classDef));
+
+        ClassPath classPath = new ClassPath(new DexClassProvider(dexFile));
+        MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, null, false);
+
+        List<AnalyzedInstruction> analyzedInstructions = methodAnalyzer.getAnalyzedInstructions();
+        Assert.assertEquals("Ljava/lang/Object;",
+                analyzedInstructions.get(2).getPreInstructionRegisterType(1).type.getType());
+
+        Assert.assertEquals("Ljava/lang/Object;",
+                analyzedInstructions.get(3).getPreInstructionRegisterType(1).type.getType());
+    }
+
+    @Test
+    public void testInstanceOfNarrowingAfterMove_art() throws IOException {
+        MethodImplementationBuilder builder = new MethodImplementationBuilder(3);
+
+        builder.addInstruction(new BuilderInstruction12x(Opcode.MOVE_OBJECT, 1, 2));
+        builder.addInstruction(new BuilderInstruction22c(Opcode.INSTANCE_OF, 0, 1,
+                new ImmutableTypeReference("Lmain;")));
+        builder.addInstruction(new BuilderInstruction21t(Opcode.IF_EQZ, 0, builder.getLabel("not_instance_of")));
+        builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID));
+
+        builder.addLabel("not_instance_of");
+        builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID));
+
+        MethodImplementation methodImplementation = builder.getMethodImplementation();
+
+        Method method = new ImmutableMethod("Lmain;", "narrowing",
+                Collections.singletonList(new ImmutableMethodParameter("Ljava/lang/Object;", null, null)), "V",
+                AccessFlags.PUBLIC.getValue(), null, null, methodImplementation);
+        ClassDef classDef = new ImmutableClassDef("Lmain;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null,
+                null, null, null, Collections.singletonList(method));
+        DexFile dexFile = new ImmutableDexFile(forArtVersion(56), Collections.singletonList(classDef));
+
+        ClassPath classPath = new ClassPath(Lists.newArrayList(new DexClassProvider(dexFile)), true, 56);
+        MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, null, false);
+
+        List<AnalyzedInstruction> analyzedInstructions = methodAnalyzer.getAnalyzedInstructions();
+        Assert.assertEquals("Lmain;", analyzedInstructions.get(3).getPreInstructionRegisterType(1).type.getType());
+        Assert.assertEquals("Lmain;", analyzedInstructions.get(3).getPreInstructionRegisterType(2).type.getType());
+
+        Assert.assertEquals("Ljava/lang/Object;",
+                analyzedInstructions.get(4).getPreInstructionRegisterType(1).type.getType());
+        Assert.assertEquals("Ljava/lang/Object;",
+                analyzedInstructions.get(4).getPreInstructionRegisterType(2).type.getType());
+    }
+
+    @Test
+    public void testInstanceOfNarrowingAfterMove_dalvik() throws IOException {
+        MethodImplementationBuilder builder = new MethodImplementationBuilder(3);
+
+        builder.addInstruction(new BuilderInstruction12x(Opcode.MOVE_OBJECT, 1, 2));
+        builder.addInstruction(new BuilderInstruction22c(Opcode.INSTANCE_OF, 0, 1,
+                new ImmutableTypeReference("Lmain;")));
+        builder.addInstruction(new BuilderInstruction21t(Opcode.IF_EQZ, 0, builder.getLabel("not_instance_of")));
+        builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID));
+
+        builder.addLabel("not_instance_of");
+        builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID));
+
+        MethodImplementation methodImplementation = builder.getMethodImplementation();
+
+        Method method = new ImmutableMethod("Lmain;", "narrowing",
+                Collections.singletonList(new ImmutableMethodParameter("Ljava/lang/Object;", null, null)), "V",
+                AccessFlags.PUBLIC.getValue(), null, null, methodImplementation);
+        ClassDef classDef = new ImmutableClassDef("Lmain;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null,
+                null, null, null, Collections.singletonList(method));
+        DexFile dexFile = new ImmutableDexFile(Opcodes.getDefault(), Collections.singletonList(classDef));
+
+        ClassPath classPath = new ClassPath(new DexClassProvider(dexFile));
+        MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, null, false);
+
+        List<AnalyzedInstruction> analyzedInstructions = methodAnalyzer.getAnalyzedInstructions();
+        Assert.assertEquals("Ljava/lang/Object;",
+                analyzedInstructions.get(3).getPreInstructionRegisterType(1).type.getType());
+        Assert.assertEquals("Ljava/lang/Object;",
+                analyzedInstructions.get(3).getPreInstructionRegisterType(2).type.getType());
+
+        Assert.assertEquals("Ljava/lang/Object;",
+                analyzedInstructions.get(4).getPreInstructionRegisterType(1).type.getType());
+        Assert.assertEquals("Ljava/lang/Object;",
+                analyzedInstructions.get(4).getPreInstructionRegisterType(2).type.getType());
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/analysis/TestUtils.java b/dexlib2/src/test/java/org/jf/dexlib2/analysis/TestUtils.java
new file mode 100644
index 0000000..c4b678d
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/dexlib2/analysis/TestUtils.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis;
+
+import com.google.common.collect.ImmutableSet;
+import org.jf.dexlib2.AccessFlags;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.immutable.ImmutableClassDef;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+public class TestUtils {
+    public static ClassDef makeClassDef(@Nonnull String classType, @Nullable String superType, String... interfaces) {
+        return new ImmutableClassDef(classType, 0, superType, ImmutableSet.copyOf(interfaces),
+                null, null, null, null, null, null);
+    }
+
+    public static ClassDef makeInterfaceDef(@Nonnull String classType, String... interfaces) {
+        return new ImmutableClassDef(classType, AccessFlags.INTERFACE.getValue(), "Ljava/lang/Object;",
+                ImmutableSet.copyOf(interfaces), null, null, null, null, null, null);
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/analysis/util/SuperclassChainTest.java b/dexlib2/src/test/java/org/jf/dexlib2/analysis/util/SuperclassChainTest.java
new file mode 100644
index 0000000..78bc8a5
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/dexlib2/analysis/util/SuperclassChainTest.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis.util;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import junit.framework.Assert;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.analysis.ClassPath;
+import org.jf.dexlib2.analysis.DexClassProvider;
+import org.jf.dexlib2.analysis.TestUtils;
+import org.jf.dexlib2.analysis.TypeProto;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.immutable.ImmutableDexFile;
+import org.junit.Test;
+
+import java.io.IOException;
+
+public class SuperclassChainTest {
+
+    @Test
+    public void testGetSuperclassChain() throws IOException {
+        ClassDef objectClassDef = TestUtils.makeClassDef("Ljava/lang/Object;", null);
+        ClassDef oneClassDef = TestUtils.makeClassDef("Ltest/one;", "Ljava/lang/Object;");
+        ClassDef twoClassDef = TestUtils.makeClassDef("Ltest/two;", "Ltest/one;");
+        ClassDef threeClassDef = TestUtils.makeClassDef("Ltest/three;", "Ltest/two;");
+
+        ImmutableSet<ClassDef> classes = ImmutableSet.<ClassDef>of(
+                objectClassDef, oneClassDef, twoClassDef, threeClassDef);
+
+        ClassPath classPath = new ClassPath(new DexClassProvider(new ImmutableDexFile(Opcodes.getDefault(), classes)));
+
+        TypeProto objectClassProto = classPath.getClass("Ljava/lang/Object;");
+        TypeProto oneClassProto = classPath.getClass("Ltest/one;");
+        TypeProto twoClassProto = classPath.getClass("Ltest/two;");
+        TypeProto threeClassProto = classPath.getClass("Ltest/three;");
+
+        Assert.assertEquals(
+                ImmutableList.<TypeProto>of(),
+                ImmutableList.copyOf(TypeProtoUtils.getSuperclassChain(objectClassProto)));
+
+        Assert.assertEquals(
+                ImmutableList.<TypeProto>of(objectClassProto),
+                ImmutableList.copyOf(TypeProtoUtils.getSuperclassChain(oneClassProto)));
+
+        Assert.assertEquals(
+                ImmutableList.<TypeProto>of(oneClassProto, objectClassProto),
+                ImmutableList.copyOf(TypeProtoUtils.getSuperclassChain(twoClassProto)));
+
+        Assert.assertEquals(
+                ImmutableList.<TypeProto>of(twoClassProto, oneClassProto, objectClassProto),
+                ImmutableList.copyOf(TypeProtoUtils.getSuperclassChain(threeClassProto)));
+    }
+
+    @Test
+    public void testGetSuperclassChain_Unresolved() throws IOException {
+        // Ltest/one; isn't defined
+
+        ClassDef twoClassDef = TestUtils.makeClassDef("Ltest/two;", "Ltest/one;");
+        ClassDef threeClassDef = TestUtils.makeClassDef("Ltest/three;", "Ltest/two;");
+        ImmutableSet<ClassDef> classes = ImmutableSet.<ClassDef>of(twoClassDef, threeClassDef);
+        ClassPath classPath = new ClassPath(new DexClassProvider(new ImmutableDexFile(Opcodes.getDefault(), classes)));
+
+        TypeProto unknownClassProto = classPath.getUnknownClass();
+        TypeProto oneClassProto = classPath.getClass("Ltest/one;");
+        TypeProto twoClassProto = classPath.getClass("Ltest/two;");
+        TypeProto threeClassProto = classPath.getClass("Ltest/three;");
+
+        Assert.assertEquals(
+                ImmutableList.<TypeProto>of(oneClassProto, unknownClassProto),
+                ImmutableList.copyOf(TypeProtoUtils.getSuperclassChain(twoClassProto)));
+
+        Assert.assertEquals(
+                ImmutableList.<TypeProto>of(twoClassProto, oneClassProto, unknownClassProto),
+                ImmutableList.copyOf(TypeProtoUtils.getSuperclassChain(threeClassProto)));
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/builder/FixGotoTest.java b/dexlib2/src/test/java/org/jf/dexlib2/builder/FixGotoTest.java
new file mode 100644
index 0000000..5b1be22
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/dexlib2/builder/FixGotoTest.java
@@ -0,0 +1,122 @@
+package org.jf.dexlib2.builder;
+
+import com.google.common.collect.Lists;
+import junit.framework.Assert;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.instruction.BuilderInstruction10t;
+import org.jf.dexlib2.builder.instruction.BuilderInstruction10x;
+import org.jf.dexlib2.builder.instruction.BuilderInstruction20t;
+import org.jf.dexlib2.iface.MethodImplementation;
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.dexlib2.iface.instruction.OffsetInstruction;
+import org.junit.Test;
+
+import java.util.List;
+
+public class FixGotoTest {
+    @Test
+    public void testFixGotoToGoto16() {
+        MethodImplementationBuilder builder = new MethodImplementationBuilder(1);
+
+        Label gotoTarget = builder.getLabel("gotoTarget");
+        builder.addInstruction(new BuilderInstruction10t(Opcode.GOTO, gotoTarget));
+
+        for (int i=0; i<500; i++) {
+            builder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+        }
+
+        builder.addLabel("gotoTarget");
+        builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID));
+
+        MethodImplementation impl = builder.getMethodImplementation();
+
+        List<? extends Instruction> instructions = Lists.newArrayList(impl.getInstructions());
+        Assert.assertEquals(502, instructions.size());
+
+        Assert.assertEquals(Opcode.GOTO_16, instructions.get(0).getOpcode());
+        Assert.assertEquals(502, ((OffsetInstruction)instructions.get(0)).getCodeOffset());
+    }
+
+    @Test
+    public void testFixGotoToGoto32() {
+        MethodImplementationBuilder builder = new MethodImplementationBuilder(1);
+
+        Label gotoTarget = builder.getLabel("gotoTarget");
+        builder.addInstruction(new BuilderInstruction10t(Opcode.GOTO, gotoTarget));
+
+        for (int i=0; i<70000; i++) {
+            builder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+        }
+
+        builder.addLabel("gotoTarget");
+        builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID));
+
+        MethodImplementation impl = builder.getMethodImplementation();
+
+        List<? extends Instruction> instructions = Lists.newArrayList(impl.getInstructions());
+        Assert.assertEquals(70002, instructions.size());
+
+        Assert.assertEquals(Opcode.GOTO_32, instructions.get(0).getOpcode());
+        Assert.assertEquals(70003, ((OffsetInstruction)instructions.get(0)).getCodeOffset());
+    }
+
+    @Test
+    public void testFixGoto16ToGoto32() {
+        MethodImplementationBuilder builder = new MethodImplementationBuilder(1);
+
+        Label gotoTarget = builder.getLabel("gotoTarget");
+        builder.addInstruction(new BuilderInstruction20t(Opcode.GOTO_16, gotoTarget));
+
+        for (int i=0; i<70000; i++) {
+            builder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+        }
+
+        builder.addLabel("gotoTarget");
+        builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID));
+
+        MethodImplementation impl = builder.getMethodImplementation();
+
+        List<? extends Instruction> instructions = Lists.newArrayList(impl.getInstructions());
+        Assert.assertEquals(70002, instructions.size());
+
+        Assert.assertEquals(Opcode.GOTO_32, instructions.get(0).getOpcode());
+        Assert.assertEquals(70003, ((OffsetInstruction)instructions.get(0)).getCodeOffset());
+    }
+
+    @Test
+    public void testFixGotoCascading() {
+        MethodImplementationBuilder builder = new MethodImplementationBuilder(1);
+
+        Label goto16Target = builder.getLabel("goto16Target");
+        builder.addInstruction(new BuilderInstruction20t(Opcode.GOTO_16, goto16Target));
+
+        for (int i=0; i<1000; i++) {
+            builder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+        }
+
+        Label gotoTarget = builder.getLabel("gotoTarget");
+        builder.addInstruction(new BuilderInstruction10t(Opcode.GOTO, gotoTarget));
+
+        for (int i=0; i<499; i++) {
+            builder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+        }
+
+        builder.addLabel("gotoTarget");
+
+        for (int i=0; i<31265; i++) {
+            builder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+        }
+
+        builder.addLabel("goto16Target");
+        builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID));
+
+        MethodImplementation impl = builder.getMethodImplementation();
+
+        List<? extends Instruction> instructions = Lists.newArrayList(impl.getInstructions());
+        Assert.assertEquals(32767, instructions.size());
+
+        Assert.assertEquals(Opcode.GOTO_32, instructions.get(0).getOpcode());
+        Assert.assertEquals(32769, ((OffsetInstruction)instructions.get(0)).getCodeOffset());
+
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/builder/FixOffsetsTest.java b/dexlib2/src/test/java/org/jf/dexlib2/builder/FixOffsetsTest.java
new file mode 100644
index 0000000..749c735
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/dexlib2/builder/FixOffsetsTest.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder;
+
+import com.google.common.collect.Lists;
+import junit.framework.Assert;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.instruction.BuilderInstruction10t;
+import org.jf.dexlib2.builder.instruction.BuilderInstruction10x;
+import org.jf.dexlib2.iface.ExceptionHandler;
+import org.jf.dexlib2.iface.MethodImplementation;
+import org.jf.dexlib2.iface.TryBlock;
+import org.jf.dexlib2.iface.debug.DebugItem;
+import org.jf.dexlib2.iface.debug.LineNumber;
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.dexlib2.iface.instruction.OffsetInstruction;
+import org.junit.Test;
+
+import java.util.List;
+
+public class FixOffsetsTest {
+    @Test
+    public void testFixOffsets() {
+        MethodImplementationBuilder builder = new MethodImplementationBuilder(1);
+
+        Label firstGotoTarget = builder.getLabel("firstGotoTarget");
+        builder.addInstruction(new BuilderInstruction10t(Opcode.GOTO, firstGotoTarget));
+
+        builder.addLineNumber(1);
+
+        for (int i=0; i<250; i++) {
+            builder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+        }
+
+        builder.addLabel("tryStart");
+
+        builder.addLineNumber(2);
+
+        for (int i=0; i<250; i++) {
+            builder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+        }
+
+        builder.addLineNumber(3);
+
+        Label secondGotoTarget = builder.getLabel("secondGotoTarget");
+        builder.addInstruction(new BuilderInstruction10t(Opcode.GOTO, secondGotoTarget));
+
+
+        builder.addLineNumber(4);
+        builder.addLabel("handler");
+
+        for (int i=0; i<500; i++) {
+            builder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+        }
+
+        builder.addLineNumber(5);
+
+        builder.addLabel("tryEnd");
+
+        builder.addLabel("firstGotoTarget");
+        builder.addLabel("secondGotoTarget");
+        builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID));
+
+        Label tryStart = builder.getLabel("tryStart");
+        Label tryEnd = builder.getLabel("tryEnd");
+        Label handler = builder.getLabel("handler");
+
+        builder.addCatch(tryStart, tryEnd, handler);
+
+        MethodImplementation impl = builder.getMethodImplementation();
+
+        List<? extends Instruction> instructions = Lists.newArrayList(impl.getInstructions());
+        Assert.assertEquals(1003, instructions.size());
+
+        Assert.assertEquals(Opcode.GOTO_16, instructions.get(0).getOpcode());
+        Assert.assertEquals(1004, ((OffsetInstruction)instructions.get(0)).getCodeOffset());
+
+        Assert.assertEquals(Opcode.GOTO_16, instructions.get(501).getOpcode());
+        Assert.assertEquals(502, ((OffsetInstruction)instructions.get(501)).getCodeOffset());
+
+        List<? extends TryBlock<? extends ExceptionHandler>> exceptionHandlers = impl.getTryBlocks();
+
+        Assert.assertEquals(1, exceptionHandlers.size());
+        Assert.assertEquals(252, exceptionHandlers.get(0).getStartCodeAddress());
+        Assert.assertEquals(752, exceptionHandlers.get(0).getCodeUnitCount());
+
+        Assert.assertEquals(1, exceptionHandlers.get(0).getExceptionHandlers().size());
+
+        ExceptionHandler exceptionHandler = exceptionHandlers.get(0).getExceptionHandlers().get(0);
+        Assert.assertEquals(504, exceptionHandler.getHandlerCodeAddress());
+
+        List<DebugItem> debugItems = Lists.newArrayList(impl.getDebugItems());
+
+        Assert.assertEquals(5, debugItems.size());
+
+        Assert.assertEquals(1, ((LineNumber)debugItems.get(0)).getLineNumber());
+        Assert.assertEquals(2, debugItems.get(0).getCodeAddress());
+
+        Assert.assertEquals(2, ((LineNumber)debugItems.get(1)).getLineNumber());
+        Assert.assertEquals(252, debugItems.get(1).getCodeAddress());
+
+        Assert.assertEquals(3, ((LineNumber)debugItems.get(2)).getLineNumber());
+        Assert.assertEquals(502, debugItems.get(2).getCodeAddress());
+
+        Assert.assertEquals(4, ((LineNumber)debugItems.get(3)).getLineNumber());
+        Assert.assertEquals(504, debugItems.get(3).getCodeAddress());
+
+        Assert.assertEquals(5, ((LineNumber)debugItems.get(4)).getLineNumber());
+        Assert.assertEquals(1004, debugItems.get(4).getCodeAddress());
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/builder/LocatedItemsTest.java b/dexlib2/src/test/java/org/jf/dexlib2/builder/LocatedItemsTest.java
new file mode 100644
index 0000000..a194799
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/dexlib2/builder/LocatedItemsTest.java
@@ -0,0 +1,46 @@
+package org.jf.dexlib2.builder;
+
+import com.google.common.collect.Sets;
+import org.jf.dexlib2.builder.debug.BuilderLineNumber;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class LocatedItemsTest {
+
+    private List<BuilderDebugItem> createItems(int count) {
+        List<BuilderDebugItem> items = new ArrayList<>();
+        for(int i = 0; i < count; ++i) {
+            items.add(new BuilderLineNumber(i));
+        }
+        return items;
+    }
+
+    private void doTestMergeIntoKeepsOrderOfDebugItems(int countLocation1, int countLocation2) {
+        MethodLocation location1 = new MethodLocation(null, 123, 1);
+        MethodLocation location2 = new MethodLocation(null, 456, 2);
+
+        List<BuilderDebugItem> items1 = createItems(countLocation1);
+        List<BuilderDebugItem> items2 = createItems(countLocation2);
+        location1.getDebugItems().addAll(items1);
+        location2.getDebugItems().addAll(items2);
+
+        location1.mergeInto(location2);
+
+        Assert.assertEquals(Sets.newHashSet(), location1.getDebugItems());
+        // items1 appear BEFORE items2
+        List<BuilderDebugItem> expectedItems = new ArrayList<>(items1);
+        expectedItems.addAll(items2);
+        Assert.assertEquals(expectedItems, new ArrayList<>(location2.getDebugItems()));
+    }
+
+    @Test
+    public void testMergeIntoKeepsOrderOfDebugItems() {
+        doTestMergeIntoKeepsOrderOfDebugItems(2, 2);
+        doTestMergeIntoKeepsOrderOfDebugItems(0, 0);
+        doTestMergeIntoKeepsOrderOfDebugItems(0, 2);
+        doTestMergeIntoKeepsOrderOfDebugItems(2, 0);
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/builder/MutableMethodImplementationTest.java b/dexlib2/src/test/java/org/jf/dexlib2/builder/MutableMethodImplementationTest.java
new file mode 100644
index 0000000..0df5ab3
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/dexlib2/builder/MutableMethodImplementationTest.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.instruction.BuilderInstruction10x;
+import org.jf.dexlib2.builder.instruction.BuilderInstruction32x;
+import org.jf.dexlib2.iface.MethodImplementation;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class MutableMethodImplementationTest {
+
+    @Test
+    public void testTryEndAtEndOfMethod() {
+        MethodImplementationBuilder builder = new MethodImplementationBuilder(10);
+
+        Label startLabel = builder.addLabel("start");
+        builder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+        builder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+        builder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+        builder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+        builder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+        builder.addInstruction(new BuilderInstruction32x(Opcode.MOVE_16, 0, 0));
+        Label endLabel = builder.addLabel("end");
+
+        builder.addCatch(startLabel, endLabel, startLabel);
+
+        MethodImplementation methodImplementation = builder.getMethodImplementation();
+
+        Assert.assertEquals(0, methodImplementation.getTryBlocks().get(0).getStartCodeAddress());
+        Assert.assertEquals(8, methodImplementation.getTryBlocks().get(0).getCodeUnitCount());
+
+        methodImplementation = new MutableMethodImplementation(methodImplementation);
+
+        Assert.assertEquals(0, methodImplementation.getTryBlocks().get(0).getStartCodeAddress());
+        Assert.assertEquals(8, methodImplementation.getTryBlocks().get(0).getCodeUnitCount());
+    }
+
+    @Test
+    public void testNewLabelByAddress() {
+        MethodImplementationBuilder builder = new MethodImplementationBuilder(10);
+
+        builder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+        builder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+        builder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+        builder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+        builder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+        builder.addInstruction(new BuilderInstruction32x(Opcode.MOVE_16, 0, 0));
+
+        MutableMethodImplementation mutableMethodImplementation =
+                new MutableMethodImplementation(builder.getMethodImplementation());
+
+        mutableMethodImplementation.addCatch(
+                mutableMethodImplementation.newLabelForAddress(0),
+                mutableMethodImplementation.newLabelForAddress(8),
+                mutableMethodImplementation.newLabelForAddress(1));
+
+        Assert.assertEquals(0, mutableMethodImplementation.getTryBlocks().get(0).getStartCodeAddress());
+        Assert.assertEquals(8, mutableMethodImplementation.getTryBlocks().get(0).getCodeUnitCount());
+        Assert.assertEquals(1, mutableMethodImplementation.getTryBlocks().get(0).getExceptionHandlers().get(0)
+                .getHandlerCodeAddress());
+    }
+
+    @Test
+    public void testNewLabelByIndex() {
+        MethodImplementationBuilder builder = new MethodImplementationBuilder(10);
+
+        builder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+        builder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+        builder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+        builder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+        builder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+        builder.addInstruction(new BuilderInstruction32x(Opcode.MOVE_16, 0, 0));
+
+        MutableMethodImplementation mutableMethodImplementation =
+                new MutableMethodImplementation(builder.getMethodImplementation());
+
+        mutableMethodImplementation.addCatch(
+                mutableMethodImplementation.newLabelForIndex(0),
+                mutableMethodImplementation.newLabelForIndex(6),
+                mutableMethodImplementation.newLabelForIndex(1));
+
+        Assert.assertEquals(0, mutableMethodImplementation.getTryBlocks().get(0).getStartCodeAddress());
+        Assert.assertEquals(8, mutableMethodImplementation.getTryBlocks().get(0).getCodeUnitCount());
+        Assert.assertEquals(1, mutableMethodImplementation.getTryBlocks().get(0).getExceptionHandlers().get(0)
+                .getHandlerCodeAddress());
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/builder/PayloadAlignmentTest.java b/dexlib2/src/test/java/org/jf/dexlib2/builder/PayloadAlignmentTest.java
new file mode 100644
index 0000000..7040818
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/dexlib2/builder/PayloadAlignmentTest.java
@@ -0,0 +1,251 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.builder;
+
+import com.google.common.collect.Lists;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.builder.instruction.*;
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.dexlib2.iface.instruction.OffsetInstruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction31t;
+import org.jf.dexlib2.iface.instruction.formats.PackedSwitchPayload;
+import org.jf.dexlib2.iface.instruction.formats.SparseSwitchPayload;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.List;
+
+public class PayloadAlignmentTest {
+
+    @Test
+    public void testPayloadAlignmentRemoveNop() {
+        MethodImplementationBuilder implBuilder = new MethodImplementationBuilder(10);
+
+        implBuilder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+        implBuilder.addInstruction(new BuilderArrayPayload(4, null));
+
+        List<? extends Instruction> instructions =
+                Lists.newArrayList(implBuilder.getMethodImplementation().getInstructions());
+
+        Assert.assertEquals(instructions.size(), 1);
+
+        Instruction instruction = instructions.get(0);
+
+        Assert.assertEquals(instruction.getOpcode(), Opcode.ARRAY_PAYLOAD);
+    }
+
+    @Test
+    public void testPayloadAlignmentAddNop() {
+        MethodImplementationBuilder implBuilder = new MethodImplementationBuilder(10);
+
+        implBuilder.addInstruction(new BuilderInstruction12x(Opcode.MOVE, 0, 0));
+        implBuilder.addInstruction(new BuilderArrayPayload(4, null));
+
+        List<? extends Instruction> instructions =
+                Lists.newArrayList(implBuilder.getMethodImplementation().getInstructions());
+
+        Assert.assertEquals(instructions.size(), 3);
+
+        Instruction instruction = instructions.get(0);
+        Assert.assertEquals(instruction.getOpcode(), Opcode.MOVE);
+
+        instruction = instructions.get(1);
+        Assert.assertEquals(instruction.getOpcode(), Opcode.NOP);
+
+        instruction = instructions.get(2);
+        Assert.assertEquals(instruction.getOpcode(), Opcode.ARRAY_PAYLOAD);
+    }
+
+    @Test
+    public void testPayloadAlignmentRemoveNopWithReferent() {
+        MethodImplementationBuilder implBuilder = new MethodImplementationBuilder(10);
+
+        Label label = implBuilder.getLabel("array_payload");
+        implBuilder.addInstruction(new BuilderInstruction31t(Opcode.FILL_ARRAY_DATA, 0, label));
+        implBuilder.addInstruction(new BuilderInstruction12x(Opcode.MOVE, 0, 0));
+        implBuilder.addInstruction(new BuilderInstruction12x(Opcode.MOVE, 0, 0));
+        implBuilder.addInstruction(new BuilderInstruction12x(Opcode.MOVE, 0, 0));
+        implBuilder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+        implBuilder.addLabel("array_payload");
+        implBuilder.addInstruction(new BuilderArrayPayload(4, null));
+
+        List<Instruction> instructions = Lists.newArrayList(implBuilder.getMethodImplementation().getInstructions());
+
+        checkInstructions(instructions,
+                new Opcode[]{Opcode.FILL_ARRAY_DATA,
+                        Opcode.MOVE,
+                        Opcode.MOVE,
+                        Opcode.MOVE,
+                        Opcode.ARRAY_PAYLOAD});
+
+        Instruction31t referent = (Instruction31t)instructions.get(0);
+        Assert.assertEquals(6, referent.getCodeOffset());
+    }
+
+    @Test
+    public void testPayloadAlignmentAddNopWithReferent() {
+        MethodImplementationBuilder implBuilder = new MethodImplementationBuilder(10);
+
+        Label label = implBuilder.getLabel("array_payload");
+        implBuilder.addInstruction(new BuilderInstruction31t(Opcode.FILL_ARRAY_DATA, 0, label));
+        implBuilder.addInstruction(new BuilderInstruction12x(Opcode.MOVE, 0, 0));
+        implBuilder.addInstruction(new BuilderInstruction12x(Opcode.MOVE, 0, 0));
+        implBuilder.addInstruction(new BuilderInstruction12x(Opcode.MOVE, 0, 0));
+        implBuilder.addInstruction(new BuilderInstruction12x(Opcode.MOVE, 0, 0));
+        implBuilder.addLabel("array_payload");
+        implBuilder.addInstruction(new BuilderArrayPayload(4, null));
+
+        List<Instruction> instructions = Lists.newArrayList(implBuilder.getMethodImplementation().getInstructions());
+
+        checkInstructions(instructions,
+                new Opcode[]{Opcode.FILL_ARRAY_DATA,
+                    Opcode.MOVE,
+                    Opcode.MOVE,
+                    Opcode.MOVE,
+                    Opcode.MOVE,
+                    Opcode.NOP,
+                    Opcode.ARRAY_PAYLOAD});
+
+        Instruction31t referent = (Instruction31t)instructions.get(0);
+        Assert.assertEquals(8, referent.getCodeOffset());
+    }
+
+    private static void checkInstructions(List<Instruction> instructions, Opcode[] expectedOpcodes) {
+        Assert.assertEquals(expectedOpcodes.length, instructions.size());
+
+        for (int i=0; i<expectedOpcodes.length; i++) {
+            Assert.assertEquals(instructions.get(i).getOpcode(), expectedOpcodes[i]);
+        }
+    }
+
+    @Test
+    public void testPackedSwitchAlignment() {
+        MethodImplementationBuilder implBuilder = new MethodImplementationBuilder(10);
+
+        implBuilder.addLabel("switch_target_1");
+        implBuilder.addInstruction(new BuilderInstruction10t(Opcode.GOTO, implBuilder.getLabel("goto_target")));
+
+        implBuilder.addLabel("switch_payload");
+        implBuilder.addInstruction(new BuilderPackedSwitchPayload(0, Lists.newArrayList(
+                implBuilder.getLabel("switch_target_1"),
+                implBuilder.getLabel("switch_target_2"),
+                implBuilder.getLabel("switch_target_3"))));
+
+        implBuilder.addLabel("goto_target");
+        implBuilder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+        implBuilder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+
+        implBuilder.addLabel("switch_target_2");
+        implBuilder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+
+        implBuilder.addLabel("switch_target_3");
+        implBuilder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+
+        implBuilder.addInstruction(new BuilderInstruction31t(Opcode.PACKED_SWITCH, 0,
+                implBuilder.getLabel("switch_payload")));
+
+        List<Instruction> instructions = Lists.newArrayList(implBuilder.getMethodImplementation().getInstructions());
+
+        checkInstructions(instructions,
+                new Opcode[]{Opcode.GOTO,
+                        Opcode.NOP,
+                        Opcode.PACKED_SWITCH_PAYLOAD,
+                        Opcode.NOP,
+                        Opcode.NOP,
+                        Opcode.NOP,
+                        Opcode.NOP,
+                        Opcode.PACKED_SWITCH});
+
+        OffsetInstruction gotoInstruction = (OffsetInstruction)instructions.get(0);
+        Assert.assertEquals(12, gotoInstruction.getCodeOffset());
+
+        PackedSwitchPayload payload = (PackedSwitchPayload)instructions.get(2);
+        Assert.assertEquals(3, payload.getSwitchElements().size());
+        Assert.assertEquals(-16, payload.getSwitchElements().get(0).getOffset());
+        Assert.assertEquals(-2, payload.getSwitchElements().get(1).getOffset());
+        Assert.assertEquals(-1, payload.getSwitchElements().get(2).getOffset());
+
+        OffsetInstruction referent = (OffsetInstruction)instructions.get(7);
+        Assert.assertEquals(-14, referent.getCodeOffset());
+    }
+
+    @Test
+    public void testSparseSwitchAlignment() {
+        MethodImplementationBuilder implBuilder = new MethodImplementationBuilder(10);
+
+        implBuilder.addLabel("switch_target_1");
+        implBuilder.addInstruction(new BuilderInstruction10t(Opcode.GOTO, implBuilder.getLabel("goto_target")));
+
+        implBuilder.addLabel("switch_payload");
+        implBuilder.addInstruction(new BuilderSparseSwitchPayload(Lists.newArrayList(
+                new SwitchLabelElement(0, implBuilder.getLabel("switch_target_1")),
+                new SwitchLabelElement(5, implBuilder.getLabel("switch_target_2")),
+                new SwitchLabelElement(10, implBuilder.getLabel("switch_target_3")))));
+
+        implBuilder.addLabel("goto_target");
+        implBuilder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+        implBuilder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+
+        implBuilder.addLabel("switch_target_2");
+        implBuilder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+
+        implBuilder.addLabel("switch_target_3");
+        implBuilder.addInstruction(new BuilderInstruction10x(Opcode.NOP));
+
+        implBuilder.addInstruction(new BuilderInstruction31t(Opcode.SPARSE_SWITCH, 0,
+                implBuilder.getLabel("switch_payload")));
+
+        List<Instruction> instructions = Lists.newArrayList(implBuilder.getMethodImplementation().getInstructions());
+
+        checkInstructions(instructions,
+                new Opcode[]{Opcode.GOTO,
+                        Opcode.NOP,
+                        Opcode.SPARSE_SWITCH_PAYLOAD,
+                        Opcode.NOP,
+                        Opcode.NOP,
+                        Opcode.NOP,
+                        Opcode.NOP,
+                        Opcode.SPARSE_SWITCH});
+
+        OffsetInstruction gotoInstruction = (OffsetInstruction)instructions.get(0);
+        Assert.assertEquals(16, gotoInstruction.getCodeOffset());
+
+        SparseSwitchPayload payload = (SparseSwitchPayload)instructions.get(2);
+        Assert.assertEquals(3, payload.getSwitchElements().size());
+        Assert.assertEquals(-20, payload.getSwitchElements().get(0).getOffset());
+        Assert.assertEquals(-2, payload.getSwitchElements().get(1).getOffset());
+        Assert.assertEquals(-1, payload.getSwitchElements().get(2).getOffset());
+
+        OffsetInstruction referent = (OffsetInstruction)instructions.get(7);
+        Assert.assertEquals(-18, referent.getCodeOffset());
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/BaseDexBufferTest.java b/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/BaseDexBufferTest.java
new file mode 100644
index 0000000..790c25b
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/BaseDexBufferTest.java
@@ -0,0 +1,263 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked;
+
+import junit.framework.Assert;
+import org.jf.util.ExceptionWithContext;
+import org.junit.Test;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.Random;
+
+public class BaseDexBufferTest {
+    @Test
+    public void testReadSmallUintSuccess() {
+        DexBuffer dexBuf = new DexBuffer(new byte[] {0x11, 0x22, 0x33, 0x44});
+        Assert.assertEquals(0x44332211, dexBuf.readSmallUint(0));
+
+        dexBuf = new DexBuffer(new byte[] {0x00, 0x00, 0x00, 0x00});
+        Assert.assertEquals(0, dexBuf.readSmallUint(0));
+
+        dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, 0x7f});
+        Assert.assertEquals(0x7fffffff, dexBuf.readSmallUint(0));
+    }
+
+    @Test(expected=ExceptionWithContext.class)
+    public void testReadSmallUintTooLarge1() {
+        DexBuffer dexBuf = new DexBuffer(new byte[] {0x00, 0x00, 0x00, (byte)0x80});
+        dexBuf.readSmallUint(0);
+    }
+
+    @Test(expected=ExceptionWithContext.class)
+    public void testReadSmallUintTooLarge2() {
+        DexBuffer dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, (byte)0x80});
+        dexBuf.readSmallUint(0);
+    }
+
+    @Test(expected=ExceptionWithContext.class)
+    public void testReadSmallUintTooLarge3() {
+        DexBuffer dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff});
+        dexBuf.readSmallUint(0);
+    }
+
+    @Test
+    public void testReadOptionalUintSuccess() {
+        DexBuffer dexBuf = new DexBuffer(new byte[] {0x11, 0x22, 0x33, 0x44});
+        Assert.assertEquals(0x44332211, dexBuf.readSmallUint(0));
+
+        dexBuf = new DexBuffer(new byte[] {0x00, 0x00, 0x00, 0x00});
+        Assert.assertEquals(0, dexBuf.readSmallUint(0));
+
+        dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, 0x7f});
+        Assert.assertEquals(0x7fffffff, dexBuf.readSmallUint(0));
+
+        dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff});
+        Assert.assertEquals(-1, dexBuf.readOptionalUint(0));
+    }
+
+    @Test(expected=ExceptionWithContext.class)
+    public void testReadOptionalUintTooLarge1() {
+        DexBuffer dexBuf = new DexBuffer(new byte[] {0x00, 0x00, 0x00, (byte)0x80});
+        dexBuf.readSmallUint(0);
+    }
+
+    @Test(expected=ExceptionWithContext.class)
+    public void testReadOptionalUintTooLarge2() {
+        DexBuffer dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, (byte)0x80});
+        dexBuf.readSmallUint(0);
+    }
+
+    @Test(expected=ExceptionWithContext.class)
+    public void testReadOptionalUintTooLarge3() {
+        DexBuffer dexBuf = new DexBuffer(new byte[] {(byte)0xfe, (byte)0xff, (byte)0xff, (byte)0xff});
+        dexBuf.readSmallUint(0);
+    }
+
+    @Test
+    public void testReadUshort() {
+        DexBuffer dexBuf = new DexBuffer(new byte[] {0x11, 0x22});
+        Assert.assertEquals(dexBuf.readUshort(0), 0x2211);
+
+        dexBuf = new DexBuffer(new byte[] {0x00, 0x00});
+        Assert.assertEquals(dexBuf.readUshort(0), 0);
+
+        dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0xff});
+        Assert.assertEquals(dexBuf.readUshort(0), 0xffff);
+
+        dexBuf = new DexBuffer(new byte[] {(byte)0x00, (byte)0x80});
+        Assert.assertEquals(dexBuf.readUshort(0), 0x8000);
+
+        dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0x7f});
+        Assert.assertEquals(dexBuf.readUshort(0), 0x7fff);
+    }
+
+    @Test
+    public void testReadUbyte() {
+        byte[] buf = new byte[1];
+        DexBuffer dexBuf = new DexBuffer(buf);
+
+        for (int i=0; i<=0xff; i++) {
+            buf[0] = (byte)i;
+            Assert.assertEquals(i, dexBuf.readUbyte(0));
+        }
+    }
+
+    @Test
+    public void testReadLong() {
+        DexBuffer dexBuf = new DexBuffer(new byte[] {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77});
+        Assert.assertEquals(0x7766554433221100L, dexBuf.readLong(0));
+
+        dexBuf = new DexBuffer(new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00});
+        Assert.assertEquals(0, dexBuf.readLong(0));
+
+        dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff,
+                (byte)0xff, (byte)0xff, (byte)0xff, 0x7f});
+        Assert.assertEquals(Long.MAX_VALUE, dexBuf.readLong(0));
+
+        dexBuf = new DexBuffer(new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, (byte)0x80});
+        Assert.assertEquals(Long.MIN_VALUE, dexBuf.readLong(0));
+
+        dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff,
+                (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x80});
+        Assert.assertEquals(0x80ffffffffffffffL, dexBuf.readLong(0));
+
+        dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff,
+                (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff});
+        Assert.assertEquals(-1, dexBuf.readLong(0));
+
+    }
+
+    @Test
+    public void testReadInt() {
+        DexBuffer dexBuf = new DexBuffer(new byte[] {0x11, 0x22, 0x33, 0x44});
+        Assert.assertEquals(0x44332211, dexBuf.readInt(0));
+
+        dexBuf = new DexBuffer(new byte[] {0x00, 0x00, 0x00, 0x00});
+        Assert.assertEquals(0, dexBuf.readInt(0));
+
+        dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, 0x7f});
+        Assert.assertEquals(Integer.MAX_VALUE, dexBuf.readInt(0));
+
+        dexBuf = new DexBuffer(new byte[] {0x00, 0x00, 0x00, (byte)0x80});
+        Assert.assertEquals(Integer.MIN_VALUE, dexBuf.readInt(0));
+
+        dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, (byte)0x80});
+        Assert.assertEquals(0x80ffffff, dexBuf.readInt(0));
+
+        dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff});
+        Assert.assertEquals(-1, dexBuf.readInt(0));
+    }
+
+    @Test
+    public void testReadShort() {
+        DexBuffer dexBuf = new DexBuffer(new byte[] {0x11, 0x22});
+        Assert.assertEquals(dexBuf.readShort(0), 0x2211);
+
+        dexBuf = new DexBuffer(new byte[] {0x00, 0x00});
+        Assert.assertEquals(dexBuf.readShort(0), 0);
+
+        dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0xff});
+        Assert.assertEquals(dexBuf.readShort(0), -1);
+
+        dexBuf = new DexBuffer(new byte[] {(byte)0x00, (byte)0x80});
+        Assert.assertEquals(dexBuf.readShort(0), Short.MIN_VALUE);
+
+        dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0x7f});
+        Assert.assertEquals(dexBuf.readShort(0), 0x7fff);
+
+        dexBuf = new DexBuffer(new byte[] {(byte)0xff, (byte)0x80});
+        Assert.assertEquals(dexBuf.readShort(0), 0xffff80ff);
+    }
+
+    @Test
+    public void testReadByte() {
+        byte[] buf = new byte[1];
+        DexBuffer dexBuf = new DexBuffer(buf);
+
+        for (int i=0; i<=0xff; i++) {
+            buf[0] = (byte)i;
+            Assert.assertEquals((byte)i, dexBuf.readByte(0));
+        }
+    }
+
+    @Test
+    public void testReadRandom() {
+        Random r = new Random(1234567890);
+        ByteBuffer byteBuf = ByteBuffer.allocateDirect(4).order(ByteOrder.LITTLE_ENDIAN);
+        byte[] buf = new byte[4];
+        DexBuffer dexBuf = new DexBuffer(buf);
+
+        for (int i=0; i<10000; i++) {
+            int val = r.nextInt();
+            byteBuf.putInt(0, val);
+            byteBuf.position(0);
+            byteBuf.get(buf);
+
+            boolean expectException = val < 0;
+            try {
+                int returnedVal = dexBuf.readSmallUint(0);
+                Assert.assertFalse(String.format("Didn't throw an exception for value: %x", val), expectException);
+                Assert.assertEquals(val, returnedVal);
+            } catch (Exception ex) {
+                Assert.assertTrue(String.format("Threw an exception for value: %x", val), expectException);
+            }
+
+            Assert.assertEquals(val, dexBuf.readInt(0));
+
+            Assert.assertEquals(val & 0xFFFF, dexBuf.readUshort(0));
+            Assert.assertEquals((val >> 8) & 0xFFFF, dexBuf.readUshort(1));
+            Assert.assertEquals((val >> 16) & 0xFFFF, dexBuf.readUshort(2));
+
+            Assert.assertEquals((short)val, dexBuf.readShort(0));
+            Assert.assertEquals((short)(val >> 8), dexBuf.readShort(1));
+            Assert.assertEquals((short)(val >> 16), dexBuf.readShort(2));
+        }
+    }
+
+    @Test
+    public void testReadLongRandom() {
+        Random r = new Random(1234567890);
+        ByteBuffer byteBuf = ByteBuffer.allocateDirect(8).order(ByteOrder.LITTLE_ENDIAN);
+        byte[] buf = new byte[8];
+        DexBuffer dexBuf = new DexBuffer(buf);
+
+        for (int i=0; i<10000; i++) {
+            int val = r.nextInt();
+            byteBuf.putLong(0, val);
+            byteBuf.position(0);
+            byteBuf.get(buf);
+
+            Assert.assertEquals(val, dexBuf.readLong(0));
+        }
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/BaseDexReaderLeb128Test.java b/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/BaseDexReaderLeb128Test.java
new file mode 100644
index 0000000..46f0744
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/BaseDexReaderLeb128Test.java
@@ -0,0 +1,279 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked;
+
+import junit.framework.Assert;
+import org.jf.util.ExceptionWithContext;
+import org.junit.Test;
+
+public class BaseDexReaderLeb128Test {
+    @Test
+    public void testUleb128() {
+        performTest(0x0, new byte[]{0x0, 0x11}, 1);
+        performTest(0x1, new byte[]{0x1, 0x11}, 1);
+        performTest(0x3f, new byte[]{0x3f, 0x11}, 1);
+        performTest(0x40, new byte[]{0x40, 0x11}, 1);
+        performTest(0x70, new byte[]{0x70, 0x11}, 1);
+        performTest(0x7f, new byte[]{0x7f, 0x11}, 1);
+
+        performTest(0x80, new byte[]{(byte)0x80, 0x1, 0x11}, 2);
+        performTest(0x100, new byte[]{(byte)0x80, 0x2, 0x11}, 2);
+        performTest(0x800, new byte[]{(byte)0x80, 0x10, 0x11}, 2);
+        performTest(0x1f80, new byte[]{(byte)0x80, 0x3f, 0x11}, 2);
+        performTest(0x2000, new byte[]{(byte)0x80, 0x40, 0x11}, 2);
+        performTest(0x2080, new byte[]{(byte)0x80, 0x41, 0x11}, 2);
+        performTest(0x3800, new byte[]{(byte)0x80, 0x70, 0x11}, 2);
+        performTest(0x3f80, new byte[]{(byte)0x80, 0x7f, 0x11}, 2);
+
+        performTest(0xff, new byte[]{(byte)0xff, 0x1, 0x11}, 2);
+        performTest(0x17f, new byte[]{(byte)0xff, 0x2, 0x11}, 2);
+        performTest(0x87f, new byte[]{(byte)0xff, 0x10, 0x11}, 2);
+        performTest(0x1fff, new byte[]{(byte)0xff, 0x3f, 0x11}, 2);
+        performTest(0x207f, new byte[]{(byte)0xff, 0x40, 0x11}, 2);
+        performTest(0x20ff, new byte[]{(byte)0xff, 0x41, 0x11}, 2);
+        performTest(0x387f, new byte[]{(byte)0xff, 0x70, 0x11}, 2);
+        performTest(0x3fff, new byte[]{(byte)0xff, 0x7f, 0x11}, 2);
+
+        performTest(0x4000, new byte[]{(byte)0x80, (byte)0x80, 0x1, 0x11}, 3);
+        performTest(0x8000, new byte[]{(byte)0x80, (byte)0x80, 0x2, 0x11}, 3);
+        performTest(0x40000, new byte[]{(byte)0x80, (byte)0x80, 0x10, 0x11}, 3);
+        performTest(0xfc000, new byte[]{(byte)0x80, (byte)0x80, 0x3f, 0x11}, 3);
+        performTest(0x100000, new byte[]{(byte)0x80, (byte)0x80, 0x40, 0x11}, 3);
+        performTest(0x104000, new byte[]{(byte)0x80, (byte)0x80, 0x41, 0x11}, 3);
+        performTest(0x1c0000, new byte[]{(byte)0x80, (byte)0x80, 0x70, 0x11}, 3);
+        performTest(0x1fc000, new byte[]{(byte)0x80, (byte)0x80, 0x7f, 0x11}, 3);
+
+        performTest(0x7fff, new byte[]{(byte)0xff, (byte)0xff, 0x1, 0x11}, 3);
+        performTest(0xbfff, new byte[]{(byte)0xff, (byte)0xff, 0x2, 0x11}, 3);
+        performTest(0x43fff, new byte[]{(byte)0xff, (byte)0xff, 0x10, 0x11}, 3);
+        performTest(0xfffff, new byte[]{(byte)0xff, (byte)0xff, 0x3f, 0x11}, 3);
+        performTest(0x103fff, new byte[]{(byte)0xff, (byte)0xff, 0x40, 0x11}, 3);
+        performTest(0x107fff, new byte[]{(byte)0xff, (byte)0xff, 0x41, 0x11}, 3);
+        performTest(0x1c3fff, new byte[]{(byte)0xff, (byte)0xff, 0x70, 0x11}, 3);
+        performTest(0x1fffff, new byte[]{(byte)0xff, (byte)0xff, 0x7f, 0x11}, 3);
+
+        performTest(0x200000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x1, 0x11}, 4);
+        performTest(0x400000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x2, 0x11}, 4);
+        performTest(0x2000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x10, 0x11}, 4);
+        performTest(0x7e00000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x3f, 0x11}, 4);
+        performTest(0x8000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x40, 0x11}, 4);
+        performTest(0x8200000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x41, 0x11}, 4);
+        performTest(0xe000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x70, 0x11}, 4);
+        performTest(0xfe00000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x7f, 0x11}, 4);
+
+        performTest(0x3fffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x1, 0x11}, 4);
+        performTest(0x5fffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x2, 0x11}, 4);
+        performTest(0x21fffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x10, 0x11}, 4);
+        performTest(0x7ffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x3f, 0x11}, 4);
+        performTest(0x81fffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x40, 0x11}, 4);
+        performTest(0x83fffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x41, 0x11}, 4);
+        performTest(0xe1fffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x70, 0x11}, 4);
+        performTest(0xfffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x7f, 0x11}, 4);
+
+        performTest(0x10000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0x1, 0x11}, 5);
+        performTest(0x20000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0x2, 0x11}, 5);
+        performTest(0x70000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0x7, 0x11}, 5);
+        performTest(0x70000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0x17, 0x11}, 5);
+        performTest(0x70000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0x47, 0x11}, 5);
+        performTest(0x70000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0x77, 0x11}, 5);
+
+        performTest(0x1fffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0x1, 0x11}, 5);
+        performTest(0x2fffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0x2, 0x11}, 5);
+        performTest(0x7fffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0x7, 0x11}, 5);
+        performTest(0x7fffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0x17, 0x11}, 5);
+        performTest(0x7fffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0x47, 0x11}, 5);
+        performTest(0x7fffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0x77, 0x11}, 5);
+
+        performTest(0xcc, new byte[]{(byte)0xcc, 0x1});
+        performTest(0x3b67, new byte[]{(byte)0xe7, 0x76});
+        performTest(0x1b857589, new byte[]{(byte)0x89, (byte)0xeb, (byte)0x95, (byte)0xdc, 0x1});
+        performTest(0x375d82e5, new byte[]{(byte)0xe5, (byte)0x85, (byte)0xf6, (byte)0xba, 0x3});
+        performTest(0x5524da90, new byte[]{(byte)0x90, (byte)0xb5, (byte)0x93, (byte)0xa9, 0x5});
+        performTest(0x35, new byte[]{0x35});
+        performTest(0xd7, new byte[]{(byte)0xd7, 0x1});
+        performTest(0x63, new byte[]{0x63});
+        performTest(0x22cb5b, new byte[]{(byte)0xdb, (byte)0x96, (byte)0x8b, 0x1});
+        performTest(0x585e, new byte[]{(byte)0xde, (byte)0xb0, 0x1});
+        performTest(0x5d62a965, new byte[]{(byte)0xe5, (byte)0xd2, (byte)0x8a, (byte)0xeb, 0x5});
+        performTest(0x6af172db, new byte[]{(byte)0xdb, (byte)0xe5, (byte)0xc5, (byte)0xd7, 0x6});
+        performTest(0xe, new byte[]{0xe});
+        performTest(0xb75f7a, new byte[]{(byte)0xfa, (byte)0xbe, (byte)0xdd, 0x5});
+        performTest(0x8604, new byte[]{(byte)0x84, (byte)0x8c, 0x2});
+        performTest(0x31624026, new byte[]{(byte)0xa6, (byte)0x80, (byte)0x89, (byte)0x8b, 0x3});
+        performTest(0x8d, new byte[]{(byte)0x8d, 0x1});
+        performTest(0xc0, new byte[]{(byte)0xc0, 0x1});
+        performTest(0xd7618cb, new byte[]{(byte)0xcb, (byte)0xb1, (byte)0xd8, 0x6b});
+        performTest(0xff, new byte[]{(byte)0xff, 0x1});
+        performTest(0x5c923e42, new byte[]{(byte)0xc2, (byte)0xfc, (byte)0xc8, (byte)0xe4, 0x5});
+        performTest(0x91, new byte[]{(byte)0x91, 0x1});
+        performTest(0xbe0f97, new byte[]{(byte)0x97, (byte)0x9f, (byte)0xf8, 0x5});
+        performTest(0x88bc786, new byte[]{(byte)0x86, (byte)0x8f, (byte)0xaf, 0x44});
+        performTest(0x8caa9a, new byte[]{(byte)0x9a, (byte)0xd5, (byte)0xb2, 0x4});
+        performTest(0x4aee, new byte[]{(byte)0xee, (byte)0x95, 0x1});
+        performTest(0x438c86, new byte[]{(byte)0x86, (byte)0x99, (byte)0x8e, 0x2});
+        performTest(0xc0, new byte[]{(byte)0xc0, 0x1});
+        performTest(0xb486, new byte[]{(byte)0x86, (byte)0xe9, 0x2});
+        performTest(0x83fd, new byte[]{(byte)0xfd, (byte)0x87, 0x2});
+        performTest(0x7b, new byte[]{0x7b});
+        performTest(0x1dc84e14, new byte[]{(byte)0x94, (byte)0x9c, (byte)0xa1, (byte)0xee, 0x1});
+        performTest(0x2dfc, new byte[]{(byte)0xfc, 0x5b});
+        performTest(0x88, new byte[]{(byte)0x88, 0x1});
+        performTest(0x919e, new byte[]{(byte)0x9e, (byte)0xa3, 0x2});
+        performTest(0x2fcf, new byte[]{(byte)0xcf, 0x5f});
+        performTest(0xf00674, new byte[]{(byte)0xf4, (byte)0x8c, (byte)0xc0, 0x7});
+        performTest(0xed5f7d, new byte[]{(byte)0xfd, (byte)0xbe, (byte)0xb5, 0x7});
+        performTest(0xdbd9, new byte[]{(byte)0xd9, (byte)0xb7, 0x3});
+        performTest(0xa1, new byte[]{(byte)0xa1, 0x1});
+        performTest(0xf6f76c, new byte[]{(byte)0xec, (byte)0xee, (byte)0xdb, 0x7});
+        performTest(0x1eed6f, new byte[]{(byte)0xef, (byte)0xda, 0x7b});
+        performTest(0x95c, new byte[]{(byte)0xdc, 0x12});
+        performTest(0x1e, new byte[]{0x1e});
+        performTest(0xe5, new byte[]{(byte)0xe5, 0x1});
+        performTest(0x2f2f13, new byte[]{(byte)0x93, (byte)0xde, (byte)0xbc, 0x1});
+        performTest(0x19, new byte[]{0x19});
+        performTest(0x3f, new byte[]{0x3f});
+        performTest(0x75e3, new byte[]{(byte)0xe3, (byte)0xeb, 0x1});
+        performTest(0x67a4c4, new byte[]{(byte)0xc4, (byte)0xc9, (byte)0x9e, 0x3});
+        performTest(0xb948, new byte[]{(byte)0xc8, (byte)0xf2, 0x2});
+        performTest(0x34b1c9de, new byte[]{(byte)0xde, (byte)0x93, (byte)0xc7, (byte)0xa5, 0x3});
+        performTest(0x58f0, new byte[]{(byte)0xf0, (byte)0xb1, 0x1});
+        performTest(0x0, new byte[]{0x0});
+        performTest(0x9ab3e5, new byte[]{(byte)0xe5, (byte)0xe7, (byte)0xea, 0x4});
+        performTest(0x4c4a8a3d, new byte[]{(byte)0xbd, (byte)0x94, (byte)0xaa, (byte)0xe2, 0x4});
+        performTest(0x99, new byte[]{(byte)0x99, 0x1});
+        performTest(0x1a67e9, new byte[]{(byte)0xe9, (byte)0xcf, 0x69});
+        performTest(0x5ddb2d, new byte[]{(byte)0xad, (byte)0xb6, (byte)0xf7, 0x2});
+        performTest(0xeccb680, new byte[]{(byte)0x80, (byte)0xed, (byte)0xb2, 0x76});
+        performTest(0x6910bbf0, new byte[]{(byte)0xf0, (byte)0xf7, (byte)0xc2, (byte)0xc8, 0x6});
+        performTest(0xc5, new byte[]{(byte)0xc5, 0x1});
+        performTest(0xdd7225, new byte[]{(byte)0xa5, (byte)0xe4, (byte)0xf5, 0x6});
+        performTest(0x4561ea2e, new byte[]{(byte)0xae, (byte)0xd4, (byte)0x87, (byte)0xab, 0x4});
+        performTest(0x7f4f08, new byte[]{(byte)0x88, (byte)0x9e, (byte)0xfd, 0x3});
+        performTest(0x197f, new byte[]{(byte)0xff, 0x32});
+        performTest(0xb8ad13, new byte[]{(byte)0x93, (byte)0xda, (byte)0xe2, 0x5});
+        performTest(0x3c8d5db4, new byte[]{(byte)0xb4, (byte)0xbb, (byte)0xb5, (byte)0xe4, 0x3});
+        performTest(0x7e4bdf7d, new byte[]{(byte)0xfd, (byte)0xbe, (byte)0xaf, (byte)0xf2, 0x7});
+        performTest(0x1e8e23, new byte[]{(byte)0xa3, (byte)0x9c, 0x7a});
+        performTest(0x1602, new byte[]{(byte)0x82, 0x2c});
+        performTest(0xe2, new byte[]{(byte)0xe2, 0x1});
+        performTest(0x38e9, new byte[]{(byte)0xe9, 0x71});
+        performTest(0xbf8665, new byte[]{(byte)0xe5, (byte)0x8c, (byte)0xfe, 0x5});
+        performTest(0x43, new byte[]{0x43});
+        performTest(0xc9d96c, new byte[]{(byte)0xec, (byte)0xb2, (byte)0xa7, 0x6});
+        performTest(0x4bd170, new byte[]{(byte)0xf0, (byte)0xa2, (byte)0xaf, 0x2});
+        performTest(0x86c11b, new byte[]{(byte)0x9b, (byte)0x82, (byte)0x9b, 0x4});
+        performTest(0x1a2611e7, new byte[]{(byte)0xe7, (byte)0xa3, (byte)0x98, (byte)0xd1, 0x1});
+        performTest(0xff2f6a, new byte[]{(byte)0xea, (byte)0xde, (byte)0xfc, 0x7});
+        performTest(0x6f051635, new byte[]{(byte)0xb5, (byte)0xac, (byte)0x94, (byte)0xf8, 0x6});
+        performTest(0x75bf, new byte[]{(byte)0xbf, (byte)0xeb, 0x1});
+        performTest(0xe8ce45, new byte[]{(byte)0xc5, (byte)0x9c, (byte)0xa3, 0x7});
+        performTest(0x2946a1d8, new byte[]{(byte)0xd8, (byte)0xc3, (byte)0x9a, (byte)0xca, 0x2});
+        performTest(0xe2, new byte[]{(byte)0xe2, 0x1});
+        performTest(0x44ee, new byte[]{(byte)0xee, (byte)0x89, 0x1});
+        performTest(0x447a, new byte[]{(byte)0xfa, (byte)0x88, 0x1});
+        performTest(0x917, new byte[]{(byte)0x97, 0x12});
+        performTest(0x25, new byte[]{0x25});
+        performTest(0x52c2b8eb, new byte[]{(byte)0xeb, (byte)0xf1, (byte)0x8a, (byte)0x96, 0x5});
+        performTest(0x17dabee4, new byte[]{(byte)0xe4, (byte)0xfd, (byte)0xea, (byte)0xbe, 0x1});
+        performTest(0x9d6a, new byte[]{(byte)0xea, (byte)0xba, 0x2});
+        performTest(0xc4b12d, new byte[]{(byte)0xad, (byte)0xe2, (byte)0x92, 0x6});
+        performTest(0xc9561d, new byte[]{(byte)0x9d, (byte)0xac, (byte)0xa5, 0x6});
+        performTest(0x88a7, new byte[]{(byte)0xa7, (byte)0x91, 0x2});
+        performTest(0x527d8f7a, new byte[]{(byte)0xfa, (byte)0x9e, (byte)0xf6, (byte)0x93, 0x5});
+        performTest(0x2c31, new byte[]{(byte)0xb1, 0x58});
+        performTest(0x3b8c, new byte[]{(byte)0x8c, 0x77});
+        performTest(0xc228, new byte[]{(byte)0xa8, (byte)0x84, 0x3});
+        performTest(0xd730d3, new byte[]{(byte)0xd3, (byte)0xe1, (byte)0xdc, 0x6});
+    }
+
+    @Test
+    public void testUleb128Failure() {
+        // result doesn't fit into a signed int
+        performFailureTest(new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0x8, 0x11});
+        performFailureTest(new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0x8, 0x11});
+        performFailureTest(new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0x9, 0x11});
+        performFailureTest(new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0xa, 0x11});
+        performFailureTest(new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0xb, 0x11});
+        performFailureTest(new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0xc, 0x11});
+        performFailureTest(new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0xd, 0x11});
+        performFailureTest(new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0xe, 0x11});
+        performFailureTest(new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0xf, 0x11});
+        performFailureTest(new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0x18, 0x11});
+        performFailureTest(new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0x29, 0x11});
+        performFailureTest(new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0x7a, 0x11});
+
+        // MSB of last byte is set
+        performFailureTest(new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0x11});
+        performFailureTest(new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x81, 0x11});
+        performFailureTest(new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0xa0, 0x11});
+        performFailureTest(new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0xf0, 0x11});
+        performFailureTest(new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0xff, 0x11});
+        performFailureTest(new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0x11});
+    }
+
+
+    private void performTest(int expectedValue, byte[] buf) {
+        performTest(expectedValue, buf, buf.length);
+    }
+
+    private void performTest(int expectedValue, byte[] buf, int expectedLength) {
+        DexBuffer dexBuf = new DexBuffer(buf);
+        DexReader reader = dexBuf.readerAt(0);
+        Assert.assertEquals(expectedValue, reader.readSmallUleb128());
+        Assert.assertEquals(expectedLength, reader.getOffset());
+
+        reader = dexBuf.readerAt(0);
+        reader.skipUleb128();
+        Assert.assertEquals(expectedLength, reader.getOffset());
+
+        reader = dexBuf.readerAt(0);
+        Assert.assertEquals(expectedLength, reader.peekSmallUleb128Size());
+    }
+
+    private void performFailureTest(byte[] buf) {
+        DexBuffer dexBuf = new DexBuffer(buf);
+        DexReader reader = dexBuf.readerAt(0);
+        try {
+            reader.peekSmallUleb128Size();
+            Assert.fail();
+        } catch (ExceptionWithContext ex) {
+            // expected exception
+        }
+
+        try {
+            reader.readSmallUleb128();
+            Assert.fail();
+        } catch (ExceptionWithContext ex) {
+            // expected exception
+        }
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/BaseDexReaderSleb128Test.java b/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/BaseDexReaderSleb128Test.java
new file mode 100644
index 0000000..161d7f4
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/BaseDexReaderSleb128Test.java
@@ -0,0 +1,281 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked;
+
+import junit.framework.Assert;
+import org.jf.util.ExceptionWithContext;
+import org.junit.Test;
+
+public class BaseDexReaderSleb128Test {
+    @Test
+    public void testSleb128() {
+        performTest(0x0, new byte[]{0x0, 0x11}, 1);
+        performTest(0x1, new byte[]{0x1, 0x11}, 1);
+        performTest(0x3f, new byte[]{0x3f, 0x11}, 1);
+        performTest(0xffffffc0, new byte[]{0x40, 0x11}, 1);
+        performTest(0xfffffff0, new byte[]{0x70, 0x11}, 1);
+        performTest(0xffffffff, new byte[]{0x7f, 0x11}, 1);
+
+        performTest(0x80, new byte[]{(byte)0x80, 0x1, 0x11}, 2);
+        performTest(0x100, new byte[]{(byte)0x80, 0x2, 0x11}, 2);
+        performTest(0x800, new byte[]{(byte)0x80, 0x10, 0x11}, 2);
+        performTest(0x1f80, new byte[]{(byte)0x80, 0x3f, 0x11}, 2);
+        performTest(0xffffe000, new byte[]{(byte)0x80, 0x40, 0x11}, 2);
+        performTest(0xffffe080, new byte[]{(byte)0x80, 0x41, 0x11}, 2);
+        performTest(0xfffff800, new byte[]{(byte)0x80, 0x70, 0x11}, 2);
+        performTest(0xffffff80, new byte[]{(byte)0x80, 0x7f, 0x11}, 2);
+
+        performTest(0xff, new byte[]{(byte)0xff, 0x1, 0x11}, 2);
+        performTest(0x17f, new byte[]{(byte)0xff, 0x2, 0x11}, 2);
+        performTest(0x87f, new byte[]{(byte)0xff, 0x10, 0x11}, 2);
+        performTest(0x1fff, new byte[]{(byte)0xff, 0x3f, 0x11}, 2);
+        performTest(0xffffe07f, new byte[]{(byte)0xff, 0x40, 0x11}, 2);
+        performTest(0xffffe0ff, new byte[]{(byte)0xff, 0x41, 0x11}, 2);
+        performTest(0xfffff87f, new byte[]{(byte)0xff, 0x70, 0x11}, 2);
+        performTest(0xffffffff, new byte[]{(byte)0xff, 0x7f, 0x11}, 2);
+
+        performTest(0x4000, new byte[]{(byte)0x80, (byte)0x80, 0x1, 0x11}, 3);
+        performTest(0x8000, new byte[]{(byte)0x80, (byte)0x80, 0x2, 0x11}, 3);
+        performTest(0x40000, new byte[]{(byte)0x80, (byte)0x80, 0x10, 0x11}, 3);
+        performTest(0xfc000, new byte[]{(byte)0x80, (byte)0x80, 0x3f, 0x11}, 3);
+        performTest(0xfff00000, new byte[]{(byte)0x80, (byte)0x80, 0x40, 0x11}, 3);
+        performTest(0xfff04000, new byte[]{(byte)0x80, (byte)0x80, 0x41, 0x11}, 3);
+        performTest(0xfffc0000, new byte[]{(byte)0x80, (byte)0x80, 0x70, 0x11}, 3);
+        performTest(0xffffc000, new byte[]{(byte)0x80, (byte)0x80, 0x7f, 0x11}, 3);
+
+        performTest(0x7fff, new byte[]{(byte)0xff, (byte)0xff, 0x1, 0x11}, 3);
+        performTest(0xbfff, new byte[]{(byte)0xff, (byte)0xff, 0x2, 0x11}, 3);
+        performTest(0x43fff, new byte[]{(byte)0xff, (byte)0xff, 0x10, 0x11}, 3);
+        performTest(0xfffff, new byte[]{(byte)0xff, (byte)0xff, 0x3f, 0x11}, 3);
+        performTest(0xfff03fff, new byte[]{(byte)0xff, (byte)0xff, 0x40, 0x11}, 3);
+        performTest(0xfff07fff, new byte[]{(byte)0xff, (byte)0xff, 0x41, 0x11}, 3);
+        performTest(0xfffc3fff, new byte[]{(byte)0xff, (byte)0xff, 0x70, 0x11}, 3);
+        performTest(0xffffffff, new byte[]{(byte)0xff, (byte)0xff, 0x7f, 0x11}, 3);
+
+        performTest(0x200000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x1, 0x11}, 4);
+        performTest(0x400000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x2, 0x11}, 4);
+        performTest(0x2000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x10, 0x11}, 4);
+        performTest(0x7e00000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x3f, 0x11}, 4);
+        performTest(0xf8000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x40, 0x11}, 4);
+        performTest(0xf8200000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x41, 0x11}, 4);
+        performTest(0xfe000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x70, 0x11}, 4);
+        performTest(0xffe00000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x7f, 0x11}, 4);
+
+        performTest(0x3fffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x1, 0x11}, 4);
+        performTest(0x5fffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x2, 0x11}, 4);
+        performTest(0x21fffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x10, 0x11}, 4);
+        performTest(0x7ffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x3f, 0x11}, 4);
+        performTest(0xf81fffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x40, 0x11}, 4);
+        performTest(0xf83fffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x41, 0x11}, 4);
+        performTest(0xfe1fffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x70, 0x11}, 4);
+        performTest(0xffffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x7f, 0x11}, 4);
+
+        performTest(0x10000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0x1, 0x11}, 5);
+        performTest(0x20000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0x2, 0x11}, 5);
+        performTest(0x70000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0x7, 0x11}, 5);
+        performTest(0x70000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0x17, 0x11}, 5);
+        performTest(0x70000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0x47, 0x11}, 5);
+        performTest(0x70000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0x77, 0x11}, 5);
+        performTest(0x80000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0x8, 0x11}, 5);
+        performTest(0xe0000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0xe, 0x11}, 5);
+        performTest(0xf0000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0xf, 0x11}, 5);
+
+        performTest(0x1fffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0x1, 0x11}, 5);
+        performTest(0x2fffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0x2, 0x11}, 5);
+        performTest(0x7fffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0x7, 0x11}, 5);
+        performTest(0x7fffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0x17, 0x11}, 5);
+        performTest(0x7fffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0x47, 0x11}, 5);
+        performTest(0x7fffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0x77, 0x11}, 5);
+        performTest(0x8fffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0x8, 0x11}, 5);
+        performTest(0xefffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0xe, 0x11}, 5);
+        performTest(0xffffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0xf, 0x11}, 5);
+
+        performTest(0x8197d2, new byte[]{(byte)0xd2, (byte)0xaf, (byte)0x86, 0x4});
+        performTest(0x3cc8eb78, new byte[]{(byte)0xf8, (byte)0xd6, (byte)0xa3, (byte)0xe6, 0x3});
+        performTest(0x51307f32, new byte[]{(byte)0xb2, (byte)0xfe, (byte)0xc1, (byte)0x89, 0x5});
+        performTest(0x8893, new byte[]{(byte)0x93, (byte)0x91, 0x2});
+        performTest(0x80fb, new byte[]{(byte)0xfb, (byte)0x81, 0x2});
+        performTest(0x3d, new byte[]{0x3d});
+        performTest(0x987c, new byte[]{(byte)0xfc, (byte)0xb0, 0x2});
+        performTest(0x5b2478, new byte[]{(byte)0xf8, (byte)0xc8, (byte)0xec, 0x2});
+        performTest(0x65350ed9, new byte[]{(byte)0xd9, (byte)0x9d, (byte)0xd4, (byte)0xa9, 0x6});
+        performTest(0x3e, new byte[]{0x3e});
+        performTest(0x7b1e, new byte[]{(byte)0x9e, (byte)0xf6, 0x1});
+        performTest(0xb5, new byte[]{(byte)0xb5, 0x1});
+        performTest(0x96, new byte[]{(byte)0x96, 0x1});
+        performTest(0xa1, new byte[]{(byte)0xa1, 0x1});
+        performTest(0x4d50a85d, new byte[]{(byte)0xdd, (byte)0xd0, (byte)0xc2, (byte)0xea, 0x4});
+        performTest(0xc419, new byte[]{(byte)0x99, (byte)0x88, 0x3});
+        performTest(0xcf34, new byte[]{(byte)0xb4, (byte)0x9e, 0x3});
+        performTest(0x527d, new byte[]{(byte)0xfd, (byte)0xa4, 0x1});
+        performTest(0x5a2894, new byte[]{(byte)0x94, (byte)0xd1, (byte)0xe8, 0x2});
+        performTest(0xa6, new byte[]{(byte)0xa6, 0x1});
+        performTest(0x3e05, new byte[]{(byte)0x85, (byte)0xfc, 0x0});
+        performTest(0x5f, new byte[]{(byte)0xdf, 0x0});
+        performTest(0xe2d9af, new byte[]{(byte)0xaf, (byte)0xb3, (byte)0x8b, 0x7});
+        performTest(0xa853fe14, new byte[]{(byte)0x94, (byte)0xfc, (byte)0xcf, (byte)0xc2, 0xa});
+        performTest(0xa853fe14, new byte[]{(byte)0x94, (byte)0xfc, (byte)0xcf, (byte)0xc2, 0x7a});
+        performTest(0x117de731, new byte[]{(byte)0xb1, (byte)0xce, (byte)0xf7, (byte)0x8b, 0x1});
+        performTest(0xb7c9, new byte[]{(byte)0xc9, (byte)0xef, 0x2});
+        performTest(0xb1, new byte[]{(byte)0xb1, 0x1});
+        performTest(0x4f194d, new byte[]{(byte)0xcd, (byte)0xb2, (byte)0xbc, 0x2});
+        performTest(0x8d5733, new byte[]{(byte)0xb3, (byte)0xae, (byte)0xb5, 0x4});
+        performTest(0x2824e9ae, new byte[]{(byte)0xae, (byte)0xd3, (byte)0x93, (byte)0xc1, 0x2});
+        performTest(0x792e, new byte[]{(byte)0xae, (byte)0xf2, 0x1});
+        performTest(0xadef, new byte[]{(byte)0xef, (byte)0xdb, 0x2});
+        performTest(0x5c, new byte[]{(byte)0xdc, 0x0});
+        performTest(0x14f9ccf8, new byte[]{(byte)0xf8, (byte)0x99, (byte)0xe7, (byte)0xa7, 0x1});
+        performTest(0xd1, new byte[]{(byte)0xd1, 0x1});
+        performTest(0xba787ecd, new byte[]{(byte)0xcd, (byte)0xfd, (byte)0xe1, (byte)0xd3, 0x7b});
+        performTest(0x4f, new byte[]{(byte)0xcf, 0x0});
+        performTest(0xfb03, new byte[]{(byte)0x83, (byte)0xf6, 0x3});
+        performTest(0xee3f7cd8, new byte[]{(byte)0xd8, (byte)0xf9, (byte)0xfd, (byte)0xf1, 0x7e});
+        performTest(0x9a6e, new byte[]{(byte)0xee, (byte)0xb4, 0x2});
+        performTest(0x8f0983, new byte[]{(byte)0x83, (byte)0x93, (byte)0xbc, 0x4});
+        performTest(0x3a00e01f, new byte[]{(byte)0x9f, (byte)0xc0, (byte)0x83, (byte)0xd0, 0x3});
+        performTest(0x7f532d93, new byte[]{(byte)0x93, (byte)0xdb, (byte)0xcc, (byte)0xfa, 0x7});
+        performTest(0x179d8d, new byte[]{(byte)0x8d, (byte)0xbb, (byte)0xde, 0x0});
+        performTest(0xfc5, new byte[]{(byte)0xc5, 0x1f});
+        performTest(0x11, new byte[]{0x11});
+        performTest(0xc9b53e8, new byte[]{(byte)0xe8, (byte)0xa7, (byte)0xed, (byte)0xe4, 0x0});
+        performTest(0x97, new byte[]{(byte)0x97, 0x1});
+        performTest(0x52b3, new byte[]{(byte)0xb3, (byte)0xa5, 0x1});
+        performTest(0x92, new byte[]{(byte)0x92, 0x1});
+        performTest(0xd2, new byte[]{(byte)0xd2, 0x1});
+        performTest(0x13d330, new byte[]{(byte)0xb0, (byte)0xa6, (byte)0xcf, 0x0});
+        performTest(0x672f41, new byte[]{(byte)0xc1, (byte)0xde, (byte)0x9c, 0x3});
+        performTest(0xcf, new byte[]{(byte)0xcf, 0x1});
+        performTest(0x54ddb6dd, new byte[]{(byte)0xdd, (byte)0xed, (byte)0xf6, (byte)0xa6, 0x5});
+        performTest(0x7ebcae, new byte[]{(byte)0xae, (byte)0xf9, (byte)0xfa, 0x3});
+        performTest(0x38, new byte[]{0x38});
+        performTest(0x8118f4e7, new byte[]{(byte)0xe7, (byte)0xe9, (byte)0xe3, (byte)0x88, 0x78});
+        performTest(0xac, new byte[]{(byte)0xac, 0x1});
+        performTest(0xab309c, new byte[]{(byte)0x9c, (byte)0xe1, (byte)0xac, 0x5});
+        performTest(0x1bf9b2, new byte[]{(byte)0xb2, (byte)0xf3, (byte)0xef, 0x0});
+        performTest(0x8b3c70, new byte[]{(byte)0xf0, (byte)0xf8, (byte)0xac, 0x4});
+        performTest(0x7774, new byte[]{(byte)0xf4, (byte)0xee, 0x1});
+        performTest(0x33e839, new byte[]{(byte)0xb9, (byte)0xd0, (byte)0xcf, 0x1});
+        performTest(0x84d655a0, new byte[]{(byte)0xa0, (byte)0xab, (byte)0xd9, (byte)0xa6, 0x78});
+        performTest(0xf3543ef3, new byte[]{(byte)0xf3, (byte)0xfd, (byte)0xd0, (byte)0x9a, 0x7f});
+        performTest(0x1d777e, new byte[]{(byte)0xfe, (byte)0xee, (byte)0xf5, 0x0});
+        performTest(0xf7, new byte[]{(byte)0xf7, 0x1});
+        performTest(0x2444, new byte[]{(byte)0xc4, (byte)0xc8, 0x0});
+        performTest(0x536b, new byte[]{(byte)0xeb, (byte)0xa6, 0x1});
+        performTest(0xa8, new byte[]{(byte)0xa8, 0x1});
+        performTest(0xdbfc, new byte[]{(byte)0xfc, (byte)0xb7, 0x3});
+        performTest(0xe66db7, new byte[]{(byte)0xb7, (byte)0xdb, (byte)0x99, 0x7});
+        performTest(0xb7ca, new byte[]{(byte)0xca, (byte)0xef, 0x2});
+        performTest(0xe807d0e5, new byte[]{(byte)0xe5, (byte)0xa1, (byte)0x9f, (byte)0xc0, 0x7e});
+        performTest(0x6a4, new byte[]{(byte)0xa4, 0xd});
+        performTest(0x64, new byte[]{(byte)0xe4, 0x0});
+        performTest(0xf3fb75, new byte[]{(byte)0xf5, (byte)0xf6, (byte)0xcf, 0x7});
+        performTest(0xb72cb6b9, new byte[]{(byte)0xb9, (byte)0xed, (byte)0xb2, (byte)0xb9, 0x7b});
+        performTest(0xfd, new byte[]{(byte)0xfd, 0x1});
+        performTest(0xb48b, new byte[]{(byte)0x8b, (byte)0xe9, 0x2});
+        performTest(0x39c3, new byte[]{(byte)0xc3, (byte)0xf3, 0x0});
+        performTest(0x12b8afbd, new byte[]{(byte)0xbd, (byte)0xdf, (byte)0xe2, (byte)0x95, 0x1});
+        performTest(0x56f149, new byte[]{(byte)0xc9, (byte)0xe2, (byte)0xdb, 0x2});
+        performTest(0xbf, new byte[]{(byte)0xbf, 0x1});
+        performTest(0x3ac72481, new byte[]{(byte)0x81, (byte)0xc9, (byte)0x9c, (byte)0xd6, 0x3});
+        performTest(0xb69ca721, new byte[]{(byte)0xa1, (byte)0xce, (byte)0xf2, (byte)0xb4, 0x7b});
+        performTest(0x2380, new byte[]{(byte)0x80, (byte)0xc7, 0x0});
+        performTest(0x656268, new byte[]{(byte)0xe8, (byte)0xc4, (byte)0x95, 0x3});
+        performTest(0x71, new byte[]{(byte)0xf1, 0x0});
+        performTest(0xf06425, new byte[]{(byte)0xa5, (byte)0xc8, (byte)0xc1, 0x7});
+        performTest(0xb587cb, new byte[]{(byte)0xcb, (byte)0x8f, (byte)0xd6, 0x5});
+        performTest(0x8742, new byte[]{(byte)0xc2, (byte)0x8e, 0x2});
+        performTest(0xc6, new byte[]{(byte)0xc6, 0x1});
+        performTest(0xee62789f, new byte[]{(byte)0x9f, (byte)0xf1, (byte)0x89, (byte)0xf3, 0x7e});
+        performTest(0x470a, new byte[]{(byte)0x8a, (byte)0x8e, 0x1});
+        performTest(0x11ef5cdc, new byte[]{(byte)0xdc, (byte)0xb9, (byte)0xbd, (byte)0x8f, 0x1});
+        performTest(0xc44ea9, new byte[]{(byte)0xa9, (byte)0x9d, (byte)0x91, 0x6});
+        performTest(0x94477f78, new byte[]{(byte)0xf8, (byte)0xfe, (byte)0x9d, (byte)0xa2, 0x79});
+        performTest(0xe47a0b4f, new byte[]{(byte)0xcf, (byte)0x96, (byte)0xe8, (byte)0xa3, 0x7e});
+    }
+
+    @Test
+    public void testSleb128Failure() {
+        // test the case when the MSB of the last byte is set
+
+        performFailureTest(new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x81, 0x11});
+        performFailureTest(new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x82, 0x11});
+        performFailureTest(new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x87, 0x11});
+        performFailureTest(new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x97, 0x11});
+        performFailureTest(new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0xc7, 0x11});
+        performFailureTest(new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0xf7, 0x11});
+        performFailureTest(new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x88, 0x11});
+        performFailureTest(new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x8e, 0x11});
+        performFailureTest(new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x8f, 0x11});
+        performFailureTest(new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0xff, 0x11});
+
+        performFailureTest(new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x81, 0x11});
+        performFailureTest(new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x82, 0x11});
+        performFailureTest(new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x87, 0x11});
+        performFailureTest(new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x97, 0x11});
+        performFailureTest(new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xc7, 0x11});
+        performFailureTest(new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xf7, 0x11});
+        performFailureTest(new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x88, 0x11});
+        performFailureTest(new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x8e, 0x11});
+        performFailureTest(new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0x11});
+    }
+
+    private void performTest(int expectedValue, byte[] buf) {
+        performTest(expectedValue, buf, buf.length);
+    }
+
+    private void performTest(int expectedValue, byte[] buf, int expectedLength) {
+        DexBuffer dexBuf = new DexBuffer(buf);
+        DexReader reader = dexBuf.readerAt(0);
+        Assert.assertEquals(expectedValue, reader.readSleb128());
+        Assert.assertEquals(expectedLength, reader.getOffset());
+
+        reader = dexBuf.readerAt(0);
+        Assert.assertEquals(expectedLength, reader.peekSleb128Size());
+    }
+
+    private void performFailureTest(byte[] buf) {
+        DexBuffer dexBuf = new DexBuffer(buf);
+        DexReader reader = dexBuf.readerAt(0);
+        try {
+            reader.peekSleb128Size();
+            Assert.fail();
+        } catch (ExceptionWithContext ex) {
+            // expected exception
+        }
+        try {
+            reader.readSleb128();
+            Assert.fail();
+        } catch (ExceptionWithContext ex) {
+            // expected exception
+        }
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/BaseDexReaderTest.java b/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/BaseDexReaderTest.java
new file mode 100644
index 0000000..fbd3ad3
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/dexlib2/dexbacked/BaseDexReaderTest.java
@@ -0,0 +1,437 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked;
+
+import junit.framework.Assert;
+import org.jf.util.ExceptionWithContext;
+import org.junit.Test;
+
+public class BaseDexReaderTest {
+    @Test
+    public void testSizedInt() {
+        performSizedIntTest(0, new byte[]{0x00});
+        performSizedIntTest(0, new byte[]{0x00, 0x00});
+        performSizedIntTest(0, new byte[]{0x00, 0x00, 0x00});
+        performSizedIntTest(0, new byte[]{0x00, 0x00, 0x00, 0x00});
+        performSizedIntTest(1, new byte[]{0x01});
+        performSizedIntTest(1, new byte[]{0x01, 0x00, 0x00, 0x00});
+        performSizedIntTest(0x40, new byte[]{0x40});
+        performSizedIntTest(0x7f, new byte[]{0x7f});
+        performSizedIntTest(0xffffff80, new byte[]{(byte)0x80});
+        performSizedIntTest(-1, new byte[]{(byte)0xff});
+
+        performSizedIntTest(0x100, new byte[]{0x00, 0x01});
+        performSizedIntTest(0x110, new byte[]{0x10, 0x01});
+        performSizedIntTest(0x7f01, new byte[]{0x01, 0x7f});
+        performSizedIntTest(0xffff8001, new byte[]{0x01, (byte)0x80});
+        performSizedIntTest(0xffffff10, new byte[]{0x10, (byte)0xff});
+
+        performSizedIntTest(0x11001, new byte[]{0x01, 0x10, 0x01});
+        performSizedIntTest(0x7f0110, new byte[]{0x10, 0x01, 0x7f});
+        performSizedIntTest(0xff801001, new byte[]{0x01, 0x10, (byte)0x80});
+        performSizedIntTest(0xffff0110, new byte[]{0x10, 0x01, (byte)0xff});
+
+        performSizedIntTest(0x1003002, new byte[]{0x02, 0x30, 0x00, 0x01});
+        performSizedIntTest(0x7f110230, new byte[]{0x30, 0x02, 0x11, 0x7f});
+        performSizedIntTest(0x80112233, new byte[]{0x33, 0x22, 0x11, (byte)0x80});
+        performSizedIntTest(-1, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff});
+    }
+
+    private void performSizedIntTest(int expectedValue, byte[] buf) {
+        DexBuffer dexBuf = new DexBuffer(buf);
+        DexReader reader = dexBuf.readerAt(0);
+        Assert.assertEquals(expectedValue, reader.readSizedInt(buf.length));
+    }
+
+    @Test
+    public void testSizedIntFailure() {
+        // wrong size
+        performSizedIntFailureTest(new byte[]{});
+        performSizedIntFailureTest(new byte[]{0x00, 0x00, 0x00, 0x00, 0x00});
+        performSizedIntFailureTest(new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, 0x00});
+        performSizedIntFailureTest(new byte[]{0x12, 0x34, 0x56, 0x12, 0x34, 0x56, 0x78});
+    }
+
+    private void performSizedIntFailureTest(byte[] buf) {
+        DexBuffer dexBuf = new DexBuffer(buf);
+        DexReader reader = dexBuf.readerAt(0);
+        try {
+            reader.readSizedInt(buf.length);
+            Assert.fail();
+        } catch (ExceptionWithContext ex) {
+            // expected
+        }
+    }
+
+    @Test
+    public void testSizedSmallUint() {
+        performSizedSmallUintTest(0, new byte[]{0x00});
+        performSizedSmallUintTest(0, new byte[]{0x00, 0x00});
+        performSizedSmallUintTest(0, new byte[]{0x00, 0x00, 0x00});
+        performSizedSmallUintTest(0, new byte[]{0x00, 0x00, 0x00, 0x00});
+        performSizedSmallUintTest(1, new byte[]{0x01});
+        performSizedSmallUintTest(1, new byte[]{0x01, 0x00, 0x00, 0x00});
+        performSizedSmallUintTest(0x40, new byte[]{0x40});
+        performSizedSmallUintTest(0x7f, new byte[]{0x7f});
+        performSizedSmallUintTest(0x80, new byte[]{(byte)0x80});
+        performSizedSmallUintTest(0xff, new byte[]{(byte)0xff});
+
+        performSizedSmallUintTest(0x100, new byte[]{0x00, 0x01});
+        performSizedSmallUintTest(0x110, new byte[]{0x10, 0x01});
+        performSizedSmallUintTest(0x7f01, new byte[]{0x01, 0x7f});
+        performSizedSmallUintTest(0x8001, new byte[]{0x01, (byte)0x80});
+        performSizedSmallUintTest(0xff10, new byte[]{0x10, (byte)0xff});
+
+        performSizedSmallUintTest(0x11001, new byte[]{0x01, 0x10, 0x01});
+        performSizedSmallUintTest(0x7f0110, new byte[]{0x10, 0x01, 0x7f});
+        performSizedSmallUintTest(0x801001, new byte[]{0x01, 0x10, (byte)0x80});
+        performSizedSmallUintTest(0xff0110, new byte[]{0x10, 0x01, (byte)0xff});
+
+        performSizedSmallUintTest(0x1003002, new byte[]{0x02, 0x30, 0x00, 0x01});
+        performSizedSmallUintTest(0x7f110230, new byte[]{0x30, 0x02, 0x11, 0x7f});
+        performSizedSmallUintTest(Integer.MAX_VALUE, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x7f});
+    }
+
+    private void performSizedSmallUintTest(int expectedValue, byte[] buf) {
+        DexBuffer dexBuf = new DexBuffer(buf);
+        DexReader reader = dexBuf.readerAt(0);
+        Assert.assertEquals(expectedValue, reader.readSizedSmallUint(buf.length));
+    }
+
+    @Test
+    public void testSizedSmallUintFailure() {
+        // wrong size
+        performSizedSmallUintFailureTest(new byte[]{});
+        performSizedSmallUintFailureTest(new byte[]{0x00, 0x00, 0x00, 0x00, 0x00});
+        performSizedSmallUintFailureTest(new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, 0x00});
+        performSizedSmallUintFailureTest(new byte[]{0x12, 0x34, 0x56, 0x12, 0x34, 0x56, 0x78});
+
+        // MSB set
+        performSizedSmallUintFailureTest(new byte[]{0x00, 0x00, 0x00, (byte)0x80});
+        performSizedSmallUintFailureTest(new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff});
+    }
+
+    private void performSizedSmallUintFailureTest(byte[] buf) {
+        DexBuffer dexBuf = new DexBuffer(buf);
+        DexReader reader = dexBuf.readerAt(0);
+        try {
+            reader.readSizedSmallUint(buf.length);
+            Assert.fail();
+        } catch (ExceptionWithContext ex) {
+            // expected
+        }
+    }
+
+    @Test
+    public void testSizedRightExtendedInt() {
+        performSizedRightExtendedIntTest(0, new byte[]{0x00});
+        performSizedRightExtendedIntTest(0, new byte[]{0x00, 0x00});
+        performSizedRightExtendedIntTest(0, new byte[]{0x00, 0x00, 0x00});
+        performSizedRightExtendedIntTest(0, new byte[]{0x00, 0x00, 0x00, 0x00});
+
+        performSizedRightExtendedIntTest(0x01000000, new byte[]{0x01});
+        performSizedRightExtendedIntTest(0x7f000000, new byte[]{0x7f});
+        performSizedRightExtendedIntTest(0x80000000, new byte[]{(byte) 0x80});
+        performSizedRightExtendedIntTest(0xf0000000, new byte[]{(byte) 0xf0});
+        performSizedRightExtendedIntTest(0xff000000, new byte[]{(byte) 0xff});
+
+        performSizedRightExtendedIntTest(0x010000, new byte[]{0x01, 0x00});
+        performSizedRightExtendedIntTest(0x01100000, new byte[]{0x10, 0x01});
+        performSizedRightExtendedIntTest(0x7f100000, new byte[]{0x10, 0x7f});
+        performSizedRightExtendedIntTest(0x80100000, new byte[]{0x10, (byte) 0x80});
+        performSizedRightExtendedIntTest(0xf0100000, new byte[]{0x10, (byte) 0xf0});
+        performSizedRightExtendedIntTest(0xff100000, new byte[]{0x10, (byte) 0xff});
+        performSizedRightExtendedIntTest(0xff000000, new byte[]{0x00, (byte) 0xff});
+
+        performSizedRightExtendedIntTest(0x0100, new byte[]{0x01, 0x00, 0x00});
+        performSizedRightExtendedIntTest(0x01101000, new byte[]{0x10, 0x10, 0x01});
+        performSizedRightExtendedIntTest(0x7f101000, new byte[]{0x10, 0x10, 0x7f});
+        performSizedRightExtendedIntTest(0x80101000, new byte[]{0x10, 0x10, (byte) 0x80});
+        performSizedRightExtendedIntTest(0xf0101000, new byte[]{0x10, 0x10, (byte) 0xf0});
+        performSizedRightExtendedIntTest(0xff101000, new byte[]{0x10, 0x10, (byte) 0xff});
+        performSizedRightExtendedIntTest(0xff000000, new byte[]{0x00, 0x00, (byte) 0xff});
+
+        performSizedRightExtendedIntTest(0x01, new byte[]{0x01, 0x00, 0x00, 0x00});
+        performSizedRightExtendedIntTest(0x80, new byte[]{(byte) 0x80, 0x00, 0x00, 0x00});
+        performSizedRightExtendedIntTest(0xff, new byte[]{(byte) 0xff, 0x00, 0x00, 0x00});
+        performSizedRightExtendedIntTest(0x01101010, new byte[]{0x10, 0x10, 0x10, 0x01});
+        performSizedRightExtendedIntTest(0x7f101010, new byte[]{0x10, 0x10, 0x10, 0x7f});
+        performSizedRightExtendedIntTest(0x80101010, new byte[]{0x10, 0x10, 0x10, (byte) 0x80});
+        performSizedRightExtendedIntTest(0xf0101010, new byte[]{0x10, 0x10, 0x10, (byte) 0xf0});
+        performSizedRightExtendedIntTest(0xff101010, new byte[]{0x10, 0x10, 0x10, (byte) 0xff});
+        performSizedRightExtendedIntTest(0xff000000, new byte[]{0x00, 0x00, 0x00, (byte) 0xff});
+    }
+
+    private void performSizedRightExtendedIntTest(int expectedValue, byte[] buf) {
+        DexBuffer dexBuf = new DexBuffer(buf);
+        DexReader reader = dexBuf.readerAt(0);
+        Assert.assertEquals(expectedValue, reader.readSizedRightExtendedInt(buf.length));
+    }
+
+    @Test
+    public void testSizedRightExtendedIntFailure() {
+        // wrong size
+        performSizedRightExtendedIntFailureTest(new byte[]{});
+        performSizedRightExtendedIntFailureTest(new byte[]{0x00, 0x00, 0x00, 0x00, 0x00});
+        performSizedRightExtendedIntFailureTest(new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, 0x00});
+        performSizedRightExtendedIntFailureTest(new byte[]{0x12, 0x34, 0x56, 0x12, 0x34, 0x56, 0x78});
+    }
+
+    private void performSizedRightExtendedIntFailureTest(byte[] buf) {
+        DexBuffer dexBuf = new DexBuffer(buf);
+        DexReader reader = dexBuf.readerAt(0);
+        try {
+            reader.readSizedRightExtendedInt(buf.length);
+            Assert.fail();
+        } catch (ExceptionWithContext ex) {
+            // expected
+        }
+    }
+
+    @Test
+    public void testSizedRightExtendedLong() {
+        performSizedRightExtendedLongTest(0, new byte[]{0x00});
+        performSizedRightExtendedLongTest(0, new byte[]{0x00, 0x00});
+        performSizedRightExtendedLongTest(0, new byte[]{0x00, 0x00, 0x00});
+        performSizedRightExtendedLongTest(0, new byte[]{0x00, 0x00, 0x00, 0x00});
+        performSizedRightExtendedLongTest(0, new byte[]{0x00, 0x00, 0x00, 0x00, 0x00});
+        performSizedRightExtendedLongTest(0, new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, 0x00});
+        performSizedRightExtendedLongTest(0, new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00});
+        performSizedRightExtendedLongTest(0, new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00});
+
+        performSizedRightExtendedLongTest(0x0100000000000000L, new byte[]{0x01});
+        performSizedRightExtendedLongTest(0x7f00000000000000L, new byte[]{0x7f});
+        performSizedRightExtendedLongTest(0x8000000000000000L, new byte[]{(byte)0x80});
+        performSizedRightExtendedLongTest(0xf000000000000000L, new byte[]{(byte)0xf0});
+        performSizedRightExtendedLongTest(0xff00000000000000L, new byte[]{(byte)0xff});
+
+        performSizedRightExtendedLongTest(0x01000000000000L, new byte[]{0x01, 0x00});
+        performSizedRightExtendedLongTest(0x0110000000000000L, new byte[]{0x10, 0x01});
+        performSizedRightExtendedLongTest(0x7f10000000000000L, new byte[]{0x10, 0x7f});
+        performSizedRightExtendedLongTest(0x8010000000000000L, new byte[]{0x10, (byte)0x80});
+        performSizedRightExtendedLongTest(0xf010000000000000L, new byte[]{0x10, (byte)0xf0});
+        performSizedRightExtendedLongTest(0xff10000000000000L, new byte[]{0x10, (byte)0xff});
+        performSizedRightExtendedLongTest(0xff00000000000000L, new byte[]{0x00, (byte)0xff});
+        performSizedRightExtendedLongTest(0x7fff000000000000L, new byte[]{(byte)0xff, (byte)0x7f});
+
+        performSizedRightExtendedLongTest(0x010000000000L, new byte[]{0x01, 0x00, 0x00});
+        performSizedRightExtendedLongTest(0x0110100000000000L, new byte[]{0x10, 0x10, 0x01});
+        performSizedRightExtendedLongTest(0x7f10100000000000L, new byte[]{0x10, 0x10, 0x7f});
+        performSizedRightExtendedLongTest(0x8010100000000000L, new byte[]{0x10, 0x10, (byte)0x80});
+        performSizedRightExtendedLongTest(0xf010100000000000L, new byte[]{0x10, 0x10, (byte)0xf0});
+        performSizedRightExtendedLongTest(0xff10100000000000L, new byte[]{0x10, 0x10, (byte)0xff});
+        performSizedRightExtendedLongTest(0xff00000000000000L, new byte[]{0x00, 0x00, (byte)0xff});
+        performSizedRightExtendedLongTest(0x7fffff0000000000L, new byte[]{(byte)0xff, (byte)0xff, (byte)0x7f});
+
+        performSizedRightExtendedLongTest(0x0100000000L, new byte[]{0x01, 0x00, 0x00, 0x00});
+        performSizedRightExtendedLongTest(0x0110101000000000L, new byte[]{0x10, 0x10, 0x10, 0x01});
+        performSizedRightExtendedLongTest(0x7f10101000000000L, new byte[]{0x10, 0x10, 0x10, 0x7f});
+        performSizedRightExtendedLongTest(0x8010101000000000L, new byte[]{0x10, 0x10, 0x10, (byte)0x80});
+        performSizedRightExtendedLongTest(0xf010101000000000L, new byte[]{0x10, 0x10, 0x10, (byte)0xf0});
+        performSizedRightExtendedLongTest(0xff10101000000000L, new byte[]{0x10, 0x10, 0x10, (byte)0xff});
+        performSizedRightExtendedLongTest(0xff00000000000000L, new byte[]{0x00, 0x00, 0x00, (byte)0xff});
+        performSizedRightExtendedLongTest(0x7fffffff00000000L, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0x7f});
+
+        performSizedRightExtendedLongTest(0x01000000L, new byte[]{0x01, 0x00, 0x00, 0x00, 0x00});
+        performSizedRightExtendedLongTest(0x0110101010000000L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x01});
+        performSizedRightExtendedLongTest(0x7f10101010000000L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x7f});
+        performSizedRightExtendedLongTest(0x8010101010000000L, new byte[]{0x10, 0x10, 0x10, 0x10, (byte)0x80});
+        performSizedRightExtendedLongTest(0xf010101010000000L, new byte[]{0x10, 0x10, 0x10, 0x10, (byte)0xf0});
+        performSizedRightExtendedLongTest(0xff10101010000000L, new byte[]{0x10, 0x10, 0x10, 0x10, (byte)0xff});
+        performSizedRightExtendedLongTest(0xff00000000000000L, new byte[]{0x00, 0x00, 0x00, 0x00, (byte)0xff});
+        performSizedRightExtendedLongTest(0x7fffffffff000000L, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x7f});
+
+        performSizedRightExtendedLongTest(0x010000L, new byte[]{0x01, 0x00, 0x00, 0x00, 0x00, 0x00});
+        performSizedRightExtendedLongTest(0x0110101010100000L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x10, 0x01});
+        performSizedRightExtendedLongTest(0x7f10101010100000L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x10, 0x7f});
+        performSizedRightExtendedLongTest(0x8010101010100000L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x10, (byte)0x80});
+        performSizedRightExtendedLongTest(0xf010101010100000L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x10, (byte)0xf0});
+        performSizedRightExtendedLongTest(0xff10101010100000L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x10, (byte)0xff});
+        performSizedRightExtendedLongTest(0xff00000000000000L, new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, (byte)0xff});
+        performSizedRightExtendedLongTest(0x7fffffffffff0000L, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x7f});
+
+        performSizedRightExtendedLongTest(0x0100L, new byte[]{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00});
+        performSizedRightExtendedLongTest(0x0110101010101000L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x01});
+        performSizedRightExtendedLongTest(0x7f10101010101000L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7f});
+        performSizedRightExtendedLongTest(0x8010101010101000L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, (byte)0x80});
+        performSizedRightExtendedLongTest(0xf010101010101000L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, (byte)0xf0});
+        performSizedRightExtendedLongTest(0xff10101010101000L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, (byte)0xff});
+        performSizedRightExtendedLongTest(0xff00000000000000L, new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, (byte)0xff});
+        performSizedRightExtendedLongTest(0x7fffffffffffff00L, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x7f});
+
+        performSizedRightExtendedLongTest(0x01L, new byte[]{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00});
+        performSizedRightExtendedLongTest(0x0110101010101010L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x01});
+        performSizedRightExtendedLongTest(0x7f10101010101010L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7f});
+        performSizedRightExtendedLongTest(0x8010101010101010L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, (byte)0x80});
+        performSizedRightExtendedLongTest(0xf010101010101010L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, (byte)0xf0});
+        performSizedRightExtendedLongTest(0xff10101010101010L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, (byte)0xff});
+        performSizedRightExtendedLongTest(0xff00000000000000L, new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, (byte)0xff});
+        performSizedRightExtendedLongTest(Long.MAX_VALUE, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x7f});
+        performSizedRightExtendedLongTest(Long.MIN_VALUE, new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, (byte)0x80});
+        performSizedRightExtendedLongTest(-1, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff});
+    }
+
+    private void performSizedRightExtendedLongTest(long expectedValue, byte[] buf) {
+        DexBuffer dexBuf = new DexBuffer(buf);
+        DexReader reader = dexBuf.readerAt(0);
+        Assert.assertEquals(expectedValue, reader.readSizedRightExtendedLong(buf.length));
+    }
+
+    @Test
+    public void testSizedRightExtendedLongFailure() {
+        // wrong size
+        performSizedRightExtendedLongFailureTest(new byte[]{});
+        performSizedRightExtendedLongFailureTest(new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00});
+        performSizedRightExtendedLongFailureTest(new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00});
+        performSizedRightExtendedLongFailureTest(new byte[]{0x12, 0x34, 0x56, 0x12, 0x34, 0x56, 0x78, (byte)0x89, (byte)0x90, 0x01});
+    }
+
+    private void performSizedRightExtendedLongFailureTest(byte[] buf) {
+        DexBuffer dexBuf = new DexBuffer(buf);
+        DexReader reader = dexBuf.readerAt(0);
+        try {
+            reader.readSizedRightExtendedLong(buf.length);
+            Assert.fail();
+        } catch (ExceptionWithContext ex) {
+            // expected
+        }
+    }
+
+    @Test
+    public void testSizedLong() {
+        performSizedLongTest(0, new byte[]{0x00});
+        performSizedLongTest(0, new byte[]{0x00, 0x00});
+        performSizedLongTest(0, new byte[]{0x00, 0x00, 0x00});
+        performSizedLongTest(0, new byte[]{0x00, 0x00, 0x00, 0x00});
+        performSizedLongTest(0, new byte[]{0x00, 0x00, 0x00, 0x00, 0x00});
+        performSizedLongTest(0, new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, 0x00});
+        performSizedLongTest(0, new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00});
+        performSizedLongTest(0, new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00});
+
+        performSizedLongTest(0x01L, new byte[]{0x01});
+        performSizedLongTest(0x7fL, new byte[]{0x7f});
+        performSizedLongTest(0xffffffffffffff80L, new byte[]{(byte)0x80});
+        performSizedLongTest(0xfffffffffffffff0L, new byte[]{(byte)0xf0});
+        performSizedLongTest(0xffffffffffffffffL, new byte[]{(byte)0xff});
+
+        performSizedLongTest(0x01L, new byte[]{0x01, 0x00});
+        performSizedLongTest(0x0110L, new byte[]{0x10, 0x01});
+        performSizedLongTest(0x7f10L, new byte[]{0x10, 0x7f});
+        performSizedLongTest(0xffffffffffff8010L, new byte[]{0x10, (byte)0x80});
+        performSizedLongTest(0xfffffffffffff010L, new byte[]{0x10, (byte)0xf0});
+        performSizedLongTest(0xffffffffffffff10L, new byte[]{0x10, (byte)0xff});
+        performSizedLongTest(0xffffffffffffff00L, new byte[]{0x00, (byte)0xff});
+        performSizedLongTest(0x7fffL, new byte[]{(byte)0xff, (byte)0x7f});
+
+        performSizedLongTest(0x01L, new byte[]{0x01, 0x00, 0x00});
+        performSizedLongTest(0x011010L, new byte[]{0x10, 0x10, 0x01});
+        performSizedLongTest(0x7f1010L, new byte[]{0x10, 0x10, 0x7f});
+        performSizedLongTest(0xffffffffff801010L, new byte[]{0x10, 0x10, (byte)0x80});
+        performSizedLongTest(0xfffffffffff01010L, new byte[]{0x10, 0x10, (byte)0xf0});
+        performSizedLongTest(0xffffffffffff1010L, new byte[]{0x10, 0x10, (byte)0xff});
+        performSizedLongTest(0xffffffffffff0000L, new byte[]{0x00, 0x00, (byte)0xff});
+        performSizedLongTest(0x7fffffL, new byte[]{(byte)0xff, (byte)0xff, (byte)0x7f});
+
+        performSizedLongTest(0x01L, new byte[]{0x01, 0x00, 0x00, 0x00});
+        performSizedLongTest(0x01101010L, new byte[]{0x10, 0x10, 0x10, 0x01});
+        performSizedLongTest(0x7f101010L, new byte[]{0x10, 0x10, 0x10, 0x7f});
+        performSizedLongTest(0xffffffff80101010L, new byte[]{0x10, 0x10, 0x10, (byte)0x80});
+        performSizedLongTest(0xfffffffff0101010l, new byte[]{0x10, 0x10, 0x10, (byte)0xf0});
+        performSizedLongTest(0xffffffffff101010L, new byte[]{0x10, 0x10, 0x10, (byte)0xff});
+        performSizedLongTest(0xffffffffff000000L, new byte[]{0x00, 0x00, 0x00, (byte)0xff});
+        performSizedLongTest(0x7fffffffL, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0x7f});
+
+        performSizedLongTest(0x01, new byte[]{0x01, 0x00, 0x00, 0x00, 0x00});
+        performSizedLongTest(0x0110101010L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x01});
+        performSizedLongTest(0x7f10101010L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x7f});
+        performSizedLongTest(0xffffff8010101010L, new byte[]{0x10, 0x10, 0x10, 0x10, (byte)0x80});
+        performSizedLongTest(0xfffffff010101010L, new byte[]{0x10, 0x10, 0x10, 0x10, (byte)0xf0});
+        performSizedLongTest(0xffffffff10101010L, new byte[]{0x10, 0x10, 0x10, 0x10, (byte)0xff});
+        performSizedLongTest(0xffffffff00000000L, new byte[]{0x00, 0x00, 0x00, 0x00, (byte)0xff});
+        performSizedLongTest(0x7fffffffffL, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x7f});
+
+        performSizedLongTest(0x01L, new byte[]{0x01, 0x00, 0x00, 0x00, 0x00, 0x00});
+        performSizedLongTest(0x011010101010L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x10, 0x01});
+        performSizedLongTest(0x7f1010101010L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x10, 0x7f});
+        performSizedLongTest(0xffff801010101010L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x10, (byte)0x80});
+        performSizedLongTest(0xfffff01010101010L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x10, (byte)0xf0});
+        performSizedLongTest(0xffffff1010101010L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x10, (byte)0xff});
+        performSizedLongTest(0xffffff0000000000L, new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, (byte)0xff});
+        performSizedLongTest(0x7fffffffffffL, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x7f});
+
+        performSizedLongTest(0x01L, new byte[]{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00});
+        performSizedLongTest(0x01101010101010L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x01});
+        performSizedLongTest(0x7f101010101010L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7f});
+        performSizedLongTest(0xff80101010101010L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, (byte)0x80});
+        performSizedLongTest(0xfff0101010101010L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, (byte)0xf0});
+        performSizedLongTest(0xffff101010101010L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, (byte)0xff});
+        performSizedLongTest(0xffff000000000000L, new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, (byte)0xff});
+        performSizedLongTest(0x7fffffffffffffL, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x7f});
+
+        performSizedLongTest(0x01L, new byte[]{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00});
+        performSizedLongTest(0x0110101010101010L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x01});
+        performSizedLongTest(0x7f10101010101010L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7f});
+        performSizedLongTest(0x8010101010101010L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, (byte)0x80});
+        performSizedLongTest(0xf010101010101010L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, (byte)0xf0});
+        performSizedLongTest(0xff10101010101010L, new byte[]{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, (byte)0xff});
+        performSizedLongTest(0xff00000000000000L, new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, (byte)0xff});
+        performSizedLongTest(Long.MAX_VALUE, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x7f});
+        performSizedLongTest(Long.MIN_VALUE, new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, (byte)0x80});
+        performSizedLongTest(-1, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff});
+    }
+
+    private void performSizedLongTest(long expectedValue, byte[] buf) {
+        DexBuffer dexBuf = new DexBuffer(buf);
+        DexReader reader = dexBuf.readerAt(0);
+        Assert.assertEquals(expectedValue, reader.readSizedLong(buf.length));
+    }
+
+    @Test
+    public void testSizedLongFailure() {
+        // wrong size
+        performSizedLongFailureTest(new byte[]{});
+        performSizedLongFailureTest(new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00});
+        performSizedLongFailureTest(new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00});
+        performSizedLongFailureTest(new byte[]{0x12, 0x34, 0x56, 0x12, 0x34, 0x56, 0x78, (byte)0x89, (byte)0x90, 0x01});
+    }
+
+    private void performSizedLongFailureTest(byte[] buf) {
+        DexBuffer dexBuf = new DexBuffer(buf);
+        DexReader reader = dexBuf.readerAt(0);
+        try {
+            reader.readSizedLong(buf.length);
+            Assert.fail();
+        } catch (ExceptionWithContext ex) {
+            // expected
+        }
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/pool/RollbackTest.java b/dexlib2/src/test/java/org/jf/dexlib2/pool/RollbackTest.java
new file mode 100644
index 0000000..3f433f0
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/dexlib2/pool/RollbackTest.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.pool;
+
+import com.google.common.collect.Lists;
+import org.jf.dexlib2.AccessFlags;
+import org.jf.dexlib2.AnnotationVisibility;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.raw.MapItem;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.Field;
+import org.jf.dexlib2.iface.Method;
+import org.jf.dexlib2.iface.MethodParameter;
+import org.jf.dexlib2.immutable.*;
+import org.jf.dexlib2.writer.io.MemoryDataStore;
+import org.jf.dexlib2.writer.pool.DexPool;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.List;
+
+public class RollbackTest {
+    @Test
+    public void testRollback() throws IOException {
+        ClassDef class1 = new ImmutableClassDef("Lcls1;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null, null,
+                Lists.newArrayList(new ImmutableAnnotation(AnnotationVisibility.RUNTIME, "Lannotation;", null)),
+                Lists.<Field>newArrayList(
+                        new ImmutableField("Lcls1;", "field1", "I", AccessFlags.PUBLIC.getValue(), null, null, null)
+                ),
+                Lists.<Method>newArrayList(
+                        new ImmutableMethod("Lcls1", "method1",
+                                Lists.<MethodParameter>newArrayList(new ImmutableMethodParameter("L", null, null)), "V",
+                                AccessFlags.PUBLIC.getValue(), null, null, null))
+                );
+
+        ClassDef class2 = new ImmutableClassDef("Lcls2;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null, null,
+                Lists.newArrayList(new ImmutableAnnotation(AnnotationVisibility.RUNTIME, "Lannotation2;", null)),
+                Lists.<Field>newArrayList(
+                        new ImmutableField("Lcls2;", "field2", "D", AccessFlags.PUBLIC.getValue(), null, null, null)
+                ),
+                Lists.<Method>newArrayList(
+                        new ImmutableMethod("Lcls2;", "method2",
+                                Lists.<MethodParameter>newArrayList(new ImmutableMethodParameter("D", null, null)), "V",
+                                AccessFlags.PUBLIC.getValue(), null, null, null))
+        );
+
+        DexBackedDexFile dexFile1;
+        {
+            MemoryDataStore dataStore = new MemoryDataStore();
+            DexPool dexPool = new DexPool(Opcodes.getDefault());
+            dexPool.internClass(class1);
+            dexPool.mark();
+            dexPool.internClass(class2);
+            dexPool.reset();
+            dexPool.writeTo(dataStore);
+            dexFile1 = new DexBackedDexFile(Opcodes.getDefault(), dataStore.getBuffer());
+        }
+
+        DexBackedDexFile dexFile2;
+        {
+            MemoryDataStore dataStore = new MemoryDataStore();
+            DexPool dexPool = new DexPool(Opcodes.getDefault());
+            dexPool.internClass(class1);
+            dexPool.writeTo(dataStore);
+            dexFile2 = new DexBackedDexFile(Opcodes.getDefault(), dataStore.getBuffer());
+        }
+
+        List<MapItem> mapItems1 = dexFile1.getMapItems();
+        List<MapItem> mapItems2 = dexFile2.getMapItems();
+        for (int i=0; i<mapItems1.size(); i++) {
+            Assert.assertEquals(mapItems1.get(i).getType(), mapItems2.get(i).getType());
+            Assert.assertEquals(mapItems1.get(i).getItemCount(), mapItems2.get(i).getItemCount());
+        }
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/rewriter/RewriteArrayTypeTest.java b/dexlib2/src/test/java/org/jf/dexlib2/rewriter/RewriteArrayTypeTest.java
new file mode 100644
index 0000000..ab5f7da
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/dexlib2/rewriter/RewriteArrayTypeTest.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2020, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.rewriter;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
+import org.jf.dexlib2.AccessFlags;
+import org.jf.dexlib2.AnnotationVisibility;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.iface.*;
+import org.jf.dexlib2.immutable.*;
+import org.junit.Assert;
+import org.junit.Test;
+
+import javax.annotation.Nonnull;
+
+public class RewriteArrayTypeTest {
+    @Test
+    public void testRewriteArrayTypeTest() {
+        ClassDef class1 = new ImmutableClassDef("Lcls1;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null, null,
+                Lists.newArrayList(new ImmutableAnnotation(AnnotationVisibility.RUNTIME, "Lannotation;", null)),
+                Lists.<Field>newArrayList(
+                        new ImmutableField("Lcls1;", "field1", "I", AccessFlags.PUBLIC.getValue(), null, null, null)
+                ),
+                Lists.<Method>newArrayList(
+                        new ImmutableMethod("Lcls1", "method1",
+                                Lists.<MethodParameter>newArrayList(new ImmutableMethodParameter("[[[Lcls1;", null, null)), "V",
+                                AccessFlags.PUBLIC.getValue(), null, null, null)));
+
+        ImmutableDexFile dexFile = new ImmutableDexFile(Opcodes.getDefault(), ImmutableSet.of(class1));
+
+
+        DexRewriter rewriter = new DexRewriter(new RewriterModule() {
+            @Nonnull @Override public Rewriter<String> getTypeRewriter(@Nonnull Rewriters rewriters) {
+                return new TypeRewriter() {
+                    @Nonnull @Override public String rewriteUnwrappedType(@Nonnull String value) {
+                        if (value.equals("Lcls1;")) {
+                            return "Lcls2;";
+                        }
+                        return value;
+                    }
+                };
+            }
+        });
+
+        DexFile rewrittenDexFile = rewriter.getDexFileRewriter().rewrite(dexFile);
+
+        ClassDef rewrittenClassDef = Lists.newArrayList(rewrittenDexFile.getClasses()).get(0);
+        Method rewrittenMethodDef = Lists.newArrayList(rewrittenClassDef.getMethods()).get(0);
+
+        Assert.assertEquals(rewrittenClassDef.getType(), "Lcls2;");
+        Assert.assertEquals(rewrittenMethodDef.getParameterTypes().get(0), "[[[Lcls2;");
+    }
+
+    @Test
+    public void testUnmodifiedArrayTypeTest() {
+        ClassDef class1 = new ImmutableClassDef("Lcls1;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null, null,
+                Lists.newArrayList(new ImmutableAnnotation(AnnotationVisibility.RUNTIME, "Lannotation;", null)),
+                Lists.<Field>newArrayList(
+                        new ImmutableField("Lcls1;", "field1", "I", AccessFlags.PUBLIC.getValue(), null, null, null)
+                ),
+                Lists.<Method>newArrayList(
+                        new ImmutableMethod("Lcls1", "method1",
+                                Lists.<MethodParameter>newArrayList(new ImmutableMethodParameter("[[[Lcls1;", null, null)), "V",
+                                AccessFlags.PUBLIC.getValue(), null, null, null)));
+
+        ImmutableDexFile dexFile = new ImmutableDexFile(Opcodes.getDefault(), ImmutableSet.of(class1));
+
+        DexRewriter rewriter = new DexRewriter(new RewriterModule());
+
+        DexFile rewrittenDexFile = rewriter.getDexFileRewriter().rewrite(dexFile);
+
+        ClassDef rewrittenClassDef = Lists.newArrayList(rewrittenDexFile.getClasses()).get(0);
+        Method rewrittenMethodDef = Lists.newArrayList(rewrittenClassDef.getMethods()).get(0);
+
+        Assert.assertEquals(rewrittenClassDef.getType(), "Lcls1;");
+        Assert.assertEquals(rewrittenMethodDef.getParameterTypes().get(0), "[[[Lcls1;");
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/util/InstructionOffsetMapTest.java b/dexlib2/src/test/java/org/jf/dexlib2/util/InstructionOffsetMapTest.java
new file mode 100644
index 0000000..37a9450
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/dexlib2/util/InstructionOffsetMapTest.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.util;
+
+import com.google.common.collect.ImmutableList;
+import junit.framework.Assert;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.immutable.ImmutableMethodImplementation;
+import org.jf.dexlib2.immutable.instruction.*;
+import org.jf.dexlib2.immutable.reference.ImmutableStringReference;
+import org.jf.dexlib2.immutable.reference.ImmutableTypeReference;
+import org.jf.util.ExceptionWithContext;
+import org.junit.Test;
+
+public class InstructionOffsetMapTest {
+    @Test
+    public void testInstructionOffsetMap() {
+        ImmutableList<ImmutableInstruction> instructions = ImmutableList.of(
+                /*00: 0x00*/ new ImmutableInstruction10t(Opcode.GOTO, 1),
+                /*01: 0x01*/ new ImmutableInstruction10x(Opcode.NOP),
+                /*02: 0x02*/ new ImmutableInstruction11n(Opcode.CONST_4, 2, 3),
+                /*03: 0x03*/ new ImmutableInstruction11x(Opcode.RETURN, 4),
+                /*04: 0x04*/ new ImmutableInstruction12x(Opcode.ARRAY_LENGTH, 5, 6),
+                /*05: 0x05*/ new ImmutableInstruction20t(Opcode.GOTO_16, 7),
+                /*06: 0x07*/ new ImmutableInstruction21c(Opcode.CONST_STRING, 8, new ImmutableStringReference("blah")),
+                /*07: 0x09*/ new ImmutableInstruction21ih(Opcode.CONST_HIGH16, 9, 0x10000),
+                /*08: 0x0b*/ new ImmutableInstruction21lh(Opcode.CONST_WIDE_HIGH16, 10, 0x1000000000000L),
+                /*09: 0x0d*/ new ImmutableInstruction21s(Opcode.CONST_16, 11, 12),
+                /*10: 0x0f*/ new ImmutableInstruction21t(Opcode.IF_EQZ, 12, 13),
+                /*11: 0x11*/ new ImmutableInstruction22b(Opcode.ADD_INT_LIT8, 14, 15, 16),
+                /*12: 0x13*/ new ImmutableInstruction22c(Opcode.INSTANCE_OF, 0, 1,
+                                                         new ImmutableTypeReference("Ltype;")),
+                /*13: 0x15*/ new ImmutableInstruction22s(Opcode.ADD_INT_LIT16, 2, 3, 17),
+                /*14: 0x17*/ new ImmutableInstruction22t(Opcode.IF_EQ, 4, 5, 18),
+                /*15: 0x19*/ new ImmutableInstruction22x(Opcode.MOVE_FROM16, 19, 20),
+                /*16: 0x1b*/ new ImmutableInstruction23x(Opcode.AGET, 21, 22, 23),
+                /*17: 0x1d*/ new ImmutableInstruction30t(Opcode.GOTO_32, 24),
+                /*18: 0x20*/ new ImmutableInstruction31c(Opcode.CONST_STRING_JUMBO, 25,
+                                                         new ImmutableStringReference("this is a string")),
+                /*19: 0x23*/ new ImmutableInstruction31i(Opcode.CONST, 26, 27),
+                /*20: 0x26*/ new ImmutableInstruction31t(Opcode.FILL_ARRAY_DATA, 28, 29),
+                /*21: 0x29*/ new ImmutableInstruction32x(Opcode.MOVE_16, 30, 31),
+                /*22: 0x2c*/ new ImmutableInstruction35c(Opcode.FILLED_NEW_ARRAY, 0, 0, 0, 0, 0, 0,
+                                                         new ImmutableTypeReference("Ltype;")),
+                /*23: 0x2f*/ new ImmutableInstruction3rc(Opcode.FILLED_NEW_ARRAY_RANGE, 0, 0,
+                                                         new ImmutableTypeReference("Ltype;")),
+                /*24: 0x32*/ new ImmutableInstruction51l(Opcode.CONST_WIDE, 32, 33),
+                /*25: 0x37*/ new ImmutableInstruction10t(Opcode.GOTO, 1)
+        );
+        ImmutableMethodImplementation impl = new ImmutableMethodImplementation(33, instructions, null, null);
+        InstructionOffsetMap instructionOffsetMap = new InstructionOffsetMap(instructions);
+
+        int[] expectedOffsets = new int[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x07, 0x09, 0x0b, 0x0d, 0x0f, 0x11,
+                0x13, 0x15, 0x17, 0x19, 0x1b, 0x1d, 0x20, 0x23, 0x26, 0x29, 0x2c, 0x2f, 0x32, 0x37};
+
+        for (int i=0; i<instructions.size(); i++) {
+            Assert.assertEquals(expectedOffsets[i], instructionOffsetMap.getInstructionCodeOffset(i));
+            Assert.assertEquals(i, instructionOffsetMap.getInstructionIndexAtCodeOffset(expectedOffsets[i], true));
+            Assert.assertEquals(i, instructionOffsetMap.getInstructionIndexAtCodeOffset(expectedOffsets[i], false));
+        }
+
+        int instructionIndex = -1;
+        for (int codeOffset=0; codeOffset<=expectedOffsets[expectedOffsets.length-1]; codeOffset++) {
+            if (codeOffset == expectedOffsets[instructionIndex+1]) {
+                // this offset is at the beginning of an instruction
+                instructionIndex++;
+            } else {
+                // this offset is in the middle of an instruction
+                Assert.assertEquals(instructionIndex,
+                        instructionOffsetMap.getInstructionIndexAtCodeOffset(codeOffset, false));
+
+                try {
+                    instructionOffsetMap.getInstructionIndexAtCodeOffset(codeOffset, true);
+                    Assert.fail(String.format("Exception exception didn't occur for code offset 0x%x", codeOffset));
+                } catch (ExceptionWithContext ex) {
+                    // expected exception
+                }
+            }
+        }
+        Assert.assertEquals(expectedOffsets.length-1,
+                instructionOffsetMap.getInstructionIndexAtCodeOffset(expectedOffsets[expectedOffsets.length-1]+1, false));
+        Assert.assertEquals(expectedOffsets.length-1,
+                instructionOffsetMap.getInstructionIndexAtCodeOffset(expectedOffsets[expectedOffsets.length-1]+10, false));
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/writer/CallSiteTest.java b/dexlib2/src/test/java/org/jf/dexlib2/writer/CallSiteTest.java
new file mode 100644
index 0000000..040c1fe
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/dexlib2/writer/CallSiteTest.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterators;
+import com.google.common.collect.Lists;
+import org.jf.dexlib2.*;
+import org.jf.dexlib2.builder.MethodImplementationBuilder;
+import org.jf.dexlib2.builder.instruction.BuilderInstruction35c;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.DexFile;
+import org.jf.dexlib2.iface.Method;
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction35c;
+import org.jf.dexlib2.iface.reference.CallSiteReference;
+import org.jf.dexlib2.immutable.ImmutableClassDef;
+import org.jf.dexlib2.immutable.ImmutableDexFile;
+import org.jf.dexlib2.immutable.ImmutableMethod;
+import org.jf.dexlib2.immutable.ImmutableMethodImplementation;
+import org.jf.dexlib2.immutable.instruction.ImmutableInstruction35c;
+import org.jf.dexlib2.immutable.reference.ImmutableCallSiteReference;
+import org.jf.dexlib2.immutable.reference.ImmutableMethodHandleReference;
+import org.jf.dexlib2.immutable.reference.ImmutableMethodProtoReference;
+import org.jf.dexlib2.immutable.reference.ImmutableMethodReference;
+import org.jf.dexlib2.writer.builder.BuilderCallSiteReference;
+import org.jf.dexlib2.writer.builder.BuilderMethod;
+import org.jf.dexlib2.writer.builder.DexBuilder;
+import org.jf.dexlib2.writer.io.FileDataStore;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+
+public class CallSiteTest {
+    @Test
+    public void testPoolCallSite() throws IOException {
+        ClassDef class1 = new ImmutableClassDef("Lcls1;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null, null,
+                null, null,
+                Lists.<Method>newArrayList(
+                        new ImmutableMethod("Lcls1", "method1",
+                                ImmutableList.of(), "V", AccessFlags.PUBLIC.getValue(), null, null,
+                                new ImmutableMethodImplementation(10, ImmutableList.of(
+                                        new ImmutableInstruction35c(Opcode.INVOKE_CUSTOM, 0, 0, 0, 0, 0, 0,
+                                                new ImmutableCallSiteReference("call_site_1",
+                                                        new ImmutableMethodHandleReference(MethodHandleType.INVOKE_STATIC,
+                                                                new ImmutableMethodReference("Lcls1", "loader",
+                                                                        ImmutableList.of("Ljava/lang/invoke/Lookup;",
+                                                                                "Ljava/lang/String;",
+                                                                                "Ljava/lang/invoke/MethodType;"),
+                                                                        "Ljava/lang/invoke/CallSite;")),
+                                                        "someMethod", new ImmutableMethodProtoReference(ImmutableList.of(), "V"), ImmutableList.of()))
+                                ), null, null))));
+
+        File tempFile = File.createTempFile("dex", ".dex");
+        DexFileFactory.writeDexFile(tempFile.getPath(),
+                new ImmutableDexFile(Opcodes.forArtVersion(111), ImmutableList.of(class1)));
+
+        verifyDexFile(DexFileFactory.loadDexFile(tempFile, Opcodes.forArtVersion(111)));
+    }
+
+    @Test
+    public void testBuilderCallSite() throws IOException {
+        DexBuilder dexBuilder = new DexBuilder(Opcodes.forArtVersion(111));
+
+        BuilderCallSiteReference callSite = dexBuilder.internCallSite(new ImmutableCallSiteReference("call_site_1",
+                new ImmutableMethodHandleReference(
+                        MethodHandleType.INVOKE_STATIC,
+                        new ImmutableMethodReference("Lcls1", "loader", ImmutableList.of("Ljava/lang/invoke/Lookup;",
+                                "Ljava/lang/String;",
+                                "Ljava/lang/invoke/MethodType;"),
+                                "Ljava/lang/invoke/CallSite;")),
+                "someMethod",
+                new ImmutableMethodProtoReference(ImmutableList.of(), "V"), ImmutableList.of()));
+
+        MethodImplementationBuilder methodImplementationBuilder = new MethodImplementationBuilder(10);
+        methodImplementationBuilder.addInstruction(new BuilderInstruction35c(Opcode.INVOKE_CUSTOM, 0, 0, 0, 0, 0, 0,
+                callSite));
+
+        BuilderMethod method = dexBuilder.internMethod("Lcls1", "method1", null, "V", 0, ImmutableSet.of(),
+                ImmutableSet.of(), methodImplementationBuilder.getMethodImplementation());
+        dexBuilder.internClassDef("Lcls1;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null, null,
+                ImmutableSet.of(), null,
+                ImmutableList.of(method));
+
+        File tempFile = File.createTempFile("dex", ".dex");
+        dexBuilder.writeTo(new FileDataStore(tempFile));
+
+        verifyDexFile(DexFileFactory.loadDexFile(tempFile, Opcodes.forArtVersion(111)));
+    }
+
+    private void verifyDexFile(DexFile dexFile) {
+        Assert.assertEquals(1, dexFile.getClasses().size());
+        ClassDef cls = Lists.newArrayList(dexFile.getClasses()).get(0);
+        Assert.assertEquals("Lcls1;", cls.getType());
+        Assert.assertEquals(1, Lists.newArrayList(cls.getMethods()).size());
+        Method method = Iterators.getNext(cls.getMethods().iterator(), null);
+        Assert.assertEquals("method1", method.getName());
+        Assert.assertEquals(1, Lists.newArrayList(method.getImplementation().getInstructions()).size());
+        Instruction instruction = Lists.newArrayList(method.getImplementation().getInstructions().iterator()).get(0);
+        Assert.assertEquals(Opcode.INVOKE_CUSTOM, instruction.getOpcode());
+        Assert.assertTrue(((Instruction35c) instruction).getReference() instanceof CallSiteReference);
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/writer/DexDataWriterTest.java b/dexlib2/src/test/java/org/jf/dexlib2/writer/DexDataWriterTest.java
new file mode 100644
index 0000000..7ef574c
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/dexlib2/writer/DexDataWriterTest.java
@@ -0,0 +1,537 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer;
+
+import junit.framework.Assert;
+import org.jf.dexlib2.ValueType;
+import org.jf.util.ExceptionWithContext;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Random;
+
+public class DexDataWriterTest {
+    private Random random;
+    private NakedByteArrayOutputStream output = new NakedByteArrayOutputStream();
+    private int startPosition;
+    private DexDataWriter writer;
+
+    @Before
+    public void setup() throws IOException {
+        // use a predefined seed, so we get a deterministic result
+        random = new Random();
+        output.reset();
+        startPosition = 123;
+        int bufferSize = 256;
+        writer = new DexDataWriter(output, startPosition, bufferSize);
+    }
+
+    // Note: we use int[] rather than byte[] so that we don't have to cast every value when manually constructing an
+    // array.
+    private void expectData(int... bytes) throws IOException {
+        Assert.assertEquals(startPosition+bytes.length, writer.getPosition());
+
+        writer.flush();
+        byte[] writtenData = output.getBuffer();
+
+        for (int i=0; i<bytes.length; i++) {
+            Assert.assertEquals(String.format("Values not equal at index %d", i), (byte)bytes[i], writtenData[i]);
+        }
+    }
+
+    private void expectData(byte[] bytes) throws IOException {
+        Assert.assertEquals(startPosition+bytes.length, writer.getPosition());
+
+        writer.flush();
+        byte[] writtenData = output.getBuffer();
+
+        for (int i=0; i<bytes.length; i++) {
+            Assert.assertEquals(String.format("Values not equal at index %d", i), bytes[i], writtenData[i]);
+        }
+    }
+
+    @Test
+    public void testWriteByte() throws IOException {
+        byte[] arr = new byte[257];
+        for (int i=0; i<256; i++) {
+            arr[i] = (byte)i;
+            writer.write(i);
+        }
+        arr[256] = (byte)0x80;
+        writer.write(0x180);
+
+        expectData(arr);
+    }
+
+    @Test
+    public void testWriteByteArray() throws IOException {
+        byte[] arr = new byte[345];
+        random.nextBytes(arr);
+        writer.write(arr);
+
+        expectData(arr);
+    }
+
+    @Test
+    public void testWriteByteArrayWithLengthAndOffset() throws IOException {
+        byte[] arr = new byte[345];
+        random.nextBytes(arr);
+        writer.write(arr, 10, 300);
+
+        expectData(Arrays.copyOfRange(arr, 10, 310));
+    }
+
+    @Test
+    public void testWriteLong() throws IOException {
+        writer.writeLong(0x1122334455667788L);
+        writer.writeLong(-0x1122334455667788L);
+
+        expectData(0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11,
+                   0x78, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE);
+    }
+
+    @Test
+    public void testWriteInt() throws IOException {
+        writer.writeInt(0x11223344);
+        writer.writeInt(-0x11223344);
+
+        expectData(0x44, 0x33, 0x22, 0x11,
+                   0xBC, 0xCC, 0xDD, 0xEE);
+    }
+
+    @Test
+    public void testWriteShort() throws IOException {
+        writer.writeShort(0);
+        writer.writeShort(0x1122);
+        writer.writeShort(-0x1122);
+        writer.writeShort(0x7FFF);
+        writer.writeShort(-0x8000);
+
+        expectData(0x00, 0x00,
+                   0x22, 0x11,
+                   0xDE, 0xEE,
+                   0xFF, 0x7F,
+                   0x00, 0x80);
+    }
+
+    @Test(expected=ExceptionWithContext.class)
+    public void testWriteShortOutOfBounds() throws IOException {
+        writer.writeShort(0x8000);
+    }
+
+    @Test(expected=ExceptionWithContext.class)
+    public void testWriteShortOutOfBounds2() throws IOException {
+        writer.writeShort(-0x8001);
+    }
+
+    @Test
+    public void testWriteUshort() throws IOException {
+        writer.writeUshort(0);
+        writer.writeUshort(0x1122);
+        writer.writeUshort(0x8899);
+        writer.writeUshort(0xFFFF);
+
+        expectData(0x00, 0x00,
+                   0x22, 0x11,
+                   0x99, 0x88,
+                   0xFF, 0xFF);
+    }
+
+    @Test(expected=ExceptionWithContext.class)
+    public void testWriteUshortOutOfBounds() throws IOException {
+        writer.writeUshort(-1);
+    }
+
+    @Test(expected=ExceptionWithContext.class)
+    public void testWriteUshortOutOfBounds2() throws IOException {
+        writer.writeUshort(0x10000);
+    }
+
+    @Test
+    public void testWriteUbyte() throws IOException {
+        writer.writeUbyte(0);
+        writer.writeUbyte(1);
+        writer.writeUbyte(0x12);
+        writer.writeUbyte(0xFF);
+
+        expectData(0x00, 0x01, 0x12, 0xFF);
+    }
+
+    @Test(expected=ExceptionWithContext.class)
+    public void testWriteUbyteOutOfBounds() throws IOException {
+        writer.writeUbyte(-1);
+    }
+
+    @Test(expected=ExceptionWithContext.class)
+    public void testWriteUbyteOutOfBounds2() throws IOException {
+        writer.writeUbyte(256);
+    }
+
+    @Test
+    public void testWriteEncodedValueHeader() throws IOException {
+        writer.writeEncodedValueHeader(0x2, 0x1);
+
+        expectData(0x22);
+    }
+
+    private void testWriteEncodedIntHelper(int integerValue, int... encodedValue) throws IOException {
+        setup();
+        writer.writeEncodedInt(ValueType.INT, integerValue);
+
+        int[] arr = new int[encodedValue.length+1];
+        arr[0] = ValueType.INT | ((encodedValue.length-1) << 5);
+        System.arraycopy(encodedValue, 0, arr, 1, encodedValue.length);
+        expectData(arr);
+    }
+
+    @Test
+    public void testWriteEncodedInt() throws IOException {
+        testWriteEncodedIntHelper(0x00, 0x00);
+        testWriteEncodedIntHelper(0x40, 0x40);
+        testWriteEncodedIntHelper(0x7f, 0x7f);
+        testWriteEncodedIntHelper(0xff, 0xff, 0x00);
+        testWriteEncodedIntHelper(0xffff80, 0x80, 0xff, 0xff, 0x00);
+        testWriteEncodedIntHelper(0xffffff80, 0x80);
+        testWriteEncodedIntHelper(0xffffffff, 0xff);
+        testWriteEncodedIntHelper(0x100, 0x00, 0x01);
+        testWriteEncodedIntHelper(0x7fff, 0xff, 0x7f);
+        testWriteEncodedIntHelper(0x8000, 0x00, 0x80, 0x00);
+        testWriteEncodedIntHelper(0xffff8000, 0x00, 0x80);
+        testWriteEncodedIntHelper(0x10000, 0x00, 0x00, 0x01);
+        testWriteEncodedIntHelper(0x10203, 0x03, 0x02, 0x01);
+        testWriteEncodedIntHelper(0x810203, 0x03, 0x02, 0x81, 0x00);
+        testWriteEncodedIntHelper(0xff810203, 0x03, 0x02, 0x81);
+        testWriteEncodedIntHelper(0x1000000, 0x00, 0x00, 0x00, 0x01);
+        testWriteEncodedIntHelper(0x1020304, 0x04, 0x03, 0x02, 0x01);
+        testWriteEncodedIntHelper(0x7fffffff, 0xff, 0xff, 0xff, 0x7f);
+        testWriteEncodedIntHelper(0x80000000, 0x00, 0x00, 0x00, 0x80);
+        testWriteEncodedIntHelper(0x80000001, 0x01, 0x00, 0x00, 0x80);
+    }
+
+    private void testWriteEncodedUintHelper(int integerValue, int... encodedValue) throws IOException {
+        setup();
+        writer.writeEncodedUint(ValueType.METHOD, integerValue);
+
+        int[] arr = new int[encodedValue.length+1];
+        arr[0] = ValueType.METHOD | ((encodedValue.length-1) << 5);
+        System.arraycopy(encodedValue, 0, arr, 1, encodedValue.length);
+        expectData(arr);
+    }
+
+    @Test
+    public void testWriteEncodedUint() throws IOException {
+        testWriteEncodedUintHelper(0x00, 0x00);
+        testWriteEncodedUintHelper(0x01, 0x01);
+        testWriteEncodedUintHelper(0x40, 0x40);
+        testWriteEncodedUintHelper(0x7f, 0x7f);
+        testWriteEncodedUintHelper(0x80, 0x80);
+        testWriteEncodedUintHelper(0x81, 0x81);
+        testWriteEncodedUintHelper(0xff, 0xff);
+        testWriteEncodedUintHelper(0x100, 0x00, 0x01);
+        testWriteEncodedUintHelper(0x180, 0x80, 0x01);
+        testWriteEncodedUintHelper(0x8080, 0x80, 0x80);
+        testWriteEncodedUintHelper(0x1234, 0x34, 0x12);
+        testWriteEncodedUintHelper(0x1000, 0x00, 0x10);
+        testWriteEncodedUintHelper(0x8000, 0x00, 0x80);
+        testWriteEncodedUintHelper(0xff00, 0x00, 0xff);
+        testWriteEncodedUintHelper(0xffff, 0xff, 0xff);
+        testWriteEncodedUintHelper(0x10000, 0x00, 0x00, 0x01);
+        testWriteEncodedUintHelper(0x1ffff, 0xff, 0xff, 0x01);
+        testWriteEncodedUintHelper(0x80ffff, 0xff, 0xff, 0x80);
+        testWriteEncodedUintHelper(0xffffff, 0xff, 0xff, 0xff);
+        testWriteEncodedUintHelper(0x1000000, 0x00, 0x00, 0x00, 0x01);
+        testWriteEncodedUintHelper(0x1020304, 0x04, 0x03, 0x02, 0x01);
+        testWriteEncodedUintHelper(0x80000000, 0x00, 0x00, 0x00, 0x80);
+        testWriteEncodedUintHelper(0x80ffffff, 0xff, 0xff, 0xff, 0x80);
+        testWriteEncodedUintHelper(0xffffffff, 0xff, 0xff, 0xff, 0xff);
+    }
+
+    private void testWriteEncodedLongHelper(long longValue, int... encodedValue) throws IOException {
+        setup();
+        writer.writeEncodedLong(ValueType.LONG, longValue);
+
+        int[] arr = new int[encodedValue.length+1];
+        arr[0] = ValueType.LONG | ((encodedValue.length-1) << 5);
+        System.arraycopy(encodedValue, 0, arr, 1, encodedValue.length);
+        expectData(arr);
+    }
+
+    @Test
+    public void testWriteEncodedLong() throws IOException {
+        testWriteEncodedLongHelper(0x00L, 0x00);
+        testWriteEncodedLongHelper(0x40L, 0x40);
+        testWriteEncodedLongHelper(0x7fL, 0x7f);
+        testWriteEncodedLongHelper(0xffL, 0xff, 0x00);
+        testWriteEncodedLongHelper(0xffffffffffffff80L, 0x80);
+        testWriteEncodedLongHelper(0xffffffffffffffffL, 0xff);
+
+        testWriteEncodedLongHelper(0x100L, 0x00, 0x01);
+        testWriteEncodedLongHelper(0x7fffL, 0xff, 0x7f);
+        testWriteEncodedLongHelper(0x8000L, 0x00, 0x80, 0x00);
+        testWriteEncodedLongHelper(0xffffffffffff8000L, 0x00, 0x80);
+
+        testWriteEncodedLongHelper(0x10000L, 0x00, 0x00, 0x01);
+        testWriteEncodedLongHelper(0x10203L, 0x03, 0x02, 0x01);
+        testWriteEncodedLongHelper(0x810203L, 0x03, 0x02, 0x81, 0x00);
+        testWriteEncodedLongHelper(0xffffffffff810203L, 0x03, 0x02, 0x81);
+
+        testWriteEncodedLongHelper(0x1000000L, 0x00, 0x00, 0x00, 0x01);
+        testWriteEncodedLongHelper(0x1020304L, 0x04, 0x03, 0x02, 0x01);
+        testWriteEncodedLongHelper(0x7fffffffL, 0xff, 0xff, 0xff, 0x7f);
+        testWriteEncodedLongHelper(0x80000000L, 0x00, 0x00, 0x00, 0x80, 0x00);
+        testWriteEncodedLongHelper(0xffffffff80000000L, 0x00, 0x00, 0x00, 0x80);
+        testWriteEncodedLongHelper(0xffffffff80000001L, 0x01, 0x00, 0x00, 0x80);
+
+        testWriteEncodedLongHelper(0x100000000L, 0x00, 0x00, 0x00, 0x00, 0x01);
+        testWriteEncodedLongHelper(0x102030405L, 0x05, 0x04, 0x03, 0x02, 0x01);
+        testWriteEncodedLongHelper(0x7fffffffffL, 0xff, 0xff, 0xff, 0xff, 0x7f);
+        testWriteEncodedLongHelper(0x8000000000L, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00);
+        testWriteEncodedLongHelper(0xffffff8000000000L, 0x00, 0x00, 0x00, 0x00, 0x80);
+        testWriteEncodedLongHelper(0xffffff8000000001L, 0x01, 0x00, 0x00, 0x00, 0x80);
+
+        testWriteEncodedLongHelper(0x10000000000L, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01);
+        testWriteEncodedLongHelper(0x10203040506L, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01);
+        testWriteEncodedLongHelper(0x7fffffffffffL, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f);
+        testWriteEncodedLongHelper(0x800000000000L, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00);
+        testWriteEncodedLongHelper(0xffff800000000000L, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80);
+        testWriteEncodedLongHelper(0xffff800000000001L, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80);
+
+        testWriteEncodedLongHelper(0x1000000000000L, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01);
+        testWriteEncodedLongHelper(0x1020304050607L, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01);
+        testWriteEncodedLongHelper(0x7fffffffffffffL, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f);
+        testWriteEncodedLongHelper(0x80000000000000L, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00);
+        testWriteEncodedLongHelper(0xff80000000000000L, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80);
+        testWriteEncodedLongHelper(0xff80000000000001L, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80);
+
+        testWriteEncodedLongHelper(0x100000000000000L, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01);
+        testWriteEncodedLongHelper(0x102030405060708L, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01);
+        testWriteEncodedLongHelper(0x7fffffffffffffffL, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f);
+        testWriteEncodedLongHelper(0x8000000000000000L, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80);
+        testWriteEncodedLongHelper(0x8000000000000001L, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80);
+        testWriteEncodedLongHelper(0xfeffffffffffffffL, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe);
+
+        testWriteEncodedLongHelper(0x123456789ABCDEF0L, 0xF0, 0xDE, 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12);
+    }
+
+    private void testWriteRightZeroExtendedIntHelper(int intValue, int... encodedValue) throws IOException {
+        setup();
+        writer.writeRightZeroExtendedInt(ValueType.FLOAT, intValue);
+
+        int[] arr = new int[encodedValue.length+1];
+        arr[0] = ValueType.FLOAT | ((encodedValue.length-1) << 5);
+        System.arraycopy(encodedValue, 0, arr, 1, encodedValue.length);
+        expectData(arr);
+    }
+
+    @Test
+    public void testWriteRightZeroExtendedInt() throws IOException {
+        testWriteRightZeroExtendedIntHelper(0, 0x00);
+
+        testWriteRightZeroExtendedIntHelper(0x01000000, 0x01);
+        testWriteRightZeroExtendedIntHelper(0x7f000000, 0x7f);
+        testWriteRightZeroExtendedIntHelper(0x80000000, 0x80);
+        testWriteRightZeroExtendedIntHelper(0xf0000000, 0xf0);
+        testWriteRightZeroExtendedIntHelper(0xff000000, 0xff);
+
+        testWriteRightZeroExtendedIntHelper(0x010000, 0x01, 0x00);
+        testWriteRightZeroExtendedIntHelper(0x01100000, 0x10, 0x01);
+        testWriteRightZeroExtendedIntHelper(0x7f100000, 0x10, 0x7f);
+        testWriteRightZeroExtendedIntHelper(0x80100000, 0x10, 0x80);
+        testWriteRightZeroExtendedIntHelper(0xf0100000, 0x10, 0xf0);
+        testWriteRightZeroExtendedIntHelper(0xff100000, 0x10, 0xff);
+        testWriteRightZeroExtendedIntHelper(0xff000000, 0xff);
+
+        testWriteRightZeroExtendedIntHelper(0x0100, 0x01, 0x00, 0x00);
+        testWriteRightZeroExtendedIntHelper(0x01101000, 0x10, 0x10, 0x01);
+        testWriteRightZeroExtendedIntHelper(0x7f101000, 0x10, 0x10, 0x7f);
+        testWriteRightZeroExtendedIntHelper(0x80101000, 0x10, 0x10, 0x80);
+        testWriteRightZeroExtendedIntHelper(0xf0101000, 0x10, 0x10, 0xf0);
+        testWriteRightZeroExtendedIntHelper(0xff101000, 0x10, 0x10, 0xff);
+
+        testWriteRightZeroExtendedIntHelper(0x01, 0x01, 0x00, 0x00, 0x00);
+        testWriteRightZeroExtendedIntHelper(0x80, 0x80, 0x00, 0x00, 0x00);
+        testWriteRightZeroExtendedIntHelper(0xff, 0xff, 0x00, 0x00, 0x00);
+        testWriteRightZeroExtendedIntHelper(0x01101010, 0x10, 0x10, 0x10, 0x01);
+        testWriteRightZeroExtendedIntHelper(0x7f101010, 0x10, 0x10, 0x10, 0x7f);
+        testWriteRightZeroExtendedIntHelper(0x80101010, 0x10, 0x10, 0x10, 0x80);
+        testWriteRightZeroExtendedIntHelper(0xf0101010, 0x10, 0x10, 0x10, 0xf0);
+        testWriteRightZeroExtendedIntHelper(0xff101010, 0x10, 0x10, 0x10, 0xff);
+    }
+
+    private void testWriteRightZeroExtendedLongHelper(long longValue, int... encodedValue) throws IOException {
+        setup();
+        writer.writeRightZeroExtendedLong(ValueType.DOUBLE, longValue);
+
+        int[] arr = new int[encodedValue.length+1];
+        arr[0] = ValueType.DOUBLE | ((encodedValue.length-1) << 5);
+        System.arraycopy(encodedValue, 0, arr, 1, encodedValue.length);
+        expectData(arr);
+    }
+
+    @Test
+    public void testWriteRightZeroExtendedLong() throws IOException {
+        testWriteRightZeroExtendedLongHelper(0, 0x00);
+
+        testWriteRightZeroExtendedLongHelper(0x0100000000000000L, 0x01);
+        testWriteRightZeroExtendedLongHelper(0x7f00000000000000L, 0x7f);
+        testWriteRightZeroExtendedLongHelper(0x8000000000000000L, 0x80);
+        testWriteRightZeroExtendedLongHelper(0xf000000000000000L, 0xf0);
+        testWriteRightZeroExtendedLongHelper(0xff00000000000000L, 0xff);
+
+        testWriteRightZeroExtendedLongHelper(0x01000000000000L, 0x01, 0x00);
+        testWriteRightZeroExtendedLongHelper(0x0110000000000000L, 0x10, 0x01);
+        testWriteRightZeroExtendedLongHelper(0x7f10000000000000L, 0x10, 0x7f);
+        testWriteRightZeroExtendedLongHelper(0x8010000000000000L, 0x10, 0x80);
+        testWriteRightZeroExtendedLongHelper(0xf010000000000000L, 0x10, 0xf0);
+        testWriteRightZeroExtendedLongHelper(0xff10000000000000L, 0x10, 0xff);
+        testWriteRightZeroExtendedLongHelper(0x7fff000000000000L, 0xff, 0x7f);
+
+        testWriteRightZeroExtendedLongHelper(0x010000000000L, 0x01, 0x00, 0x00);
+        testWriteRightZeroExtendedLongHelper(0x0110100000000000L, 0x10, 0x10, 0x01);
+        testWriteRightZeroExtendedLongHelper(0x7f10100000000000L, 0x10, 0x10, 0x7f);
+        testWriteRightZeroExtendedLongHelper(0x8010100000000000L, 0x10, 0x10, 0x80);
+        testWriteRightZeroExtendedLongHelper(0xf010100000000000L, 0x10, 0x10, 0xf0);
+        testWriteRightZeroExtendedLongHelper(0xff10100000000000L, 0x10, 0x10, 0xff);
+        testWriteRightZeroExtendedLongHelper(0x7fffff0000000000L, 0xff, 0xff, 0x7f);
+
+        testWriteRightZeroExtendedLongHelper(0x0100000000L, 0x01, 0x00, 0x00, 0x00);
+        testWriteRightZeroExtendedLongHelper(0x0110101000000000L, 0x10, 0x10, 0x10, 0x01);
+        testWriteRightZeroExtendedLongHelper(0x7f10101000000000L, 0x10, 0x10, 0x10, 0x7f);
+        testWriteRightZeroExtendedLongHelper(0x8010101000000000L, 0x10, 0x10, 0x10, 0x80);
+        testWriteRightZeroExtendedLongHelper(0xf010101000000000L, 0x10, 0x10, 0x10, 0xf0);
+        testWriteRightZeroExtendedLongHelper(0xff10101000000000L, 0x10, 0x10, 0x10, 0xff);
+        testWriteRightZeroExtendedLongHelper(0x7fffffff00000000L, 0xff, 0xff, 0xff, 0x7f);
+
+        testWriteRightZeroExtendedLongHelper(0x01000000L, 0x01, 0x00, 0x00, 0x00, 0x00);
+        testWriteRightZeroExtendedLongHelper(0x0110101010000000L, 0x10, 0x10, 0x10, 0x10, 0x01);
+        testWriteRightZeroExtendedLongHelper(0x7f10101010000000L, 0x10, 0x10, 0x10, 0x10, 0x7f);
+        testWriteRightZeroExtendedLongHelper(0x8010101010000000L, 0x10, 0x10, 0x10, 0x10, 0x80);
+        testWriteRightZeroExtendedLongHelper(0xf010101010000000L, 0x10, 0x10, 0x10, 0x10, 0xf0);
+        testWriteRightZeroExtendedLongHelper(0xff10101010000000L, 0x10, 0x10, 0x10, 0x10, 0xff);
+        testWriteRightZeroExtendedLongHelper(0x7fffffffff000000L, 0xff, 0xff, 0xff, 0xff, 0x7f);
+
+        testWriteRightZeroExtendedLongHelper(0x010000L, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00);
+        testWriteRightZeroExtendedLongHelper(0x0110101010100000L, 0x10, 0x10, 0x10, 0x10, 0x10, 0x01);
+        testWriteRightZeroExtendedLongHelper(0x7f10101010100000L, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7f);
+        testWriteRightZeroExtendedLongHelper(0x8010101010100000L, 0x10, 0x10, 0x10, 0x10, 0x10, 0x80);
+        testWriteRightZeroExtendedLongHelper(0xf010101010100000L, 0x10, 0x10, 0x10, 0x10, 0x10, 0xf0);
+        testWriteRightZeroExtendedLongHelper(0xff10101010100000L, 0x10, 0x10, 0x10, 0x10, 0x10, 0xff);
+        testWriteRightZeroExtendedLongHelper(0x7fffffffffff0000L, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f);
+
+        testWriteRightZeroExtendedLongHelper(0x0100L, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
+        testWriteRightZeroExtendedLongHelper(0x0110101010101000L, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x01);
+        testWriteRightZeroExtendedLongHelper(0x7f10101010101000L, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7f);
+        testWriteRightZeroExtendedLongHelper(0x8010101010101000L, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x80);
+        testWriteRightZeroExtendedLongHelper(0xf010101010101000L, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xf0);
+        testWriteRightZeroExtendedLongHelper(0xff10101010101000L, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xff);
+        testWriteRightZeroExtendedLongHelper(0x7fffffffffffff00L, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f);
+
+        testWriteRightZeroExtendedLongHelper(0x01L, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
+        testWriteRightZeroExtendedLongHelper(0x0110101010101010L, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x01);
+        testWriteRightZeroExtendedLongHelper(0x7f10101010101010L, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7f);
+        testWriteRightZeroExtendedLongHelper(0x8010101010101010L, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x80);
+        testWriteRightZeroExtendedLongHelper(0xf010101010101010L, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xf0);
+        testWriteRightZeroExtendedLongHelper(0xff10101010101010L, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xff);
+        testWriteRightZeroExtendedLongHelper(Long.MAX_VALUE, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f);
+        testWriteRightZeroExtendedLongHelper(Long.MIN_VALUE, 0x80);
+        testWriteRightZeroExtendedLongHelper(-1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff);
+    }
+
+    private void testWriteStringHelper(String stringValue, int... encodedValue) throws IOException {
+        setup();
+
+        writer.writeString(stringValue);
+
+        expectData(encodedValue);
+    }
+
+    @Test
+    public void testWriteString() throws IOException {
+        testWriteStringHelper(new String(new char[]{0x00}), 0xc0, 0x80);
+        testWriteStringHelper(new String(new char[]{0x01}), 0x01);
+        testWriteStringHelper(new String(new char[]{0x40}), 0x40);
+        testWriteStringHelper(new String(new char[]{0x7f}), 0x7f);
+        testWriteStringHelper(new String(new char[]{0x80}), 0xc2, 0x80);
+        testWriteStringHelper(new String(new char[]{0x81}), 0xc2, 0x81);
+        testWriteStringHelper(new String(new char[]{0x100}), 0xc4, 0x80);
+        testWriteStringHelper(new String(new char[]{0x7ff}), 0xdf, 0xbf);
+        testWriteStringHelper(new String(new char[]{0x800}), 0xe0, 0xa0, 0x80);
+        testWriteStringHelper(new String(new char[]{0x801}), 0xe0, 0xa0, 0x81);
+        testWriteStringHelper(new String(new char[]{0x1000}), 0xe1, 0x80, 0x80);
+        testWriteStringHelper(new String(new char[]{0x7fff}), 0xe7, 0xbf, 0xbf);
+        testWriteStringHelper(new String(new char[]{0x8000}), 0xe8, 0x80, 0x80);
+        testWriteStringHelper(new String(new char[]{0x8001}), 0xe8, 0x80, 0x81);
+        testWriteStringHelper(new String(new char[]{0xffff}), 0xef, 0xbf, 0xbf);
+    }
+
+    @Test
+    public void testAlign() throws IOException {
+        // create a new writer so we can start at file position 0
+        startPosition = 0;
+        writer = new DexDataWriter(output, startPosition, 256);
+
+        writer.align();
+        writer.write(1);
+        writer.align();
+        writer.align();
+
+        writer.write(1);
+        writer.write(2);
+        writer.align();
+
+        writer.write(1);
+        writer.write(2);
+        writer.write(3);
+        writer.align();
+        writer.align();
+
+        writer.write(1);
+        writer.write(2);
+        writer.write(3);
+        writer.write(4);
+        writer.align();
+        writer.align();
+        writer.align();
+        writer.align();
+
+        writer.write(1);
+        writer.align();
+
+        expectData(0x01, 0x00, 0x00, 0x00,
+                   0x01, 0x02, 0x00, 0x00,
+                   0x01, 0x02, 0x03, 0x00,
+                   0x01, 0x02, 0x03, 0x04,
+                   0x01, 0x00, 0x00, 0x00);
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/writer/DexWriterSleb128Test.java b/dexlib2/src/test/java/org/jf/dexlib2/writer/DexWriterSleb128Test.java
new file mode 100644
index 0000000..ffcf96b
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/dexlib2/writer/DexWriterSleb128Test.java
@@ -0,0 +1,250 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer;
+
+import junit.framework.Assert;
+import org.junit.Test;
+
+import java.io.IOException;
+
+public class DexWriterSleb128Test {
+    private NakedByteArrayOutputStream output = new NakedByteArrayOutputStream();
+    private int startPosition;
+    private DexDataWriter writer;
+
+    public void setup() throws IOException {
+        output.reset();
+        startPosition = 123;
+        int bufferSize = 256;
+        writer = new DexDataWriter(output, startPosition, bufferSize);
+    }
+
+    @Test
+    public void testSleb128() throws IOException {
+        performTest(0x0, new byte[]{0x0, 0x11}, 1);
+        performTest(0x1, new byte[]{0x1, 0x11}, 1);
+        performTest(0x3f, new byte[]{0x3f, 0x11}, 1);
+        performTest(0xffffffc0, new byte[]{0x40, 0x11}, 1);
+        performTest(0xfffffff0, new byte[]{0x70, 0x11}, 1);
+        performTest(0xffffffff, new byte[]{0x7f, 0x11}, 1);
+
+        performTest(0x80, new byte[]{(byte)0x80, 0x1, 0x11}, 2);
+        performTest(0x100, new byte[]{(byte)0x80, 0x2, 0x11}, 2);
+        performTest(0x800, new byte[]{(byte)0x80, 0x10, 0x11}, 2);
+        performTest(0x1f80, new byte[]{(byte)0x80, 0x3f, 0x11}, 2);
+        performTest(0xffffe000, new byte[]{(byte)0x80, 0x40, 0x11}, 2);
+        performTest(0xffffe080, new byte[]{(byte)0x80, 0x41, 0x11}, 2);
+        performTest(0xfffff800, new byte[]{(byte)0x80, 0x70, 0x11}, 2);
+        performTest(0xffffff80, new byte[]{(byte)0x80, 0x7f, 0x11}, 2);
+
+        performTest(0xff, new byte[]{(byte)0xff, 0x1, 0x11}, 2);
+        performTest(0x17f, new byte[]{(byte)0xff, 0x2, 0x11}, 2);
+        performTest(0x87f, new byte[]{(byte)0xff, 0x10, 0x11}, 2);
+        performTest(0x1fff, new byte[]{(byte)0xff, 0x3f, 0x11}, 2);
+        performTest(0xffffe07f, new byte[]{(byte)0xff, 0x40, 0x11}, 2);
+        performTest(0xffffe0ff, new byte[]{(byte)0xff, 0x41, 0x11}, 2);
+        performTest(0xfffff87f, new byte[]{(byte)0xff, 0x70, 0x11}, 2);
+
+        performTest(0x4000, new byte[]{(byte)0x80, (byte)0x80, 0x1, 0x11}, 3);
+        performTest(0x8000, new byte[]{(byte)0x80, (byte)0x80, 0x2, 0x11}, 3);
+        performTest(0x40000, new byte[]{(byte)0x80, (byte)0x80, 0x10, 0x11}, 3);
+        performTest(0xfc000, new byte[]{(byte)0x80, (byte)0x80, 0x3f, 0x11}, 3);
+        performTest(0xfff00000, new byte[]{(byte)0x80, (byte)0x80, 0x40, 0x11}, 3);
+        performTest(0xfff04000, new byte[]{(byte)0x80, (byte)0x80, 0x41, 0x11}, 3);
+        performTest(0xfffc0000, new byte[]{(byte)0x80, (byte)0x80, 0x70, 0x11}, 3);
+        performTest(0xffffc000, new byte[]{(byte)0x80, (byte)0x80, 0x7f, 0x11}, 3);
+
+        performTest(0x7fff, new byte[]{(byte)0xff, (byte)0xff, 0x1, 0x11}, 3);
+        performTest(0xbfff, new byte[]{(byte)0xff, (byte)0xff, 0x2, 0x11}, 3);
+        performTest(0x43fff, new byte[]{(byte)0xff, (byte)0xff, 0x10, 0x11}, 3);
+        performTest(0xfffff, new byte[]{(byte)0xff, (byte)0xff, 0x3f, 0x11}, 3);
+        performTest(0xfff03fff, new byte[]{(byte)0xff, (byte)0xff, 0x40, 0x11}, 3);
+        performTest(0xfff07fff, new byte[]{(byte)0xff, (byte)0xff, 0x41, 0x11}, 3);
+        performTest(0xfffc3fff, new byte[]{(byte)0xff, (byte)0xff, 0x70, 0x11}, 3);
+
+        performTest(0x200000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x1, 0x11}, 4);
+        performTest(0x400000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x2, 0x11}, 4);
+        performTest(0x2000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x10, 0x11}, 4);
+        performTest(0x7e00000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x3f, 0x11}, 4);
+        performTest(0xf8000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x40, 0x11}, 4);
+        performTest(0xf8200000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x41, 0x11}, 4);
+        performTest(0xfe000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x70, 0x11}, 4);
+        performTest(0xffe00000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x7f, 0x11}, 4);
+
+        performTest(0x3fffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x1, 0x11}, 4);
+        performTest(0x5fffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x2, 0x11}, 4);
+        performTest(0x21fffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x10, 0x11}, 4);
+        performTest(0x7ffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x3f, 0x11}, 4);
+        performTest(0xf81fffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x40, 0x11}, 4);
+        performTest(0xf83fffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x41, 0x11}, 4);
+        performTest(0xfe1fffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x70, 0x11}, 4);
+
+        performTest(0x10000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0x1, 0x11}, 5);
+        performTest(0x20000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0x2, 0x11}, 5);
+        performTest(0x70000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0x7, 0x11}, 5);
+        performTest(0x80000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0x8, 0x11}, 5);
+        performTest(0xe0000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0xe, 0x11}, 5);
+        performTest(0xf0000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0xf, 0x11}, 5);
+
+        performTest(0x1fffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0x1, 0x11}, 5);
+        performTest(0x2fffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0x2, 0x11}, 5);
+        performTest(0x7fffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0x7, 0x11}, 5);
+        performTest(0x8fffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0x8, 0x11}, 5);
+        performTest(0xefffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0xe, 0x11}, 5);
+
+        performTest(0x8197d2, new byte[]{(byte)0xd2, (byte)0xaf, (byte)0x86, 0x4});
+        performTest(0x3cc8eb78, new byte[]{(byte)0xf8, (byte)0xd6, (byte)0xa3, (byte)0xe6, 0x3});
+        performTest(0x51307f32, new byte[]{(byte)0xb2, (byte)0xfe, (byte)0xc1, (byte)0x89, 0x5});
+        performTest(0x8893, new byte[]{(byte)0x93, (byte)0x91, 0x2});
+        performTest(0x80fb, new byte[]{(byte)0xfb, (byte)0x81, 0x2});
+        performTest(0x3d, new byte[]{0x3d});
+        performTest(0x987c, new byte[]{(byte)0xfc, (byte)0xb0, 0x2});
+        performTest(0x5b2478, new byte[]{(byte)0xf8, (byte)0xc8, (byte)0xec, 0x2});
+        performTest(0x65350ed9, new byte[]{(byte)0xd9, (byte)0x9d, (byte)0xd4, (byte)0xa9, 0x6});
+        performTest(0x3e, new byte[]{0x3e});
+        performTest(0x7b1e, new byte[]{(byte)0x9e, (byte)0xf6, 0x1});
+        performTest(0xb5, new byte[]{(byte)0xb5, 0x1});
+        performTest(0x96, new byte[]{(byte)0x96, 0x1});
+        performTest(0xa1, new byte[]{(byte)0xa1, 0x1});
+        performTest(0x4d50a85d, new byte[]{(byte)0xdd, (byte)0xd0, (byte)0xc2, (byte)0xea, 0x4});
+        performTest(0xc419, new byte[]{(byte)0x99, (byte)0x88, 0x3});
+        performTest(0xcf34, new byte[]{(byte)0xb4, (byte)0x9e, 0x3});
+        performTest(0x527d, new byte[]{(byte)0xfd, (byte)0xa4, 0x1});
+        performTest(0x5a2894, new byte[]{(byte)0x94, (byte)0xd1, (byte)0xe8, 0x2});
+        performTest(0xa6, new byte[]{(byte)0xa6, 0x1});
+        performTest(0x3e05, new byte[]{(byte)0x85, (byte)0xfc, 0x0});
+        performTest(0x5f, new byte[]{(byte)0xdf, 0x0});
+        performTest(0xe2d9af, new byte[]{(byte)0xaf, (byte)0xb3, (byte)0x8b, 0x7});
+        performTest(0xa853fe14, new byte[]{(byte)0x94, (byte)0xfc, (byte)0xcf, (byte)0xc2, 0xa});
+        performTest(0xa853fe14, new byte[]{(byte)0x94, (byte)0xfc, (byte)0xcf, (byte)0xc2, 0x7a});
+        performTest(0x117de731, new byte[]{(byte)0xb1, (byte)0xce, (byte)0xf7, (byte)0x8b, 0x1});
+        performTest(0xb7c9, new byte[]{(byte)0xc9, (byte)0xef, 0x2});
+        performTest(0xb1, new byte[]{(byte)0xb1, 0x1});
+        performTest(0x4f194d, new byte[]{(byte)0xcd, (byte)0xb2, (byte)0xbc, 0x2});
+        performTest(0x8d5733, new byte[]{(byte)0xb3, (byte)0xae, (byte)0xb5, 0x4});
+        performTest(0x2824e9ae, new byte[]{(byte)0xae, (byte)0xd3, (byte)0x93, (byte)0xc1, 0x2});
+        performTest(0x792e, new byte[]{(byte)0xae, (byte)0xf2, 0x1});
+        performTest(0xadef, new byte[]{(byte)0xef, (byte)0xdb, 0x2});
+        performTest(0x5c, new byte[]{(byte)0xdc, 0x0});
+        performTest(0x14f9ccf8, new byte[]{(byte)0xf8, (byte)0x99, (byte)0xe7, (byte)0xa7, 0x1});
+        performTest(0xd1, new byte[]{(byte)0xd1, 0x1});
+        performTest(0xba787ecd, new byte[]{(byte)0xcd, (byte)0xfd, (byte)0xe1, (byte)0xd3, 0x7b});
+        performTest(0x4f, new byte[]{(byte)0xcf, 0x0});
+        performTest(0xfb03, new byte[]{(byte)0x83, (byte)0xf6, 0x3});
+        performTest(0xee3f7cd8, new byte[]{(byte)0xd8, (byte)0xf9, (byte)0xfd, (byte)0xf1, 0x7e});
+        performTest(0x9a6e, new byte[]{(byte)0xee, (byte)0xb4, 0x2});
+        performTest(0x8f0983, new byte[]{(byte)0x83, (byte)0x93, (byte)0xbc, 0x4});
+        performTest(0x3a00e01f, new byte[]{(byte)0x9f, (byte)0xc0, (byte)0x83, (byte)0xd0, 0x3});
+        performTest(0x7f532d93, new byte[]{(byte)0x93, (byte)0xdb, (byte)0xcc, (byte)0xfa, 0x7});
+        performTest(0x179d8d, new byte[]{(byte)0x8d, (byte)0xbb, (byte)0xde, 0x0});
+        performTest(0xfc5, new byte[]{(byte)0xc5, 0x1f});
+        performTest(0x11, new byte[]{0x11});
+        performTest(0xc9b53e8, new byte[]{(byte)0xe8, (byte)0xa7, (byte)0xed, (byte)0xe4, 0x0});
+        performTest(0x97, new byte[]{(byte)0x97, 0x1});
+        performTest(0x52b3, new byte[]{(byte)0xb3, (byte)0xa5, 0x1});
+        performTest(0x92, new byte[]{(byte)0x92, 0x1});
+        performTest(0xd2, new byte[]{(byte)0xd2, 0x1});
+        performTest(0x13d330, new byte[]{(byte)0xb0, (byte)0xa6, (byte)0xcf, 0x0});
+        performTest(0x672f41, new byte[]{(byte)0xc1, (byte)0xde, (byte)0x9c, 0x3});
+        performTest(0xcf, new byte[]{(byte)0xcf, 0x1});
+        performTest(0x54ddb6dd, new byte[]{(byte)0xdd, (byte)0xed, (byte)0xf6, (byte)0xa6, 0x5});
+        performTest(0x7ebcae, new byte[]{(byte)0xae, (byte)0xf9, (byte)0xfa, 0x3});
+        performTest(0x38, new byte[]{0x38});
+        performTest(0x8118f4e7, new byte[]{(byte)0xe7, (byte)0xe9, (byte)0xe3, (byte)0x88, 0x78});
+        performTest(0xac, new byte[]{(byte)0xac, 0x1});
+        performTest(0xab309c, new byte[]{(byte)0x9c, (byte)0xe1, (byte)0xac, 0x5});
+        performTest(0x1bf9b2, new byte[]{(byte)0xb2, (byte)0xf3, (byte)0xef, 0x0});
+        performTest(0x8b3c70, new byte[]{(byte)0xf0, (byte)0xf8, (byte)0xac, 0x4});
+        performTest(0x7774, new byte[]{(byte)0xf4, (byte)0xee, 0x1});
+        performTest(0x33e839, new byte[]{(byte)0xb9, (byte)0xd0, (byte)0xcf, 0x1});
+        performTest(0x84d655a0, new byte[]{(byte)0xa0, (byte)0xab, (byte)0xd9, (byte)0xa6, 0x78});
+        performTest(0xf3543ef3, new byte[]{(byte)0xf3, (byte)0xfd, (byte)0xd0, (byte)0x9a, 0x7f});
+        performTest(0x1d777e, new byte[]{(byte)0xfe, (byte)0xee, (byte)0xf5, 0x0});
+        performTest(0xf7, new byte[]{(byte)0xf7, 0x1});
+        performTest(0x2444, new byte[]{(byte)0xc4, (byte)0xc8, 0x0});
+        performTest(0x536b, new byte[]{(byte)0xeb, (byte)0xa6, 0x1});
+        performTest(0xa8, new byte[]{(byte)0xa8, 0x1});
+        performTest(0xdbfc, new byte[]{(byte)0xfc, (byte)0xb7, 0x3});
+        performTest(0xe66db7, new byte[]{(byte)0xb7, (byte)0xdb, (byte)0x99, 0x7});
+        performTest(0xb7ca, new byte[]{(byte)0xca, (byte)0xef, 0x2});
+        performTest(0xe807d0e5, new byte[]{(byte)0xe5, (byte)0xa1, (byte)0x9f, (byte)0xc0, 0x7e});
+        performTest(0x6a4, new byte[]{(byte)0xa4, 0xd});
+        performTest(0x64, new byte[]{(byte)0xe4, 0x0});
+        performTest(0xf3fb75, new byte[]{(byte)0xf5, (byte)0xf6, (byte)0xcf, 0x7});
+        performTest(0xb72cb6b9, new byte[]{(byte)0xb9, (byte)0xed, (byte)0xb2, (byte)0xb9, 0x7b});
+        performTest(0xfd, new byte[]{(byte)0xfd, 0x1});
+        performTest(0xb48b, new byte[]{(byte)0x8b, (byte)0xe9, 0x2});
+        performTest(0x39c3, new byte[]{(byte)0xc3, (byte)0xf3, 0x0});
+        performTest(0x12b8afbd, new byte[]{(byte)0xbd, (byte)0xdf, (byte)0xe2, (byte)0x95, 0x1});
+        performTest(0x56f149, new byte[]{(byte)0xc9, (byte)0xe2, (byte)0xdb, 0x2});
+        performTest(0xbf, new byte[]{(byte)0xbf, 0x1});
+        performTest(0x3ac72481, new byte[]{(byte)0x81, (byte)0xc9, (byte)0x9c, (byte)0xd6, 0x3});
+        performTest(0xb69ca721, new byte[]{(byte)0xa1, (byte)0xce, (byte)0xf2, (byte)0xb4, 0x7b});
+        performTest(0x2380, new byte[]{(byte)0x80, (byte)0xc7, 0x0});
+        performTest(0x656268, new byte[]{(byte)0xe8, (byte)0xc4, (byte)0x95, 0x3});
+        performTest(0x71, new byte[]{(byte)0xf1, 0x0});
+        performTest(0xf06425, new byte[]{(byte)0xa5, (byte)0xc8, (byte)0xc1, 0x7});
+        performTest(0xb587cb, new byte[]{(byte)0xcb, (byte)0x8f, (byte)0xd6, 0x5});
+        performTest(0x8742, new byte[]{(byte)0xc2, (byte)0x8e, 0x2});
+        performTest(0xc6, new byte[]{(byte)0xc6, 0x1});
+        performTest(0xee62789f, new byte[]{(byte)0x9f, (byte)0xf1, (byte)0x89, (byte)0xf3, 0x7e});
+        performTest(0x470a, new byte[]{(byte)0x8a, (byte)0x8e, 0x1});
+        performTest(0x11ef5cdc, new byte[]{(byte)0xdc, (byte)0xb9, (byte)0xbd, (byte)0x8f, 0x1});
+        performTest(0xc44ea9, new byte[]{(byte)0xa9, (byte)0x9d, (byte)0x91, 0x6});
+        performTest(0x94477f78, new byte[]{(byte)0xf8, (byte)0xfe, (byte)0x9d, (byte)0xa2, 0x79});
+        performTest(0xe47a0b4f, new byte[]{(byte)0xcf, (byte)0x96, (byte)0xe8, (byte)0xa3, 0x7e});
+    }
+
+    private void performTest(int integerValue, byte[] encodedValue) throws IOException {
+        performTest(integerValue, encodedValue, encodedValue.length);
+    }
+
+    private void performTest(int integerValue, byte[] encodedValue, int encodedLength) throws IOException {
+        setup();
+
+        writer.writeSleb128(integerValue);
+        writer.flush();
+
+        byte[] writtenData = output.getBuffer();
+
+        Assert.assertEquals(startPosition + encodedLength, writer.getPosition());
+        for (int i=0; i<encodedLength; i++) {
+            byte encoded = encodedValue[i];
+            byte written = writtenData[i];
+            if (i == 4) {
+                encoded = (byte)(encoded & 0x0F);
+                written = (byte)(written & 0x0F);
+            }
+            Assert.assertEquals(String.format("Values not equal at index %d", i), encoded, written);
+        }
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/writer/DexWriterTest.java b/dexlib2/src/test/java/org/jf/dexlib2/writer/DexWriterTest.java
new file mode 100644
index 0000000..fb65934
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/dexlib2/writer/DexWriterTest.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright 2014, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import junit.framework.Assert;
+import org.jf.dexlib2.AnnotationVisibility;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.iface.AnnotationElement;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.value.AnnotationEncodedValue;
+import org.jf.dexlib2.immutable.ImmutableAnnotation;
+import org.jf.dexlib2.immutable.ImmutableAnnotationElement;
+import org.jf.dexlib2.immutable.ImmutableClassDef;
+import org.jf.dexlib2.immutable.ImmutableDexFile;
+import org.jf.dexlib2.immutable.value.ImmutableAnnotationEncodedValue;
+import org.jf.dexlib2.immutable.value.ImmutableNullEncodedValue;
+import org.jf.dexlib2.writer.io.MemoryDataStore;
+import org.jf.dexlib2.writer.pool.DexPool;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.List;
+
+public class DexWriterTest {
+    @Test
+    public void testAnnotationElementOrder() {
+        // Elements are out of order wrt to the element name
+        ImmutableSet<ImmutableAnnotationElement> elements =
+                ImmutableSet.of(new ImmutableAnnotationElement("zabaglione", ImmutableNullEncodedValue.INSTANCE),
+                        new ImmutableAnnotationElement("blah", ImmutableNullEncodedValue.INSTANCE));
+
+        ImmutableAnnotation annotation = new ImmutableAnnotation(AnnotationVisibility.RUNTIME,
+                "Lorg/test/anno;", elements);
+
+        ImmutableClassDef classDef = new ImmutableClassDef("Lorg/test/blah;",
+                0, "Ljava/lang/Object;", null, null, ImmutableSet.of(annotation), null, null);
+
+        MemoryDataStore dataStore = new MemoryDataStore();
+
+        try {
+            DexPool.writeTo(dataStore, new ImmutableDexFile(Opcodes.getDefault(), ImmutableSet.of(classDef)));
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+
+        DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.getDefault(), dataStore.getBuffer());
+        ClassDef dbClassDef = Iterables.getFirst(dexFile.getClasses(), null);
+        Assert.assertNotNull(dbClassDef);
+        Annotation dbAnnotation = Iterables.getFirst(dbClassDef.getAnnotations(), null);
+        Assert.assertNotNull(dbAnnotation);
+        List<AnnotationElement> dbElements = Lists.newArrayList(dbAnnotation.getElements());
+
+        // Ensure that the elements were written out in sorted order
+        Assert.assertEquals(2, dbElements.size());
+        Assert.assertEquals("blah", dbElements.get(0).getName());
+        Assert.assertEquals("zabaglione", dbElements.get(1).getName());
+    }
+
+    @Test
+    public void testEncodedAnnotationElementOrder() {
+        // Elements are out of order wrt to the element name
+        ImmutableSet<ImmutableAnnotationElement> encodedElements =
+                ImmutableSet.of(new ImmutableAnnotationElement("zabaglione", ImmutableNullEncodedValue.INSTANCE),
+                        new ImmutableAnnotationElement("blah", ImmutableNullEncodedValue.INSTANCE));
+
+        ImmutableAnnotationEncodedValue encodedAnnotations =
+                new ImmutableAnnotationEncodedValue("Lan/encoded/annotation", encodedElements);
+
+        ImmutableSet<ImmutableAnnotationElement> elements =
+                ImmutableSet.of(new ImmutableAnnotationElement("encoded_annotation", encodedAnnotations));
+
+        ImmutableAnnotation annotation = new ImmutableAnnotation(AnnotationVisibility.RUNTIME,
+                "Lorg/test/anno;", elements);
+
+        ImmutableClassDef classDef = new ImmutableClassDef("Lorg/test/blah;",
+                0, "Ljava/lang/Object;", null, null, ImmutableSet.of(annotation), null, null);
+
+        MemoryDataStore dataStore = new MemoryDataStore();
+
+        try {
+            DexPool.writeTo(dataStore, new ImmutableDexFile(Opcodes.getDefault(), ImmutableSet.of(classDef)));
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+
+        DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.getDefault(), dataStore.getBuffer());
+        ClassDef dbClassDef = Iterables.getFirst(dexFile.getClasses(), null);
+        Assert.assertNotNull(dbClassDef);
+        Annotation dbAnnotation = Iterables.getFirst(dbClassDef.getAnnotations(), null);
+        Assert.assertNotNull(dbAnnotation);
+
+        AnnotationElement element = Iterables.getFirst(dbAnnotation.getElements(), null);
+        AnnotationEncodedValue dbAnnotationEncodedValue = (AnnotationEncodedValue)element.getValue();
+
+        List<AnnotationElement> dbElements = Lists.newArrayList(dbAnnotationEncodedValue.getElements());
+
+        // Ensure that the elements were written out in sorted order
+        Assert.assertEquals(2, dbElements.size());
+        Assert.assertEquals("blah", dbElements.get(0).getName());
+        Assert.assertEquals("zabaglione", dbElements.get(1).getName());
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/writer/DexWriterUleb128Test.java b/dexlib2/src/test/java/org/jf/dexlib2/writer/DexWriterUleb128Test.java
new file mode 100644
index 0000000..4fb1acb
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/dexlib2/writer/DexWriterUleb128Test.java
@@ -0,0 +1,241 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer;
+
+import junit.framework.Assert;
+import org.junit.Test;
+
+import java.io.IOException;
+
+public class DexWriterUleb128Test {
+    private NakedByteArrayOutputStream output = new NakedByteArrayOutputStream();
+    private int startPosition;
+    private DexDataWriter writer;
+
+    public void setup() throws IOException {
+        output.reset();
+        startPosition = 123;
+        int bufferSize = 256;
+        writer = new DexDataWriter(output, startPosition, bufferSize);
+    }
+
+    @Test
+    public void testUleb128() throws IOException {
+        performTest(0x0, new byte[]{0x0, 0x11}, 1);
+        performTest(0x1, new byte[]{0x1, 0x11}, 1);
+        performTest(0x3f, new byte[]{0x3f, 0x11}, 1);
+        performTest(0x40, new byte[]{0x40, 0x11}, 1);
+        performTest(0x70, new byte[]{0x70, 0x11}, 1);
+        performTest(0x7f, new byte[]{0x7f, 0x11}, 1);
+
+        performTest(0x80, new byte[]{(byte)0x80, 0x1, 0x11}, 2);
+        performTest(0x100, new byte[]{(byte)0x80, 0x2, 0x11}, 2);
+        performTest(0x800, new byte[]{(byte)0x80, 0x10, 0x11}, 2);
+        performTest(0x1f80, new byte[]{(byte)0x80, 0x3f, 0x11}, 2);
+        performTest(0x2000, new byte[]{(byte)0x80, 0x40, 0x11}, 2);
+        performTest(0x2080, new byte[]{(byte)0x80, 0x41, 0x11}, 2);
+        performTest(0x3800, new byte[]{(byte)0x80, 0x70, 0x11}, 2);
+        performTest(0x3f80, new byte[]{(byte)0x80, 0x7f, 0x11}, 2);
+
+        performTest(0xff, new byte[]{(byte)0xff, 0x1, 0x11}, 2);
+        performTest(0x17f, new byte[]{(byte)0xff, 0x2, 0x11}, 2);
+        performTest(0x87f, new byte[]{(byte)0xff, 0x10, 0x11}, 2);
+        performTest(0x1fff, new byte[]{(byte)0xff, 0x3f, 0x11}, 2);
+        performTest(0x207f, new byte[]{(byte)0xff, 0x40, 0x11}, 2);
+        performTest(0x20ff, new byte[]{(byte)0xff, 0x41, 0x11}, 2);
+        performTest(0x387f, new byte[]{(byte)0xff, 0x70, 0x11}, 2);
+        performTest(0x3fff, new byte[]{(byte)0xff, 0x7f, 0x11}, 2);
+
+        performTest(0x4000, new byte[]{(byte)0x80, (byte)0x80, 0x1, 0x11}, 3);
+        performTest(0x8000, new byte[]{(byte)0x80, (byte)0x80, 0x2, 0x11}, 3);
+        performTest(0x40000, new byte[]{(byte)0x80, (byte)0x80, 0x10, 0x11}, 3);
+        performTest(0xfc000, new byte[]{(byte)0x80, (byte)0x80, 0x3f, 0x11}, 3);
+        performTest(0x100000, new byte[]{(byte)0x80, (byte)0x80, 0x40, 0x11}, 3);
+        performTest(0x104000, new byte[]{(byte)0x80, (byte)0x80, 0x41, 0x11}, 3);
+        performTest(0x1c0000, new byte[]{(byte)0x80, (byte)0x80, 0x70, 0x11}, 3);
+        performTest(0x1fc000, new byte[]{(byte)0x80, (byte)0x80, 0x7f, 0x11}, 3);
+
+        performTest(0x7fff, new byte[]{(byte)0xff, (byte)0xff, 0x1, 0x11}, 3);
+        performTest(0xbfff, new byte[]{(byte)0xff, (byte)0xff, 0x2, 0x11}, 3);
+        performTest(0x43fff, new byte[]{(byte)0xff, (byte)0xff, 0x10, 0x11}, 3);
+        performTest(0xfffff, new byte[]{(byte)0xff, (byte)0xff, 0x3f, 0x11}, 3);
+        performTest(0x103fff, new byte[]{(byte)0xff, (byte)0xff, 0x40, 0x11}, 3);
+        performTest(0x107fff, new byte[]{(byte)0xff, (byte)0xff, 0x41, 0x11}, 3);
+        performTest(0x1c3fff, new byte[]{(byte)0xff, (byte)0xff, 0x70, 0x11}, 3);
+        performTest(0x1fffff, new byte[]{(byte)0xff, (byte)0xff, 0x7f, 0x11}, 3);
+
+        performTest(0x200000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x1, 0x11}, 4);
+        performTest(0x400000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x2, 0x11}, 4);
+        performTest(0x2000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x10, 0x11}, 4);
+        performTest(0x7e00000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x3f, 0x11}, 4);
+        performTest(0x8000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x40, 0x11}, 4);
+        performTest(0x8200000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x41, 0x11}, 4);
+        performTest(0xe000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x70, 0x11}, 4);
+        performTest(0xfe00000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, 0x7f, 0x11}, 4);
+
+        performTest(0x3fffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x1, 0x11}, 4);
+        performTest(0x5fffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x2, 0x11}, 4);
+        performTest(0x21fffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x10, 0x11}, 4);
+        performTest(0x7ffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x3f, 0x11}, 4);
+        performTest(0x81fffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x40, 0x11}, 4);
+        performTest(0x83fffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x41, 0x11}, 4);
+        performTest(0xe1fffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x70, 0x11}, 4);
+        performTest(0xfffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, 0x7f, 0x11}, 4);
+
+        performTest(0x10000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0x1, 0x11}, 5);
+        performTest(0x20000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0x2, 0x11}, 5);
+        performTest(0x70000000, new byte[]{(byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80, 0x7, 0x11}, 5);
+
+        performTest(0x1fffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0x1, 0x11}, 5);
+        performTest(0x2fffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0x2, 0x11}, 5);
+        performTest(0x7fffffff, new byte[]{(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, 0x7, 0x11}, 5);
+
+        performTest(0xcc, new byte[]{(byte)0xcc, 0x1});
+        performTest(0x3b67, new byte[]{(byte)0xe7, 0x76});
+        performTest(0x1b857589, new byte[]{(byte)0x89, (byte)0xeb, (byte)0x95, (byte)0xdc, 0x1});
+        performTest(0x375d82e5, new byte[]{(byte)0xe5, (byte)0x85, (byte)0xf6, (byte)0xba, 0x3});
+        performTest(0x5524da90, new byte[]{(byte)0x90, (byte)0xb5, (byte)0x93, (byte)0xa9, 0x5});
+        performTest(0x35, new byte[]{0x35});
+        performTest(0xd7, new byte[]{(byte)0xd7, 0x1});
+        performTest(0x63, new byte[]{0x63});
+        performTest(0x22cb5b, new byte[]{(byte)0xdb, (byte)0x96, (byte)0x8b, 0x1});
+        performTest(0x585e, new byte[]{(byte)0xde, (byte)0xb0, 0x1});
+        performTest(0x5d62a965, new byte[]{(byte)0xe5, (byte)0xd2, (byte)0x8a, (byte)0xeb, 0x5});
+        performTest(0x6af172db, new byte[]{(byte)0xdb, (byte)0xe5, (byte)0xc5, (byte)0xd7, 0x6});
+        performTest(0xe, new byte[]{0xe});
+        performTest(0xb75f7a, new byte[]{(byte)0xfa, (byte)0xbe, (byte)0xdd, 0x5});
+        performTest(0x8604, new byte[]{(byte)0x84, (byte)0x8c, 0x2});
+        performTest(0x31624026, new byte[]{(byte)0xa6, (byte)0x80, (byte)0x89, (byte)0x8b, 0x3});
+        performTest(0x8d, new byte[]{(byte)0x8d, 0x1});
+        performTest(0xc0, new byte[]{(byte)0xc0, 0x1});
+        performTest(0xd7618cb, new byte[]{(byte)0xcb, (byte)0xb1, (byte)0xd8, 0x6b});
+        performTest(0xff, new byte[]{(byte)0xff, 0x1});
+        performTest(0x5c923e42, new byte[]{(byte)0xc2, (byte)0xfc, (byte)0xc8, (byte)0xe4, 0x5});
+        performTest(0x91, new byte[]{(byte)0x91, 0x1});
+        performTest(0xbe0f97, new byte[]{(byte)0x97, (byte)0x9f, (byte)0xf8, 0x5});
+        performTest(0x88bc786, new byte[]{(byte)0x86, (byte)0x8f, (byte)0xaf, 0x44});
+        performTest(0x8caa9a, new byte[]{(byte)0x9a, (byte)0xd5, (byte)0xb2, 0x4});
+        performTest(0x4aee, new byte[]{(byte)0xee, (byte)0x95, 0x1});
+        performTest(0x438c86, new byte[]{(byte)0x86, (byte)0x99, (byte)0x8e, 0x2});
+        performTest(0xc0, new byte[]{(byte)0xc0, 0x1});
+        performTest(0xb486, new byte[]{(byte)0x86, (byte)0xe9, 0x2});
+        performTest(0x83fd, new byte[]{(byte)0xfd, (byte)0x87, 0x2});
+        performTest(0x7b, new byte[]{0x7b});
+        performTest(0x1dc84e14, new byte[]{(byte)0x94, (byte)0x9c, (byte)0xa1, (byte)0xee, 0x1});
+        performTest(0x2dfc, new byte[]{(byte)0xfc, 0x5b});
+        performTest(0x88, new byte[]{(byte)0x88, 0x1});
+        performTest(0x919e, new byte[]{(byte)0x9e, (byte)0xa3, 0x2});
+        performTest(0x2fcf, new byte[]{(byte)0xcf, 0x5f});
+        performTest(0xf00674, new byte[]{(byte)0xf4, (byte)0x8c, (byte)0xc0, 0x7});
+        performTest(0xed5f7d, new byte[]{(byte)0xfd, (byte)0xbe, (byte)0xb5, 0x7});
+        performTest(0xdbd9, new byte[]{(byte)0xd9, (byte)0xb7, 0x3});
+        performTest(0xa1, new byte[]{(byte)0xa1, 0x1});
+        performTest(0xf6f76c, new byte[]{(byte)0xec, (byte)0xee, (byte)0xdb, 0x7});
+        performTest(0x1eed6f, new byte[]{(byte)0xef, (byte)0xda, 0x7b});
+        performTest(0x95c, new byte[]{(byte)0xdc, 0x12});
+        performTest(0x1e, new byte[]{0x1e});
+        performTest(0xe5, new byte[]{(byte)0xe5, 0x1});
+        performTest(0x2f2f13, new byte[]{(byte)0x93, (byte)0xde, (byte)0xbc, 0x1});
+        performTest(0x19, new byte[]{0x19});
+        performTest(0x3f, new byte[]{0x3f});
+        performTest(0x75e3, new byte[]{(byte)0xe3, (byte)0xeb, 0x1});
+        performTest(0x67a4c4, new byte[]{(byte)0xc4, (byte)0xc9, (byte)0x9e, 0x3});
+        performTest(0xb948, new byte[]{(byte)0xc8, (byte)0xf2, 0x2});
+        performTest(0x34b1c9de, new byte[]{(byte)0xde, (byte)0x93, (byte)0xc7, (byte)0xa5, 0x3});
+        performTest(0x58f0, new byte[]{(byte)0xf0, (byte)0xb1, 0x1});
+        performTest(0x0, new byte[]{0x0});
+        performTest(0x9ab3e5, new byte[]{(byte)0xe5, (byte)0xe7, (byte)0xea, 0x4});
+        performTest(0x4c4a8a3d, new byte[]{(byte)0xbd, (byte)0x94, (byte)0xaa, (byte)0xe2, 0x4});
+        performTest(0x99, new byte[]{(byte)0x99, 0x1});
+        performTest(0x1a67e9, new byte[]{(byte)0xe9, (byte)0xcf, 0x69});
+        performTest(0x5ddb2d, new byte[]{(byte)0xad, (byte)0xb6, (byte)0xf7, 0x2});
+        performTest(0xeccb680, new byte[]{(byte)0x80, (byte)0xed, (byte)0xb2, 0x76});
+        performTest(0x6910bbf0, new byte[]{(byte)0xf0, (byte)0xf7, (byte)0xc2, (byte)0xc8, 0x6});
+        performTest(0xc5, new byte[]{(byte)0xc5, 0x1});
+        performTest(0xdd7225, new byte[]{(byte)0xa5, (byte)0xe4, (byte)0xf5, 0x6});
+        performTest(0x4561ea2e, new byte[]{(byte)0xae, (byte)0xd4, (byte)0x87, (byte)0xab, 0x4});
+        performTest(0x7f4f08, new byte[]{(byte)0x88, (byte)0x9e, (byte)0xfd, 0x3});
+        performTest(0x197f, new byte[]{(byte)0xff, 0x32});
+        performTest(0xb8ad13, new byte[]{(byte)0x93, (byte)0xda, (byte)0xe2, 0x5});
+        performTest(0x3c8d5db4, new byte[]{(byte)0xb4, (byte)0xbb, (byte)0xb5, (byte)0xe4, 0x3});
+        performTest(0x7e4bdf7d, new byte[]{(byte)0xfd, (byte)0xbe, (byte)0xaf, (byte)0xf2, 0x7});
+        performTest(0x1e8e23, new byte[]{(byte)0xa3, (byte)0x9c, 0x7a});
+        performTest(0x1602, new byte[]{(byte)0x82, 0x2c});
+        performTest(0xe2, new byte[]{(byte)0xe2, 0x1});
+        performTest(0x38e9, new byte[]{(byte)0xe9, 0x71});
+        performTest(0xbf8665, new byte[]{(byte)0xe5, (byte)0x8c, (byte)0xfe, 0x5});
+        performTest(0x43, new byte[]{0x43});
+        performTest(0xc9d96c, new byte[]{(byte)0xec, (byte)0xb2, (byte)0xa7, 0x6});
+        performTest(0x4bd170, new byte[]{(byte)0xf0, (byte)0xa2, (byte)0xaf, 0x2});
+        performTest(0x86c11b, new byte[]{(byte)0x9b, (byte)0x82, (byte)0x9b, 0x4});
+        performTest(0x1a2611e7, new byte[]{(byte)0xe7, (byte)0xa3, (byte)0x98, (byte)0xd1, 0x1});
+        performTest(0xff2f6a, new byte[]{(byte)0xea, (byte)0xde, (byte)0xfc, 0x7});
+        performTest(0x6f051635, new byte[]{(byte)0xb5, (byte)0xac, (byte)0x94, (byte)0xf8, 0x6});
+        performTest(0x75bf, new byte[]{(byte)0xbf, (byte)0xeb, 0x1});
+        performTest(0xe8ce45, new byte[]{(byte)0xc5, (byte)0x9c, (byte)0xa3, 0x7});
+        performTest(0x2946a1d8, new byte[]{(byte)0xd8, (byte)0xc3, (byte)0x9a, (byte)0xca, 0x2});
+        performTest(0xe2, new byte[]{(byte)0xe2, 0x1});
+        performTest(0x44ee, new byte[]{(byte)0xee, (byte)0x89, 0x1});
+        performTest(0x447a, new byte[]{(byte)0xfa, (byte)0x88, 0x1});
+        performTest(0x917, new byte[]{(byte)0x97, 0x12});
+        performTest(0x25, new byte[]{0x25});
+        performTest(0x52c2b8eb, new byte[]{(byte)0xeb, (byte)0xf1, (byte)0x8a, (byte)0x96, 0x5});
+        performTest(0x17dabee4, new byte[]{(byte)0xe4, (byte)0xfd, (byte)0xea, (byte)0xbe, 0x1});
+        performTest(0x9d6a, new byte[]{(byte)0xea, (byte)0xba, 0x2});
+        performTest(0xc4b12d, new byte[]{(byte)0xad, (byte)0xe2, (byte)0x92, 0x6});
+        performTest(0xc9561d, new byte[]{(byte)0x9d, (byte)0xac, (byte)0xa5, 0x6});
+        performTest(0x88a7, new byte[]{(byte)0xa7, (byte)0x91, 0x2});
+        performTest(0x527d8f7a, new byte[]{(byte)0xfa, (byte)0x9e, (byte)0xf6, (byte)0x93, 0x5});
+        performTest(0x2c31, new byte[]{(byte)0xb1, 0x58});
+        performTest(0x3b8c, new byte[]{(byte)0x8c, 0x77});
+        performTest(0xc228, new byte[]{(byte)0xa8, (byte)0x84, 0x3});
+        performTest(0xd730d3, new byte[]{(byte)0xd3, (byte)0xe1, (byte)0xdc, 0x6});
+    }
+
+    private void performTest(int integerValue, byte[] encodedValue) throws IOException {
+        performTest(integerValue, encodedValue, encodedValue.length);
+    }
+
+    private void performTest(int integerValue, byte[] encodedValue, int encodedLength) throws IOException {
+        setup();
+
+        writer.writeUleb128(integerValue);
+        writer.flush();
+
+        byte[] writtenData = output.getBuffer();
+
+        Assert.assertEquals(startPosition + encodedLength, writer.getPosition());
+        for (int i=0; i<encodedLength; i++) {
+            Assert.assertEquals(String.format("Values not equal at index %d", i), encodedValue[i], writtenData[i]);
+        }
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/writer/JumboStringConversionTest.java b/dexlib2/src/test/java/org/jf/dexlib2/writer/JumboStringConversionTest.java
new file mode 100644
index 0000000..c5f12ce
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/dexlib2/writer/JumboStringConversionTest.java
@@ -0,0 +1,220 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.ReferenceType;
+import org.jf.dexlib2.builder.MethodImplementationBuilder;
+import org.jf.dexlib2.builder.instruction.BuilderInstruction10x;
+import org.jf.dexlib2.builder.instruction.BuilderInstruction21c;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.*;
+import org.jf.dexlib2.iface.debug.DebugItem;
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.dexlib2.iface.instruction.ReferenceInstruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction21c;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.dexlib2.iface.reference.StringReference;
+import org.jf.dexlib2.immutable.instruction.ImmutableInstruction10x;
+import org.jf.dexlib2.writer.builder.DexBuilder;
+import org.jf.dexlib2.writer.io.MemoryDataStore;
+import org.junit.Assert;
+import org.junit.Test;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.util.List;
+
+public class JumboStringConversionTest {
+    @Test
+    public void testJumboStringConversion() throws IOException {
+        DexBuilder dexBuilder = new DexBuilder(Opcodes.getDefault());
+
+        MethodImplementationBuilder methodBuilder = new MethodImplementationBuilder(1);
+        for (int i=0; i<66000; i++) {
+            methodBuilder.addInstruction(new BuilderInstruction21c(Opcode.CONST_STRING, 0,
+                    dexBuilder.internStringReference(String.format("%08d", i))));
+        }
+        methodBuilder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID));
+
+        dexBuilder.internClassDef(
+                "Ltest;",
+                0,
+                "Ljava/lang/Object;",
+                null,
+                null,
+                ImmutableSet.<Annotation>of(),
+                null,
+                ImmutableList.of(
+                        dexBuilder.internMethod(
+                                "Ltest;",
+                                "test",
+                                null,
+                                "V",
+                                0,
+                                ImmutableSet.<Annotation>of(),
+                                ImmutableSet.of(),
+                                methodBuilder.getMethodImplementation())));
+
+        MemoryDataStore dexStore = new MemoryDataStore();
+        dexBuilder.writeTo(dexStore);
+
+        DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.getDefault(), dexStore.getBuffer());
+
+        ClassDef classDef = Iterables.getFirst(dexFile.getClasses(), null);
+        Assert.assertNotNull(classDef);
+
+        Method method = Iterables.getFirst(classDef.getMethods(), null);
+        Assert.assertNotNull(method);
+
+        MethodImplementation impl = method.getImplementation();
+        Assert.assertNotNull(impl);
+
+        List<? extends Instruction> instructions = Lists.newArrayList(impl.getInstructions());
+        Assert.assertEquals(66001, instructions.size());
+
+        for (int i=0; i<65536; i++) {
+            Assert.assertEquals(Opcode.CONST_STRING, instructions.get(i).getOpcode());
+            Assert.assertEquals(String.format("%08d", i),
+                    ((StringReference)((ReferenceInstruction)instructions.get(i)).getReference()).getString());
+        }
+        for (int i=65536; i<66000; i++) {
+            Assert.assertEquals(Opcode.CONST_STRING_JUMBO, instructions.get(i).getOpcode());
+            Assert.assertEquals(String.format("%08d", i),
+                    ((StringReference)((ReferenceInstruction)instructions.get(i)).getReference()).getString());
+        }
+        Assert.assertEquals(Opcode.RETURN_VOID, instructions.get(66000).getOpcode());
+    }
+
+
+    @Test
+    public void testJumboStringConversion_NonMethodBuilder() throws IOException {
+        DexBuilder dexBuilder = new DexBuilder(Opcodes.getDefault());
+
+        final List<Instruction> instructions = Lists.newArrayList();
+        for (int i=0; i<66000; i++) {
+            final StringReference ref = dexBuilder.internStringReference(String.format("%08d", i));
+
+            instructions.add(new Instruction21c() {
+                @Override public int getRegisterA() {
+                    return 0;
+                }
+
+                @Nonnull @Override public Reference getReference() {
+                    return ref;
+                }
+
+                @Override public int getReferenceType() { return ReferenceType.STRING; }
+
+                @Override public Opcode getOpcode() {
+                    return Opcode.CONST_STRING;
+                }
+
+                @Override public int getCodeUnits() {
+                    return getOpcode().format.size / 2;
+                }
+            });
+        }
+        instructions.add(new ImmutableInstruction10x(Opcode.RETURN_VOID));
+
+        MethodImplementation methodImpl = new MethodImplementation() {
+            @Override public int getRegisterCount() {
+                return 1;
+            }
+
+            @Nonnull @Override public Iterable<? extends Instruction> getInstructions() {
+                return instructions;
+            }
+
+            @Nonnull @Override public List<? extends TryBlock<? extends ExceptionHandler>> getTryBlocks() {
+                return ImmutableList.of();
+            }
+
+            @Nonnull @Override public Iterable<? extends DebugItem> getDebugItems() {
+                return ImmutableList.of();
+            }
+        };
+
+        dexBuilder.internClassDef(
+                "Ltest;",
+                0,
+                "Ljava/lang/Object;",
+                null,
+                null,
+                ImmutableSet.<Annotation>of(),
+                null,
+                ImmutableList.of(
+                        dexBuilder.internMethod(
+                                "Ltest;",
+                                "test",
+                                null,
+                                "V",
+                                0,
+                                ImmutableSet.<Annotation>of(),
+                                ImmutableSet.of(),
+                                methodImpl)));
+
+        MemoryDataStore dexStore = new MemoryDataStore();
+        dexBuilder.writeTo(dexStore);
+
+        DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.getDefault(), dexStore.getBuffer());
+
+        ClassDef classDef = Iterables.getFirst(dexFile.getClasses(), null);
+        Assert.assertNotNull(classDef);
+
+        Method method = Iterables.getFirst(classDef.getMethods(), null);
+        Assert.assertNotNull(method);
+
+        MethodImplementation impl = method.getImplementation();
+        Assert.assertNotNull(impl);
+
+        List<? extends Instruction> actualInstructions = Lists.newArrayList(impl.getInstructions());
+        Assert.assertEquals(66001, actualInstructions.size());
+
+        for (int i=0; i<65536; i++) {
+            Assert.assertEquals(Opcode.CONST_STRING, actualInstructions.get(i).getOpcode());
+            Assert.assertEquals(String.format("%08d", i),
+                    ((StringReference)((ReferenceInstruction)actualInstructions.get(i)).getReference()).getString());
+        }
+        for (int i=65536; i<66000; i++) {
+            Assert.assertEquals(Opcode.CONST_STRING_JUMBO, actualInstructions.get(i).getOpcode());
+            Assert.assertEquals(String.format("%08d", i),
+                    ((StringReference)((ReferenceInstruction)actualInstructions.get(i)).getReference()).getString());
+        }
+        Assert.assertEquals(Opcode.RETURN_VOID, actualInstructions.get(66000).getOpcode());
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/writer/NakedByteArrayOutputStream.java b/dexlib2/src/test/java/org/jf/dexlib2/writer/NakedByteArrayOutputStream.java
new file mode 100644
index 0000000..ea1e6d7
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/dexlib2/writer/NakedByteArrayOutputStream.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+/**
+ * A ByteArrayOutputStream that lets you grab its protected bits.
+ */
+public class NakedByteArrayOutputStream extends ByteArrayOutputStream {
+    public byte[] getBuffer() throws IOException {
+        return buf;
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/writer/util/TryListBuilderTest.java b/dexlib2/src/test/java/org/jf/dexlib2/writer/util/TryListBuilderTest.java
new file mode 100644
index 0000000..b02a512
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/dexlib2/writer/util/TryListBuilderTest.java
@@ -0,0 +1,566 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.util;
+
+import com.google.common.collect.ImmutableList;
+import junit.framework.Assert;
+import org.jf.dexlib2.iface.ExceptionHandler;
+import org.jf.dexlib2.iface.TryBlock;
+import org.jf.dexlib2.immutable.ImmutableExceptionHandler;
+import org.jf.dexlib2.immutable.ImmutableTryBlock;
+import org.junit.Test;
+
+import java.util.List;
+
+public class TryListBuilderTest {
+    private static class TryListBuilder extends org.jf.dexlib2.writer.util.TryListBuilder<ExceptionHandler> {
+    }
+
+    @Test
+    public void testSingleCatchAll_Beginning() {
+        TryListBuilder tlb = new TryListBuilder();
+
+        tlb.addHandler(0, 10, new ImmutableExceptionHandler(null, 5));
+
+        List<? extends TryBlock<? extends ExceptionHandler>> tryBlocks = tlb.getTryBlocks();
+
+        List<? extends TryBlock> expected = ImmutableList.of(new ImmutableTryBlock(0, 10,
+                ImmutableList.of(new ImmutableExceptionHandler(null, 5))));
+
+        Assert.assertEquals(expected, tryBlocks);
+    }
+
+    @Test
+    public void testSingleCatchAll_Middle() {
+        TryListBuilder tlb = new TryListBuilder();
+
+        tlb.addHandler(5, 10, new ImmutableExceptionHandler(null, 15));
+
+        List<? extends TryBlock<? extends ExceptionHandler>> tryBlocks = tlb.getTryBlocks();
+
+        List<? extends TryBlock> expected = ImmutableList.of(new ImmutableTryBlock(5, 5,
+                ImmutableList.of(new ImmutableExceptionHandler(null, 15))));
+
+        Assert.assertEquals(expected, tryBlocks);
+    }
+
+    @Test
+    public void testSingleCatch_Beginning() {
+        TryListBuilder tlb = new TryListBuilder();
+
+        tlb.addHandler(0, 10, new ImmutableExceptionHandler("Ljava/lang/Exception;", 5));
+
+        List<? extends TryBlock<? extends ExceptionHandler>> tryBlocks = tlb.getTryBlocks();
+
+        List<? extends TryBlock> expected = ImmutableList.of(new ImmutableTryBlock(0, 10,
+                ImmutableList.of(new ImmutableExceptionHandler("Ljava/lang/Exception;", 5))));
+
+        Assert.assertEquals(expected, tryBlocks);
+    }
+
+    @Test
+    public void testSingleCatch_Middle() {
+        TryListBuilder tlb = new TryListBuilder();
+
+        tlb.addHandler(5, 10, new ImmutableExceptionHandler("Ljava/lang/Exception;", 15));
+
+        List<? extends TryBlock<? extends ExceptionHandler>> tryBlocks = tlb.getTryBlocks();
+
+        List<? extends TryBlock> expected = ImmutableList.of(new ImmutableTryBlock(5, 5,
+                ImmutableList.of(new ImmutableExceptionHandler("Ljava/lang/Exception;", 15))));
+
+        Assert.assertEquals(expected, tryBlocks);
+    }
+
+    @Test
+    public void testOverlap_End_After() {
+        TryListBuilder tlb = new TryListBuilder();
+
+        tlb.addHandler(0, 10, new ImmutableExceptionHandler("LException1;", 5));
+        tlb.addHandler(10, 20, new ImmutableExceptionHandler("LException2;", 6));
+
+        List<? extends TryBlock<? extends ExceptionHandler>> tryBlocks = tlb.getTryBlocks();
+
+        List<? extends TryBlock> expected = ImmutableList.of(
+                new ImmutableTryBlock(0, 10,
+                        ImmutableList.of(new ImmutableExceptionHandler("LException1;", 5))),
+                new ImmutableTryBlock(10, 10,
+                        ImmutableList.of(new ImmutableExceptionHandler("LException2;", 6))));
+
+        Assert.assertEquals(expected, tryBlocks);
+    }
+
+    @Test
+    public void testOverlap_After_After() {
+        TryListBuilder tlb = new TryListBuilder();
+
+        tlb.addHandler(0, 10, new ImmutableExceptionHandler("LException1;", 5));
+        tlb.addHandler(15, 20, new ImmutableExceptionHandler("LException2;", 6));
+
+        List<? extends TryBlock<? extends ExceptionHandler>> tryBlocks = tlb.getTryBlocks();
+
+        List<? extends TryBlock> expected = ImmutableList.of(
+                new ImmutableTryBlock(0, 10,
+                        ImmutableList.of(new ImmutableExceptionHandler("LException1;", 5))),
+                new ImmutableTryBlock(15, 5,
+                        ImmutableList.of(new ImmutableExceptionHandler("LException2;", 6))));
+
+        Assert.assertEquals(expected, tryBlocks);
+    }
+
+    @Test
+    public void testOverlap_Before_Start() {
+        TryListBuilder tlb = new TryListBuilder();
+
+        tlb.addHandler(5, 10, new ImmutableExceptionHandler("LException1;", 5));
+        tlb.addHandler(0, 5, new ImmutableExceptionHandler("LException2;", 6));
+
+        List<? extends TryBlock<? extends ExceptionHandler>> tryBlocks = tlb.getTryBlocks();
+
+        List<? extends TryBlock> expected = ImmutableList.of(
+                new ImmutableTryBlock(0, 5,
+                        ImmutableList.of(new ImmutableExceptionHandler("LException2;", 6))),
+                new ImmutableTryBlock(5, 5,
+                        ImmutableList.of(new ImmutableExceptionHandler("LException1;", 5))));
+
+        Assert.assertEquals(expected, tryBlocks);
+    }
+
+    @Test
+    public void testOverlap_Before_Before() {
+        TryListBuilder tlb = new TryListBuilder();
+
+        tlb.addHandler(5, 10, new ImmutableExceptionHandler("LException1;", 5));
+        tlb.addHandler(0, 3, new ImmutableExceptionHandler("LException2;", 6));
+
+        List<? extends TryBlock<? extends ExceptionHandler>> tryBlocks = tlb.getTryBlocks();
+
+        List<? extends TryBlock> expected = ImmutableList.of(
+                new ImmutableTryBlock(0, 3,
+                        ImmutableList.of(new ImmutableExceptionHandler("LException2;", 6))),
+                new ImmutableTryBlock(5, 5,
+                        ImmutableList.of(new ImmutableExceptionHandler("LException1;", 5))));
+
+        Assert.assertEquals(expected, tryBlocks);
+    }
+
+    @Test
+    public void testOverlap_Start_End() {
+        TryListBuilder tlb = new TryListBuilder();
+
+        tlb.addHandler(0, 10, new ImmutableExceptionHandler("LException1;", 5));
+        tlb.addHandler(0, 10, new ImmutableExceptionHandler("LException2;", 6));
+
+        List<? extends TryBlock<? extends ExceptionHandler>> tryBlocks = tlb.getTryBlocks();
+
+        List<? extends TryBlock> expected = ImmutableList.of(
+                new ImmutableTryBlock(0, 10,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException1;", 5),
+                                new ImmutableExceptionHandler("LException2;", 6))));
+
+        Assert.assertEquals(expected, tryBlocks);
+    }
+
+    @Test
+    public void testOverlap_Start_Middle() {
+        TryListBuilder tlb = new TryListBuilder();
+
+        tlb.addHandler(0, 10, new ImmutableExceptionHandler("LException1;", 5));
+        tlb.addHandler(0, 5, new ImmutableExceptionHandler("LException2;", 6));
+
+        List<? extends TryBlock<? extends ExceptionHandler>> tryBlocks = tlb.getTryBlocks();
+
+        List<? extends TryBlock> expected = ImmutableList.of(
+                new ImmutableTryBlock(0, 5,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException1;", 5),
+                                new ImmutableExceptionHandler("LException2;", 6))),
+                new ImmutableTryBlock(5, 5,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException1;", 5))));
+
+        Assert.assertEquals(expected, tryBlocks);
+    }
+
+    @Test
+    public void testOverlap_Middle_Middle() {
+        TryListBuilder tlb = new TryListBuilder();
+
+        tlb.addHandler(0, 10, new ImmutableExceptionHandler("LException1;", 5));
+        tlb.addHandler(2, 7, new ImmutableExceptionHandler("LException2;", 6));
+
+        List<? extends TryBlock<? extends ExceptionHandler>> tryBlocks = tlb.getTryBlocks();
+
+        List<? extends TryBlock> expected = ImmutableList.of(
+                new ImmutableTryBlock(0, 2,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException1;", 5))),
+                new ImmutableTryBlock(2, 5,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException1;", 5),
+                                new ImmutableExceptionHandler("LException2;", 6))),
+                new ImmutableTryBlock(7, 3,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException1;", 5))));
+
+        Assert.assertEquals(expected, tryBlocks);
+    }
+
+    @Test
+    public void testOverlap_Middle_End() {
+        TryListBuilder tlb = new TryListBuilder();
+
+        tlb.addHandler(0, 10, new ImmutableExceptionHandler("LException1;", 5));
+        tlb.addHandler(5, 10, new ImmutableExceptionHandler("LException2;", 6));
+
+        List<? extends TryBlock<? extends ExceptionHandler>> tryBlocks = tlb.getTryBlocks();
+
+        List<? extends TryBlock> expected = ImmutableList.of(
+                new ImmutableTryBlock(0, 5,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException1;", 5))),
+                new ImmutableTryBlock(5, 5,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException1;", 5),
+                                new ImmutableExceptionHandler("LException2;", 6))));
+
+        Assert.assertEquals(expected, tryBlocks);
+    }
+
+    @Test
+    public void testOverlap_Beginning_After() {
+        TryListBuilder tlb = new TryListBuilder();
+
+        tlb.addHandler(0, 10, new ImmutableExceptionHandler("LException1;", 5));
+        tlb.addHandler(0, 15, new ImmutableExceptionHandler("LException2;", 6));
+
+        List<? extends TryBlock<? extends ExceptionHandler>> tryBlocks = tlb.getTryBlocks();
+
+        List<? extends TryBlock> expected = ImmutableList.of(
+                new ImmutableTryBlock(0, 10,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException1;", 5),
+                                new ImmutableExceptionHandler("LException2;", 6))),
+                new ImmutableTryBlock(10, 5,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException2;", 6))));
+
+        Assert.assertEquals(expected, tryBlocks);
+    }
+
+    @Test
+    public void testOverlap_Middle_After() {
+        TryListBuilder tlb = new TryListBuilder();
+
+        tlb.addHandler(0, 10, new ImmutableExceptionHandler("LException1;", 5));
+        tlb.addHandler(5, 15, new ImmutableExceptionHandler("LException2;", 6));
+
+        List<? extends TryBlock<? extends ExceptionHandler>> tryBlocks = tlb.getTryBlocks();
+
+        List<? extends TryBlock> expected = ImmutableList.of(
+                new ImmutableTryBlock(0, 5,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException1;", 5))),
+                new ImmutableTryBlock(5, 5,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException1;", 5),
+                                new ImmutableExceptionHandler("LException2;", 6))),
+                new ImmutableTryBlock(10, 5,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException2;", 6))));
+
+        Assert.assertEquals(expected, tryBlocks);
+    }
+
+    @Test
+    public void testOverlap_Before_End() {
+        TryListBuilder tlb = new TryListBuilder();
+
+        tlb.addHandler(5, 10, new ImmutableExceptionHandler("LException1;", 5));
+        tlb.addHandler(0, 10, new ImmutableExceptionHandler("LException2;", 6));
+
+        List<? extends TryBlock<? extends ExceptionHandler>> tryBlocks = tlb.getTryBlocks();
+
+        List<? extends TryBlock> expected = ImmutableList.of(
+                new ImmutableTryBlock(0, 5,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException2;", 6))),
+                new ImmutableTryBlock(5, 5,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException1;", 5),
+                                new ImmutableExceptionHandler("LException2;", 6))));
+
+        Assert.assertEquals(expected, tryBlocks);
+    }
+
+    @Test
+    public void testOverlap_Before_Middle() {
+        TryListBuilder tlb = new TryListBuilder();
+
+        tlb.addHandler(5, 10, new ImmutableExceptionHandler("LException1;", 5));
+        tlb.addHandler(0, 7, new ImmutableExceptionHandler("LException2;", 6));
+
+        List<? extends TryBlock<? extends ExceptionHandler>> tryBlocks = tlb.getTryBlocks();
+
+        List<? extends TryBlock> expected = ImmutableList.of(
+                new ImmutableTryBlock(0, 5,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException2;", 6))),
+                new ImmutableTryBlock(5, 2,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException1;", 5),
+                                new ImmutableExceptionHandler("LException2;", 6))),
+                new ImmutableTryBlock(7, 3,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException1;", 5))));
+
+        Assert.assertEquals(expected, tryBlocks);
+    }
+
+    @Test
+    public void testOverlap_Before_After() {
+        TryListBuilder tlb = new TryListBuilder();
+
+        tlb.addHandler(5, 10, new ImmutableExceptionHandler("LException1;", 5));
+        tlb.addHandler(0, 15, new ImmutableExceptionHandler("LException2;", 6));
+
+        List<? extends TryBlock<? extends ExceptionHandler>> tryBlocks = tlb.getTryBlocks();
+
+        List<? extends TryBlock> expected = ImmutableList.of(
+                new ImmutableTryBlock(0, 5,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException2;", 6))),
+                new ImmutableTryBlock(5, 5,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException1;", 5),
+                                new ImmutableExceptionHandler("LException2;", 6))),
+                new ImmutableTryBlock(10, 5,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException2;", 6))));
+
+        Assert.assertEquals(expected, tryBlocks);
+    }
+
+    @Test
+    public void testOverlap_Hole() {
+        TryListBuilder tlb = new TryListBuilder();
+
+        tlb.addHandler(1, 5, new ImmutableExceptionHandler("LException1;", 5));
+        tlb.addHandler(10, 14, new ImmutableExceptionHandler("LException1;", 5));
+        tlb.addHandler(0, 15, new ImmutableExceptionHandler("LException2;", 6));
+
+        List<? extends TryBlock<? extends ExceptionHandler>> tryBlocks = tlb.getTryBlocks();
+
+        List<? extends TryBlock> expected = ImmutableList.of(
+                new ImmutableTryBlock(0, 1,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException2;", 6))),
+                new ImmutableTryBlock(1, 4,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException1;", 5),
+                                new ImmutableExceptionHandler("LException2;", 6))),
+                new ImmutableTryBlock(5, 5,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException2;", 6))),
+                new ImmutableTryBlock(10, 4,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException1;", 5),
+                                new ImmutableExceptionHandler("LException2;", 6))),
+                new ImmutableTryBlock(14, 1,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException2;", 6))));
+
+        Assert.assertEquals(expected, tryBlocks);
+    }
+
+    @Test
+    public void testHandlerMerge_Same() {
+        TryListBuilder tlb = new TryListBuilder();
+
+        tlb.addHandler(5, 10, new ImmutableExceptionHandler("LException1;", 5));
+        tlb.addHandler(0, 15, new ImmutableExceptionHandler("LException1;", 5));
+
+        List<? extends TryBlock<? extends ExceptionHandler>> tryBlocks = tlb.getTryBlocks();
+
+        List<? extends TryBlock> expected = ImmutableList.of(
+                new ImmutableTryBlock(0, 15,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException1;", 5))));
+
+        Assert.assertEquals(expected, tryBlocks);
+    }
+
+    @Test
+    public void testHandlerMerge_DifferentType() {
+        TryListBuilder tlb = new TryListBuilder();
+
+        tlb.addHandler(5, 10, new ImmutableExceptionHandler("LException1;", 5));
+        tlb.addHandler(0, 15, new ImmutableExceptionHandler("LException2;", 6));
+
+        List<? extends TryBlock<? extends ExceptionHandler>> tryBlocks = tlb.getTryBlocks();
+
+        List<? extends TryBlock> expected = ImmutableList.of(
+                new ImmutableTryBlock(0, 5,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException2;", 6))),
+                new ImmutableTryBlock(5, 5,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException1;", 5),
+                                new ImmutableExceptionHandler("LException2;", 6))),
+                new ImmutableTryBlock(10, 5,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException2;", 6))));
+
+        Assert.assertEquals(expected, tryBlocks);
+    }
+
+    @Test
+    public void testHandlerMerge_DifferentAddress() {
+        TryListBuilder tlb = new TryListBuilder();
+
+        tlb.addHandler(5, 10, new ImmutableExceptionHandler("LException1;", 5));
+        tlb.addHandler(0, 15, new ImmutableExceptionHandler("LException1;", 6));
+        // no exception should be thrown...
+    }
+
+    @Test
+    public void testHandlerMerge_Exception_Catchall() {
+        TryListBuilder tlb = new TryListBuilder();
+
+        tlb.addHandler(5, 10, new ImmutableExceptionHandler("LException1;", 5));
+        tlb.addHandler(0, 15, new ImmutableExceptionHandler(null, 6));
+
+        List<? extends TryBlock<? extends ExceptionHandler>> tryBlocks = tlb.getTryBlocks();
+
+        List<? extends TryBlock> expected = ImmutableList.of(
+                new ImmutableTryBlock(0, 5,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler(null, 6))),
+                new ImmutableTryBlock(5, 5,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException1;", 5),
+                                new ImmutableExceptionHandler(null, 6))),
+                new ImmutableTryBlock(10, 5,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler(null, 6))));
+
+        Assert.assertEquals(expected, tryBlocks);
+    }
+
+    @Test
+    public void testHandlerMerge_Catchall_Exception() {
+        TryListBuilder tlb = new TryListBuilder();
+
+        tlb.addHandler(5, 10, new ImmutableExceptionHandler(null, 5));
+        tlb.addHandler(0, 15, new ImmutableExceptionHandler("LException1;", 6));
+
+        List<? extends TryBlock<? extends ExceptionHandler>> tryBlocks = tlb.getTryBlocks();
+
+        List<? extends TryBlock> expected = ImmutableList.of(
+                new ImmutableTryBlock(0, 5,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException1;", 6))),
+                new ImmutableTryBlock(5, 5,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler(null, 5),
+                                new ImmutableExceptionHandler("LException1;", 6))),
+                new ImmutableTryBlock(10, 5,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException1;", 6))));
+
+        Assert.assertEquals(expected, tryBlocks);
+    }
+
+    @Test
+    public void testHandlerMerge_Catchall_Catchall() {
+        TryListBuilder tlb = new TryListBuilder();
+
+        tlb.addHandler(5, 10, new ImmutableExceptionHandler(null, 5));
+        tlb.addHandler(0, 15, new ImmutableExceptionHandler(null, 5));
+
+        List<? extends TryBlock<? extends ExceptionHandler>> tryBlocks = tlb.getTryBlocks();
+
+        List<? extends TryBlock> expected = ImmutableList.of(
+                new ImmutableTryBlock(0, 15,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler(null, 5))));
+
+        Assert.assertEquals(expected, tryBlocks);
+    }
+
+    @Test
+    public void testHandlerMerge_Catchall_Catchall_DifferentAddress() {
+        TryListBuilder tlb = new TryListBuilder();
+
+        tlb.addHandler(5, 10, new ImmutableExceptionHandler(null, 5));
+        try {
+            tlb.addHandler(0, 15, new ImmutableExceptionHandler(null, 6));
+        } catch (TryListBuilder.InvalidTryException ex) {
+            return;
+        }
+        Assert.fail();
+    }
+
+    @Test
+    public void testHandlerMerge_MergeSame() {
+        TryListBuilder tlb = new TryListBuilder();
+
+        tlb.addHandler(0, 15, new ImmutableExceptionHandler(null, 6));
+        tlb.addHandler(10, 20, new ImmutableExceptionHandler("LException1;", 5));
+        tlb.addHandler(20, 30, new ImmutableExceptionHandler("LException1;", 5));
+        tlb.addHandler(25, 40, new ImmutableExceptionHandler(null, 6));
+
+        List<? extends TryBlock<? extends ExceptionHandler>> tryBlocks = tlb.getTryBlocks();
+
+        List<? extends TryBlock> expected = ImmutableList.of(
+                new ImmutableTryBlock(0, 10,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler(null, 6))),
+                new ImmutableTryBlock(10, 5,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler(null, 6),
+                                new ImmutableExceptionHandler("LException1;", 5))),
+                new ImmutableTryBlock(15, 10,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException1;", 5))),
+                new ImmutableTryBlock(25, 5,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler("LException1;", 5),
+                                new ImmutableExceptionHandler(null, 6))),
+                new ImmutableTryBlock(30, 10,
+                        ImmutableList.of(
+                                new ImmutableExceptionHandler(null, 6))));
+
+        Assert.assertEquals(expected, tryBlocks);
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/util/AbstractForwardSequentialListTest.java b/dexlib2/src/test/java/org/jf/util/AbstractForwardSequentialListTest.java
new file mode 100644
index 0000000..6b52320
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/util/AbstractForwardSequentialListTest.java
@@ -0,0 +1,214 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+import junit.framework.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import javax.annotation.Nonnull;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.NoSuchElementException;
+
+public class AbstractForwardSequentialListTest {
+    private List<Integer> list;
+
+    @Before
+    public void setup() {
+        list = new AbstractForwardSequentialList<Integer>() {
+            @Nonnull @Override public Iterator<Integer> iterator() {
+                return new Iterator<Integer>() {
+                    private int index = 0;
+
+                    @Override public boolean hasNext() {
+                        return index < 100;
+                    }
+
+                    @Override public Integer next() {
+                        if (!hasNext()) {
+                            throw new NoSuchElementException();
+                        }
+                        return index++;
+                    }
+
+                    @Override public void remove() {
+                        throw new UnsupportedOperationException();
+                    }
+                };
+            }
+
+            @Override public int size() {
+                return 100;
+            }
+        };
+    }
+
+    private void testForwardIterationImpl(ListIterator<Integer> iter) {
+        Assert.assertFalse(iter.hasPrevious());
+
+        for (int i=0; i<100; i++) {
+            Assert.assertEquals(i, iter.nextIndex());
+            Assert.assertEquals(i-1, iter.previousIndex());
+
+            Assert.assertTrue(iter.hasNext());
+
+            Assert.assertEquals(i, iter.next().intValue());
+            Assert.assertTrue(iter.hasPrevious());
+        }
+
+        Assert.assertFalse(iter.hasNext());
+        Assert.assertEquals(iter.nextIndex(), 100);
+        Assert.assertEquals(iter.previousIndex(), 99);
+    }
+
+    @Test
+    public void testForwardIteration() {
+        testForwardIterationImpl(list.listIterator());
+    }
+
+    private void testReverseIterationImpl(ListIterator<Integer> iter) {
+        Assert.assertFalse(iter.hasNext());
+
+        for (int i=99; i>=0; i--) {
+            Assert.assertEquals(i+1, iter.nextIndex());
+            Assert.assertEquals(i, iter.previousIndex());
+
+            Assert.assertTrue(iter.hasPrevious());
+
+            Assert.assertEquals(i, iter.previous().intValue());
+            Assert.assertTrue(iter.hasNext());
+        }
+
+        Assert.assertFalse(iter.hasPrevious());
+        Assert.assertEquals(0, iter.nextIndex());
+        Assert.assertEquals(-1, iter.previousIndex());
+    }
+
+    @Test
+    public void testReverseIteration() {
+        testReverseIterationImpl(list.listIterator(100));
+    }
+
+    @Test
+    public void testAlternatingIteration() {
+        ListIterator<Integer> iter = list.listIterator(50);
+
+        for (int i=0; i<10; i++) {
+            Assert.assertTrue(iter.hasNext());
+            Assert.assertTrue(iter.hasPrevious());
+            Assert.assertEquals(50, iter.nextIndex());
+            Assert.assertEquals(49, iter.previousIndex());
+
+            Assert.assertEquals(50, iter.next().intValue());
+
+            Assert.assertTrue(iter.hasNext());
+            Assert.assertTrue(iter.hasPrevious());
+            Assert.assertEquals(51, iter.nextIndex());
+            Assert.assertEquals(50, iter.previousIndex());
+
+            Assert.assertEquals(50, iter.previous().intValue());
+        }
+    }
+
+    @Test
+    public void testAlternatingIteration2() {
+        ListIterator<Integer> iter = list.listIterator(0);
+
+        for (int i=0; i<10; i++) {
+            testForwardIterationImpl(iter);
+            testReverseIterationImpl(iter);
+        }
+    }
+
+    @Test(expected = IndexOutOfBoundsException.class)
+    public void testNegativeIndex() {
+        list.listIterator(-1);
+    }
+
+    @Test(expected = IndexOutOfBoundsException.class)
+    public void testLargeIndex() {
+        list.listIterator(101);
+    }
+
+    @Test(expected = IndexOutOfBoundsException.class)
+    public void testLargeIndex2() {
+        list.listIterator(1000000);
+    }
+
+    @Test
+    public void testForwardIterationException() {
+        // note: no "expected = NoSuchElementException", because we want to make sure the exception occurs only during
+        // the last call to next()
+
+        ListIterator<Integer> iter = list.listIterator(0);
+        for (int i=0; i<100; i++) {
+            iter.next();
+        }
+        try {
+            iter.next();
+        } catch (NoSuchElementException ex) {
+            return;
+        }
+        Assert.fail();
+    }
+
+    @Test(expected = NoSuchElementException.class)
+    public void testForwardIterationException2() {
+        ListIterator<Integer> iter = list.listIterator(100);
+        iter.next();
+    }
+
+    @Test
+    public void testReverseIterationException() {
+        // note: no "expected = NoSuchElementException", because we want to make sure the exception occurs only during
+        // the last call to previous()
+
+        ListIterator<Integer> iter = list.listIterator(100);
+        for (int i=0; i<100; i++) {
+            iter.previous();
+        }
+        try {
+            iter.previous();
+        } catch (NoSuchElementException ex) {
+            return;
+        }
+        Assert.fail();
+    }
+
+    @Test(expected = NoSuchElementException.class)
+    public void testReverseIterationException2() {
+        ListIterator<Integer> iter = list.listIterator(0);
+        iter.previous();
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/util/HexTest.java b/dexlib2/src/test/java/org/jf/util/HexTest.java
new file mode 100644
index 0000000..78838e0
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/util/HexTest.java
@@ -0,0 +1,156 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2019 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class HexTest {
+
+    @Rule
+    public final ExpectedException thrown = ExpectedException.none();
+
+    @Test
+    public void testU8() {
+        Assert.assertEquals("0000000000000000", Hex.u8(0L));
+        Assert.assertEquals("0000016b5086c128", Hex.u8(1560424137000L));
+        Assert.assertEquals("000462d53c8abac0", Hex.u8(1234567890123456L));
+    }
+
+    @Test
+    public void testU4() {
+        Assert.assertEquals("00000000", Hex.u4(0));
+        Assert.assertEquals("00bc614e", Hex.u4(12345678));
+        Assert.assertEquals("499602d2", Hex.u4(1234567890));
+    }
+
+    @Test
+    public void testU3() {
+        Assert.assertEquals("000000", Hex.u3(0));
+        Assert.assertEquals("01e240", Hex.u3(123456));
+        Assert.assertEquals("9602d2", Hex.u3(1234567890));
+    }
+
+    @Test
+    public void testU2() {
+        Assert.assertEquals("0000", Hex.u2(0));
+        Assert.assertEquals("04d2", Hex.u2(1234));
+        Assert.assertEquals("02d2", Hex.u2(1234567890));
+    }
+
+    @Test
+    public void testU2or4() {
+        Assert.assertEquals("0000", Hex.u2or4(0));
+        Assert.assertEquals("04d2", Hex.u2or4(1234));
+        Assert.assertEquals("0001e240", Hex.u2or4(123456));
+        Assert.assertEquals("00bc614e", Hex.u2or4(12345678));
+        Assert.assertEquals("499602d2", Hex.u2or4(1234567890));
+    }
+
+    @Test
+    public void testU1() {
+        Assert.assertEquals("00", Hex.u1(0));
+        Assert.assertEquals("0c", Hex.u1(12));
+        Assert.assertEquals("d2", Hex.u1(1234567890));
+    }
+
+    @Test
+    public void testUNibble() {
+        Assert.assertEquals("0", Hex.uNibble(0));
+        Assert.assertEquals("1", Hex.uNibble(1));
+        Assert.assertEquals("f", Hex.uNibble(999999999));
+        Assert.assertEquals("2", Hex.uNibble(1234567890));
+    }
+
+    @Test
+    public void testS8() {
+        Assert.assertEquals("+0000000000000000", Hex.s8(0L));
+        Assert.assertEquals("-7fffffffffffffff", Hex.s8(-9223372036854775807L));
+        Assert.assertEquals("+002bdc545d6b4b87", Hex.s8(12345678901234567L));
+    }
+
+    @Test
+    public void testS4() {
+        Assert.assertEquals("+00000000", Hex.s4(0));
+        Assert.assertEquals("-80000000", Hex.s4(-2147483648));
+        Assert.assertEquals("+075bcd15", Hex.s4(123456789));
+        Assert.assertEquals("+499602d2", Hex.s4(1234567890));
+    }
+
+    @Test
+    public void testS2() {
+        Assert.assertEquals("+0000", Hex.s2(0));
+        Assert.assertEquals("-0000", Hex.s2(-2147483648));
+        Assert.assertEquals("+3039", Hex.s2(12345));
+        Assert.assertEquals("+02d2", Hex.s2(1234567890));
+    }
+
+    @Test
+    public void testS1() {
+        Assert.assertEquals("+00", Hex.s1(0));
+        Assert.assertEquals("-00", Hex.s1(-2147483648));
+        Assert.assertEquals("+7b", Hex.s1(123));
+        Assert.assertEquals("+d2", Hex.s1(1234567890));
+    }
+
+    @Test
+    public void testDump() {
+        byte[] bytes1 = new byte[]{17, 16, 17, 17, 17};
+        byte[] bytes2 = new byte[]{1, 1, 1, 1, 1, 1, 1, 0, 1, 1};
+
+        Assert.assertEquals("", Hex.dump(bytes1, 5, 0, 0, 1, 3));
+        Assert.assertEquals("ba: 0101 00\nbd: 0101\n",
+                Hex.dump(bytes2, 5, 5, 186, 3, 2));
+        Assert.assertEquals("00: 10\n",
+                Hex.dump(new byte[]{16}, 0, 1, 0, 1, 2));
+        Assert.assertEquals("00000000: 10\n",
+                Hex.dump(new byte[]{16}, 0, 1, 0, 0, 3));
+        Assert.assertEquals("0000: 10\n",
+                Hex.dump(new byte[]{16}, 0, 1, 0, 0, 4));
+        Assert.assertEquals("000000: 10\n",
+                Hex.dump(new byte[]{16}, 0, 1, 0, 1, 6));
+    }
+
+    @Test
+    public void testDumpthrowIllegalArgumentException() {
+        byte[] bytes = new byte[]{17, 16, 17, 17, 17, 16, 17, 17, 17, 17};
+        thrown.expect(IllegalArgumentException.class);
+        Hex.dump(bytes, 4, 1, -2147483648, 1, 5);
+        // Method is not expected to return due to exception thrown
+    }
+
+    @Test
+    public void testDumpthrowIndexOutOfBoundsException() {
+        thrown.expect(IndexOutOfBoundsException.class);
+        Hex.dump(new byte[0], 4, 1, -2147483648, 1, 4);
+        // Method is not expected to return due to exception thrown
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/util/IndentingWriterTest.java b/dexlib2/src/test/java/org/jf/util/IndentingWriterTest.java
new file mode 100644
index 0000000..457262b
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/util/IndentingWriterTest.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+import junit.framework.Assert;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.io.StringWriter;
+
+public class IndentingWriterTest {
+    @Test
+    public void testPrintSignedLongAsDec() throws IOException {
+        StringWriter stringWriter = new StringWriter();
+        IndentingWriter writer = new IndentingWriter(stringWriter);
+
+        writer.printUnsignedIntAsDec(-1);
+        writer.close();
+
+        Assert.assertEquals("4294967295", stringWriter.toString());
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/util/NumberUtilsTest.java b/dexlib2/src/test/java/org/jf/util/NumberUtilsTest.java
new file mode 100644
index 0000000..a059c87
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/util/NumberUtilsTest.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+import junit.framework.Assert;
+import org.junit.Test;
+
+public class NumberUtilsTest {
+    @Test
+    public void isLikelyFloatTest() {
+        Assert.assertTrue(NumberUtils.isLikelyFloat(Float.floatToRawIntBits(1.23f)));
+        Assert.assertTrue(NumberUtils.isLikelyFloat(Float.floatToRawIntBits(1.0f)));
+        Assert.assertTrue(NumberUtils.isLikelyFloat(Float.floatToRawIntBits(Float.NaN)));
+        Assert.assertTrue(NumberUtils.isLikelyFloat(Float.floatToRawIntBits(Float.NEGATIVE_INFINITY)));
+        Assert.assertTrue(NumberUtils.isLikelyFloat(Float.floatToRawIntBits(Float.POSITIVE_INFINITY)));
+        Assert.assertTrue(NumberUtils.isLikelyFloat(Float.floatToRawIntBits(1e-30f)));
+        Assert.assertTrue(NumberUtils.isLikelyFloat(Float.floatToRawIntBits(1000f)));
+        Assert.assertTrue(NumberUtils.isLikelyFloat(Float.floatToRawIntBits(1f)));
+        Assert.assertTrue(NumberUtils.isLikelyFloat(Float.floatToRawIntBits(-1f)));
+        Assert.assertTrue(NumberUtils.isLikelyFloat(Float.floatToRawIntBits(-5f)));
+        Assert.assertTrue(NumberUtils.isLikelyFloat(Float.floatToRawIntBits(1.3333f)));
+        Assert.assertTrue(NumberUtils.isLikelyFloat(Float.floatToRawIntBits(4.5f)));
+        Assert.assertTrue(NumberUtils.isLikelyFloat(Float.floatToRawIntBits(.1f)));
+        Assert.assertTrue(NumberUtils.isLikelyFloat(Float.floatToRawIntBits(50000f)));
+        Assert.assertTrue(NumberUtils.isLikelyFloat(Float.floatToRawIntBits(Float.MAX_VALUE)));
+        Assert.assertTrue(NumberUtils.isLikelyFloat(Float.floatToRawIntBits((float)Math.PI)));
+        Assert.assertTrue(NumberUtils.isLikelyFloat(Float.floatToRawIntBits((float)Math.E)));
+
+        Assert.assertTrue(NumberUtils.isLikelyFloat(2139095039));
+
+
+        // Float.MIN_VALUE is equivalent to integer value 1 - this should be detected as an integer
+        //Assert.assertTrue(NumberUtils.isLikelyFloat(Float.floatToRawIntBits(Float.MIN_VALUE)));
+
+        // This one doesn't quite work. It has a series of 2 0's, but that is probably not enough to strip off normally
+        //Assert.assertTrue(NumberUtils.isLikelyFloat(Float.floatToRawIntBits(1.33333f)));
+
+        Assert.assertFalse(NumberUtils.isLikelyFloat(0));
+        Assert.assertFalse(NumberUtils.isLikelyFloat(1));
+        Assert.assertFalse(NumberUtils.isLikelyFloat(10));
+        Assert.assertFalse(NumberUtils.isLikelyFloat(100));
+        Assert.assertFalse(NumberUtils.isLikelyFloat(1000));
+        Assert.assertFalse(NumberUtils.isLikelyFloat(1024));
+        Assert.assertFalse(NumberUtils.isLikelyFloat(1234));
+        Assert.assertFalse(NumberUtils.isLikelyFloat(-5));
+        Assert.assertFalse(NumberUtils.isLikelyFloat(-13));
+        Assert.assertFalse(NumberUtils.isLikelyFloat(-123));
+        Assert.assertFalse(NumberUtils.isLikelyFloat(20000000));
+        Assert.assertFalse(NumberUtils.isLikelyFloat(2000000000));
+        Assert.assertFalse(NumberUtils.isLikelyFloat(-2000000000));
+        Assert.assertFalse(NumberUtils.isLikelyFloat(Integer.MAX_VALUE));
+        Assert.assertFalse(NumberUtils.isLikelyFloat(Integer.MIN_VALUE));
+        Assert.assertFalse(NumberUtils.isLikelyFloat(Short.MIN_VALUE));
+        Assert.assertFalse(NumberUtils.isLikelyFloat(Short.MAX_VALUE));
+    }
+
+    @Test
+    public void isLikelyDoubleTest() {
+        Assert.assertTrue(NumberUtils.isLikelyDouble(Double.doubleToRawLongBits(1.23f)));
+        Assert.assertTrue(NumberUtils.isLikelyDouble(Double.doubleToRawLongBits(1.0f)));
+        Assert.assertTrue(NumberUtils.isLikelyDouble(Double.doubleToRawLongBits(Double.NaN)));
+        Assert.assertTrue(NumberUtils.isLikelyDouble(Double.doubleToRawLongBits(Double.NEGATIVE_INFINITY)));
+        Assert.assertTrue(NumberUtils.isLikelyDouble(Double.doubleToRawLongBits(Double.POSITIVE_INFINITY)));
+        Assert.assertTrue(NumberUtils.isLikelyDouble(Double.doubleToRawLongBits(1e-30f)));
+        Assert.assertTrue(NumberUtils.isLikelyDouble(Double.doubleToRawLongBits(1000f)));
+        Assert.assertTrue(NumberUtils.isLikelyDouble(Double.doubleToRawLongBits(1f)));
+        Assert.assertTrue(NumberUtils.isLikelyDouble(Double.doubleToRawLongBits(-1f)));
+        Assert.assertTrue(NumberUtils.isLikelyDouble(Double.doubleToRawLongBits(-5f)));
+        Assert.assertTrue(NumberUtils.isLikelyDouble(Double.doubleToRawLongBits(1.3333f)));
+        Assert.assertTrue(NumberUtils.isLikelyDouble(Double.doubleToRawLongBits(1.33333f)));
+        Assert.assertTrue(NumberUtils.isLikelyDouble(Double.doubleToRawLongBits(4.5f)));
+        Assert.assertTrue(NumberUtils.isLikelyDouble(Double.doubleToRawLongBits(.1f)));
+        Assert.assertTrue(NumberUtils.isLikelyDouble(Double.doubleToRawLongBits(50000f)));
+        Assert.assertTrue(NumberUtils.isLikelyDouble(Double.doubleToRawLongBits(Double.MAX_VALUE)));
+        Assert.assertTrue(NumberUtils.isLikelyDouble(Double.doubleToRawLongBits(Math.PI)));
+        Assert.assertTrue(NumberUtils.isLikelyDouble(Double.doubleToRawLongBits(Math.E)));
+
+        // Double.MIN_VALUE is equivalent to integer value 1 - this should be detected as an integer
+        //Assert.assertTrue(NumberUtils.isLikelyDouble(Double.doubleToRawLongBits(Double.MIN_VALUE)));
+
+        Assert.assertFalse(NumberUtils.isLikelyDouble(0));
+        Assert.assertFalse(NumberUtils.isLikelyDouble(1));
+        Assert.assertFalse(NumberUtils.isLikelyDouble(10));
+        Assert.assertFalse(NumberUtils.isLikelyDouble(100));
+        Assert.assertFalse(NumberUtils.isLikelyDouble(1000));
+        Assert.assertFalse(NumberUtils.isLikelyDouble(1024));
+        Assert.assertFalse(NumberUtils.isLikelyDouble(1234));
+        Assert.assertFalse(NumberUtils.isLikelyDouble(-5));
+        Assert.assertFalse(NumberUtils.isLikelyDouble(-13));
+        Assert.assertFalse(NumberUtils.isLikelyDouble(-123));
+        Assert.assertFalse(NumberUtils.isLikelyDouble(20000000));
+        Assert.assertFalse(NumberUtils.isLikelyDouble(2000000000));
+        Assert.assertFalse(NumberUtils.isLikelyDouble(-2000000000));
+        Assert.assertFalse(NumberUtils.isLikelyDouble(Integer.MAX_VALUE));
+        Assert.assertFalse(NumberUtils.isLikelyDouble(Integer.MIN_VALUE));
+        Assert.assertFalse(NumberUtils.isLikelyDouble(Short.MIN_VALUE));
+        Assert.assertFalse(NumberUtils.isLikelyDouble(Short.MAX_VALUE));
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/util/PreconditionsTest.java b/dexlib2/src/test/java/org/jf/util/PreconditionsTest.java
new file mode 100644
index 0000000..ba3b6fd
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/util/PreconditionsTest.java
@@ -0,0 +1,41 @@
+package org.jf.util;
+
+import com.google.common.collect.ImmutableList;
+import org.jf.dexlib2.util.Preconditions;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class PreconditionsTest {
+
+  private void verifyArrayPayloadElementIsValid(int elementWidth, long value) {
+    Preconditions.checkArrayPayloadElements(elementWidth, ImmutableList.of(value));
+  }
+
+  private void verifyArrayPayloadElementIsInvalid(int elementWidth, long value) {
+    try {
+      Preconditions.checkArrayPayloadElements(elementWidth, ImmutableList.of(value));
+      Assert.fail();
+    } catch (IllegalArgumentException ex) {
+      // expected exception
+    }
+  }
+
+  @Test
+  public void checkArrayPayloadElements() {
+    verifyArrayPayloadElementIsValid(8, Long.MAX_VALUE);
+    verifyArrayPayloadElementIsValid(8, Long.MIN_VALUE);
+    verifyArrayPayloadElementIsValid(4, Integer.MAX_VALUE);
+    verifyArrayPayloadElementIsValid(4, Integer.MIN_VALUE);
+    verifyArrayPayloadElementIsValid(2, Short.MAX_VALUE);
+    verifyArrayPayloadElementIsValid(2, Short.MIN_VALUE);
+    verifyArrayPayloadElementIsValid(1, Byte.MAX_VALUE);
+    verifyArrayPayloadElementIsValid(1, Byte.MIN_VALUE);
+
+    verifyArrayPayloadElementIsInvalid(4, ((long) Integer.MAX_VALUE) + 1);
+    verifyArrayPayloadElementIsInvalid(4, ((long) Integer.MIN_VALUE) - 1);
+    verifyArrayPayloadElementIsInvalid(2, ((long) Short.MAX_VALUE) + 1);
+    verifyArrayPayloadElementIsInvalid(2, ((long) Short.MIN_VALUE) - 1);
+    verifyArrayPayloadElementIsInvalid(1, ((long) Byte.MAX_VALUE) + 1);
+    verifyArrayPayloadElementIsInvalid(1, ((long) Byte.MIN_VALUE) - 1);
+  }
+}
diff --git a/dexlib2/src/test/java/org/jf/util/StringWrapperTest.java b/dexlib2/src/test/java/org/jf/util/StringWrapperTest.java
new file mode 100644
index 0000000..94c7914
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/util/StringWrapperTest.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+import com.google.common.collect.Lists;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.List;
+
+public class StringWrapperTest {
+    @Test
+    public void testWrapStringByWords() {
+        validateResult2(new String[]{"abc", "abcdef", "abcdef"},
+                "abc\nabcdefabcdef", 6);
+
+        validateResult2(new String[]{"abc", "abcdef", " ", "abcdef"},
+                "abc\nabcdef abcdef", 6);
+
+        validateResult2(new String[]{"abc", "abcde ", "fabcde", "f"},
+                "abc\nabcde fabcdef", 6);
+
+        validateResult2(new String[]{"abc def ghi ", "kjl mon pqr ", "stu vwx yz"},
+                "abc def ghi kjl mon pqr stu vwx yz", 14);
+
+        validateResult2(new String[]{"abcdefg", "hikjlmo", "npqrstu", "vwxyz"},
+                "abcdefghikjlmonpqrstuvwxyz", 7);
+
+        validateResult2(new String[]{"abc", "defhig"},
+                "abc\ndefhig", 20);
+    }
+
+    @Test
+    public void testWrapString() {
+        validateResult(
+                new String[]{"abc", "abcdef", "abcdef"},
+                StringWrapper.wrapString("abc\nabcdefabcdef", 6, null));
+
+        validateResult(
+                new String[]{"abc"},
+                StringWrapper.wrapString("abc", 6, new String[3]));
+
+        validateResult(
+                new String[]{"abc"},
+                StringWrapper.wrapString("abc", 6, new String[0]));
+
+        validateResult(
+                new String[]{"abc"},
+                StringWrapper.wrapString("abc", 6, new String[1]));
+
+        validateResult(
+                new String[]{""},
+                StringWrapper.wrapString("", 6, new String[3]));
+
+        validateResult(
+                new String[]{"abcdef"},
+                StringWrapper.wrapString("abcdef", 6, new String[3]));
+
+        validateResult(
+                new String[]{"abcdef", "abcdef"},
+                StringWrapper.wrapString("abcdef\nabcdef", 6, new String[3]));
+
+        validateResult(
+                new String[]{"abc", "", "def"},
+                StringWrapper.wrapString("abc\n\ndef", 6, new String[3]));
+
+        validateResult(
+                new String[]{"", "abcdef"},
+                StringWrapper.wrapString("\nabcdef", 6, new String[3]));
+
+        validateResult(
+                new String[]{"", "", "abcdef"},
+                StringWrapper.wrapString("\n\nabcdef", 6, new String[3]));
+
+        validateResult(
+                new String[]{"", "", "abcdef"},
+                StringWrapper.wrapString("\n\nabcdef", 6, new String[4]));
+
+        validateResult(
+                new String[]{"", "", "abcdef", ""},
+                StringWrapper.wrapString("\n\nabcdef\n\n", 6, new String[4]));
+
+        validateResult(
+                new String[]{"", "", "abcdef", "a", ""},
+                StringWrapper.wrapString("\n\nabcdefa\n\n", 6, new String[4]));
+
+        validateResult(
+                new String[]{"", "", "abcdef", "a", ""},
+                StringWrapper.wrapString("\n\nabcdefa\n\n", 6, new String[0]));
+
+        validateResult(
+                new String[]{"", "", "abcdef", "a", ""},
+                StringWrapper.wrapString("\n\nabcdefa\n\n", 6, new String[5]));
+
+        validateResult(
+                new String[]{"", "", "a", "b", "c", "d", "e", "f", "a", ""},
+                StringWrapper.wrapString("\n\nabcdefa\n\n", 1, new String[5]));
+    }
+
+    public static void validateResult(String[] expected, String[] actual) {
+        Assert.assertTrue(actual.length >= expected.length);
+
+        int i;
+        for (i=0; i<actual.length; i++) {
+            if (actual[i] == null) {
+                Assert.assertTrue(i == expected.length);
+                return;
+            }
+            Assert.assertTrue(i < expected.length);
+            Assert.assertEquals(expected[i], actual[i]);
+        }
+    }
+
+    public static void validateResult2(String[] expected, String textToWrap, int maxWidth) {
+        List<String> result = Lists.newArrayList(StringWrapper.wrapStringOnBreaks(textToWrap, maxWidth));
+
+        Assert.assertEquals(expected.length, result.size());
+        int i;
+        for (i=0; i<result.size(); i++) {
+            Assert.assertTrue(i < expected.length);
+            Assert.assertEquals(expected[i], result.get(i));
+        }
+    }
+}
diff --git a/dexlib2/src/test/resources/accessorTest.dex b/dexlib2/src/test/resources/accessorTest.dex
new file mode 100644
index 0000000..456f85f
Binary files /dev/null and b/dexlib2/src/test/resources/accessorTest.dex differ
diff --git a/examples/AnnotationTypes/ClassAnnotation.smali b/examples/AnnotationTypes/ClassAnnotation.smali
new file mode 100644
index 0000000..941e782
--- /dev/null
+++ b/examples/AnnotationTypes/ClassAnnotation.smali
@@ -0,0 +1,4 @@
+.class public abstract interface annotation LClassAnnotation;
+.super Ljava/lang/Object;
+.implements Ljava/lang/annotation/Annotation;
+
diff --git a/examples/AnnotationTypes/FieldAnnotation.smali b/examples/AnnotationTypes/FieldAnnotation.smali
new file mode 100644
index 0000000..17846b9
--- /dev/null
+++ b/examples/AnnotationTypes/FieldAnnotation.smali
@@ -0,0 +1,4 @@
+.class public abstract interface annotation LFieldAnnotation;
+.super Ljava/lang/Object;
+.implements Ljava/lang/annotation/Annotation;
+
diff --git a/examples/AnnotationTypes/Main.smali b/examples/AnnotationTypes/Main.smali
new file mode 100644
index 0000000..3cfcb1d
--- /dev/null
+++ b/examples/AnnotationTypes/Main.smali
@@ -0,0 +1,138 @@
+.class public LMain;
+.super Ljava/lang/Object;
+
+
+#expected output:
+#@ClassAnnotation()
+#@MethodAnnotation()
+#@FieldAnnotation()
+#@ParameterAnnotation()
+
+
+.method public static main([Ljava/lang/String;)V
+    .registers 1
+
+    invoke-static {}, LMain;->testClassAnnotation()V
+
+    invoke-static {}, LMain;->testMethodAnnotation()V
+
+    invoke-static {}, LMain;->testFieldAnnotation()V
+
+    const-string v0, ""
+
+    invoke-static {v0}, LMain;->testParameterAnnotation(Ljava/lang/String;)V 
+
+	return-void
+.end method
+
+.annotation runtime LClassAnnotation;
+.end annotation
+
+.method public static testClassAnnotation()V
+    .registers 3
+
+    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
+
+    const-class v1, LMain;
+    const-class v2, LClassAnnotation;
+
+    invoke-virtual {v1, v2}, Ljava/lang/Class;->getAnnotation(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;
+    move-result-object v1
+
+    invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
+
+    return-void
+.end method
+
+
+
+.method public static testMethodAnnotation()V
+    .registers 4
+
+    .annotation runtime LMethodAnnotation;
+    .end annotation
+
+    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
+
+    const-class v1, LMain;
+    const-string v2, "testMethodAnnotation"
+
+    const/4 v3, 0
+    new-array v3, v3, [Ljava/lang/Class;
+
+    invoke-virtual {v1, v2, v3}, Ljava/lang/Class;->getMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
+    move-result-object v1
+
+    const-class v2, LMethodAnnotation;
+
+    invoke-virtual {v1, v2}, Ljava/lang/reflect/Method;->getAnnotation(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;
+    move-result-object v1
+
+    invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
+
+    return-void
+.end method
+
+
+.field public static fieldAnnotationTest:Ljava/lang/Object;
+    .annotation runtime LFieldAnnotation;
+    .end annotation
+.end field
+
+.method public static testFieldAnnotation()V
+    .registers 3
+
+    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
+
+    const-class v1, LMain;
+    const-string v2, "fieldAnnotationTest"
+
+    invoke-virtual {v1, v2}, Ljava/lang/Class;->getField(Ljava/lang/String;)Ljava/lang/reflect/Field;
+    move-result-object v1
+
+    const-class v2, LFieldAnnotation;
+
+    invoke-virtual {v1, v2}, Ljava/lang/reflect/Field;->getAnnotation(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;
+    move-result-object v1
+
+    invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
+
+    return-void
+.end method
+
+
+.method public static testParameterAnnotation(Ljava/lang/String;)V
+    .registers 6
+
+    .param p0    # Ljava/lang/String;
+        .annotation runtime LParameterAnnotation;
+        .end annotation
+    .end param
+
+
+    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
+
+    const-class v1, LMain;
+    const-string v2, "testParameterAnnotation"
+
+    const/4 v3, 1
+    new-array v3, v3, [Ljava/lang/Class;
+
+    const-class v4, Ljava/lang/String;
+    const/4 v5, 0
+    aput-object v4, v3, v5
+
+    invoke-virtual {v1, v2, v3}, Ljava/lang/Class;->getMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
+    move-result-object v1
+
+
+    invoke-virtual {v1}, Ljava/lang/reflect/Method;->getParameterAnnotations()[[Ljava/lang/annotation/Annotation;
+    move-result-object v1
+
+    aget-object v1, v1, v5
+    aget-object v1, v1, v5
+
+    invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
+
+    return-void
+.end method
\ No newline at end of file
diff --git a/examples/AnnotationTypes/MethodAnnotation.smali b/examples/AnnotationTypes/MethodAnnotation.smali
new file mode 100644
index 0000000..2e63299
--- /dev/null
+++ b/examples/AnnotationTypes/MethodAnnotation.smali
@@ -0,0 +1,4 @@
+.class public abstract interface annotation LMethodAnnotation;
+.super Ljava/lang/Object;
+.implements Ljava/lang/annotation/Annotation;
+
diff --git a/examples/AnnotationTypes/ParameterAnnotation.smali b/examples/AnnotationTypes/ParameterAnnotation.smali
new file mode 100644
index 0000000..d114b2a
--- /dev/null
+++ b/examples/AnnotationTypes/ParameterAnnotation.smali
@@ -0,0 +1,3 @@
+.class public abstract interface annotation LParameterAnnotation;
+.super Ljava/lang/Object;
+.implements Ljava/lang/annotation/Annotation;
\ No newline at end of file
diff --git a/examples/AnnotationValues/10.smali b/examples/AnnotationValues/10.smali
new file mode 100644
index 0000000..2a382ec
--- /dev/null
+++ b/examples/AnnotationValues/10.smali
@@ -0,0 +1,7 @@
+.class public L10;
+.super Ljava/lang/Object;
+
+.method public static 11()V
+    .registers 0
+    return-void
+.end method
\ No newline at end of file
diff --git a/examples/AnnotationValues/AnnotationWithValues.smali b/examples/AnnotationValues/AnnotationWithValues.smali
new file mode 100644
index 0000000..5446510
--- /dev/null
+++ b/examples/AnnotationValues/AnnotationWithValues.smali
@@ -0,0 +1,67 @@
+.class public abstract interface annotation LAnnotationWithValues;
+.super Ljava/lang/Object;
+.implements Ljava/lang/annotation/Annotation;
+
+.method public abstract booleanValue()Z
+.end method
+
+.method public abstract byteValue()B
+.end method
+
+.method public abstract charValue()C
+.end method
+
+.method public abstract shortValue()S
+.end method
+
+.method public abstract intValue()I
+.end method
+
+.method public abstract longValue()J
+.end method
+
+.method public abstract floatValue()F
+.end method
+
+.method public abstract doubleValue()D
+.end method
+
+.method public abstract stringValue()Ljava/lang/String;
+.end method
+
+.method public abstract subAnnotationValue()LSubAnnotation;
+.end method
+
+.method public abstract typeValue()Ljava/lang/Class;
+.end method
+
+.method public abstract methodValue()Ljava/lang/reflect/Method;
+.end method
+
+#dalvik doesn't seem to like field values
+#.method public abstract fieldValue()Ljava/lang/reflect/Field;
+#.end method
+
+.method public abstract enumValue()LEnum;
+.end method
+
+.annotation system Ldalvik/annotation/AnnotationDefault;
+    value = .subannotation LAnnotationWithValues;
+                booleanValue = false
+                byteValue = 1t
+                charValue = '2'
+                shortValue = 3s
+                intValue = 4
+                longValue = 5l
+                floatValue = 6.0f
+                doubleValue = 7.0
+                stringValue = "8"
+                subAnnotationValue = .subannotation LSubAnnotation;
+                                            stringValue = "9"
+                                     .end subannotation
+                typeValue = L10;
+                methodValue = L10;->11()V
+                enumValue = .enum LEnum;->12:LEnum;                
+            .end subannotation
+.end annotation
+
diff --git a/examples/AnnotationValues/Enum.smali b/examples/AnnotationValues/Enum.smali
new file mode 100644
index 0000000..cbc60a4
--- /dev/null
+++ b/examples/AnnotationValues/Enum.smali
@@ -0,0 +1,52 @@
+.class public final enum LEnum;
+.super Ljava/lang/Enum;
+
+.field private static final synthetic $VALUES:[LEnum;
+
+.field public static final enum 12:LEnum;
+
+.method static constructor <clinit>()V
+    .registers 4
+
+    const/4 v3, 1
+    const/4 v2, 0
+    new-instance v0, LEnum;
+    const-string v1, "12"
+    invoke-direct {v0, v1, v2}, LEnum;-><init>(Ljava/lang/String;I)V
+    sput-object v0, LEnum;->12:LEnum;
+
+    const/4 v0, 1
+    new-array v0, v0, [LEnum;
+    sget-object v1, LEnum;->12:LEnum;
+    aput-object v1, v0, v2
+    
+    sput-object v0, LEnum;->$VALUES:[LEnum;
+    return-void
+.end method
+
+.method private constructor <init>(Ljava/lang/String;I)V
+    .registers 3
+
+    invoke-direct {p0, p1, p2}, Ljava/lang/Enum;-><init>(Ljava/lang/String;I)V
+    return-void
+.end method
+
+.method public static valueOf(Ljava/lang/String;)LEnum;
+    .registers 2
+
+    const-class v0, LEnum;
+    invoke-static {v0, p0}, Ljava/lang/Enum;->valueOf(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
+    move-result-object v1
+    check-cast v1, LEnum;
+    return-object v1
+.end method
+
+.method public static values()[LEnum;
+    .registers 1
+
+    sget-object v0, LEnum;->$VALUES:[LEnum;
+    invoke-virtual {v0}, [LEnum;->clone()Ljava/lang/Object;
+    move-result-object v0
+    check-cast v0, [LEnum;
+    return-object v0
+.end method
\ No newline at end of file
diff --git a/examples/AnnotationValues/Main.smali b/examples/AnnotationValues/Main.smali
new file mode 100644
index 0000000..5f35c9d
--- /dev/null
+++ b/examples/AnnotationValues/Main.smali
@@ -0,0 +1,25 @@
+.class public LMain;
+.super Ljava/lang/Object;
+
+#expected output:
+#@AnnotationWithValues(booleanValue=false, byteValue=1, charValue=2, doubleValue=7.0, enumValue=12, floatValue=6.0, intValue=4, longValue=5, methodValue=public static void 10.11(), shortValue=3, stringValue=8, subAnnotationValue=@SubAnnotation(stringValue=9), typeValue=class 10)
+
+
+.method public static main([Ljava/lang/String;)V
+    .registers 3
+
+    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
+
+    const-class v1, LMain;
+    const-class v2, LAnnotationWithValues;
+
+    invoke-virtual {v1, v2}, Ljava/lang/Class;->getAnnotation(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;
+    move-result-object v1
+
+    invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
+
+    return-void
+.end method
+
+.annotation runtime LAnnotationWithValues;
+.end annotation
diff --git a/examples/AnnotationValues/SubAnnotation.smali b/examples/AnnotationValues/SubAnnotation.smali
new file mode 100644
index 0000000..61ef9fd
--- /dev/null
+++ b/examples/AnnotationValues/SubAnnotation.smali
@@ -0,0 +1,6 @@
+.class public abstract interface annotation LSubAnnotation;
+.super Ljava/lang/Object;
+.implements Ljava/lang/annotation/Annotation;
+
+.method public abstract stringValue()Ljava/lang/String;
+.end method
\ No newline at end of file
diff --git a/examples/BracketedMemberNames/BracketedMemberNames.smali b/examples/BracketedMemberNames/BracketedMemberNames.smali
new file mode 100644
index 0000000..51b0398
--- /dev/null
+++ b/examples/BracketedMemberNames/BracketedMemberNames.smali
@@ -0,0 +1,40 @@
+.class public LBracketedMemberNames;
+
+.super Ljava/lang/Object;
+
+.field public static <test_field>:Ljava/lang/String; = "Hello World!"
+
+.method public static main([Ljava/lang/String;)V
+    .registers 2
+
+    invoke-static {}, LBracketedMemberNames;->test_method()V
+
+    return-void
+.end method
+
+.method public static test_method()V
+    .registers 2
+
+    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
+
+    sget-object v1, LBracketedMemberNames;-><test_field>:Ljava/lang/String;
+
+    invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
+
+    return-void
+.end method
+
+.method public static <test_method>()V
+    .registers 2
+
+    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
+
+    sget-object v1, LBracketedMemberNames;-><test_field>:Ljava/lang/String;
+
+    invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
+
+    # this will cause a verification error
+    invoke-static {}, LBracketedMemberNames;-><test_method>()V
+
+    return-void
+.end method
\ No newline at end of file
diff --git a/examples/Enums/Enum.smali b/examples/Enums/Enum.smali
new file mode 100644
index 0000000..1bae8c5
--- /dev/null
+++ b/examples/Enums/Enum.smali
@@ -0,0 +1,73 @@
+.class public final enum LEnum;
+.super Ljava/lang/Enum;
+
+#This class is an example of how to define an enum. You have
+#to do all of the work that java normally takes care of
+
+.field private static final synthetic $VALUES:[LEnum;
+
+.field public static final enum VALUE1:LEnum;
+.field public static final enum VALUE2:LEnum;
+
+.method static constructor <clinit>()V
+    .registers 4
+
+    #create an instance of this class for the VALUE1 value
+    new-instance v0, LEnum;
+    const-string v1, "VALUE1"
+    const/4 v2, 0
+    invoke-direct {v0, v1, v2}, LEnum;-><init>(Ljava/lang/String;I)V
+
+    #and store it in VALUE1
+    sput-object v0, LEnum;->VALUE1:LEnum;
+
+    #create an instance of this class for the VALUE2 value
+    new-instance v0, LEnum;
+    const-string v1, "VALUE2"
+    const/4 v3, 1
+    invoke-direct {v0, v1, v3}, LEnum;-><init>(Ljava/lang/String;I)V
+
+    #and store it in VALUE2
+    sput-object v0, LEnum;->VALUE2:LEnum;
+
+    #create an array of Enums, for the $VALUES member
+    const/4 v0, 2
+    new-array v0, v0, [LEnum;
+
+    #add VALUE1 to the array
+    sget-object v1, LEnum;->VALUE1:LEnum;
+    aput-object v1, v0, v2
+
+    #add VALUE2 to the array
+    sget-object v1, LEnum;->VALUE2:LEnum;
+    aput-object v1, v0, v3
+
+    #and store the array in $VALUES
+    sput-object v0, LEnum;->$VALUES:[LEnum;
+
+    return-void
+.end method
+
+.method private constructor <init>(Ljava/lang/String;I)V
+    .registers 3
+    invoke-direct {p0, p1, p2}, Ljava/lang/Enum;-><init>(Ljava/lang/String;I)V
+    return-void
+.end method
+
+.method public static valueof(Ljava/lang/String;)LEnum;
+    .registers 2
+    const-class v0, LEnum;
+    invoke-static {v0, p0}, Ljava/lang/Enum;->valueOf(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
+    move-result-object v1
+    check-cast v1, LEnum;
+    return-object v1
+.end method
+
+.method public static values()[LEnum;
+    .registers 1
+    sget-object v0, LEnum;->$VALUES:[LEnum;
+    invoke-virtual {v0}, [LEnum;->clone()Ljava/lang/Object;
+    move-result-object v0
+    check-cast v0, [LEnum;
+    return-object v0
+.end method
\ No newline at end of file
diff --git a/examples/Enums/Main.smali b/examples/Enums/Main.smali
new file mode 100644
index 0000000..6535419
--- /dev/null
+++ b/examples/Enums/Main.smali
@@ -0,0 +1,15 @@
+.class public LMain;
+.super Ljava/lang/Object;
+
+
+
+.method public static main([Ljava/lang/String;)V
+    .registers 2
+
+    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
+    sget-object v1, LEnum;->VALUE1:LEnum;
+
+    invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
+
+	return-void
+.end method
\ No newline at end of file
diff --git a/examples/HelloWorld/HelloWorld.smali b/examples/HelloWorld/HelloWorld.smali
new file mode 100644
index 0000000..17b03f8
--- /dev/null
+++ b/examples/HelloWorld/HelloWorld.smali
@@ -0,0 +1,27 @@
+.class public LHelloWorld;
+
+#Ye olde hello world application
+#To assemble and run this on a phone or emulator:
+#
+#java -jar smali.jar -o classes.dex HelloWorld.smali
+#zip HelloWorld.zip classes.dex
+#adb push HelloWorld.zip /data/local
+#adb shell dalvikvm -cp /data/local/HelloWorld.zip HelloWorld
+#
+#if you get out of memory type errors when running smali.jar, try
+#java -Xmx512m -jar smali.jar HelloWorld.smali
+#instead
+
+.super Ljava/lang/Object;
+
+.method public static main([Ljava/lang/String;)V
+    .registers 2
+
+    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
+
+    const-string	v1, "Hello World!"
+
+    invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
+
+    return-void
+.end method
\ No newline at end of file
diff --git a/examples/Interface/Interface.smali b/examples/Interface/Interface.smali
new file mode 100644
index 0000000..2c5d154
--- /dev/null
+++ b/examples/Interface/Interface.smali
@@ -0,0 +1,5 @@
+.class public abstract interface LInterface;
+.super Ljava/lang/Object;
+
+.method public abstract interfaceMethod()Ljava/lang/String;
+.end method
\ No newline at end of file
diff --git a/examples/Interface/Main.smali b/examples/Interface/Main.smali
new file mode 100644
index 0000000..f2f69f8
--- /dev/null
+++ b/examples/Interface/Main.smali
@@ -0,0 +1,35 @@
+.class public LMain;
+.super Ljava/lang/Object;
+.implements LInterface;
+
+#expected output:
+#in interfaceMethod()
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public static main([Ljava/lang/String;)V
+    .registers 3
+
+    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
+
+    new-instance v1, LMain;
+    invoke-direct {v1}, LMain;-><init>()V
+    invoke-interface {v1}, LInterface;->interfaceMethod()Ljava/lang/String;
+    move-result-object v1
+
+    invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
+
+    return-void
+.end method
+
+
+.method public interfaceMethod()Ljava/lang/String;
+    .registers 1
+
+    const-string v0, "in interfaceMethod()"
+    return-object v0
+.end method
\ No newline at end of file
diff --git a/examples/InvokeCustom/BootstrapLinker.smali b/examples/InvokeCustom/BootstrapLinker.smali
new file mode 100644
index 0000000..cb50bb5
--- /dev/null
+++ b/examples/InvokeCustom/BootstrapLinker.smali
@@ -0,0 +1,60 @@
+.class public LBootstrapLinker;
+
+.super Ljava/lang/Object;
+
+.method public static normalLink(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
+    .registers 15
+
+    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
+    const-string v3, "BootstrapLinker.normalLink - "
+    invoke-virtual {v0, v3}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V
+    invoke-virtual {p3}, Ljava/lang/Object;->toString()Ljava/lang/String;
+    move-result-object v1
+    invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
+
+    const v0, 0
+    const v1, 1
+    invoke-virtual {p2, v0, v1}, Ljava/lang/invoke/MethodType;->dropParameterTypes(II)Ljava/lang/invoke/MethodType;
+    move-result-object p2
+
+    const-class v1, LCustom;
+
+    invoke-virtual {p0, v1, p1, p2}, Ljava/lang/invoke/MethodHandles$Lookup;->findVirtual(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;
+    move-result-object v2
+
+    new-instance v0, Ljava/lang/invoke/ConstantCallSite;
+    invoke-direct {v0, v2}, Ljava/lang/invoke/ConstantCallSite;-><init>(Ljava/lang/invoke/MethodHandle;)V
+
+    return-object v0
+.end method
+
+
+.method public static backwardsLink(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;)Ljava/lang/invoke/CallSite;
+    .registers 15
+
+    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
+    const-string v3, "BootstrapLinker.backwardsLink - "
+    invoke-virtual {v0, v3}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V
+    invoke-virtual {v0, p3}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
+
+    const v0, 0
+    const v1, 1
+    invoke-virtual {p2, v0, v1}, Ljava/lang/invoke/MethodType;->dropParameterTypes(II)Ljava/lang/invoke/MethodType;
+    move-result-object p2
+
+    new-instance v0, Ljava/lang/StringBuffer;
+    invoke-direct {v0, p1}, Ljava/lang/StringBuffer;-><init>(Ljava/lang/String;)V
+    invoke-virtual {v0}, Ljava/lang/StringBuffer;->reverse()Ljava/lang/StringBuffer;
+    invoke-virtual {v0}, Ljava/lang/StringBuffer;->toString()Ljava/lang/String;
+    move-result-object p1
+
+    const-class v1, LCustom;
+
+    invoke-virtual {p0, v1, p1, p2}, Ljava/lang/invoke/MethodHandles$Lookup;->findVirtual(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;
+    move-result-object v2
+
+    new-instance v0, Ljava/lang/invoke/ConstantCallSite;
+    invoke-direct {v0, v2}, Ljava/lang/invoke/ConstantCallSite;-><init>(Ljava/lang/invoke/MethodHandle;)V
+
+    return-object v0
+.end method
diff --git a/examples/InvokeCustom/Custom.smali b/examples/InvokeCustom/Custom.smali
new file mode 100644
index 0000000..63a28f5
--- /dev/null
+++ b/examples/InvokeCustom/Custom.smali
@@ -0,0 +1,27 @@
+.class public LCustom;
+
+.super Ljava/lang/Object;
+
+.method public doSomething(Ljava/lang/String;)Ljava/lang/String;
+    .registers 15
+
+    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
+
+    invoke-virtual {v0, p1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
+
+    const-string v1, "Custom"
+
+    return-object v1
+.end method
+
+.method public gnihtemoSod(Ljava/lang/String;)Ljava/lang/String;
+    .registers 15
+
+    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
+
+    invoke-virtual {v0, p1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
+
+    const-string v1, "motsuC"
+
+    return-object v1
+.end method
\ No newline at end of file
diff --git a/examples/InvokeCustom/Main.smali b/examples/InvokeCustom/Main.smali
new file mode 100644
index 0000000..db009cd
--- /dev/null
+++ b/examples/InvokeCustom/Main.smali
@@ -0,0 +1,26 @@
+.class LMain;
+
+.super Ljava/lang/Object;
+
+.method public static main([Ljava/lang/String;)V
+    .registers 15
+
+    new-instance v0, LCustom;
+    invoke-direct {v0}, LCustom;-><init>()V
+    
+    const-string v1, "Arg to doSomething"
+
+    invoke-custom {v0, v1}, normallyLinkedCallSite("doSomething", (LCustom;Ljava/lang/String;)Ljava/lang/String;, "just testing")@LBootstrapLinker;->normalLink(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;)Ljava/lang/invoke/CallSite;
+    move-result-object v2
+    sget-object v3, Ljava/lang/System;->out:Ljava/io/PrintStream;
+    const-string v4, "got back - "
+    invoke-virtual {v3, v4}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V
+    invoke-virtual {v3, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
+
+    invoke-custom {v0, v1}, backwardsLinkedCallSite("doSomething", (LCustom;Ljava/lang/String;)Ljava/lang/String;, "just testing")@LBootstrapLinker;->backwardsLink(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;)Ljava/lang/invoke/CallSite;
+    move-result-object v2
+    sget-object v3, Ljava/lang/System;->out:Ljava/io/PrintStream;
+    const-string v4, "got back - "
+    invoke-virtual {v3, v4}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V
+    invoke-virtual {v3, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
+.end method
\ No newline at end of file
diff --git a/examples/MethodOverloading/Main.smali b/examples/MethodOverloading/Main.smali
new file mode 100644
index 0000000..a61303e
--- /dev/null
+++ b/examples/MethodOverloading/Main.smali
@@ -0,0 +1,50 @@
+.class public LMain;
+.super Ljava/lang/Object;
+
+#expected output:
+#returning a string
+#42
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public static main([Ljava/lang/String;)V
+    .registers 4
+
+    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
+
+    new-instance v1, LMain;
+    invoke-direct {v1}, LMain;-><init>()V
+    invoke-virtual {v1}, LMain;->overloadTest()Ljava/lang/String;
+    move-result-object v2
+
+    invoke-virtual {v0, v2}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
+
+    invoke-virtual {v1}, LMain;->overloadTest()I
+    move-result v2
+
+    invoke-static {v2}, Ljava/lang/Integer;->toString(I)Ljava/lang/String;
+    move-result-object v2
+
+    invoke-virtual {v0, v2}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
+
+    return-void
+.end method
+
+
+.method public overloadTest()Ljava/lang/String;
+    .registers 1
+
+    const-string v0, "returning a string"
+    return-object v0
+.end method
+
+.method public overloadTest()I
+    .registers 1
+
+    const v0, 42
+    return v0
+.end method
\ No newline at end of file
diff --git a/examples/RecursiveAnnotation/Main.smali b/examples/RecursiveAnnotation/Main.smali
new file mode 100644
index 0000000..d44bdca
--- /dev/null
+++ b/examples/RecursiveAnnotation/Main.smali
@@ -0,0 +1,24 @@
+.class public LMain;
+.super Ljava/lang/Object;
+
+#expected output (using the dalvik's default stack size)
+#@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=@RecursiveAnnotation(value=java.lang.StackOverflowError))))))))))))))))))))))))))))))
+
+.method public static main([Ljava/lang/String;)V
+    .registers 3
+
+    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
+
+    const-class v1, LMain;
+    const-class v2, LRecursiveAnnotation;
+
+    invoke-virtual {v1, v2}, Ljava/lang/Class;->getAnnotation(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;
+    move-result-object v1
+
+    invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
+
+    return-void
+.end method
+
+.annotation runtime LRecursiveAnnotation;
+.end annotation
diff --git a/examples/RecursiveAnnotation/RecursiveAnnotation.smali b/examples/RecursiveAnnotation/RecursiveAnnotation.smali
new file mode 100644
index 0000000..0fde4a8
--- /dev/null
+++ b/examples/RecursiveAnnotation/RecursiveAnnotation.smali
@@ -0,0 +1,18 @@
+.class public abstract interface annotation LRecursiveAnnotation;
+.super Ljava/lang/Object;
+.implements Ljava/lang/annotation/Annotation;
+
+#this is a recursive annotation that has a default value of itself.
+#Trying to print .toString() on an instance of this annotation
+#will cause a stack overflow
+
+.method public abstract value()LRecursiveAnnotation;
+.end method
+
+.annotation system Ldalvik/annotation/AnnotationDefault;
+    value = .subannotation LRecursiveAnnotation;
+                value = .subannotation LRecursiveAnnotation;
+                        .end subannotation
+            .end subannotation
+.end annotation
+
diff --git a/examples/RecursiveExceptionHandler/Main.smali b/examples/RecursiveExceptionHandler/Main.smali
new file mode 100644
index 0000000..ea11365
--- /dev/null
+++ b/examples/RecursiveExceptionHandler/Main.smali
@@ -0,0 +1,21 @@
+.class public LMain;
+.super Ljava/lang/Object;
+
+.method public static main([Ljava/lang/String;)V
+    .registers 3
+
+    :second_handler
+    :first_try_start
+        new-instance v0, Ljava/lang/RuntimeException;
+        invoke-direct {v0}, Ljava/lang/RuntimeException;-><init>()V
+        throw v0
+    :first_try_end
+    .catch Ljava/lang/Exception; {:first_try_start .. :first_try_end} :first_handler
+    :first_handler
+    :second_try_start
+        new-instance v0, Ljava/lang/RuntimeException;
+        invoke-direct {v0}, Ljava/lang/RuntimeException;-><init>()V
+        throw v0
+    :second_try_end
+    .catch Ljava/lang/Exception; {:second_try_start .. :second_try_end} :second_handler
+.end method
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000..567bbb9
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,2 @@
+org.gradle.daemon=true
+org.gradle.parallel=true
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..87b738c
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..10cb99e
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.1-all.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
new file mode 100755
index 0000000..af6708f
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+    echo "$*"
+}
+
+die () {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Escape application args
+save () {
+    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+    echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+  cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..0f8d593
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/scripts/baksmali b/scripts/baksmali
new file mode 100755
index 0000000..bd3f820
--- /dev/null
+++ b/scripts/baksmali
@@ -0,0 +1,83 @@
+#!/bin/bash
+#
+# Copyright (C) 2007 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# As per the Apache license requirements, this file has been modified
+# from its original state.
+#
+# Such modifications are Copyright (C) 2010 Ben Gruver, and are released
+# under the original license
+
+# This script is a wrapper around baksmali.jar, so you can simply call
+# "baksmali", instead of java -jar baksmali.jar. It is heavily based on
+# the "dx" script from the Android SDK
+
+# Set up prog to be the path of this script, including following symlinks,
+# and set up progdir to be the fully-qualified pathname of its directory.
+prog="$0"
+while [ -h "${prog}" ]; do
+    newProg=`/bin/ls -ld "${prog}"`
+    echo ${newProg}
+
+
+    newProg=`expr "${newProg}" : ".* -> \(.*\)$"`
+    if expr "x${newProg}" : 'x/' >/dev/null; then
+        prog="${newProg}"
+    else
+        progdir=`dirname "${prog}"`
+        prog="${progdir}/${newProg}"
+    fi
+done
+oldwd=`pwd`
+progdir=`dirname "${prog}"`
+cd "${progdir}"
+progdir=`pwd`
+prog="${progdir}"/`basename "${prog}"`
+cd "${oldwd}"
+
+
+jarfile=baksmali.jar
+libdir="$progdir"
+if [ ! -r "$libdir/$jarfile" ]
+then
+    echo `basename "$prog"`": can't find $jarfile"
+    exit 1
+fi
+
+javaOpts=""
+
+# If you want DX to have more memory when executing, uncomment the following
+# line and adjust the value accordingly. Use "java -X" for a list of options
+# you can pass here.
+#
+javaOpts="-Xmx256M"
+
+# Alternatively, this will extract any parameter "-Jxxx" from the command line
+# and pass them to Java (instead of to dx). This makes it possible for you to
+# add a command-line parameter such as "-JXmx256M" in your ant scripts, for
+# example.
+while expr "x$1" : 'x-J' >/dev/null; do
+    opt=`expr "$1" : '-J\(.*\)'`
+    javaOpts="${javaOpts} -${opt}"
+    shift
+done
+
+if [ "$OSTYPE" = "cygwin" ] ; then
+	jarpath=`cygpath -w  "$libdir/$jarfile"`
+else
+	jarpath="$libdir/$jarfile"
+fi
+
+exec java $javaOpts -jar "$jarpath" "$@"
diff --git a/scripts/smali b/scripts/smali
new file mode 100755
index 0000000..9ede675
--- /dev/null
+++ b/scripts/smali
@@ -0,0 +1,83 @@
+#!/bin/bash
+#
+# Copyright (C) 2007 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# As per the Apache license requirements, this file has been modified
+# from its original state.
+#
+# Such modifications are Copyright (C) 2010 Ben Gruver, and are released
+# under the original license
+
+# This script is a wrapper for smali.jar, so you can simply call "smali",
+# instead of java -jar smali.jar. It is heavily based on the "dx" script
+# from the Android SDK
+
+# Set up prog to be the path of this script, including following symlinks,
+# and set up progdir to be the fully-qualified pathname of its directory.
+prog="$0"
+while [ -h "${prog}" ]; do
+    newProg=`/bin/ls -ld "${prog}"`
+    echo ${newProg}
+
+
+    newProg=`expr "${newProg}" : ".* -> \(.*\)$"`
+    if expr "x${newProg}" : 'x/' >/dev/null; then
+        prog="${newProg}"
+    else
+        progdir=`dirname "${prog}"`
+        prog="${progdir}/${newProg}"
+    fi
+done
+oldwd=`pwd`
+progdir=`dirname "${prog}"`
+cd "${progdir}"
+progdir=`pwd`
+prog="${progdir}"/`basename "${prog}"`
+cd "${oldwd}"
+
+
+jarfile=smali.jar
+libdir="$progdir"
+if [ ! -r "$libdir/$jarfile" ]
+then
+    echo `basename "$prog"`": can't find $jarfile"
+    exit 1
+fi
+
+javaOpts=""
+
+# If you want DX to have more memory when executing, uncomment the following
+# line and adjust the value accordingly. Use "java -X" for a list of options
+# you can pass here.
+#
+javaOpts="-Xmx512M"
+
+# Alternatively, this will extract any parameter "-Jxxx" from the command line
+# and pass them to Java (instead of to dx). This makes it possible for you to
+# add a command-line parameter such as "-JXmx256M" in your ant scripts, for
+# example.
+while expr "x$1" : 'x-J' >/dev/null; do
+    opt=`expr "$1" : '-J\(.*\)'`
+    javaOpts="${javaOpts} -${opt}"
+    shift
+done
+
+if [ "$OSTYPE" = "cygwin" ] ; then
+    jarpath=`cygpath -w  "$libdir/$jarfile"`
+else
+    jarpath="$libdir/$jarfile"
+fi
+
+exec java $javaOpts -jar "$jarpath" "$@"
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..6c4f08c
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1 @@
+include 'util', 'dexlib2', 'baksmali', 'smali', 'dexlib2:accessorTestGenerator'
\ No newline at end of file
diff --git a/smali-2.4.0.jar b/smali-2.4.0.jar
deleted file mode 100644
index 9d502f2..0000000
Binary files a/smali-2.4.0.jar and /dev/null differ
diff --git a/smali-integration-tests/src/assemble/jumbo-field-tests.xml b/smali-integration-tests/src/assemble/jumbo-field-tests.xml
new file mode 100644
index 0000000..0f463db
--- /dev/null
+++ b/smali-integration-tests/src/assemble/jumbo-field-tests.xml
@@ -0,0 +1,44 @@
+<!--
+  ~ Copyright 2011, Google Inc.
+  ~ All rights reserved.
+  ~
+  ~ Redistribution and use in source and binary forms, with or without
+  ~ modification, are permitted provided that the following conditions are
+  ~ met:
+  ~
+  ~     * Redistributions of source code must retain the above copyright
+  ~ notice, this list of conditions and the following disclaimer.
+  ~     * Redistributions in binary form must reproduce the above
+  ~ copyright notice, this list of conditions and the following disclaimer
+  ~ in the documentation and/or other materials provided with the
+  ~ distribution.
+  ~     * Neither the name of Google Inc. nor the names of its
+  ~ contributors may be used to endorse or promote products derived from
+  ~ this software without specific prior written permission.
+  ~
+  ~ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+  ~ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+  ~ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+  ~ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+  ~ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+  ~ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  ~ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+  ~ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+  ~ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+  ~ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+  ~ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  -->
+
+<assembly>
+  <id>zip</id>
+  <formats>
+    <format>zip</format>
+  </formats>
+  <includeBaseDirectory>false</includeBaseDirectory>
+  <files>
+    <file>
+        <source>target/jumbo-field-tests/classes.dex</source>
+        <outputDirectory>/</outputDirectory>
+    </file>
+  </files>
+</assembly>
\ No newline at end of file
diff --git a/smali-integration-tests/src/assemble/jumbo-method-tests.xml b/smali-integration-tests/src/assemble/jumbo-method-tests.xml
new file mode 100644
index 0000000..f5be3c0
--- /dev/null
+++ b/smali-integration-tests/src/assemble/jumbo-method-tests.xml
@@ -0,0 +1,44 @@
+<!--
+  ~ Copyright 2011, Google Inc.
+  ~ All rights reserved.
+  ~
+  ~ Redistribution and use in source and binary forms, with or without
+  ~ modification, are permitted provided that the following conditions are
+  ~ met:
+  ~
+  ~     * Redistributions of source code must retain the above copyright
+  ~ notice, this list of conditions and the following disclaimer.
+  ~     * Redistributions in binary form must reproduce the above
+  ~ copyright notice, this list of conditions and the following disclaimer
+  ~ in the documentation and/or other materials provided with the
+  ~ distribution.
+  ~     * Neither the name of Google Inc. nor the names of its
+  ~ contributors may be used to endorse or promote products derived from
+  ~ this software without specific prior written permission.
+  ~
+  ~ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+  ~ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+  ~ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+  ~ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+  ~ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+  ~ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  ~ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+  ~ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+  ~ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+  ~ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+  ~ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  -->
+
+<assembly>
+  <id>zip</id>
+  <formats>
+    <format>zip</format>
+  </formats>
+  <includeBaseDirectory>false</includeBaseDirectory>
+  <files>
+    <file>
+        <source>target/jumbo-method-tests/classes.dex</source>
+        <outputDirectory>/</outputDirectory>
+    </file>
+  </files>
+</assembly>
\ No newline at end of file
diff --git a/smali-integration-tests/src/assemble/jumbo-string-tests.xml b/smali-integration-tests/src/assemble/jumbo-string-tests.xml
new file mode 100644
index 0000000..7c9cd79
--- /dev/null
+++ b/smali-integration-tests/src/assemble/jumbo-string-tests.xml
@@ -0,0 +1,13 @@
+<assembly>
+  <id>zip</id>
+  <formats>
+    <format>zip</format>
+  </formats>
+  <includeBaseDirectory>false</includeBaseDirectory>
+  <files>
+    <file>
+        <source>target/jumbo-string-tests/classes.dex</source>
+        <outputDirectory>/</outputDirectory>
+    </file>
+  </files>
+</assembly>
\ No newline at end of file
diff --git a/smali-integration-tests/src/assemble/jumbo-type-tests.xml b/smali-integration-tests/src/assemble/jumbo-type-tests.xml
new file mode 100644
index 0000000..4fd1b6c
--- /dev/null
+++ b/smali-integration-tests/src/assemble/jumbo-type-tests.xml
@@ -0,0 +1,13 @@
+<assembly>
+  <id>zip</id>
+  <formats>
+    <format>zip</format>
+  </formats>
+  <includeBaseDirectory>false</includeBaseDirectory>
+  <files>
+    <file>
+        <source>target/jumbo-type-tests/classes.dex</source>
+        <outputDirectory>/</outputDirectory>
+    </file>
+  </files>
+</assembly>
\ No newline at end of file
diff --git a/smali-integration-tests/src/assemble/junit-tests.xml b/smali-integration-tests/src/assemble/junit-tests.xml
new file mode 100644
index 0000000..fb41744
--- /dev/null
+++ b/smali-integration-tests/src/assemble/junit-tests.xml
@@ -0,0 +1,13 @@
+<assembly>
+  <id>zip</id>
+  <formats>
+    <format>zip</format>
+  </formats>
+  <includeBaseDirectory>false</includeBaseDirectory>
+  <files>
+    <file>
+        <source>target/junit-tests/classes.dex</source>
+        <outputDirectory>/</outputDirectory>
+    </file>
+  </files>
+</assembly>
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/jumbo-string-tests/Format31c.smali b/smali-integration-tests/src/test/smali/jumbo-string-tests/Format31c.smali
new file mode 100644
index 0000000..c985567
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/jumbo-string-tests/Format31c.smali
@@ -0,0 +1,65642 @@
+# Copyright 2011, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,           
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY           
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+.class public LFormat31c;
+.super Ljava/lang/Object;
+.source "Format31c.smali"
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public test_const-string-jumbo()V
+    .registers 9
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-string/jumbo v0, "99999"
+    invoke-virtual {v0}, Ljava/lang/String;->length()I
+    move-result v1
+
+    const v2, 0
+    const-wide v3, '9'
+
+    :loop
+        invoke-virtual {v0, v2}, Ljava/lang/String;->charAt(I)C
+        move-result v5
+
+        int-to-long v6, v5
+
+        invoke-static {v3, v4, v6, v7}, Lorg/junit/Assert;->assertEquals(JJ)V
+
+	add-int/lit8 v2, v2, 1 
+    if-ne v1, v2, :loop
+
+    return-void
+.end method
+
+.method public test_const-string-jumbo-autofix()V
+    .registers 9
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-string v0, "99999"
+    invoke-virtual {v0}, Ljava/lang/String;->length()I
+    move-result v1
+
+    const v2, 0
+    const-wide v3, '9'
+
+    :loop
+        invoke-virtual {v0, v2}, Ljava/lang/String;->charAt(I)C
+        move-result v5
+
+        int-to-long v6, v5
+
+        invoke-static {v3, v4, v6, v7}, Lorg/junit/Assert;->assertEquals(JJ)V
+
+	add-int/lit8 v2, v2, 1 
+    if-ne v1, v2, :loop
+
+    return-void
+.end method
+
+#this method is not directly used in any of the tests. It's purpose is to fill out the type table past 64k entries
+.method public not-used-1()V
+    .registers 1
+
+    const-string/jumbo v0, "0"
+    const-string/jumbo v0, "1"
+    const-string/jumbo v0, "2"
+    const-string/jumbo v0, "3"
+    const-string/jumbo v0, "4"
+    const-string/jumbo v0, "5"
+    const-string/jumbo v0, "6"
+    const-string/jumbo v0, "7"
+    const-string/jumbo v0, "8"
+    const-string/jumbo v0, "9"
+    const-string/jumbo v0, "10"
+    const-string/jumbo v0, "11"
+    const-string/jumbo v0, "12"
+    const-string/jumbo v0, "13"
+    const-string/jumbo v0, "14"
+    const-string/jumbo v0, "15"
+    const-string/jumbo v0, "16"
+    const-string/jumbo v0, "17"
+    const-string/jumbo v0, "18"
+    const-string/jumbo v0, "19"
+    const-string/jumbo v0, "20"
+    const-string/jumbo v0, "21"
+    const-string/jumbo v0, "22"
+    const-string/jumbo v0, "23"
+    const-string/jumbo v0, "24"
+    const-string/jumbo v0, "25"
+    const-string/jumbo v0, "26"
+    const-string/jumbo v0, "27"
+    const-string/jumbo v0, "28"
+    const-string/jumbo v0, "29"
+    const-string/jumbo v0, "30"
+    const-string/jumbo v0, "31"
+    const-string/jumbo v0, "32"
+    const-string/jumbo v0, "33"
+    const-string/jumbo v0, "34"
+    const-string/jumbo v0, "35"
+    const-string/jumbo v0, "36"
+    const-string/jumbo v0, "37"
+    const-string/jumbo v0, "38"
+    const-string/jumbo v0, "39"
+    const-string/jumbo v0, "40"
+    const-string/jumbo v0, "41"
+    const-string/jumbo v0, "42"
+    const-string/jumbo v0, "43"
+    const-string/jumbo v0, "44"
+    const-string/jumbo v0, "45"
+    const-string/jumbo v0, "46"
+    const-string/jumbo v0, "47"
+    const-string/jumbo v0, "48"
+    const-string/jumbo v0, "49"
+    const-string/jumbo v0, "50"
+    const-string/jumbo v0, "51"
+    const-string/jumbo v0, "52"
+    const-string/jumbo v0, "53"
+    const-string/jumbo v0, "54"
+    const-string/jumbo v0, "55"
+    const-string/jumbo v0, "56"
+    const-string/jumbo v0, "57"
+    const-string/jumbo v0, "58"
+    const-string/jumbo v0, "59"
+    const-string/jumbo v0, "60"
+    const-string/jumbo v0, "61"
+    const-string/jumbo v0, "62"
+    const-string/jumbo v0, "63"
+    const-string/jumbo v0, "64"
+    const-string/jumbo v0, "65"
+    const-string/jumbo v0, "66"
+    const-string/jumbo v0, "67"
+    const-string/jumbo v0, "68"
+    const-string/jumbo v0, "69"
+    const-string/jumbo v0, "70"
+    const-string/jumbo v0, "71"
+    const-string/jumbo v0, "72"
+    const-string/jumbo v0, "73"
+    const-string/jumbo v0, "74"
+    const-string/jumbo v0, "75"
+    const-string/jumbo v0, "76"
+    const-string/jumbo v0, "77"
+    const-string/jumbo v0, "78"
+    const-string/jumbo v0, "79"
+    const-string/jumbo v0, "80"
+    const-string/jumbo v0, "81"
+    const-string/jumbo v0, "82"
+    const-string/jumbo v0, "83"
+    const-string/jumbo v0, "84"
+    const-string/jumbo v0, "85"
+    const-string/jumbo v0, "86"
+    const-string/jumbo v0, "87"
+    const-string/jumbo v0, "88"
+    const-string/jumbo v0, "89"
+    const-string/jumbo v0, "90"
+    const-string/jumbo v0, "91"
+    const-string/jumbo v0, "92"
+    const-string/jumbo v0, "93"
+    const-string/jumbo v0, "94"
+    const-string/jumbo v0, "95"
+    const-string/jumbo v0, "96"
+    const-string/jumbo v0, "97"
+    const-string/jumbo v0, "98"
+    const-string/jumbo v0, "99"
+    const-string/jumbo v0, "100"
+    const-string/jumbo v0, "101"
+    const-string/jumbo v0, "102"
+    const-string/jumbo v0, "103"
+    const-string/jumbo v0, "104"
+    const-string/jumbo v0, "105"
+    const-string/jumbo v0, "106"
+    const-string/jumbo v0, "107"
+    const-string/jumbo v0, "108"
+    const-string/jumbo v0, "109"
+    const-string/jumbo v0, "110"
+    const-string/jumbo v0, "111"
+    const-string/jumbo v0, "112"
+    const-string/jumbo v0, "113"
+    const-string/jumbo v0, "114"
+    const-string/jumbo v0, "115"
+    const-string/jumbo v0, "116"
+    const-string/jumbo v0, "117"
+    const-string/jumbo v0, "118"
+    const-string/jumbo v0, "119"
+    const-string/jumbo v0, "120"
+    const-string/jumbo v0, "121"
+    const-string/jumbo v0, "122"
+    const-string/jumbo v0, "123"
+    const-string/jumbo v0, "124"
+    const-string/jumbo v0, "125"
+    const-string/jumbo v0, "126"
+    const-string/jumbo v0, "127"
+    const-string/jumbo v0, "128"
+    const-string/jumbo v0, "129"
+    const-string/jumbo v0, "130"
+    const-string/jumbo v0, "131"
+    const-string/jumbo v0, "132"
+    const-string/jumbo v0, "133"
+    const-string/jumbo v0, "134"
+    const-string/jumbo v0, "135"
+    const-string/jumbo v0, "136"
+    const-string/jumbo v0, "137"
+    const-string/jumbo v0, "138"
+    const-string/jumbo v0, "139"
+    const-string/jumbo v0, "140"
+    const-string/jumbo v0, "141"
+    const-string/jumbo v0, "142"
+    const-string/jumbo v0, "143"
+    const-string/jumbo v0, "144"
+    const-string/jumbo v0, "145"
+    const-string/jumbo v0, "146"
+    const-string/jumbo v0, "147"
+    const-string/jumbo v0, "148"
+    const-string/jumbo v0, "149"
+    const-string/jumbo v0, "150"
+    const-string/jumbo v0, "151"
+    const-string/jumbo v0, "152"
+    const-string/jumbo v0, "153"
+    const-string/jumbo v0, "154"
+    const-string/jumbo v0, "155"
+    const-string/jumbo v0, "156"
+    const-string/jumbo v0, "157"
+    const-string/jumbo v0, "158"
+    const-string/jumbo v0, "159"
+    const-string/jumbo v0, "160"
+    const-string/jumbo v0, "161"
+    const-string/jumbo v0, "162"
+    const-string/jumbo v0, "163"
+    const-string/jumbo v0, "164"
+    const-string/jumbo v0, "165"
+    const-string/jumbo v0, "166"
+    const-string/jumbo v0, "167"
+    const-string/jumbo v0, "168"
+    const-string/jumbo v0, "169"
+    const-string/jumbo v0, "170"
+    const-string/jumbo v0, "171"
+    const-string/jumbo v0, "172"
+    const-string/jumbo v0, "173"
+    const-string/jumbo v0, "174"
+    const-string/jumbo v0, "175"
+    const-string/jumbo v0, "176"
+    const-string/jumbo v0, "177"
+    const-string/jumbo v0, "178"
+    const-string/jumbo v0, "179"
+    const-string/jumbo v0, "180"
+    const-string/jumbo v0, "181"
+    const-string/jumbo v0, "182"
+    const-string/jumbo v0, "183"
+    const-string/jumbo v0, "184"
+    const-string/jumbo v0, "185"
+    const-string/jumbo v0, "186"
+    const-string/jumbo v0, "187"
+    const-string/jumbo v0, "188"
+    const-string/jumbo v0, "189"
+    const-string/jumbo v0, "190"
+    const-string/jumbo v0, "191"
+    const-string/jumbo v0, "192"
+    const-string/jumbo v0, "193"
+    const-string/jumbo v0, "194"
+    const-string/jumbo v0, "195"
+    const-string/jumbo v0, "196"
+    const-string/jumbo v0, "197"
+    const-string/jumbo v0, "198"
+    const-string/jumbo v0, "199"
+    const-string/jumbo v0, "200"
+    const-string/jumbo v0, "201"
+    const-string/jumbo v0, "202"
+    const-string/jumbo v0, "203"
+    const-string/jumbo v0, "204"
+    const-string/jumbo v0, "205"
+    const-string/jumbo v0, "206"
+    const-string/jumbo v0, "207"
+    const-string/jumbo v0, "208"
+    const-string/jumbo v0, "209"
+    const-string/jumbo v0, "210"
+    const-string/jumbo v0, "211"
+    const-string/jumbo v0, "212"
+    const-string/jumbo v0, "213"
+    const-string/jumbo v0, "214"
+    const-string/jumbo v0, "215"
+    const-string/jumbo v0, "216"
+    const-string/jumbo v0, "217"
+    const-string/jumbo v0, "218"
+    const-string/jumbo v0, "219"
+    const-string/jumbo v0, "220"
+    const-string/jumbo v0, "221"
+    const-string/jumbo v0, "222"
+    const-string/jumbo v0, "223"
+    const-string/jumbo v0, "224"
+    const-string/jumbo v0, "225"
+    const-string/jumbo v0, "226"
+    const-string/jumbo v0, "227"
+    const-string/jumbo v0, "228"
+    const-string/jumbo v0, "229"
+    const-string/jumbo v0, "230"
+    const-string/jumbo v0, "231"
+    const-string/jumbo v0, "232"
+    const-string/jumbo v0, "233"
+    const-string/jumbo v0, "234"
+    const-string/jumbo v0, "235"
+    const-string/jumbo v0, "236"
+    const-string/jumbo v0, "237"
+    const-string/jumbo v0, "238"
+    const-string/jumbo v0, "239"
+    const-string/jumbo v0, "240"
+    const-string/jumbo v0, "241"
+    const-string/jumbo v0, "242"
+    const-string/jumbo v0, "243"
+    const-string/jumbo v0, "244"
+    const-string/jumbo v0, "245"
+    const-string/jumbo v0, "246"
+    const-string/jumbo v0, "247"
+    const-string/jumbo v0, "248"
+    const-string/jumbo v0, "249"
+    const-string/jumbo v0, "250"
+    const-string/jumbo v0, "251"
+    const-string/jumbo v0, "252"
+    const-string/jumbo v0, "253"
+    const-string/jumbo v0, "254"
+    const-string/jumbo v0, "255"
+    const-string/jumbo v0, "256"
+    const-string/jumbo v0, "257"
+    const-string/jumbo v0, "258"
+    const-string/jumbo v0, "259"
+    const-string/jumbo v0, "260"
+    const-string/jumbo v0, "261"
+    const-string/jumbo v0, "262"
+    const-string/jumbo v0, "263"
+    const-string/jumbo v0, "264"
+    const-string/jumbo v0, "265"
+    const-string/jumbo v0, "266"
+    const-string/jumbo v0, "267"
+    const-string/jumbo v0, "268"
+    const-string/jumbo v0, "269"
+    const-string/jumbo v0, "270"
+    const-string/jumbo v0, "271"
+    const-string/jumbo v0, "272"
+    const-string/jumbo v0, "273"
+    const-string/jumbo v0, "274"
+    const-string/jumbo v0, "275"
+    const-string/jumbo v0, "276"
+    const-string/jumbo v0, "277"
+    const-string/jumbo v0, "278"
+    const-string/jumbo v0, "279"
+    const-string/jumbo v0, "280"
+    const-string/jumbo v0, "281"
+    const-string/jumbo v0, "282"
+    const-string/jumbo v0, "283"
+    const-string/jumbo v0, "284"
+    const-string/jumbo v0, "285"
+    const-string/jumbo v0, "286"
+    const-string/jumbo v0, "287"
+    const-string/jumbo v0, "288"
+    const-string/jumbo v0, "289"
+    const-string/jumbo v0, "290"
+    const-string/jumbo v0, "291"
+    const-string/jumbo v0, "292"
+    const-string/jumbo v0, "293"
+    const-string/jumbo v0, "294"
+    const-string/jumbo v0, "295"
+    const-string/jumbo v0, "296"
+    const-string/jumbo v0, "297"
+    const-string/jumbo v0, "298"
+    const-string/jumbo v0, "299"
+    const-string/jumbo v0, "300"
+    const-string/jumbo v0, "301"
+    const-string/jumbo v0, "302"
+    const-string/jumbo v0, "303"
+    const-string/jumbo v0, "304"
+    const-string/jumbo v0, "305"
+    const-string/jumbo v0, "306"
+    const-string/jumbo v0, "307"
+    const-string/jumbo v0, "308"
+    const-string/jumbo v0, "309"
+    const-string/jumbo v0, "310"
+    const-string/jumbo v0, "311"
+    const-string/jumbo v0, "312"
+    const-string/jumbo v0, "313"
+    const-string/jumbo v0, "314"
+    const-string/jumbo v0, "315"
+    const-string/jumbo v0, "316"
+    const-string/jumbo v0, "317"
+    const-string/jumbo v0, "318"
+    const-string/jumbo v0, "319"
+    const-string/jumbo v0, "320"
+    const-string/jumbo v0, "321"
+    const-string/jumbo v0, "322"
+    const-string/jumbo v0, "323"
+    const-string/jumbo v0, "324"
+    const-string/jumbo v0, "325"
+    const-string/jumbo v0, "326"
+    const-string/jumbo v0, "327"
+    const-string/jumbo v0, "328"
+    const-string/jumbo v0, "329"
+    const-string/jumbo v0, "330"
+    const-string/jumbo v0, "331"
+    const-string/jumbo v0, "332"
+    const-string/jumbo v0, "333"
+    const-string/jumbo v0, "334"
+    const-string/jumbo v0, "335"
+    const-string/jumbo v0, "336"
+    const-string/jumbo v0, "337"
+    const-string/jumbo v0, "338"
+    const-string/jumbo v0, "339"
+    const-string/jumbo v0, "340"
+    const-string/jumbo v0, "341"
+    const-string/jumbo v0, "342"
+    const-string/jumbo v0, "343"
+    const-string/jumbo v0, "344"
+    const-string/jumbo v0, "345"
+    const-string/jumbo v0, "346"
+    const-string/jumbo v0, "347"
+    const-string/jumbo v0, "348"
+    const-string/jumbo v0, "349"
+    const-string/jumbo v0, "350"
+    const-string/jumbo v0, "351"
+    const-string/jumbo v0, "352"
+    const-string/jumbo v0, "353"
+    const-string/jumbo v0, "354"
+    const-string/jumbo v0, "355"
+    const-string/jumbo v0, "356"
+    const-string/jumbo v0, "357"
+    const-string/jumbo v0, "358"
+    const-string/jumbo v0, "359"
+    const-string/jumbo v0, "360"
+    const-string/jumbo v0, "361"
+    const-string/jumbo v0, "362"
+    const-string/jumbo v0, "363"
+    const-string/jumbo v0, "364"
+    const-string/jumbo v0, "365"
+    const-string/jumbo v0, "366"
+    const-string/jumbo v0, "367"
+    const-string/jumbo v0, "368"
+    const-string/jumbo v0, "369"
+    const-string/jumbo v0, "370"
+    const-string/jumbo v0, "371"
+    const-string/jumbo v0, "372"
+    const-string/jumbo v0, "373"
+    const-string/jumbo v0, "374"
+    const-string/jumbo v0, "375"
+    const-string/jumbo v0, "376"
+    const-string/jumbo v0, "377"
+    const-string/jumbo v0, "378"
+    const-string/jumbo v0, "379"
+    const-string/jumbo v0, "380"
+    const-string/jumbo v0, "381"
+    const-string/jumbo v0, "382"
+    const-string/jumbo v0, "383"
+    const-string/jumbo v0, "384"
+    const-string/jumbo v0, "385"
+    const-string/jumbo v0, "386"
+    const-string/jumbo v0, "387"
+    const-string/jumbo v0, "388"
+    const-string/jumbo v0, "389"
+    const-string/jumbo v0, "390"
+    const-string/jumbo v0, "391"
+    const-string/jumbo v0, "392"
+    const-string/jumbo v0, "393"
+    const-string/jumbo v0, "394"
+    const-string/jumbo v0, "395"
+    const-string/jumbo v0, "396"
+    const-string/jumbo v0, "397"
+    const-string/jumbo v0, "398"
+    const-string/jumbo v0, "399"
+    const-string/jumbo v0, "400"
+    const-string/jumbo v0, "401"
+    const-string/jumbo v0, "402"
+    const-string/jumbo v0, "403"
+    const-string/jumbo v0, "404"
+    const-string/jumbo v0, "405"
+    const-string/jumbo v0, "406"
+    const-string/jumbo v0, "407"
+    const-string/jumbo v0, "408"
+    const-string/jumbo v0, "409"
+    const-string/jumbo v0, "410"
+    const-string/jumbo v0, "411"
+    const-string/jumbo v0, "412"
+    const-string/jumbo v0, "413"
+    const-string/jumbo v0, "414"
+    const-string/jumbo v0, "415"
+    const-string/jumbo v0, "416"
+    const-string/jumbo v0, "417"
+    const-string/jumbo v0, "418"
+    const-string/jumbo v0, "419"
+    const-string/jumbo v0, "420"
+    const-string/jumbo v0, "421"
+    const-string/jumbo v0, "422"
+    const-string/jumbo v0, "423"
+    const-string/jumbo v0, "424"
+    const-string/jumbo v0, "425"
+    const-string/jumbo v0, "426"
+    const-string/jumbo v0, "427"
+    const-string/jumbo v0, "428"
+    const-string/jumbo v0, "429"
+    const-string/jumbo v0, "430"
+    const-string/jumbo v0, "431"
+    const-string/jumbo v0, "432"
+    const-string/jumbo v0, "433"
+    const-string/jumbo v0, "434"
+    const-string/jumbo v0, "435"
+    const-string/jumbo v0, "436"
+    const-string/jumbo v0, "437"
+    const-string/jumbo v0, "438"
+    const-string/jumbo v0, "439"
+    const-string/jumbo v0, "440"
+    const-string/jumbo v0, "441"
+    const-string/jumbo v0, "442"
+    const-string/jumbo v0, "443"
+    const-string/jumbo v0, "444"
+    const-string/jumbo v0, "445"
+    const-string/jumbo v0, "446"
+    const-string/jumbo v0, "447"
+    const-string/jumbo v0, "448"
+    const-string/jumbo v0, "449"
+    const-string/jumbo v0, "450"
+    const-string/jumbo v0, "451"
+    const-string/jumbo v0, "452"
+    const-string/jumbo v0, "453"
+    const-string/jumbo v0, "454"
+    const-string/jumbo v0, "455"
+    const-string/jumbo v0, "456"
+    const-string/jumbo v0, "457"
+    const-string/jumbo v0, "458"
+    const-string/jumbo v0, "459"
+    const-string/jumbo v0, "460"
+    const-string/jumbo v0, "461"
+    const-string/jumbo v0, "462"
+    const-string/jumbo v0, "463"
+    const-string/jumbo v0, "464"
+    const-string/jumbo v0, "465"
+    const-string/jumbo v0, "466"
+    const-string/jumbo v0, "467"
+    const-string/jumbo v0, "468"
+    const-string/jumbo v0, "469"
+    const-string/jumbo v0, "470"
+    const-string/jumbo v0, "471"
+    const-string/jumbo v0, "472"
+    const-string/jumbo v0, "473"
+    const-string/jumbo v0, "474"
+    const-string/jumbo v0, "475"
+    const-string/jumbo v0, "476"
+    const-string/jumbo v0, "477"
+    const-string/jumbo v0, "478"
+    const-string/jumbo v0, "479"
+    const-string/jumbo v0, "480"
+    const-string/jumbo v0, "481"
+    const-string/jumbo v0, "482"
+    const-string/jumbo v0, "483"
+    const-string/jumbo v0, "484"
+    const-string/jumbo v0, "485"
+    const-string/jumbo v0, "486"
+    const-string/jumbo v0, "487"
+    const-string/jumbo v0, "488"
+    const-string/jumbo v0, "489"
+    const-string/jumbo v0, "490"
+    const-string/jumbo v0, "491"
+    const-string/jumbo v0, "492"
+    const-string/jumbo v0, "493"
+    const-string/jumbo v0, "494"
+    const-string/jumbo v0, "495"
+    const-string/jumbo v0, "496"
+    const-string/jumbo v0, "497"
+    const-string/jumbo v0, "498"
+    const-string/jumbo v0, "499"
+    const-string/jumbo v0, "500"
+    const-string/jumbo v0, "501"
+    const-string/jumbo v0, "502"
+    const-string/jumbo v0, "503"
+    const-string/jumbo v0, "504"
+    const-string/jumbo v0, "505"
+    const-string/jumbo v0, "506"
+    const-string/jumbo v0, "507"
+    const-string/jumbo v0, "508"
+    const-string/jumbo v0, "509"
+    const-string/jumbo v0, "510"
+    const-string/jumbo v0, "511"
+    const-string/jumbo v0, "512"
+    const-string/jumbo v0, "513"
+    const-string/jumbo v0, "514"
+    const-string/jumbo v0, "515"
+    const-string/jumbo v0, "516"
+    const-string/jumbo v0, "517"
+    const-string/jumbo v0, "518"
+    const-string/jumbo v0, "519"
+    const-string/jumbo v0, "520"
+    const-string/jumbo v0, "521"
+    const-string/jumbo v0, "522"
+    const-string/jumbo v0, "523"
+    const-string/jumbo v0, "524"
+    const-string/jumbo v0, "525"
+    const-string/jumbo v0, "526"
+    const-string/jumbo v0, "527"
+    const-string/jumbo v0, "528"
+    const-string/jumbo v0, "529"
+    const-string/jumbo v0, "530"
+    const-string/jumbo v0, "531"
+    const-string/jumbo v0, "532"
+    const-string/jumbo v0, "533"
+    const-string/jumbo v0, "534"
+    const-string/jumbo v0, "535"
+    const-string/jumbo v0, "536"
+    const-string/jumbo v0, "537"
+    const-string/jumbo v0, "538"
+    const-string/jumbo v0, "539"
+    const-string/jumbo v0, "540"
+    const-string/jumbo v0, "541"
+    const-string/jumbo v0, "542"
+    const-string/jumbo v0, "543"
+    const-string/jumbo v0, "544"
+    const-string/jumbo v0, "545"
+    const-string/jumbo v0, "546"
+    const-string/jumbo v0, "547"
+    const-string/jumbo v0, "548"
+    const-string/jumbo v0, "549"
+    const-string/jumbo v0, "550"
+    const-string/jumbo v0, "551"
+    const-string/jumbo v0, "552"
+    const-string/jumbo v0, "553"
+    const-string/jumbo v0, "554"
+    const-string/jumbo v0, "555"
+    const-string/jumbo v0, "556"
+    const-string/jumbo v0, "557"
+    const-string/jumbo v0, "558"
+    const-string/jumbo v0, "559"
+    const-string/jumbo v0, "560"
+    const-string/jumbo v0, "561"
+    const-string/jumbo v0, "562"
+    const-string/jumbo v0, "563"
+    const-string/jumbo v0, "564"
+    const-string/jumbo v0, "565"
+    const-string/jumbo v0, "566"
+    const-string/jumbo v0, "567"
+    const-string/jumbo v0, "568"
+    const-string/jumbo v0, "569"
+    const-string/jumbo v0, "570"
+    const-string/jumbo v0, "571"
+    const-string/jumbo v0, "572"
+    const-string/jumbo v0, "573"
+    const-string/jumbo v0, "574"
+    const-string/jumbo v0, "575"
+    const-string/jumbo v0, "576"
+    const-string/jumbo v0, "577"
+    const-string/jumbo v0, "578"
+    const-string/jumbo v0, "579"
+    const-string/jumbo v0, "580"
+    const-string/jumbo v0, "581"
+    const-string/jumbo v0, "582"
+    const-string/jumbo v0, "583"
+    const-string/jumbo v0, "584"
+    const-string/jumbo v0, "585"
+    const-string/jumbo v0, "586"
+    const-string/jumbo v0, "587"
+    const-string/jumbo v0, "588"
+    const-string/jumbo v0, "589"
+    const-string/jumbo v0, "590"
+    const-string/jumbo v0, "591"
+    const-string/jumbo v0, "592"
+    const-string/jumbo v0, "593"
+    const-string/jumbo v0, "594"
+    const-string/jumbo v0, "595"
+    const-string/jumbo v0, "596"
+    const-string/jumbo v0, "597"
+    const-string/jumbo v0, "598"
+    const-string/jumbo v0, "599"
+    const-string/jumbo v0, "600"
+    const-string/jumbo v0, "601"
+    const-string/jumbo v0, "602"
+    const-string/jumbo v0, "603"
+    const-string/jumbo v0, "604"
+    const-string/jumbo v0, "605"
+    const-string/jumbo v0, "606"
+    const-string/jumbo v0, "607"
+    const-string/jumbo v0, "608"
+    const-string/jumbo v0, "609"
+    const-string/jumbo v0, "610"
+    const-string/jumbo v0, "611"
+    const-string/jumbo v0, "612"
+    const-string/jumbo v0, "613"
+    const-string/jumbo v0, "614"
+    const-string/jumbo v0, "615"
+    const-string/jumbo v0, "616"
+    const-string/jumbo v0, "617"
+    const-string/jumbo v0, "618"
+    const-string/jumbo v0, "619"
+    const-string/jumbo v0, "620"
+    const-string/jumbo v0, "621"
+    const-string/jumbo v0, "622"
+    const-string/jumbo v0, "623"
+    const-string/jumbo v0, "624"
+    const-string/jumbo v0, "625"
+    const-string/jumbo v0, "626"
+    const-string/jumbo v0, "627"
+    const-string/jumbo v0, "628"
+    const-string/jumbo v0, "629"
+    const-string/jumbo v0, "630"
+    const-string/jumbo v0, "631"
+    const-string/jumbo v0, "632"
+    const-string/jumbo v0, "633"
+    const-string/jumbo v0, "634"
+    const-string/jumbo v0, "635"
+    const-string/jumbo v0, "636"
+    const-string/jumbo v0, "637"
+    const-string/jumbo v0, "638"
+    const-string/jumbo v0, "639"
+    const-string/jumbo v0, "640"
+    const-string/jumbo v0, "641"
+    const-string/jumbo v0, "642"
+    const-string/jumbo v0, "643"
+    const-string/jumbo v0, "644"
+    const-string/jumbo v0, "645"
+    const-string/jumbo v0, "646"
+    const-string/jumbo v0, "647"
+    const-string/jumbo v0, "648"
+    const-string/jumbo v0, "649"
+    const-string/jumbo v0, "650"
+    const-string/jumbo v0, "651"
+    const-string/jumbo v0, "652"
+    const-string/jumbo v0, "653"
+    const-string/jumbo v0, "654"
+    const-string/jumbo v0, "655"
+    const-string/jumbo v0, "656"
+    const-string/jumbo v0, "657"
+    const-string/jumbo v0, "658"
+    const-string/jumbo v0, "659"
+    const-string/jumbo v0, "660"
+    const-string/jumbo v0, "661"
+    const-string/jumbo v0, "662"
+    const-string/jumbo v0, "663"
+    const-string/jumbo v0, "664"
+    const-string/jumbo v0, "665"
+    const-string/jumbo v0, "666"
+    const-string/jumbo v0, "667"
+    const-string/jumbo v0, "668"
+    const-string/jumbo v0, "669"
+    const-string/jumbo v0, "670"
+    const-string/jumbo v0, "671"
+    const-string/jumbo v0, "672"
+    const-string/jumbo v0, "673"
+    const-string/jumbo v0, "674"
+    const-string/jumbo v0, "675"
+    const-string/jumbo v0, "676"
+    const-string/jumbo v0, "677"
+    const-string/jumbo v0, "678"
+    const-string/jumbo v0, "679"
+    const-string/jumbo v0, "680"
+    const-string/jumbo v0, "681"
+    const-string/jumbo v0, "682"
+    const-string/jumbo v0, "683"
+    const-string/jumbo v0, "684"
+    const-string/jumbo v0, "685"
+    const-string/jumbo v0, "686"
+    const-string/jumbo v0, "687"
+    const-string/jumbo v0, "688"
+    const-string/jumbo v0, "689"
+    const-string/jumbo v0, "690"
+    const-string/jumbo v0, "691"
+    const-string/jumbo v0, "692"
+    const-string/jumbo v0, "693"
+    const-string/jumbo v0, "694"
+    const-string/jumbo v0, "695"
+    const-string/jumbo v0, "696"
+    const-string/jumbo v0, "697"
+    const-string/jumbo v0, "698"
+    const-string/jumbo v0, "699"
+    const-string/jumbo v0, "700"
+    const-string/jumbo v0, "701"
+    const-string/jumbo v0, "702"
+    const-string/jumbo v0, "703"
+    const-string/jumbo v0, "704"
+    const-string/jumbo v0, "705"
+    const-string/jumbo v0, "706"
+    const-string/jumbo v0, "707"
+    const-string/jumbo v0, "708"
+    const-string/jumbo v0, "709"
+    const-string/jumbo v0, "710"
+    const-string/jumbo v0, "711"
+    const-string/jumbo v0, "712"
+    const-string/jumbo v0, "713"
+    const-string/jumbo v0, "714"
+    const-string/jumbo v0, "715"
+    const-string/jumbo v0, "716"
+    const-string/jumbo v0, "717"
+    const-string/jumbo v0, "718"
+    const-string/jumbo v0, "719"
+    const-string/jumbo v0, "720"
+    const-string/jumbo v0, "721"
+    const-string/jumbo v0, "722"
+    const-string/jumbo v0, "723"
+    const-string/jumbo v0, "724"
+    const-string/jumbo v0, "725"
+    const-string/jumbo v0, "726"
+    const-string/jumbo v0, "727"
+    const-string/jumbo v0, "728"
+    const-string/jumbo v0, "729"
+    const-string/jumbo v0, "730"
+    const-string/jumbo v0, "731"
+    const-string/jumbo v0, "732"
+    const-string/jumbo v0, "733"
+    const-string/jumbo v0, "734"
+    const-string/jumbo v0, "735"
+    const-string/jumbo v0, "736"
+    const-string/jumbo v0, "737"
+    const-string/jumbo v0, "738"
+    const-string/jumbo v0, "739"
+    const-string/jumbo v0, "740"
+    const-string/jumbo v0, "741"
+    const-string/jumbo v0, "742"
+    const-string/jumbo v0, "743"
+    const-string/jumbo v0, "744"
+    const-string/jumbo v0, "745"
+    const-string/jumbo v0, "746"
+    const-string/jumbo v0, "747"
+    const-string/jumbo v0, "748"
+    const-string/jumbo v0, "749"
+    const-string/jumbo v0, "750"
+    const-string/jumbo v0, "751"
+    const-string/jumbo v0, "752"
+    const-string/jumbo v0, "753"
+    const-string/jumbo v0, "754"
+    const-string/jumbo v0, "755"
+    const-string/jumbo v0, "756"
+    const-string/jumbo v0, "757"
+    const-string/jumbo v0, "758"
+    const-string/jumbo v0, "759"
+    const-string/jumbo v0, "760"
+    const-string/jumbo v0, "761"
+    const-string/jumbo v0, "762"
+    const-string/jumbo v0, "763"
+    const-string/jumbo v0, "764"
+    const-string/jumbo v0, "765"
+    const-string/jumbo v0, "766"
+    const-string/jumbo v0, "767"
+    const-string/jumbo v0, "768"
+    const-string/jumbo v0, "769"
+    const-string/jumbo v0, "770"
+    const-string/jumbo v0, "771"
+    const-string/jumbo v0, "772"
+    const-string/jumbo v0, "773"
+    const-string/jumbo v0, "774"
+    const-string/jumbo v0, "775"
+    const-string/jumbo v0, "776"
+    const-string/jumbo v0, "777"
+    const-string/jumbo v0, "778"
+    const-string/jumbo v0, "779"
+    const-string/jumbo v0, "780"
+    const-string/jumbo v0, "781"
+    const-string/jumbo v0, "782"
+    const-string/jumbo v0, "783"
+    const-string/jumbo v0, "784"
+    const-string/jumbo v0, "785"
+    const-string/jumbo v0, "786"
+    const-string/jumbo v0, "787"
+    const-string/jumbo v0, "788"
+    const-string/jumbo v0, "789"
+    const-string/jumbo v0, "790"
+    const-string/jumbo v0, "791"
+    const-string/jumbo v0, "792"
+    const-string/jumbo v0, "793"
+    const-string/jumbo v0, "794"
+    const-string/jumbo v0, "795"
+    const-string/jumbo v0, "796"
+    const-string/jumbo v0, "797"
+    const-string/jumbo v0, "798"
+    const-string/jumbo v0, "799"
+    const-string/jumbo v0, "800"
+    const-string/jumbo v0, "801"
+    const-string/jumbo v0, "802"
+    const-string/jumbo v0, "803"
+    const-string/jumbo v0, "804"
+    const-string/jumbo v0, "805"
+    const-string/jumbo v0, "806"
+    const-string/jumbo v0, "807"
+    const-string/jumbo v0, "808"
+    const-string/jumbo v0, "809"
+    const-string/jumbo v0, "810"
+    const-string/jumbo v0, "811"
+    const-string/jumbo v0, "812"
+    const-string/jumbo v0, "813"
+    const-string/jumbo v0, "814"
+    const-string/jumbo v0, "815"
+    const-string/jumbo v0, "816"
+    const-string/jumbo v0, "817"
+    const-string/jumbo v0, "818"
+    const-string/jumbo v0, "819"
+    const-string/jumbo v0, "820"
+    const-string/jumbo v0, "821"
+    const-string/jumbo v0, "822"
+    const-string/jumbo v0, "823"
+    const-string/jumbo v0, "824"
+    const-string/jumbo v0, "825"
+    const-string/jumbo v0, "826"
+    const-string/jumbo v0, "827"
+    const-string/jumbo v0, "828"
+    const-string/jumbo v0, "829"
+    const-string/jumbo v0, "830"
+    const-string/jumbo v0, "831"
+    const-string/jumbo v0, "832"
+    const-string/jumbo v0, "833"
+    const-string/jumbo v0, "834"
+    const-string/jumbo v0, "835"
+    const-string/jumbo v0, "836"
+    const-string/jumbo v0, "837"
+    const-string/jumbo v0, "838"
+    const-string/jumbo v0, "839"
+    const-string/jumbo v0, "840"
+    const-string/jumbo v0, "841"
+    const-string/jumbo v0, "842"
+    const-string/jumbo v0, "843"
+    const-string/jumbo v0, "844"
+    const-string/jumbo v0, "845"
+    const-string/jumbo v0, "846"
+    const-string/jumbo v0, "847"
+    const-string/jumbo v0, "848"
+    const-string/jumbo v0, "849"
+    const-string/jumbo v0, "850"
+    const-string/jumbo v0, "851"
+    const-string/jumbo v0, "852"
+    const-string/jumbo v0, "853"
+    const-string/jumbo v0, "854"
+    const-string/jumbo v0, "855"
+    const-string/jumbo v0, "856"
+    const-string/jumbo v0, "857"
+    const-string/jumbo v0, "858"
+    const-string/jumbo v0, "859"
+    const-string/jumbo v0, "860"
+    const-string/jumbo v0, "861"
+    const-string/jumbo v0, "862"
+    const-string/jumbo v0, "863"
+    const-string/jumbo v0, "864"
+    const-string/jumbo v0, "865"
+    const-string/jumbo v0, "866"
+    const-string/jumbo v0, "867"
+    const-string/jumbo v0, "868"
+    const-string/jumbo v0, "869"
+    const-string/jumbo v0, "870"
+    const-string/jumbo v0, "871"
+    const-string/jumbo v0, "872"
+    const-string/jumbo v0, "873"
+    const-string/jumbo v0, "874"
+    const-string/jumbo v0, "875"
+    const-string/jumbo v0, "876"
+    const-string/jumbo v0, "877"
+    const-string/jumbo v0, "878"
+    const-string/jumbo v0, "879"
+    const-string/jumbo v0, "880"
+    const-string/jumbo v0, "881"
+    const-string/jumbo v0, "882"
+    const-string/jumbo v0, "883"
+    const-string/jumbo v0, "884"
+    const-string/jumbo v0, "885"
+    const-string/jumbo v0, "886"
+    const-string/jumbo v0, "887"
+    const-string/jumbo v0, "888"
+    const-string/jumbo v0, "889"
+    const-string/jumbo v0, "890"
+    const-string/jumbo v0, "891"
+    const-string/jumbo v0, "892"
+    const-string/jumbo v0, "893"
+    const-string/jumbo v0, "894"
+    const-string/jumbo v0, "895"
+    const-string/jumbo v0, "896"
+    const-string/jumbo v0, "897"
+    const-string/jumbo v0, "898"
+    const-string/jumbo v0, "899"
+    const-string/jumbo v0, "900"
+    const-string/jumbo v0, "901"
+    const-string/jumbo v0, "902"
+    const-string/jumbo v0, "903"
+    const-string/jumbo v0, "904"
+    const-string/jumbo v0, "905"
+    const-string/jumbo v0, "906"
+    const-string/jumbo v0, "907"
+    const-string/jumbo v0, "908"
+    const-string/jumbo v0, "909"
+    const-string/jumbo v0, "910"
+    const-string/jumbo v0, "911"
+    const-string/jumbo v0, "912"
+    const-string/jumbo v0, "913"
+    const-string/jumbo v0, "914"
+    const-string/jumbo v0, "915"
+    const-string/jumbo v0, "916"
+    const-string/jumbo v0, "917"
+    const-string/jumbo v0, "918"
+    const-string/jumbo v0, "919"
+    const-string/jumbo v0, "920"
+    const-string/jumbo v0, "921"
+    const-string/jumbo v0, "922"
+    const-string/jumbo v0, "923"
+    const-string/jumbo v0, "924"
+    const-string/jumbo v0, "925"
+    const-string/jumbo v0, "926"
+    const-string/jumbo v0, "927"
+    const-string/jumbo v0, "928"
+    const-string/jumbo v0, "929"
+    const-string/jumbo v0, "930"
+    const-string/jumbo v0, "931"
+    const-string/jumbo v0, "932"
+    const-string/jumbo v0, "933"
+    const-string/jumbo v0, "934"
+    const-string/jumbo v0, "935"
+    const-string/jumbo v0, "936"
+    const-string/jumbo v0, "937"
+    const-string/jumbo v0, "938"
+    const-string/jumbo v0, "939"
+    const-string/jumbo v0, "940"
+    const-string/jumbo v0, "941"
+    const-string/jumbo v0, "942"
+    const-string/jumbo v0, "943"
+    const-string/jumbo v0, "944"
+    const-string/jumbo v0, "945"
+    const-string/jumbo v0, "946"
+    const-string/jumbo v0, "947"
+    const-string/jumbo v0, "948"
+    const-string/jumbo v0, "949"
+    const-string/jumbo v0, "950"
+    const-string/jumbo v0, "951"
+    const-string/jumbo v0, "952"
+    const-string/jumbo v0, "953"
+    const-string/jumbo v0, "954"
+    const-string/jumbo v0, "955"
+    const-string/jumbo v0, "956"
+    const-string/jumbo v0, "957"
+    const-string/jumbo v0, "958"
+    const-string/jumbo v0, "959"
+    const-string/jumbo v0, "960"
+    const-string/jumbo v0, "961"
+    const-string/jumbo v0, "962"
+    const-string/jumbo v0, "963"
+    const-string/jumbo v0, "964"
+    const-string/jumbo v0, "965"
+    const-string/jumbo v0, "966"
+    const-string/jumbo v0, "967"
+    const-string/jumbo v0, "968"
+    const-string/jumbo v0, "969"
+    const-string/jumbo v0, "970"
+    const-string/jumbo v0, "971"
+    const-string/jumbo v0, "972"
+    const-string/jumbo v0, "973"
+    const-string/jumbo v0, "974"
+    const-string/jumbo v0, "975"
+    const-string/jumbo v0, "976"
+    const-string/jumbo v0, "977"
+    const-string/jumbo v0, "978"
+    const-string/jumbo v0, "979"
+    const-string/jumbo v0, "980"
+    const-string/jumbo v0, "981"
+    const-string/jumbo v0, "982"
+    const-string/jumbo v0, "983"
+    const-string/jumbo v0, "984"
+    const-string/jumbo v0, "985"
+    const-string/jumbo v0, "986"
+    const-string/jumbo v0, "987"
+    const-string/jumbo v0, "988"
+    const-string/jumbo v0, "989"
+    const-string/jumbo v0, "990"
+    const-string/jumbo v0, "991"
+    const-string/jumbo v0, "992"
+    const-string/jumbo v0, "993"
+    const-string/jumbo v0, "994"
+    const-string/jumbo v0, "995"
+    const-string/jumbo v0, "996"
+    const-string/jumbo v0, "997"
+    const-string/jumbo v0, "998"
+    const-string/jumbo v0, "999"
+    const-string/jumbo v0, "1000"
+    const-string/jumbo v0, "1001"
+    const-string/jumbo v0, "1002"
+    const-string/jumbo v0, "1003"
+    const-string/jumbo v0, "1004"
+    const-string/jumbo v0, "1005"
+    const-string/jumbo v0, "1006"
+    const-string/jumbo v0, "1007"
+    const-string/jumbo v0, "1008"
+    const-string/jumbo v0, "1009"
+    const-string/jumbo v0, "1010"
+    const-string/jumbo v0, "1011"
+    const-string/jumbo v0, "1012"
+    const-string/jumbo v0, "1013"
+    const-string/jumbo v0, "1014"
+    const-string/jumbo v0, "1015"
+    const-string/jumbo v0, "1016"
+    const-string/jumbo v0, "1017"
+    const-string/jumbo v0, "1018"
+    const-string/jumbo v0, "1019"
+    const-string/jumbo v0, "1020"
+    const-string/jumbo v0, "1021"
+    const-string/jumbo v0, "1022"
+    const-string/jumbo v0, "1023"
+    const-string/jumbo v0, "1024"
+    const-string/jumbo v0, "1025"
+    const-string/jumbo v0, "1026"
+    const-string/jumbo v0, "1027"
+    const-string/jumbo v0, "1028"
+    const-string/jumbo v0, "1029"
+    const-string/jumbo v0, "1030"
+    const-string/jumbo v0, "1031"
+    const-string/jumbo v0, "1032"
+    const-string/jumbo v0, "1033"
+    const-string/jumbo v0, "1034"
+    const-string/jumbo v0, "1035"
+    const-string/jumbo v0, "1036"
+    const-string/jumbo v0, "1037"
+    const-string/jumbo v0, "1038"
+    const-string/jumbo v0, "1039"
+    const-string/jumbo v0, "1040"
+    const-string/jumbo v0, "1041"
+    const-string/jumbo v0, "1042"
+    const-string/jumbo v0, "1043"
+    const-string/jumbo v0, "1044"
+    const-string/jumbo v0, "1045"
+    const-string/jumbo v0, "1046"
+    const-string/jumbo v0, "1047"
+    const-string/jumbo v0, "1048"
+    const-string/jumbo v0, "1049"
+    const-string/jumbo v0, "1050"
+    const-string/jumbo v0, "1051"
+    const-string/jumbo v0, "1052"
+    const-string/jumbo v0, "1053"
+    const-string/jumbo v0, "1054"
+    const-string/jumbo v0, "1055"
+    const-string/jumbo v0, "1056"
+    const-string/jumbo v0, "1057"
+    const-string/jumbo v0, "1058"
+    const-string/jumbo v0, "1059"
+    const-string/jumbo v0, "1060"
+    const-string/jumbo v0, "1061"
+    const-string/jumbo v0, "1062"
+    const-string/jumbo v0, "1063"
+    const-string/jumbo v0, "1064"
+    const-string/jumbo v0, "1065"
+    const-string/jumbo v0, "1066"
+    const-string/jumbo v0, "1067"
+    const-string/jumbo v0, "1068"
+    const-string/jumbo v0, "1069"
+    const-string/jumbo v0, "1070"
+    const-string/jumbo v0, "1071"
+    const-string/jumbo v0, "1072"
+    const-string/jumbo v0, "1073"
+    const-string/jumbo v0, "1074"
+    const-string/jumbo v0, "1075"
+    const-string/jumbo v0, "1076"
+    const-string/jumbo v0, "1077"
+    const-string/jumbo v0, "1078"
+    const-string/jumbo v0, "1079"
+    const-string/jumbo v0, "1080"
+    const-string/jumbo v0, "1081"
+    const-string/jumbo v0, "1082"
+    const-string/jumbo v0, "1083"
+    const-string/jumbo v0, "1084"
+    const-string/jumbo v0, "1085"
+    const-string/jumbo v0, "1086"
+    const-string/jumbo v0, "1087"
+    const-string/jumbo v0, "1088"
+    const-string/jumbo v0, "1089"
+    const-string/jumbo v0, "1090"
+    const-string/jumbo v0, "1091"
+    const-string/jumbo v0, "1092"
+    const-string/jumbo v0, "1093"
+    const-string/jumbo v0, "1094"
+    const-string/jumbo v0, "1095"
+    const-string/jumbo v0, "1096"
+    const-string/jumbo v0, "1097"
+    const-string/jumbo v0, "1098"
+    const-string/jumbo v0, "1099"
+    const-string/jumbo v0, "1100"
+    const-string/jumbo v0, "1101"
+    const-string/jumbo v0, "1102"
+    const-string/jumbo v0, "1103"
+    const-string/jumbo v0, "1104"
+    const-string/jumbo v0, "1105"
+    const-string/jumbo v0, "1106"
+    const-string/jumbo v0, "1107"
+    const-string/jumbo v0, "1108"
+    const-string/jumbo v0, "1109"
+    const-string/jumbo v0, "1110"
+    const-string/jumbo v0, "1111"
+    const-string/jumbo v0, "1112"
+    const-string/jumbo v0, "1113"
+    const-string/jumbo v0, "1114"
+    const-string/jumbo v0, "1115"
+    const-string/jumbo v0, "1116"
+    const-string/jumbo v0, "1117"
+    const-string/jumbo v0, "1118"
+    const-string/jumbo v0, "1119"
+    const-string/jumbo v0, "1120"
+    const-string/jumbo v0, "1121"
+    const-string/jumbo v0, "1122"
+    const-string/jumbo v0, "1123"
+    const-string/jumbo v0, "1124"
+    const-string/jumbo v0, "1125"
+    const-string/jumbo v0, "1126"
+    const-string/jumbo v0, "1127"
+    const-string/jumbo v0, "1128"
+    const-string/jumbo v0, "1129"
+    const-string/jumbo v0, "1130"
+    const-string/jumbo v0, "1131"
+    const-string/jumbo v0, "1132"
+    const-string/jumbo v0, "1133"
+    const-string/jumbo v0, "1134"
+    const-string/jumbo v0, "1135"
+    const-string/jumbo v0, "1136"
+    const-string/jumbo v0, "1137"
+    const-string/jumbo v0, "1138"
+    const-string/jumbo v0, "1139"
+    const-string/jumbo v0, "1140"
+    const-string/jumbo v0, "1141"
+    const-string/jumbo v0, "1142"
+    const-string/jumbo v0, "1143"
+    const-string/jumbo v0, "1144"
+    const-string/jumbo v0, "1145"
+    const-string/jumbo v0, "1146"
+    const-string/jumbo v0, "1147"
+    const-string/jumbo v0, "1148"
+    const-string/jumbo v0, "1149"
+    const-string/jumbo v0, "1150"
+    const-string/jumbo v0, "1151"
+    const-string/jumbo v0, "1152"
+    const-string/jumbo v0, "1153"
+    const-string/jumbo v0, "1154"
+    const-string/jumbo v0, "1155"
+    const-string/jumbo v0, "1156"
+    const-string/jumbo v0, "1157"
+    const-string/jumbo v0, "1158"
+    const-string/jumbo v0, "1159"
+    const-string/jumbo v0, "1160"
+    const-string/jumbo v0, "1161"
+    const-string/jumbo v0, "1162"
+    const-string/jumbo v0, "1163"
+    const-string/jumbo v0, "1164"
+    const-string/jumbo v0, "1165"
+    const-string/jumbo v0, "1166"
+    const-string/jumbo v0, "1167"
+    const-string/jumbo v0, "1168"
+    const-string/jumbo v0, "1169"
+    const-string/jumbo v0, "1170"
+    const-string/jumbo v0, "1171"
+    const-string/jumbo v0, "1172"
+    const-string/jumbo v0, "1173"
+    const-string/jumbo v0, "1174"
+    const-string/jumbo v0, "1175"
+    const-string/jumbo v0, "1176"
+    const-string/jumbo v0, "1177"
+    const-string/jumbo v0, "1178"
+    const-string/jumbo v0, "1179"
+    const-string/jumbo v0, "1180"
+    const-string/jumbo v0, "1181"
+    const-string/jumbo v0, "1182"
+    const-string/jumbo v0, "1183"
+    const-string/jumbo v0, "1184"
+    const-string/jumbo v0, "1185"
+    const-string/jumbo v0, "1186"
+    const-string/jumbo v0, "1187"
+    const-string/jumbo v0, "1188"
+    const-string/jumbo v0, "1189"
+    const-string/jumbo v0, "1190"
+    const-string/jumbo v0, "1191"
+    const-string/jumbo v0, "1192"
+    const-string/jumbo v0, "1193"
+    const-string/jumbo v0, "1194"
+    const-string/jumbo v0, "1195"
+    const-string/jumbo v0, "1196"
+    const-string/jumbo v0, "1197"
+    const-string/jumbo v0, "1198"
+    const-string/jumbo v0, "1199"
+    const-string/jumbo v0, "1200"
+    const-string/jumbo v0, "1201"
+    const-string/jumbo v0, "1202"
+    const-string/jumbo v0, "1203"
+    const-string/jumbo v0, "1204"
+    const-string/jumbo v0, "1205"
+    const-string/jumbo v0, "1206"
+    const-string/jumbo v0, "1207"
+    const-string/jumbo v0, "1208"
+    const-string/jumbo v0, "1209"
+    const-string/jumbo v0, "1210"
+    const-string/jumbo v0, "1211"
+    const-string/jumbo v0, "1212"
+    const-string/jumbo v0, "1213"
+    const-string/jumbo v0, "1214"
+    const-string/jumbo v0, "1215"
+    const-string/jumbo v0, "1216"
+    const-string/jumbo v0, "1217"
+    const-string/jumbo v0, "1218"
+    const-string/jumbo v0, "1219"
+    const-string/jumbo v0, "1220"
+    const-string/jumbo v0, "1221"
+    const-string/jumbo v0, "1222"
+    const-string/jumbo v0, "1223"
+    const-string/jumbo v0, "1224"
+    const-string/jumbo v0, "1225"
+    const-string/jumbo v0, "1226"
+    const-string/jumbo v0, "1227"
+    const-string/jumbo v0, "1228"
+    const-string/jumbo v0, "1229"
+    const-string/jumbo v0, "1230"
+    const-string/jumbo v0, "1231"
+    const-string/jumbo v0, "1232"
+    const-string/jumbo v0, "1233"
+    const-string/jumbo v0, "1234"
+    const-string/jumbo v0, "1235"
+    const-string/jumbo v0, "1236"
+    const-string/jumbo v0, "1237"
+    const-string/jumbo v0, "1238"
+    const-string/jumbo v0, "1239"
+    const-string/jumbo v0, "1240"
+    const-string/jumbo v0, "1241"
+    const-string/jumbo v0, "1242"
+    const-string/jumbo v0, "1243"
+    const-string/jumbo v0, "1244"
+    const-string/jumbo v0, "1245"
+    const-string/jumbo v0, "1246"
+    const-string/jumbo v0, "1247"
+    const-string/jumbo v0, "1248"
+    const-string/jumbo v0, "1249"
+    const-string/jumbo v0, "1250"
+    const-string/jumbo v0, "1251"
+    const-string/jumbo v0, "1252"
+    const-string/jumbo v0, "1253"
+    const-string/jumbo v0, "1254"
+    const-string/jumbo v0, "1255"
+    const-string/jumbo v0, "1256"
+    const-string/jumbo v0, "1257"
+    const-string/jumbo v0, "1258"
+    const-string/jumbo v0, "1259"
+    const-string/jumbo v0, "1260"
+    const-string/jumbo v0, "1261"
+    const-string/jumbo v0, "1262"
+    const-string/jumbo v0, "1263"
+    const-string/jumbo v0, "1264"
+    const-string/jumbo v0, "1265"
+    const-string/jumbo v0, "1266"
+    const-string/jumbo v0, "1267"
+    const-string/jumbo v0, "1268"
+    const-string/jumbo v0, "1269"
+    const-string/jumbo v0, "1270"
+    const-string/jumbo v0, "1271"
+    const-string/jumbo v0, "1272"
+    const-string/jumbo v0, "1273"
+    const-string/jumbo v0, "1274"
+    const-string/jumbo v0, "1275"
+    const-string/jumbo v0, "1276"
+    const-string/jumbo v0, "1277"
+    const-string/jumbo v0, "1278"
+    const-string/jumbo v0, "1279"
+    const-string/jumbo v0, "1280"
+    const-string/jumbo v0, "1281"
+    const-string/jumbo v0, "1282"
+    const-string/jumbo v0, "1283"
+    const-string/jumbo v0, "1284"
+    const-string/jumbo v0, "1285"
+    const-string/jumbo v0, "1286"
+    const-string/jumbo v0, "1287"
+    const-string/jumbo v0, "1288"
+    const-string/jumbo v0, "1289"
+    const-string/jumbo v0, "1290"
+    const-string/jumbo v0, "1291"
+    const-string/jumbo v0, "1292"
+    const-string/jumbo v0, "1293"
+    const-string/jumbo v0, "1294"
+    const-string/jumbo v0, "1295"
+    const-string/jumbo v0, "1296"
+    const-string/jumbo v0, "1297"
+    const-string/jumbo v0, "1298"
+    const-string/jumbo v0, "1299"
+    const-string/jumbo v0, "1300"
+    const-string/jumbo v0, "1301"
+    const-string/jumbo v0, "1302"
+    const-string/jumbo v0, "1303"
+    const-string/jumbo v0, "1304"
+    const-string/jumbo v0, "1305"
+    const-string/jumbo v0, "1306"
+    const-string/jumbo v0, "1307"
+    const-string/jumbo v0, "1308"
+    const-string/jumbo v0, "1309"
+    const-string/jumbo v0, "1310"
+    const-string/jumbo v0, "1311"
+    const-string/jumbo v0, "1312"
+    const-string/jumbo v0, "1313"
+    const-string/jumbo v0, "1314"
+    const-string/jumbo v0, "1315"
+    const-string/jumbo v0, "1316"
+    const-string/jumbo v0, "1317"
+    const-string/jumbo v0, "1318"
+    const-string/jumbo v0, "1319"
+    const-string/jumbo v0, "1320"
+    const-string/jumbo v0, "1321"
+    const-string/jumbo v0, "1322"
+    const-string/jumbo v0, "1323"
+    const-string/jumbo v0, "1324"
+    const-string/jumbo v0, "1325"
+    const-string/jumbo v0, "1326"
+    const-string/jumbo v0, "1327"
+    const-string/jumbo v0, "1328"
+    const-string/jumbo v0, "1329"
+    const-string/jumbo v0, "1330"
+    const-string/jumbo v0, "1331"
+    const-string/jumbo v0, "1332"
+    const-string/jumbo v0, "1333"
+    const-string/jumbo v0, "1334"
+    const-string/jumbo v0, "1335"
+    const-string/jumbo v0, "1336"
+    const-string/jumbo v0, "1337"
+    const-string/jumbo v0, "1338"
+    const-string/jumbo v0, "1339"
+    const-string/jumbo v0, "1340"
+    const-string/jumbo v0, "1341"
+    const-string/jumbo v0, "1342"
+    const-string/jumbo v0, "1343"
+    const-string/jumbo v0, "1344"
+    const-string/jumbo v0, "1345"
+    const-string/jumbo v0, "1346"
+    const-string/jumbo v0, "1347"
+    const-string/jumbo v0, "1348"
+    const-string/jumbo v0, "1349"
+    const-string/jumbo v0, "1350"
+    const-string/jumbo v0, "1351"
+    const-string/jumbo v0, "1352"
+    const-string/jumbo v0, "1353"
+    const-string/jumbo v0, "1354"
+    const-string/jumbo v0, "1355"
+    const-string/jumbo v0, "1356"
+    const-string/jumbo v0, "1357"
+    const-string/jumbo v0, "1358"
+    const-string/jumbo v0, "1359"
+    const-string/jumbo v0, "1360"
+    const-string/jumbo v0, "1361"
+    const-string/jumbo v0, "1362"
+    const-string/jumbo v0, "1363"
+    const-string/jumbo v0, "1364"
+    const-string/jumbo v0, "1365"
+    const-string/jumbo v0, "1366"
+    const-string/jumbo v0, "1367"
+    const-string/jumbo v0, "1368"
+    const-string/jumbo v0, "1369"
+    const-string/jumbo v0, "1370"
+    const-string/jumbo v0, "1371"
+    const-string/jumbo v0, "1372"
+    const-string/jumbo v0, "1373"
+    const-string/jumbo v0, "1374"
+    const-string/jumbo v0, "1375"
+    const-string/jumbo v0, "1376"
+    const-string/jumbo v0, "1377"
+    const-string/jumbo v0, "1378"
+    const-string/jumbo v0, "1379"
+    const-string/jumbo v0, "1380"
+    const-string/jumbo v0, "1381"
+    const-string/jumbo v0, "1382"
+    const-string/jumbo v0, "1383"
+    const-string/jumbo v0, "1384"
+    const-string/jumbo v0, "1385"
+    const-string/jumbo v0, "1386"
+    const-string/jumbo v0, "1387"
+    const-string/jumbo v0, "1388"
+    const-string/jumbo v0, "1389"
+    const-string/jumbo v0, "1390"
+    const-string/jumbo v0, "1391"
+    const-string/jumbo v0, "1392"
+    const-string/jumbo v0, "1393"
+    const-string/jumbo v0, "1394"
+    const-string/jumbo v0, "1395"
+    const-string/jumbo v0, "1396"
+    const-string/jumbo v0, "1397"
+    const-string/jumbo v0, "1398"
+    const-string/jumbo v0, "1399"
+    const-string/jumbo v0, "1400"
+    const-string/jumbo v0, "1401"
+    const-string/jumbo v0, "1402"
+    const-string/jumbo v0, "1403"
+    const-string/jumbo v0, "1404"
+    const-string/jumbo v0, "1405"
+    const-string/jumbo v0, "1406"
+    const-string/jumbo v0, "1407"
+    const-string/jumbo v0, "1408"
+    const-string/jumbo v0, "1409"
+    const-string/jumbo v0, "1410"
+    const-string/jumbo v0, "1411"
+    const-string/jumbo v0, "1412"
+    const-string/jumbo v0, "1413"
+    const-string/jumbo v0, "1414"
+    const-string/jumbo v0, "1415"
+    const-string/jumbo v0, "1416"
+    const-string/jumbo v0, "1417"
+    const-string/jumbo v0, "1418"
+    const-string/jumbo v0, "1419"
+    const-string/jumbo v0, "1420"
+    const-string/jumbo v0, "1421"
+    const-string/jumbo v0, "1422"
+    const-string/jumbo v0, "1423"
+    const-string/jumbo v0, "1424"
+    const-string/jumbo v0, "1425"
+    const-string/jumbo v0, "1426"
+    const-string/jumbo v0, "1427"
+    const-string/jumbo v0, "1428"
+    const-string/jumbo v0, "1429"
+    const-string/jumbo v0, "1430"
+    const-string/jumbo v0, "1431"
+    const-string/jumbo v0, "1432"
+    const-string/jumbo v0, "1433"
+    const-string/jumbo v0, "1434"
+    const-string/jumbo v0, "1435"
+    const-string/jumbo v0, "1436"
+    const-string/jumbo v0, "1437"
+    const-string/jumbo v0, "1438"
+    const-string/jumbo v0, "1439"
+    const-string/jumbo v0, "1440"
+    const-string/jumbo v0, "1441"
+    const-string/jumbo v0, "1442"
+    const-string/jumbo v0, "1443"
+    const-string/jumbo v0, "1444"
+    const-string/jumbo v0, "1445"
+    const-string/jumbo v0, "1446"
+    const-string/jumbo v0, "1447"
+    const-string/jumbo v0, "1448"
+    const-string/jumbo v0, "1449"
+    const-string/jumbo v0, "1450"
+    const-string/jumbo v0, "1451"
+    const-string/jumbo v0, "1452"
+    const-string/jumbo v0, "1453"
+    const-string/jumbo v0, "1454"
+    const-string/jumbo v0, "1455"
+    const-string/jumbo v0, "1456"
+    const-string/jumbo v0, "1457"
+    const-string/jumbo v0, "1458"
+    const-string/jumbo v0, "1459"
+    const-string/jumbo v0, "1460"
+    const-string/jumbo v0, "1461"
+    const-string/jumbo v0, "1462"
+    const-string/jumbo v0, "1463"
+    const-string/jumbo v0, "1464"
+    const-string/jumbo v0, "1465"
+    const-string/jumbo v0, "1466"
+    const-string/jumbo v0, "1467"
+    const-string/jumbo v0, "1468"
+    const-string/jumbo v0, "1469"
+    const-string/jumbo v0, "1470"
+    const-string/jumbo v0, "1471"
+    const-string/jumbo v0, "1472"
+    const-string/jumbo v0, "1473"
+    const-string/jumbo v0, "1474"
+    const-string/jumbo v0, "1475"
+    const-string/jumbo v0, "1476"
+    const-string/jumbo v0, "1477"
+    const-string/jumbo v0, "1478"
+    const-string/jumbo v0, "1479"
+    const-string/jumbo v0, "1480"
+    const-string/jumbo v0, "1481"
+    const-string/jumbo v0, "1482"
+    const-string/jumbo v0, "1483"
+    const-string/jumbo v0, "1484"
+    const-string/jumbo v0, "1485"
+    const-string/jumbo v0, "1486"
+    const-string/jumbo v0, "1487"
+    const-string/jumbo v0, "1488"
+    const-string/jumbo v0, "1489"
+    const-string/jumbo v0, "1490"
+    const-string/jumbo v0, "1491"
+    const-string/jumbo v0, "1492"
+    const-string/jumbo v0, "1493"
+    const-string/jumbo v0, "1494"
+    const-string/jumbo v0, "1495"
+    const-string/jumbo v0, "1496"
+    const-string/jumbo v0, "1497"
+    const-string/jumbo v0, "1498"
+    const-string/jumbo v0, "1499"
+    const-string/jumbo v0, "1500"
+    const-string/jumbo v0, "1501"
+    const-string/jumbo v0, "1502"
+    const-string/jumbo v0, "1503"
+    const-string/jumbo v0, "1504"
+    const-string/jumbo v0, "1505"
+    const-string/jumbo v0, "1506"
+    const-string/jumbo v0, "1507"
+    const-string/jumbo v0, "1508"
+    const-string/jumbo v0, "1509"
+    const-string/jumbo v0, "1510"
+    const-string/jumbo v0, "1511"
+    const-string/jumbo v0, "1512"
+    const-string/jumbo v0, "1513"
+    const-string/jumbo v0, "1514"
+    const-string/jumbo v0, "1515"
+    const-string/jumbo v0, "1516"
+    const-string/jumbo v0, "1517"
+    const-string/jumbo v0, "1518"
+    const-string/jumbo v0, "1519"
+    const-string/jumbo v0, "1520"
+    const-string/jumbo v0, "1521"
+    const-string/jumbo v0, "1522"
+    const-string/jumbo v0, "1523"
+    const-string/jumbo v0, "1524"
+    const-string/jumbo v0, "1525"
+    const-string/jumbo v0, "1526"
+    const-string/jumbo v0, "1527"
+    const-string/jumbo v0, "1528"
+    const-string/jumbo v0, "1529"
+    const-string/jumbo v0, "1530"
+    const-string/jumbo v0, "1531"
+    const-string/jumbo v0, "1532"
+    const-string/jumbo v0, "1533"
+    const-string/jumbo v0, "1534"
+    const-string/jumbo v0, "1535"
+    const-string/jumbo v0, "1536"
+    const-string/jumbo v0, "1537"
+    const-string/jumbo v0, "1538"
+    const-string/jumbo v0, "1539"
+    const-string/jumbo v0, "1540"
+    const-string/jumbo v0, "1541"
+    const-string/jumbo v0, "1542"
+    const-string/jumbo v0, "1543"
+    const-string/jumbo v0, "1544"
+    const-string/jumbo v0, "1545"
+    const-string/jumbo v0, "1546"
+    const-string/jumbo v0, "1547"
+    const-string/jumbo v0, "1548"
+    const-string/jumbo v0, "1549"
+    const-string/jumbo v0, "1550"
+    const-string/jumbo v0, "1551"
+    const-string/jumbo v0, "1552"
+    const-string/jumbo v0, "1553"
+    const-string/jumbo v0, "1554"
+    const-string/jumbo v0, "1555"
+    const-string/jumbo v0, "1556"
+    const-string/jumbo v0, "1557"
+    const-string/jumbo v0, "1558"
+    const-string/jumbo v0, "1559"
+    const-string/jumbo v0, "1560"
+    const-string/jumbo v0, "1561"
+    const-string/jumbo v0, "1562"
+    const-string/jumbo v0, "1563"
+    const-string/jumbo v0, "1564"
+    const-string/jumbo v0, "1565"
+    const-string/jumbo v0, "1566"
+    const-string/jumbo v0, "1567"
+    const-string/jumbo v0, "1568"
+    const-string/jumbo v0, "1569"
+    const-string/jumbo v0, "1570"
+    const-string/jumbo v0, "1571"
+    const-string/jumbo v0, "1572"
+    const-string/jumbo v0, "1573"
+    const-string/jumbo v0, "1574"
+    const-string/jumbo v0, "1575"
+    const-string/jumbo v0, "1576"
+    const-string/jumbo v0, "1577"
+    const-string/jumbo v0, "1578"
+    const-string/jumbo v0, "1579"
+    const-string/jumbo v0, "1580"
+    const-string/jumbo v0, "1581"
+    const-string/jumbo v0, "1582"
+    const-string/jumbo v0, "1583"
+    const-string/jumbo v0, "1584"
+    const-string/jumbo v0, "1585"
+    const-string/jumbo v0, "1586"
+    const-string/jumbo v0, "1587"
+    const-string/jumbo v0, "1588"
+    const-string/jumbo v0, "1589"
+    const-string/jumbo v0, "1590"
+    const-string/jumbo v0, "1591"
+    const-string/jumbo v0, "1592"
+    const-string/jumbo v0, "1593"
+    const-string/jumbo v0, "1594"
+    const-string/jumbo v0, "1595"
+    const-string/jumbo v0, "1596"
+    const-string/jumbo v0, "1597"
+    const-string/jumbo v0, "1598"
+    const-string/jumbo v0, "1599"
+    const-string/jumbo v0, "1600"
+    const-string/jumbo v0, "1601"
+    const-string/jumbo v0, "1602"
+    const-string/jumbo v0, "1603"
+    const-string/jumbo v0, "1604"
+    const-string/jumbo v0, "1605"
+    const-string/jumbo v0, "1606"
+    const-string/jumbo v0, "1607"
+    const-string/jumbo v0, "1608"
+    const-string/jumbo v0, "1609"
+    const-string/jumbo v0, "1610"
+    const-string/jumbo v0, "1611"
+    const-string/jumbo v0, "1612"
+    const-string/jumbo v0, "1613"
+    const-string/jumbo v0, "1614"
+    const-string/jumbo v0, "1615"
+    const-string/jumbo v0, "1616"
+    const-string/jumbo v0, "1617"
+    const-string/jumbo v0, "1618"
+    const-string/jumbo v0, "1619"
+    const-string/jumbo v0, "1620"
+    const-string/jumbo v0, "1621"
+    const-string/jumbo v0, "1622"
+    const-string/jumbo v0, "1623"
+    const-string/jumbo v0, "1624"
+    const-string/jumbo v0, "1625"
+    const-string/jumbo v0, "1626"
+    const-string/jumbo v0, "1627"
+    const-string/jumbo v0, "1628"
+    const-string/jumbo v0, "1629"
+    const-string/jumbo v0, "1630"
+    const-string/jumbo v0, "1631"
+    const-string/jumbo v0, "1632"
+    const-string/jumbo v0, "1633"
+    const-string/jumbo v0, "1634"
+    const-string/jumbo v0, "1635"
+    const-string/jumbo v0, "1636"
+    const-string/jumbo v0, "1637"
+    const-string/jumbo v0, "1638"
+    const-string/jumbo v0, "1639"
+    const-string/jumbo v0, "1640"
+    const-string/jumbo v0, "1641"
+    const-string/jumbo v0, "1642"
+    const-string/jumbo v0, "1643"
+    const-string/jumbo v0, "1644"
+    const-string/jumbo v0, "1645"
+    const-string/jumbo v0, "1646"
+    const-string/jumbo v0, "1647"
+    const-string/jumbo v0, "1648"
+    const-string/jumbo v0, "1649"
+    const-string/jumbo v0, "1650"
+    const-string/jumbo v0, "1651"
+    const-string/jumbo v0, "1652"
+    const-string/jumbo v0, "1653"
+    const-string/jumbo v0, "1654"
+    const-string/jumbo v0, "1655"
+    const-string/jumbo v0, "1656"
+    const-string/jumbo v0, "1657"
+    const-string/jumbo v0, "1658"
+    const-string/jumbo v0, "1659"
+    const-string/jumbo v0, "1660"
+    const-string/jumbo v0, "1661"
+    const-string/jumbo v0, "1662"
+    const-string/jumbo v0, "1663"
+    const-string/jumbo v0, "1664"
+    const-string/jumbo v0, "1665"
+    const-string/jumbo v0, "1666"
+    const-string/jumbo v0, "1667"
+    const-string/jumbo v0, "1668"
+    const-string/jumbo v0, "1669"
+    const-string/jumbo v0, "1670"
+    const-string/jumbo v0, "1671"
+    const-string/jumbo v0, "1672"
+    const-string/jumbo v0, "1673"
+    const-string/jumbo v0, "1674"
+    const-string/jumbo v0, "1675"
+    const-string/jumbo v0, "1676"
+    const-string/jumbo v0, "1677"
+    const-string/jumbo v0, "1678"
+    const-string/jumbo v0, "1679"
+    const-string/jumbo v0, "1680"
+    const-string/jumbo v0, "1681"
+    const-string/jumbo v0, "1682"
+    const-string/jumbo v0, "1683"
+    const-string/jumbo v0, "1684"
+    const-string/jumbo v0, "1685"
+    const-string/jumbo v0, "1686"
+    const-string/jumbo v0, "1687"
+    const-string/jumbo v0, "1688"
+    const-string/jumbo v0, "1689"
+    const-string/jumbo v0, "1690"
+    const-string/jumbo v0, "1691"
+    const-string/jumbo v0, "1692"
+    const-string/jumbo v0, "1693"
+    const-string/jumbo v0, "1694"
+    const-string/jumbo v0, "1695"
+    const-string/jumbo v0, "1696"
+    const-string/jumbo v0, "1697"
+    const-string/jumbo v0, "1698"
+    const-string/jumbo v0, "1699"
+    const-string/jumbo v0, "1700"
+    const-string/jumbo v0, "1701"
+    const-string/jumbo v0, "1702"
+    const-string/jumbo v0, "1703"
+    const-string/jumbo v0, "1704"
+    const-string/jumbo v0, "1705"
+    const-string/jumbo v0, "1706"
+    const-string/jumbo v0, "1707"
+    const-string/jumbo v0, "1708"
+    const-string/jumbo v0, "1709"
+    const-string/jumbo v0, "1710"
+    const-string/jumbo v0, "1711"
+    const-string/jumbo v0, "1712"
+    const-string/jumbo v0, "1713"
+    const-string/jumbo v0, "1714"
+    const-string/jumbo v0, "1715"
+    const-string/jumbo v0, "1716"
+    const-string/jumbo v0, "1717"
+    const-string/jumbo v0, "1718"
+    const-string/jumbo v0, "1719"
+    const-string/jumbo v0, "1720"
+    const-string/jumbo v0, "1721"
+    const-string/jumbo v0, "1722"
+    const-string/jumbo v0, "1723"
+    const-string/jumbo v0, "1724"
+    const-string/jumbo v0, "1725"
+    const-string/jumbo v0, "1726"
+    const-string/jumbo v0, "1727"
+    const-string/jumbo v0, "1728"
+    const-string/jumbo v0, "1729"
+    const-string/jumbo v0, "1730"
+    const-string/jumbo v0, "1731"
+    const-string/jumbo v0, "1732"
+    const-string/jumbo v0, "1733"
+    const-string/jumbo v0, "1734"
+    const-string/jumbo v0, "1735"
+    const-string/jumbo v0, "1736"
+    const-string/jumbo v0, "1737"
+    const-string/jumbo v0, "1738"
+    const-string/jumbo v0, "1739"
+    const-string/jumbo v0, "1740"
+    const-string/jumbo v0, "1741"
+    const-string/jumbo v0, "1742"
+    const-string/jumbo v0, "1743"
+    const-string/jumbo v0, "1744"
+    const-string/jumbo v0, "1745"
+    const-string/jumbo v0, "1746"
+    const-string/jumbo v0, "1747"
+    const-string/jumbo v0, "1748"
+    const-string/jumbo v0, "1749"
+    const-string/jumbo v0, "1750"
+    const-string/jumbo v0, "1751"
+    const-string/jumbo v0, "1752"
+    const-string/jumbo v0, "1753"
+    const-string/jumbo v0, "1754"
+    const-string/jumbo v0, "1755"
+    const-string/jumbo v0, "1756"
+    const-string/jumbo v0, "1757"
+    const-string/jumbo v0, "1758"
+    const-string/jumbo v0, "1759"
+    const-string/jumbo v0, "1760"
+    const-string/jumbo v0, "1761"
+    const-string/jumbo v0, "1762"
+    const-string/jumbo v0, "1763"
+    const-string/jumbo v0, "1764"
+    const-string/jumbo v0, "1765"
+    const-string/jumbo v0, "1766"
+    const-string/jumbo v0, "1767"
+    const-string/jumbo v0, "1768"
+    const-string/jumbo v0, "1769"
+    const-string/jumbo v0, "1770"
+    const-string/jumbo v0, "1771"
+    const-string/jumbo v0, "1772"
+    const-string/jumbo v0, "1773"
+    const-string/jumbo v0, "1774"
+    const-string/jumbo v0, "1775"
+    const-string/jumbo v0, "1776"
+    const-string/jumbo v0, "1777"
+    const-string/jumbo v0, "1778"
+    const-string/jumbo v0, "1779"
+    const-string/jumbo v0, "1780"
+    const-string/jumbo v0, "1781"
+    const-string/jumbo v0, "1782"
+    const-string/jumbo v0, "1783"
+    const-string/jumbo v0, "1784"
+    const-string/jumbo v0, "1785"
+    const-string/jumbo v0, "1786"
+    const-string/jumbo v0, "1787"
+    const-string/jumbo v0, "1788"
+    const-string/jumbo v0, "1789"
+    const-string/jumbo v0, "1790"
+    const-string/jumbo v0, "1791"
+    const-string/jumbo v0, "1792"
+    const-string/jumbo v0, "1793"
+    const-string/jumbo v0, "1794"
+    const-string/jumbo v0, "1795"
+    const-string/jumbo v0, "1796"
+    const-string/jumbo v0, "1797"
+    const-string/jumbo v0, "1798"
+    const-string/jumbo v0, "1799"
+    const-string/jumbo v0, "1800"
+    const-string/jumbo v0, "1801"
+    const-string/jumbo v0, "1802"
+    const-string/jumbo v0, "1803"
+    const-string/jumbo v0, "1804"
+    const-string/jumbo v0, "1805"
+    const-string/jumbo v0, "1806"
+    const-string/jumbo v0, "1807"
+    const-string/jumbo v0, "1808"
+    const-string/jumbo v0, "1809"
+    const-string/jumbo v0, "1810"
+    const-string/jumbo v0, "1811"
+    const-string/jumbo v0, "1812"
+    const-string/jumbo v0, "1813"
+    const-string/jumbo v0, "1814"
+    const-string/jumbo v0, "1815"
+    const-string/jumbo v0, "1816"
+    const-string/jumbo v0, "1817"
+    const-string/jumbo v0, "1818"
+    const-string/jumbo v0, "1819"
+    const-string/jumbo v0, "1820"
+    const-string/jumbo v0, "1821"
+    const-string/jumbo v0, "1822"
+    const-string/jumbo v0, "1823"
+    const-string/jumbo v0, "1824"
+    const-string/jumbo v0, "1825"
+    const-string/jumbo v0, "1826"
+    const-string/jumbo v0, "1827"
+    const-string/jumbo v0, "1828"
+    const-string/jumbo v0, "1829"
+    const-string/jumbo v0, "1830"
+    const-string/jumbo v0, "1831"
+    const-string/jumbo v0, "1832"
+    const-string/jumbo v0, "1833"
+    const-string/jumbo v0, "1834"
+    const-string/jumbo v0, "1835"
+    const-string/jumbo v0, "1836"
+    const-string/jumbo v0, "1837"
+    const-string/jumbo v0, "1838"
+    const-string/jumbo v0, "1839"
+    const-string/jumbo v0, "1840"
+    const-string/jumbo v0, "1841"
+    const-string/jumbo v0, "1842"
+    const-string/jumbo v0, "1843"
+    const-string/jumbo v0, "1844"
+    const-string/jumbo v0, "1845"
+    const-string/jumbo v0, "1846"
+    const-string/jumbo v0, "1847"
+    const-string/jumbo v0, "1848"
+    const-string/jumbo v0, "1849"
+    const-string/jumbo v0, "1850"
+    const-string/jumbo v0, "1851"
+    const-string/jumbo v0, "1852"
+    const-string/jumbo v0, "1853"
+    const-string/jumbo v0, "1854"
+    const-string/jumbo v0, "1855"
+    const-string/jumbo v0, "1856"
+    const-string/jumbo v0, "1857"
+    const-string/jumbo v0, "1858"
+    const-string/jumbo v0, "1859"
+    const-string/jumbo v0, "1860"
+    const-string/jumbo v0, "1861"
+    const-string/jumbo v0, "1862"
+    const-string/jumbo v0, "1863"
+    const-string/jumbo v0, "1864"
+    const-string/jumbo v0, "1865"
+    const-string/jumbo v0, "1866"
+    const-string/jumbo v0, "1867"
+    const-string/jumbo v0, "1868"
+    const-string/jumbo v0, "1869"
+    const-string/jumbo v0, "1870"
+    const-string/jumbo v0, "1871"
+    const-string/jumbo v0, "1872"
+    const-string/jumbo v0, "1873"
+    const-string/jumbo v0, "1874"
+    const-string/jumbo v0, "1875"
+    const-string/jumbo v0, "1876"
+    const-string/jumbo v0, "1877"
+    const-string/jumbo v0, "1878"
+    const-string/jumbo v0, "1879"
+    const-string/jumbo v0, "1880"
+    const-string/jumbo v0, "1881"
+    const-string/jumbo v0, "1882"
+    const-string/jumbo v0, "1883"
+    const-string/jumbo v0, "1884"
+    const-string/jumbo v0, "1885"
+    const-string/jumbo v0, "1886"
+    const-string/jumbo v0, "1887"
+    const-string/jumbo v0, "1888"
+    const-string/jumbo v0, "1889"
+    const-string/jumbo v0, "1890"
+    const-string/jumbo v0, "1891"
+    const-string/jumbo v0, "1892"
+    const-string/jumbo v0, "1893"
+    const-string/jumbo v0, "1894"
+    const-string/jumbo v0, "1895"
+    const-string/jumbo v0, "1896"
+    const-string/jumbo v0, "1897"
+    const-string/jumbo v0, "1898"
+    const-string/jumbo v0, "1899"
+    const-string/jumbo v0, "1900"
+    const-string/jumbo v0, "1901"
+    const-string/jumbo v0, "1902"
+    const-string/jumbo v0, "1903"
+    const-string/jumbo v0, "1904"
+    const-string/jumbo v0, "1905"
+    const-string/jumbo v0, "1906"
+    const-string/jumbo v0, "1907"
+    const-string/jumbo v0, "1908"
+    const-string/jumbo v0, "1909"
+    const-string/jumbo v0, "1910"
+    const-string/jumbo v0, "1911"
+    const-string/jumbo v0, "1912"
+    const-string/jumbo v0, "1913"
+    const-string/jumbo v0, "1914"
+    const-string/jumbo v0, "1915"
+    const-string/jumbo v0, "1916"
+    const-string/jumbo v0, "1917"
+    const-string/jumbo v0, "1918"
+    const-string/jumbo v0, "1919"
+    const-string/jumbo v0, "1920"
+    const-string/jumbo v0, "1921"
+    const-string/jumbo v0, "1922"
+    const-string/jumbo v0, "1923"
+    const-string/jumbo v0, "1924"
+    const-string/jumbo v0, "1925"
+    const-string/jumbo v0, "1926"
+    const-string/jumbo v0, "1927"
+    const-string/jumbo v0, "1928"
+    const-string/jumbo v0, "1929"
+    const-string/jumbo v0, "1930"
+    const-string/jumbo v0, "1931"
+    const-string/jumbo v0, "1932"
+    const-string/jumbo v0, "1933"
+    const-string/jumbo v0, "1934"
+    const-string/jumbo v0, "1935"
+    const-string/jumbo v0, "1936"
+    const-string/jumbo v0, "1937"
+    const-string/jumbo v0, "1938"
+    const-string/jumbo v0, "1939"
+    const-string/jumbo v0, "1940"
+    const-string/jumbo v0, "1941"
+    const-string/jumbo v0, "1942"
+    const-string/jumbo v0, "1943"
+    const-string/jumbo v0, "1944"
+    const-string/jumbo v0, "1945"
+    const-string/jumbo v0, "1946"
+    const-string/jumbo v0, "1947"
+    const-string/jumbo v0, "1948"
+    const-string/jumbo v0, "1949"
+    const-string/jumbo v0, "1950"
+    const-string/jumbo v0, "1951"
+    const-string/jumbo v0, "1952"
+    const-string/jumbo v0, "1953"
+    const-string/jumbo v0, "1954"
+    const-string/jumbo v0, "1955"
+    const-string/jumbo v0, "1956"
+    const-string/jumbo v0, "1957"
+    const-string/jumbo v0, "1958"
+    const-string/jumbo v0, "1959"
+    const-string/jumbo v0, "1960"
+    const-string/jumbo v0, "1961"
+    const-string/jumbo v0, "1962"
+    const-string/jumbo v0, "1963"
+    const-string/jumbo v0, "1964"
+    const-string/jumbo v0, "1965"
+    const-string/jumbo v0, "1966"
+    const-string/jumbo v0, "1967"
+    const-string/jumbo v0, "1968"
+    const-string/jumbo v0, "1969"
+    const-string/jumbo v0, "1970"
+    const-string/jumbo v0, "1971"
+    const-string/jumbo v0, "1972"
+    const-string/jumbo v0, "1973"
+    const-string/jumbo v0, "1974"
+    const-string/jumbo v0, "1975"
+    const-string/jumbo v0, "1976"
+    const-string/jumbo v0, "1977"
+    const-string/jumbo v0, "1978"
+    const-string/jumbo v0, "1979"
+    const-string/jumbo v0, "1980"
+    const-string/jumbo v0, "1981"
+    const-string/jumbo v0, "1982"
+    const-string/jumbo v0, "1983"
+    const-string/jumbo v0, "1984"
+    const-string/jumbo v0, "1985"
+    const-string/jumbo v0, "1986"
+    const-string/jumbo v0, "1987"
+    const-string/jumbo v0, "1988"
+    const-string/jumbo v0, "1989"
+    const-string/jumbo v0, "1990"
+    const-string/jumbo v0, "1991"
+    const-string/jumbo v0, "1992"
+    const-string/jumbo v0, "1993"
+    const-string/jumbo v0, "1994"
+    const-string/jumbo v0, "1995"
+    const-string/jumbo v0, "1996"
+    const-string/jumbo v0, "1997"
+    const-string/jumbo v0, "1998"
+    const-string/jumbo v0, "1999"
+    const-string/jumbo v0, "2000"
+    const-string/jumbo v0, "2001"
+    const-string/jumbo v0, "2002"
+    const-string/jumbo v0, "2003"
+    const-string/jumbo v0, "2004"
+    const-string/jumbo v0, "2005"
+    const-string/jumbo v0, "2006"
+    const-string/jumbo v0, "2007"
+    const-string/jumbo v0, "2008"
+    const-string/jumbo v0, "2009"
+    const-string/jumbo v0, "2010"
+    const-string/jumbo v0, "2011"
+    const-string/jumbo v0, "2012"
+    const-string/jumbo v0, "2013"
+    const-string/jumbo v0, "2014"
+    const-string/jumbo v0, "2015"
+    const-string/jumbo v0, "2016"
+    const-string/jumbo v0, "2017"
+    const-string/jumbo v0, "2018"
+    const-string/jumbo v0, "2019"
+    const-string/jumbo v0, "2020"
+    const-string/jumbo v0, "2021"
+    const-string/jumbo v0, "2022"
+    const-string/jumbo v0, "2023"
+    const-string/jumbo v0, "2024"
+    const-string/jumbo v0, "2025"
+    const-string/jumbo v0, "2026"
+    const-string/jumbo v0, "2027"
+    const-string/jumbo v0, "2028"
+    const-string/jumbo v0, "2029"
+    const-string/jumbo v0, "2030"
+    const-string/jumbo v0, "2031"
+    const-string/jumbo v0, "2032"
+    const-string/jumbo v0, "2033"
+    const-string/jumbo v0, "2034"
+    const-string/jumbo v0, "2035"
+    const-string/jumbo v0, "2036"
+    const-string/jumbo v0, "2037"
+    const-string/jumbo v0, "2038"
+    const-string/jumbo v0, "2039"
+    const-string/jumbo v0, "2040"
+    const-string/jumbo v0, "2041"
+    const-string/jumbo v0, "2042"
+    const-string/jumbo v0, "2043"
+    const-string/jumbo v0, "2044"
+    const-string/jumbo v0, "2045"
+    const-string/jumbo v0, "2046"
+    const-string/jumbo v0, "2047"
+    const-string/jumbo v0, "2048"
+    const-string/jumbo v0, "2049"
+    const-string/jumbo v0, "2050"
+    const-string/jumbo v0, "2051"
+    const-string/jumbo v0, "2052"
+    const-string/jumbo v0, "2053"
+    const-string/jumbo v0, "2054"
+    const-string/jumbo v0, "2055"
+    const-string/jumbo v0, "2056"
+    const-string/jumbo v0, "2057"
+    const-string/jumbo v0, "2058"
+    const-string/jumbo v0, "2059"
+    const-string/jumbo v0, "2060"
+    const-string/jumbo v0, "2061"
+    const-string/jumbo v0, "2062"
+    const-string/jumbo v0, "2063"
+    const-string/jumbo v0, "2064"
+    const-string/jumbo v0, "2065"
+    const-string/jumbo v0, "2066"
+    const-string/jumbo v0, "2067"
+    const-string/jumbo v0, "2068"
+    const-string/jumbo v0, "2069"
+    const-string/jumbo v0, "2070"
+    const-string/jumbo v0, "2071"
+    const-string/jumbo v0, "2072"
+    const-string/jumbo v0, "2073"
+    const-string/jumbo v0, "2074"
+    const-string/jumbo v0, "2075"
+    const-string/jumbo v0, "2076"
+    const-string/jumbo v0, "2077"
+    const-string/jumbo v0, "2078"
+    const-string/jumbo v0, "2079"
+    const-string/jumbo v0, "2080"
+    const-string/jumbo v0, "2081"
+    const-string/jumbo v0, "2082"
+    const-string/jumbo v0, "2083"
+    const-string/jumbo v0, "2084"
+    const-string/jumbo v0, "2085"
+    const-string/jumbo v0, "2086"
+    const-string/jumbo v0, "2087"
+    const-string/jumbo v0, "2088"
+    const-string/jumbo v0, "2089"
+    const-string/jumbo v0, "2090"
+    const-string/jumbo v0, "2091"
+    const-string/jumbo v0, "2092"
+    const-string/jumbo v0, "2093"
+    const-string/jumbo v0, "2094"
+    const-string/jumbo v0, "2095"
+    const-string/jumbo v0, "2096"
+    const-string/jumbo v0, "2097"
+    const-string/jumbo v0, "2098"
+    const-string/jumbo v0, "2099"
+    const-string/jumbo v0, "2100"
+    const-string/jumbo v0, "2101"
+    const-string/jumbo v0, "2102"
+    const-string/jumbo v0, "2103"
+    const-string/jumbo v0, "2104"
+    const-string/jumbo v0, "2105"
+    const-string/jumbo v0, "2106"
+    const-string/jumbo v0, "2107"
+    const-string/jumbo v0, "2108"
+    const-string/jumbo v0, "2109"
+    const-string/jumbo v0, "2110"
+    const-string/jumbo v0, "2111"
+    const-string/jumbo v0, "2112"
+    const-string/jumbo v0, "2113"
+    const-string/jumbo v0, "2114"
+    const-string/jumbo v0, "2115"
+    const-string/jumbo v0, "2116"
+    const-string/jumbo v0, "2117"
+    const-string/jumbo v0, "2118"
+    const-string/jumbo v0, "2119"
+    const-string/jumbo v0, "2120"
+    const-string/jumbo v0, "2121"
+    const-string/jumbo v0, "2122"
+    const-string/jumbo v0, "2123"
+    const-string/jumbo v0, "2124"
+    const-string/jumbo v0, "2125"
+    const-string/jumbo v0, "2126"
+    const-string/jumbo v0, "2127"
+    const-string/jumbo v0, "2128"
+    const-string/jumbo v0, "2129"
+    const-string/jumbo v0, "2130"
+    const-string/jumbo v0, "2131"
+    const-string/jumbo v0, "2132"
+    const-string/jumbo v0, "2133"
+    const-string/jumbo v0, "2134"
+    const-string/jumbo v0, "2135"
+    const-string/jumbo v0, "2136"
+    const-string/jumbo v0, "2137"
+    const-string/jumbo v0, "2138"
+    const-string/jumbo v0, "2139"
+    const-string/jumbo v0, "2140"
+    const-string/jumbo v0, "2141"
+    const-string/jumbo v0, "2142"
+    const-string/jumbo v0, "2143"
+    const-string/jumbo v0, "2144"
+    const-string/jumbo v0, "2145"
+    const-string/jumbo v0, "2146"
+    const-string/jumbo v0, "2147"
+    const-string/jumbo v0, "2148"
+    const-string/jumbo v0, "2149"
+    const-string/jumbo v0, "2150"
+    const-string/jumbo v0, "2151"
+    const-string/jumbo v0, "2152"
+    const-string/jumbo v0, "2153"
+    const-string/jumbo v0, "2154"
+    const-string/jumbo v0, "2155"
+    const-string/jumbo v0, "2156"
+    const-string/jumbo v0, "2157"
+    const-string/jumbo v0, "2158"
+    const-string/jumbo v0, "2159"
+    const-string/jumbo v0, "2160"
+    const-string/jumbo v0, "2161"
+    const-string/jumbo v0, "2162"
+    const-string/jumbo v0, "2163"
+    const-string/jumbo v0, "2164"
+    const-string/jumbo v0, "2165"
+    const-string/jumbo v0, "2166"
+    const-string/jumbo v0, "2167"
+    const-string/jumbo v0, "2168"
+    const-string/jumbo v0, "2169"
+    const-string/jumbo v0, "2170"
+    const-string/jumbo v0, "2171"
+    const-string/jumbo v0, "2172"
+    const-string/jumbo v0, "2173"
+    const-string/jumbo v0, "2174"
+    const-string/jumbo v0, "2175"
+    const-string/jumbo v0, "2176"
+    const-string/jumbo v0, "2177"
+    const-string/jumbo v0, "2178"
+    const-string/jumbo v0, "2179"
+    const-string/jumbo v0, "2180"
+    const-string/jumbo v0, "2181"
+    const-string/jumbo v0, "2182"
+    const-string/jumbo v0, "2183"
+    const-string/jumbo v0, "2184"
+    const-string/jumbo v0, "2185"
+    const-string/jumbo v0, "2186"
+    const-string/jumbo v0, "2187"
+    const-string/jumbo v0, "2188"
+    const-string/jumbo v0, "2189"
+    const-string/jumbo v0, "2190"
+    const-string/jumbo v0, "2191"
+    const-string/jumbo v0, "2192"
+    const-string/jumbo v0, "2193"
+    const-string/jumbo v0, "2194"
+    const-string/jumbo v0, "2195"
+    const-string/jumbo v0, "2196"
+    const-string/jumbo v0, "2197"
+    const-string/jumbo v0, "2198"
+    const-string/jumbo v0, "2199"
+    const-string/jumbo v0, "2200"
+    const-string/jumbo v0, "2201"
+    const-string/jumbo v0, "2202"
+    const-string/jumbo v0, "2203"
+    const-string/jumbo v0, "2204"
+    const-string/jumbo v0, "2205"
+    const-string/jumbo v0, "2206"
+    const-string/jumbo v0, "2207"
+    const-string/jumbo v0, "2208"
+    const-string/jumbo v0, "2209"
+    const-string/jumbo v0, "2210"
+    const-string/jumbo v0, "2211"
+    const-string/jumbo v0, "2212"
+    const-string/jumbo v0, "2213"
+    const-string/jumbo v0, "2214"
+    const-string/jumbo v0, "2215"
+    const-string/jumbo v0, "2216"
+    const-string/jumbo v0, "2217"
+    const-string/jumbo v0, "2218"
+    const-string/jumbo v0, "2219"
+    const-string/jumbo v0, "2220"
+    const-string/jumbo v0, "2221"
+    const-string/jumbo v0, "2222"
+    const-string/jumbo v0, "2223"
+    const-string/jumbo v0, "2224"
+    const-string/jumbo v0, "2225"
+    const-string/jumbo v0, "2226"
+    const-string/jumbo v0, "2227"
+    const-string/jumbo v0, "2228"
+    const-string/jumbo v0, "2229"
+    const-string/jumbo v0, "2230"
+    const-string/jumbo v0, "2231"
+    const-string/jumbo v0, "2232"
+    const-string/jumbo v0, "2233"
+    const-string/jumbo v0, "2234"
+    const-string/jumbo v0, "2235"
+    const-string/jumbo v0, "2236"
+    const-string/jumbo v0, "2237"
+    const-string/jumbo v0, "2238"
+    const-string/jumbo v0, "2239"
+    const-string/jumbo v0, "2240"
+    const-string/jumbo v0, "2241"
+    const-string/jumbo v0, "2242"
+    const-string/jumbo v0, "2243"
+    const-string/jumbo v0, "2244"
+    const-string/jumbo v0, "2245"
+    const-string/jumbo v0, "2246"
+    const-string/jumbo v0, "2247"
+    const-string/jumbo v0, "2248"
+    const-string/jumbo v0, "2249"
+    const-string/jumbo v0, "2250"
+    const-string/jumbo v0, "2251"
+    const-string/jumbo v0, "2252"
+    const-string/jumbo v0, "2253"
+    const-string/jumbo v0, "2254"
+    const-string/jumbo v0, "2255"
+    const-string/jumbo v0, "2256"
+    const-string/jumbo v0, "2257"
+    const-string/jumbo v0, "2258"
+    const-string/jumbo v0, "2259"
+    const-string/jumbo v0, "2260"
+    const-string/jumbo v0, "2261"
+    const-string/jumbo v0, "2262"
+    const-string/jumbo v0, "2263"
+    const-string/jumbo v0, "2264"
+    const-string/jumbo v0, "2265"
+    const-string/jumbo v0, "2266"
+    const-string/jumbo v0, "2267"
+    const-string/jumbo v0, "2268"
+    const-string/jumbo v0, "2269"
+    const-string/jumbo v0, "2270"
+    const-string/jumbo v0, "2271"
+    const-string/jumbo v0, "2272"
+    const-string/jumbo v0, "2273"
+    const-string/jumbo v0, "2274"
+    const-string/jumbo v0, "2275"
+    const-string/jumbo v0, "2276"
+    const-string/jumbo v0, "2277"
+    const-string/jumbo v0, "2278"
+    const-string/jumbo v0, "2279"
+    const-string/jumbo v0, "2280"
+    const-string/jumbo v0, "2281"
+    const-string/jumbo v0, "2282"
+    const-string/jumbo v0, "2283"
+    const-string/jumbo v0, "2284"
+    const-string/jumbo v0, "2285"
+    const-string/jumbo v0, "2286"
+    const-string/jumbo v0, "2287"
+    const-string/jumbo v0, "2288"
+    const-string/jumbo v0, "2289"
+    const-string/jumbo v0, "2290"
+    const-string/jumbo v0, "2291"
+    const-string/jumbo v0, "2292"
+    const-string/jumbo v0, "2293"
+    const-string/jumbo v0, "2294"
+    const-string/jumbo v0, "2295"
+    const-string/jumbo v0, "2296"
+    const-string/jumbo v0, "2297"
+    const-string/jumbo v0, "2298"
+    const-string/jumbo v0, "2299"
+    const-string/jumbo v0, "2300"
+    const-string/jumbo v0, "2301"
+    const-string/jumbo v0, "2302"
+    const-string/jumbo v0, "2303"
+    const-string/jumbo v0, "2304"
+    const-string/jumbo v0, "2305"
+    const-string/jumbo v0, "2306"
+    const-string/jumbo v0, "2307"
+    const-string/jumbo v0, "2308"
+    const-string/jumbo v0, "2309"
+    const-string/jumbo v0, "2310"
+    const-string/jumbo v0, "2311"
+    const-string/jumbo v0, "2312"
+    const-string/jumbo v0, "2313"
+    const-string/jumbo v0, "2314"
+    const-string/jumbo v0, "2315"
+    const-string/jumbo v0, "2316"
+    const-string/jumbo v0, "2317"
+    const-string/jumbo v0, "2318"
+    const-string/jumbo v0, "2319"
+    const-string/jumbo v0, "2320"
+    const-string/jumbo v0, "2321"
+    const-string/jumbo v0, "2322"
+    const-string/jumbo v0, "2323"
+    const-string/jumbo v0, "2324"
+    const-string/jumbo v0, "2325"
+    const-string/jumbo v0, "2326"
+    const-string/jumbo v0, "2327"
+    const-string/jumbo v0, "2328"
+    const-string/jumbo v0, "2329"
+    const-string/jumbo v0, "2330"
+    const-string/jumbo v0, "2331"
+    const-string/jumbo v0, "2332"
+    const-string/jumbo v0, "2333"
+    const-string/jumbo v0, "2334"
+    const-string/jumbo v0, "2335"
+    const-string/jumbo v0, "2336"
+    const-string/jumbo v0, "2337"
+    const-string/jumbo v0, "2338"
+    const-string/jumbo v0, "2339"
+    const-string/jumbo v0, "2340"
+    const-string/jumbo v0, "2341"
+    const-string/jumbo v0, "2342"
+    const-string/jumbo v0, "2343"
+    const-string/jumbo v0, "2344"
+    const-string/jumbo v0, "2345"
+    const-string/jumbo v0, "2346"
+    const-string/jumbo v0, "2347"
+    const-string/jumbo v0, "2348"
+    const-string/jumbo v0, "2349"
+    const-string/jumbo v0, "2350"
+    const-string/jumbo v0, "2351"
+    const-string/jumbo v0, "2352"
+    const-string/jumbo v0, "2353"
+    const-string/jumbo v0, "2354"
+    const-string/jumbo v0, "2355"
+    const-string/jumbo v0, "2356"
+    const-string/jumbo v0, "2357"
+    const-string/jumbo v0, "2358"
+    const-string/jumbo v0, "2359"
+    const-string/jumbo v0, "2360"
+    const-string/jumbo v0, "2361"
+    const-string/jumbo v0, "2362"
+    const-string/jumbo v0, "2363"
+    const-string/jumbo v0, "2364"
+    const-string/jumbo v0, "2365"
+    const-string/jumbo v0, "2366"
+    const-string/jumbo v0, "2367"
+    const-string/jumbo v0, "2368"
+    const-string/jumbo v0, "2369"
+    const-string/jumbo v0, "2370"
+    const-string/jumbo v0, "2371"
+    const-string/jumbo v0, "2372"
+    const-string/jumbo v0, "2373"
+    const-string/jumbo v0, "2374"
+    const-string/jumbo v0, "2375"
+    const-string/jumbo v0, "2376"
+    const-string/jumbo v0, "2377"
+    const-string/jumbo v0, "2378"
+    const-string/jumbo v0, "2379"
+    const-string/jumbo v0, "2380"
+    const-string/jumbo v0, "2381"
+    const-string/jumbo v0, "2382"
+    const-string/jumbo v0, "2383"
+    const-string/jumbo v0, "2384"
+    const-string/jumbo v0, "2385"
+    const-string/jumbo v0, "2386"
+    const-string/jumbo v0, "2387"
+    const-string/jumbo v0, "2388"
+    const-string/jumbo v0, "2389"
+    const-string/jumbo v0, "2390"
+    const-string/jumbo v0, "2391"
+    const-string/jumbo v0, "2392"
+    const-string/jumbo v0, "2393"
+    const-string/jumbo v0, "2394"
+    const-string/jumbo v0, "2395"
+    const-string/jumbo v0, "2396"
+    const-string/jumbo v0, "2397"
+    const-string/jumbo v0, "2398"
+    const-string/jumbo v0, "2399"
+    const-string/jumbo v0, "2400"
+    const-string/jumbo v0, "2401"
+    const-string/jumbo v0, "2402"
+    const-string/jumbo v0, "2403"
+    const-string/jumbo v0, "2404"
+    const-string/jumbo v0, "2405"
+    const-string/jumbo v0, "2406"
+    const-string/jumbo v0, "2407"
+    const-string/jumbo v0, "2408"
+    const-string/jumbo v0, "2409"
+    const-string/jumbo v0, "2410"
+    const-string/jumbo v0, "2411"
+    const-string/jumbo v0, "2412"
+    const-string/jumbo v0, "2413"
+    const-string/jumbo v0, "2414"
+    const-string/jumbo v0, "2415"
+    const-string/jumbo v0, "2416"
+    const-string/jumbo v0, "2417"
+    const-string/jumbo v0, "2418"
+    const-string/jumbo v0, "2419"
+    const-string/jumbo v0, "2420"
+    const-string/jumbo v0, "2421"
+    const-string/jumbo v0, "2422"
+    const-string/jumbo v0, "2423"
+    const-string/jumbo v0, "2424"
+    const-string/jumbo v0, "2425"
+    const-string/jumbo v0, "2426"
+    const-string/jumbo v0, "2427"
+    const-string/jumbo v0, "2428"
+    const-string/jumbo v0, "2429"
+    const-string/jumbo v0, "2430"
+    const-string/jumbo v0, "2431"
+    const-string/jumbo v0, "2432"
+    const-string/jumbo v0, "2433"
+    const-string/jumbo v0, "2434"
+    const-string/jumbo v0, "2435"
+    const-string/jumbo v0, "2436"
+    const-string/jumbo v0, "2437"
+    const-string/jumbo v0, "2438"
+    const-string/jumbo v0, "2439"
+    const-string/jumbo v0, "2440"
+    const-string/jumbo v0, "2441"
+    const-string/jumbo v0, "2442"
+    const-string/jumbo v0, "2443"
+    const-string/jumbo v0, "2444"
+    const-string/jumbo v0, "2445"
+    const-string/jumbo v0, "2446"
+    const-string/jumbo v0, "2447"
+    const-string/jumbo v0, "2448"
+    const-string/jumbo v0, "2449"
+    const-string/jumbo v0, "2450"
+    const-string/jumbo v0, "2451"
+    const-string/jumbo v0, "2452"
+    const-string/jumbo v0, "2453"
+    const-string/jumbo v0, "2454"
+    const-string/jumbo v0, "2455"
+    const-string/jumbo v0, "2456"
+    const-string/jumbo v0, "2457"
+    const-string/jumbo v0, "2458"
+    const-string/jumbo v0, "2459"
+    const-string/jumbo v0, "2460"
+    const-string/jumbo v0, "2461"
+    const-string/jumbo v0, "2462"
+    const-string/jumbo v0, "2463"
+    const-string/jumbo v0, "2464"
+    const-string/jumbo v0, "2465"
+    const-string/jumbo v0, "2466"
+    const-string/jumbo v0, "2467"
+    const-string/jumbo v0, "2468"
+    const-string/jumbo v0, "2469"
+    const-string/jumbo v0, "2470"
+    const-string/jumbo v0, "2471"
+    const-string/jumbo v0, "2472"
+    const-string/jumbo v0, "2473"
+    const-string/jumbo v0, "2474"
+    const-string/jumbo v0, "2475"
+    const-string/jumbo v0, "2476"
+    const-string/jumbo v0, "2477"
+    const-string/jumbo v0, "2478"
+    const-string/jumbo v0, "2479"
+    const-string/jumbo v0, "2480"
+    const-string/jumbo v0, "2481"
+    const-string/jumbo v0, "2482"
+    const-string/jumbo v0, "2483"
+    const-string/jumbo v0, "2484"
+    const-string/jumbo v0, "2485"
+    const-string/jumbo v0, "2486"
+    const-string/jumbo v0, "2487"
+    const-string/jumbo v0, "2488"
+    const-string/jumbo v0, "2489"
+    const-string/jumbo v0, "2490"
+    const-string/jumbo v0, "2491"
+    const-string/jumbo v0, "2492"
+    const-string/jumbo v0, "2493"
+    const-string/jumbo v0, "2494"
+    const-string/jumbo v0, "2495"
+    const-string/jumbo v0, "2496"
+    const-string/jumbo v0, "2497"
+    const-string/jumbo v0, "2498"
+    const-string/jumbo v0, "2499"
+    const-string/jumbo v0, "2500"
+    const-string/jumbo v0, "2501"
+    const-string/jumbo v0, "2502"
+    const-string/jumbo v0, "2503"
+    const-string/jumbo v0, "2504"
+    const-string/jumbo v0, "2505"
+    const-string/jumbo v0, "2506"
+    const-string/jumbo v0, "2507"
+    const-string/jumbo v0, "2508"
+    const-string/jumbo v0, "2509"
+    const-string/jumbo v0, "2510"
+    const-string/jumbo v0, "2511"
+    const-string/jumbo v0, "2512"
+    const-string/jumbo v0, "2513"
+    const-string/jumbo v0, "2514"
+    const-string/jumbo v0, "2515"
+    const-string/jumbo v0, "2516"
+    const-string/jumbo v0, "2517"
+    const-string/jumbo v0, "2518"
+    const-string/jumbo v0, "2519"
+    const-string/jumbo v0, "2520"
+    const-string/jumbo v0, "2521"
+    const-string/jumbo v0, "2522"
+    const-string/jumbo v0, "2523"
+    const-string/jumbo v0, "2524"
+    const-string/jumbo v0, "2525"
+    const-string/jumbo v0, "2526"
+    const-string/jumbo v0, "2527"
+    const-string/jumbo v0, "2528"
+    const-string/jumbo v0, "2529"
+    const-string/jumbo v0, "2530"
+    const-string/jumbo v0, "2531"
+    const-string/jumbo v0, "2532"
+    const-string/jumbo v0, "2533"
+    const-string/jumbo v0, "2534"
+    const-string/jumbo v0, "2535"
+    const-string/jumbo v0, "2536"
+    const-string/jumbo v0, "2537"
+    const-string/jumbo v0, "2538"
+    const-string/jumbo v0, "2539"
+    const-string/jumbo v0, "2540"
+    const-string/jumbo v0, "2541"
+    const-string/jumbo v0, "2542"
+    const-string/jumbo v0, "2543"
+    const-string/jumbo v0, "2544"
+    const-string/jumbo v0, "2545"
+    const-string/jumbo v0, "2546"
+    const-string/jumbo v0, "2547"
+    const-string/jumbo v0, "2548"
+    const-string/jumbo v0, "2549"
+    const-string/jumbo v0, "2550"
+    const-string/jumbo v0, "2551"
+    const-string/jumbo v0, "2552"
+    const-string/jumbo v0, "2553"
+    const-string/jumbo v0, "2554"
+    const-string/jumbo v0, "2555"
+    const-string/jumbo v0, "2556"
+    const-string/jumbo v0, "2557"
+    const-string/jumbo v0, "2558"
+    const-string/jumbo v0, "2559"
+    const-string/jumbo v0, "2560"
+    const-string/jumbo v0, "2561"
+    const-string/jumbo v0, "2562"
+    const-string/jumbo v0, "2563"
+    const-string/jumbo v0, "2564"
+    const-string/jumbo v0, "2565"
+    const-string/jumbo v0, "2566"
+    const-string/jumbo v0, "2567"
+    const-string/jumbo v0, "2568"
+    const-string/jumbo v0, "2569"
+    const-string/jumbo v0, "2570"
+    const-string/jumbo v0, "2571"
+    const-string/jumbo v0, "2572"
+    const-string/jumbo v0, "2573"
+    const-string/jumbo v0, "2574"
+    const-string/jumbo v0, "2575"
+    const-string/jumbo v0, "2576"
+    const-string/jumbo v0, "2577"
+    const-string/jumbo v0, "2578"
+    const-string/jumbo v0, "2579"
+    const-string/jumbo v0, "2580"
+    const-string/jumbo v0, "2581"
+    const-string/jumbo v0, "2582"
+    const-string/jumbo v0, "2583"
+    const-string/jumbo v0, "2584"
+    const-string/jumbo v0, "2585"
+    const-string/jumbo v0, "2586"
+    const-string/jumbo v0, "2587"
+    const-string/jumbo v0, "2588"
+    const-string/jumbo v0, "2589"
+    const-string/jumbo v0, "2590"
+    const-string/jumbo v0, "2591"
+    const-string/jumbo v0, "2592"
+    const-string/jumbo v0, "2593"
+    const-string/jumbo v0, "2594"
+    const-string/jumbo v0, "2595"
+    const-string/jumbo v0, "2596"
+    const-string/jumbo v0, "2597"
+    const-string/jumbo v0, "2598"
+    const-string/jumbo v0, "2599"
+    const-string/jumbo v0, "2600"
+    const-string/jumbo v0, "2601"
+    const-string/jumbo v0, "2602"
+    const-string/jumbo v0, "2603"
+    const-string/jumbo v0, "2604"
+    const-string/jumbo v0, "2605"
+    const-string/jumbo v0, "2606"
+    const-string/jumbo v0, "2607"
+    const-string/jumbo v0, "2608"
+    const-string/jumbo v0, "2609"
+    const-string/jumbo v0, "2610"
+    const-string/jumbo v0, "2611"
+    const-string/jumbo v0, "2612"
+    const-string/jumbo v0, "2613"
+    const-string/jumbo v0, "2614"
+    const-string/jumbo v0, "2615"
+    const-string/jumbo v0, "2616"
+    const-string/jumbo v0, "2617"
+    const-string/jumbo v0, "2618"
+    const-string/jumbo v0, "2619"
+    const-string/jumbo v0, "2620"
+    const-string/jumbo v0, "2621"
+    const-string/jumbo v0, "2622"
+    const-string/jumbo v0, "2623"
+    const-string/jumbo v0, "2624"
+    const-string/jumbo v0, "2625"
+    const-string/jumbo v0, "2626"
+    const-string/jumbo v0, "2627"
+    const-string/jumbo v0, "2628"
+    const-string/jumbo v0, "2629"
+    const-string/jumbo v0, "2630"
+    const-string/jumbo v0, "2631"
+    const-string/jumbo v0, "2632"
+    const-string/jumbo v0, "2633"
+    const-string/jumbo v0, "2634"
+    const-string/jumbo v0, "2635"
+    const-string/jumbo v0, "2636"
+    const-string/jumbo v0, "2637"
+    const-string/jumbo v0, "2638"
+    const-string/jumbo v0, "2639"
+    const-string/jumbo v0, "2640"
+    const-string/jumbo v0, "2641"
+    const-string/jumbo v0, "2642"
+    const-string/jumbo v0, "2643"
+    const-string/jumbo v0, "2644"
+    const-string/jumbo v0, "2645"
+    const-string/jumbo v0, "2646"
+    const-string/jumbo v0, "2647"
+    const-string/jumbo v0, "2648"
+    const-string/jumbo v0, "2649"
+    const-string/jumbo v0, "2650"
+    const-string/jumbo v0, "2651"
+    const-string/jumbo v0, "2652"
+    const-string/jumbo v0, "2653"
+    const-string/jumbo v0, "2654"
+    const-string/jumbo v0, "2655"
+    const-string/jumbo v0, "2656"
+    const-string/jumbo v0, "2657"
+    const-string/jumbo v0, "2658"
+    const-string/jumbo v0, "2659"
+    const-string/jumbo v0, "2660"
+    const-string/jumbo v0, "2661"
+    const-string/jumbo v0, "2662"
+    const-string/jumbo v0, "2663"
+    const-string/jumbo v0, "2664"
+    const-string/jumbo v0, "2665"
+    const-string/jumbo v0, "2666"
+    const-string/jumbo v0, "2667"
+    const-string/jumbo v0, "2668"
+    const-string/jumbo v0, "2669"
+    const-string/jumbo v0, "2670"
+    const-string/jumbo v0, "2671"
+    const-string/jumbo v0, "2672"
+    const-string/jumbo v0, "2673"
+    const-string/jumbo v0, "2674"
+    const-string/jumbo v0, "2675"
+    const-string/jumbo v0, "2676"
+    const-string/jumbo v0, "2677"
+    const-string/jumbo v0, "2678"
+    const-string/jumbo v0, "2679"
+    const-string/jumbo v0, "2680"
+    const-string/jumbo v0, "2681"
+    const-string/jumbo v0, "2682"
+    const-string/jumbo v0, "2683"
+    const-string/jumbo v0, "2684"
+    const-string/jumbo v0, "2685"
+    const-string/jumbo v0, "2686"
+    const-string/jumbo v0, "2687"
+    const-string/jumbo v0, "2688"
+    const-string/jumbo v0, "2689"
+    const-string/jumbo v0, "2690"
+    const-string/jumbo v0, "2691"
+    const-string/jumbo v0, "2692"
+    const-string/jumbo v0, "2693"
+    const-string/jumbo v0, "2694"
+    const-string/jumbo v0, "2695"
+    const-string/jumbo v0, "2696"
+    const-string/jumbo v0, "2697"
+    const-string/jumbo v0, "2698"
+    const-string/jumbo v0, "2699"
+    const-string/jumbo v0, "2700"
+    const-string/jumbo v0, "2701"
+    const-string/jumbo v0, "2702"
+    const-string/jumbo v0, "2703"
+    const-string/jumbo v0, "2704"
+    const-string/jumbo v0, "2705"
+    const-string/jumbo v0, "2706"
+    const-string/jumbo v0, "2707"
+    const-string/jumbo v0, "2708"
+    const-string/jumbo v0, "2709"
+    const-string/jumbo v0, "2710"
+    const-string/jumbo v0, "2711"
+    const-string/jumbo v0, "2712"
+    const-string/jumbo v0, "2713"
+    const-string/jumbo v0, "2714"
+    const-string/jumbo v0, "2715"
+    const-string/jumbo v0, "2716"
+    const-string/jumbo v0, "2717"
+    const-string/jumbo v0, "2718"
+    const-string/jumbo v0, "2719"
+    const-string/jumbo v0, "2720"
+    const-string/jumbo v0, "2721"
+    const-string/jumbo v0, "2722"
+    const-string/jumbo v0, "2723"
+    const-string/jumbo v0, "2724"
+    const-string/jumbo v0, "2725"
+    const-string/jumbo v0, "2726"
+    const-string/jumbo v0, "2727"
+    const-string/jumbo v0, "2728"
+    const-string/jumbo v0, "2729"
+    const-string/jumbo v0, "2730"
+    const-string/jumbo v0, "2731"
+    const-string/jumbo v0, "2732"
+    const-string/jumbo v0, "2733"
+    const-string/jumbo v0, "2734"
+    const-string/jumbo v0, "2735"
+    const-string/jumbo v0, "2736"
+    const-string/jumbo v0, "2737"
+    const-string/jumbo v0, "2738"
+    const-string/jumbo v0, "2739"
+    const-string/jumbo v0, "2740"
+    const-string/jumbo v0, "2741"
+    const-string/jumbo v0, "2742"
+    const-string/jumbo v0, "2743"
+    const-string/jumbo v0, "2744"
+    const-string/jumbo v0, "2745"
+    const-string/jumbo v0, "2746"
+    const-string/jumbo v0, "2747"
+    const-string/jumbo v0, "2748"
+    const-string/jumbo v0, "2749"
+    const-string/jumbo v0, "2750"
+    const-string/jumbo v0, "2751"
+    const-string/jumbo v0, "2752"
+    const-string/jumbo v0, "2753"
+    const-string/jumbo v0, "2754"
+    const-string/jumbo v0, "2755"
+    const-string/jumbo v0, "2756"
+    const-string/jumbo v0, "2757"
+    const-string/jumbo v0, "2758"
+    const-string/jumbo v0, "2759"
+    const-string/jumbo v0, "2760"
+    const-string/jumbo v0, "2761"
+    const-string/jumbo v0, "2762"
+    const-string/jumbo v0, "2763"
+    const-string/jumbo v0, "2764"
+    const-string/jumbo v0, "2765"
+    const-string/jumbo v0, "2766"
+    const-string/jumbo v0, "2767"
+    const-string/jumbo v0, "2768"
+    const-string/jumbo v0, "2769"
+    const-string/jumbo v0, "2770"
+    const-string/jumbo v0, "2771"
+    const-string/jumbo v0, "2772"
+    const-string/jumbo v0, "2773"
+    const-string/jumbo v0, "2774"
+    const-string/jumbo v0, "2775"
+    const-string/jumbo v0, "2776"
+    const-string/jumbo v0, "2777"
+    const-string/jumbo v0, "2778"
+    const-string/jumbo v0, "2779"
+    const-string/jumbo v0, "2780"
+    const-string/jumbo v0, "2781"
+    const-string/jumbo v0, "2782"
+    const-string/jumbo v0, "2783"
+    const-string/jumbo v0, "2784"
+    const-string/jumbo v0, "2785"
+    const-string/jumbo v0, "2786"
+    const-string/jumbo v0, "2787"
+    const-string/jumbo v0, "2788"
+    const-string/jumbo v0, "2789"
+    const-string/jumbo v0, "2790"
+    const-string/jumbo v0, "2791"
+    const-string/jumbo v0, "2792"
+    const-string/jumbo v0, "2793"
+    const-string/jumbo v0, "2794"
+    const-string/jumbo v0, "2795"
+    const-string/jumbo v0, "2796"
+    const-string/jumbo v0, "2797"
+    const-string/jumbo v0, "2798"
+    const-string/jumbo v0, "2799"
+    const-string/jumbo v0, "2800"
+    const-string/jumbo v0, "2801"
+    const-string/jumbo v0, "2802"
+    const-string/jumbo v0, "2803"
+    const-string/jumbo v0, "2804"
+    const-string/jumbo v0, "2805"
+    const-string/jumbo v0, "2806"
+    const-string/jumbo v0, "2807"
+    const-string/jumbo v0, "2808"
+    const-string/jumbo v0, "2809"
+    const-string/jumbo v0, "2810"
+    const-string/jumbo v0, "2811"
+    const-string/jumbo v0, "2812"
+    const-string/jumbo v0, "2813"
+    const-string/jumbo v0, "2814"
+    const-string/jumbo v0, "2815"
+    const-string/jumbo v0, "2816"
+    const-string/jumbo v0, "2817"
+    const-string/jumbo v0, "2818"
+    const-string/jumbo v0, "2819"
+    const-string/jumbo v0, "2820"
+    const-string/jumbo v0, "2821"
+    const-string/jumbo v0, "2822"
+    const-string/jumbo v0, "2823"
+    const-string/jumbo v0, "2824"
+    const-string/jumbo v0, "2825"
+    const-string/jumbo v0, "2826"
+    const-string/jumbo v0, "2827"
+    const-string/jumbo v0, "2828"
+    const-string/jumbo v0, "2829"
+    const-string/jumbo v0, "2830"
+    const-string/jumbo v0, "2831"
+    const-string/jumbo v0, "2832"
+    const-string/jumbo v0, "2833"
+    const-string/jumbo v0, "2834"
+    const-string/jumbo v0, "2835"
+    const-string/jumbo v0, "2836"
+    const-string/jumbo v0, "2837"
+    const-string/jumbo v0, "2838"
+    const-string/jumbo v0, "2839"
+    const-string/jumbo v0, "2840"
+    const-string/jumbo v0, "2841"
+    const-string/jumbo v0, "2842"
+    const-string/jumbo v0, "2843"
+    const-string/jumbo v0, "2844"
+    const-string/jumbo v0, "2845"
+    const-string/jumbo v0, "2846"
+    const-string/jumbo v0, "2847"
+    const-string/jumbo v0, "2848"
+    const-string/jumbo v0, "2849"
+    const-string/jumbo v0, "2850"
+    const-string/jumbo v0, "2851"
+    const-string/jumbo v0, "2852"
+    const-string/jumbo v0, "2853"
+    const-string/jumbo v0, "2854"
+    const-string/jumbo v0, "2855"
+    const-string/jumbo v0, "2856"
+    const-string/jumbo v0, "2857"
+    const-string/jumbo v0, "2858"
+    const-string/jumbo v0, "2859"
+    const-string/jumbo v0, "2860"
+    const-string/jumbo v0, "2861"
+    const-string/jumbo v0, "2862"
+    const-string/jumbo v0, "2863"
+    const-string/jumbo v0, "2864"
+    const-string/jumbo v0, "2865"
+    const-string/jumbo v0, "2866"
+    const-string/jumbo v0, "2867"
+    const-string/jumbo v0, "2868"
+    const-string/jumbo v0, "2869"
+    const-string/jumbo v0, "2870"
+    const-string/jumbo v0, "2871"
+    const-string/jumbo v0, "2872"
+    const-string/jumbo v0, "2873"
+    const-string/jumbo v0, "2874"
+    const-string/jumbo v0, "2875"
+    const-string/jumbo v0, "2876"
+    const-string/jumbo v0, "2877"
+    const-string/jumbo v0, "2878"
+    const-string/jumbo v0, "2879"
+    const-string/jumbo v0, "2880"
+    const-string/jumbo v0, "2881"
+    const-string/jumbo v0, "2882"
+    const-string/jumbo v0, "2883"
+    const-string/jumbo v0, "2884"
+    const-string/jumbo v0, "2885"
+    const-string/jumbo v0, "2886"
+    const-string/jumbo v0, "2887"
+    const-string/jumbo v0, "2888"
+    const-string/jumbo v0, "2889"
+    const-string/jumbo v0, "2890"
+    const-string/jumbo v0, "2891"
+    const-string/jumbo v0, "2892"
+    const-string/jumbo v0, "2893"
+    const-string/jumbo v0, "2894"
+    const-string/jumbo v0, "2895"
+    const-string/jumbo v0, "2896"
+    const-string/jumbo v0, "2897"
+    const-string/jumbo v0, "2898"
+    const-string/jumbo v0, "2899"
+    const-string/jumbo v0, "2900"
+    const-string/jumbo v0, "2901"
+    const-string/jumbo v0, "2902"
+    const-string/jumbo v0, "2903"
+    const-string/jumbo v0, "2904"
+    const-string/jumbo v0, "2905"
+    const-string/jumbo v0, "2906"
+    const-string/jumbo v0, "2907"
+    const-string/jumbo v0, "2908"
+    const-string/jumbo v0, "2909"
+    const-string/jumbo v0, "2910"
+    const-string/jumbo v0, "2911"
+    const-string/jumbo v0, "2912"
+    const-string/jumbo v0, "2913"
+    const-string/jumbo v0, "2914"
+    const-string/jumbo v0, "2915"
+    const-string/jumbo v0, "2916"
+    const-string/jumbo v0, "2917"
+    const-string/jumbo v0, "2918"
+    const-string/jumbo v0, "2919"
+    const-string/jumbo v0, "2920"
+    const-string/jumbo v0, "2921"
+    const-string/jumbo v0, "2922"
+    const-string/jumbo v0, "2923"
+    const-string/jumbo v0, "2924"
+    const-string/jumbo v0, "2925"
+    const-string/jumbo v0, "2926"
+    const-string/jumbo v0, "2927"
+    const-string/jumbo v0, "2928"
+    const-string/jumbo v0, "2929"
+    const-string/jumbo v0, "2930"
+    const-string/jumbo v0, "2931"
+    const-string/jumbo v0, "2932"
+    const-string/jumbo v0, "2933"
+    const-string/jumbo v0, "2934"
+    const-string/jumbo v0, "2935"
+    const-string/jumbo v0, "2936"
+    const-string/jumbo v0, "2937"
+    const-string/jumbo v0, "2938"
+    const-string/jumbo v0, "2939"
+    const-string/jumbo v0, "2940"
+    const-string/jumbo v0, "2941"
+    const-string/jumbo v0, "2942"
+    const-string/jumbo v0, "2943"
+    const-string/jumbo v0, "2944"
+    const-string/jumbo v0, "2945"
+    const-string/jumbo v0, "2946"
+    const-string/jumbo v0, "2947"
+    const-string/jumbo v0, "2948"
+    const-string/jumbo v0, "2949"
+    const-string/jumbo v0, "2950"
+    const-string/jumbo v0, "2951"
+    const-string/jumbo v0, "2952"
+    const-string/jumbo v0, "2953"
+    const-string/jumbo v0, "2954"
+    const-string/jumbo v0, "2955"
+    const-string/jumbo v0, "2956"
+    const-string/jumbo v0, "2957"
+    const-string/jumbo v0, "2958"
+    const-string/jumbo v0, "2959"
+    const-string/jumbo v0, "2960"
+    const-string/jumbo v0, "2961"
+    const-string/jumbo v0, "2962"
+    const-string/jumbo v0, "2963"
+    const-string/jumbo v0, "2964"
+    const-string/jumbo v0, "2965"
+    const-string/jumbo v0, "2966"
+    const-string/jumbo v0, "2967"
+    const-string/jumbo v0, "2968"
+    const-string/jumbo v0, "2969"
+    const-string/jumbo v0, "2970"
+    const-string/jumbo v0, "2971"
+    const-string/jumbo v0, "2972"
+    const-string/jumbo v0, "2973"
+    const-string/jumbo v0, "2974"
+    const-string/jumbo v0, "2975"
+    const-string/jumbo v0, "2976"
+    const-string/jumbo v0, "2977"
+    const-string/jumbo v0, "2978"
+    const-string/jumbo v0, "2979"
+    const-string/jumbo v0, "2980"
+    const-string/jumbo v0, "2981"
+    const-string/jumbo v0, "2982"
+    const-string/jumbo v0, "2983"
+    const-string/jumbo v0, "2984"
+    const-string/jumbo v0, "2985"
+    const-string/jumbo v0, "2986"
+    const-string/jumbo v0, "2987"
+    const-string/jumbo v0, "2988"
+    const-string/jumbo v0, "2989"
+    const-string/jumbo v0, "2990"
+    const-string/jumbo v0, "2991"
+    const-string/jumbo v0, "2992"
+    const-string/jumbo v0, "2993"
+    const-string/jumbo v0, "2994"
+    const-string/jumbo v0, "2995"
+    const-string/jumbo v0, "2996"
+    const-string/jumbo v0, "2997"
+    const-string/jumbo v0, "2998"
+    const-string/jumbo v0, "2999"
+    const-string/jumbo v0, "3000"
+    const-string/jumbo v0, "3001"
+    const-string/jumbo v0, "3002"
+    const-string/jumbo v0, "3003"
+    const-string/jumbo v0, "3004"
+    const-string/jumbo v0, "3005"
+    const-string/jumbo v0, "3006"
+    const-string/jumbo v0, "3007"
+    const-string/jumbo v0, "3008"
+    const-string/jumbo v0, "3009"
+    const-string/jumbo v0, "3010"
+    const-string/jumbo v0, "3011"
+    const-string/jumbo v0, "3012"
+    const-string/jumbo v0, "3013"
+    const-string/jumbo v0, "3014"
+    const-string/jumbo v0, "3015"
+    const-string/jumbo v0, "3016"
+    const-string/jumbo v0, "3017"
+    const-string/jumbo v0, "3018"
+    const-string/jumbo v0, "3019"
+    const-string/jumbo v0, "3020"
+    const-string/jumbo v0, "3021"
+    const-string/jumbo v0, "3022"
+    const-string/jumbo v0, "3023"
+    const-string/jumbo v0, "3024"
+    const-string/jumbo v0, "3025"
+    const-string/jumbo v0, "3026"
+    const-string/jumbo v0, "3027"
+    const-string/jumbo v0, "3028"
+    const-string/jumbo v0, "3029"
+    const-string/jumbo v0, "3030"
+    const-string/jumbo v0, "3031"
+    const-string/jumbo v0, "3032"
+    const-string/jumbo v0, "3033"
+    const-string/jumbo v0, "3034"
+    const-string/jumbo v0, "3035"
+    const-string/jumbo v0, "3036"
+    const-string/jumbo v0, "3037"
+    const-string/jumbo v0, "3038"
+    const-string/jumbo v0, "3039"
+    const-string/jumbo v0, "3040"
+    const-string/jumbo v0, "3041"
+    const-string/jumbo v0, "3042"
+    const-string/jumbo v0, "3043"
+    const-string/jumbo v0, "3044"
+    const-string/jumbo v0, "3045"
+    const-string/jumbo v0, "3046"
+    const-string/jumbo v0, "3047"
+    const-string/jumbo v0, "3048"
+    const-string/jumbo v0, "3049"
+    const-string/jumbo v0, "3050"
+    const-string/jumbo v0, "3051"
+    const-string/jumbo v0, "3052"
+    const-string/jumbo v0, "3053"
+    const-string/jumbo v0, "3054"
+    const-string/jumbo v0, "3055"
+    const-string/jumbo v0, "3056"
+    const-string/jumbo v0, "3057"
+    const-string/jumbo v0, "3058"
+    const-string/jumbo v0, "3059"
+    const-string/jumbo v0, "3060"
+    const-string/jumbo v0, "3061"
+    const-string/jumbo v0, "3062"
+    const-string/jumbo v0, "3063"
+    const-string/jumbo v0, "3064"
+    const-string/jumbo v0, "3065"
+    const-string/jumbo v0, "3066"
+    const-string/jumbo v0, "3067"
+    const-string/jumbo v0, "3068"
+    const-string/jumbo v0, "3069"
+    const-string/jumbo v0, "3070"
+    const-string/jumbo v0, "3071"
+    const-string/jumbo v0, "3072"
+    const-string/jumbo v0, "3073"
+    const-string/jumbo v0, "3074"
+    const-string/jumbo v0, "3075"
+    const-string/jumbo v0, "3076"
+    const-string/jumbo v0, "3077"
+    const-string/jumbo v0, "3078"
+    const-string/jumbo v0, "3079"
+    const-string/jumbo v0, "3080"
+    const-string/jumbo v0, "3081"
+    const-string/jumbo v0, "3082"
+    const-string/jumbo v0, "3083"
+    const-string/jumbo v0, "3084"
+    const-string/jumbo v0, "3085"
+    const-string/jumbo v0, "3086"
+    const-string/jumbo v0, "3087"
+    const-string/jumbo v0, "3088"
+    const-string/jumbo v0, "3089"
+    const-string/jumbo v0, "3090"
+    const-string/jumbo v0, "3091"
+    const-string/jumbo v0, "3092"
+    const-string/jumbo v0, "3093"
+    const-string/jumbo v0, "3094"
+    const-string/jumbo v0, "3095"
+    const-string/jumbo v0, "3096"
+    const-string/jumbo v0, "3097"
+    const-string/jumbo v0, "3098"
+    const-string/jumbo v0, "3099"
+    const-string/jumbo v0, "3100"
+    const-string/jumbo v0, "3101"
+    const-string/jumbo v0, "3102"
+    const-string/jumbo v0, "3103"
+    const-string/jumbo v0, "3104"
+    const-string/jumbo v0, "3105"
+    const-string/jumbo v0, "3106"
+    const-string/jumbo v0, "3107"
+    const-string/jumbo v0, "3108"
+    const-string/jumbo v0, "3109"
+    const-string/jumbo v0, "3110"
+    const-string/jumbo v0, "3111"
+    const-string/jumbo v0, "3112"
+    const-string/jumbo v0, "3113"
+    const-string/jumbo v0, "3114"
+    const-string/jumbo v0, "3115"
+    const-string/jumbo v0, "3116"
+    const-string/jumbo v0, "3117"
+    const-string/jumbo v0, "3118"
+    const-string/jumbo v0, "3119"
+    const-string/jumbo v0, "3120"
+    const-string/jumbo v0, "3121"
+    const-string/jumbo v0, "3122"
+    const-string/jumbo v0, "3123"
+    const-string/jumbo v0, "3124"
+    const-string/jumbo v0, "3125"
+    const-string/jumbo v0, "3126"
+    const-string/jumbo v0, "3127"
+    const-string/jumbo v0, "3128"
+    const-string/jumbo v0, "3129"
+    const-string/jumbo v0, "3130"
+    const-string/jumbo v0, "3131"
+    const-string/jumbo v0, "3132"
+    const-string/jumbo v0, "3133"
+    const-string/jumbo v0, "3134"
+    const-string/jumbo v0, "3135"
+    const-string/jumbo v0, "3136"
+    const-string/jumbo v0, "3137"
+    const-string/jumbo v0, "3138"
+    const-string/jumbo v0, "3139"
+    const-string/jumbo v0, "3140"
+    const-string/jumbo v0, "3141"
+    const-string/jumbo v0, "3142"
+    const-string/jumbo v0, "3143"
+    const-string/jumbo v0, "3144"
+    const-string/jumbo v0, "3145"
+    const-string/jumbo v0, "3146"
+    const-string/jumbo v0, "3147"
+    const-string/jumbo v0, "3148"
+    const-string/jumbo v0, "3149"
+    const-string/jumbo v0, "3150"
+    const-string/jumbo v0, "3151"
+    const-string/jumbo v0, "3152"
+    const-string/jumbo v0, "3153"
+    const-string/jumbo v0, "3154"
+    const-string/jumbo v0, "3155"
+    const-string/jumbo v0, "3156"
+    const-string/jumbo v0, "3157"
+    const-string/jumbo v0, "3158"
+    const-string/jumbo v0, "3159"
+    const-string/jumbo v0, "3160"
+    const-string/jumbo v0, "3161"
+    const-string/jumbo v0, "3162"
+    const-string/jumbo v0, "3163"
+    const-string/jumbo v0, "3164"
+    const-string/jumbo v0, "3165"
+    const-string/jumbo v0, "3166"
+    const-string/jumbo v0, "3167"
+    const-string/jumbo v0, "3168"
+    const-string/jumbo v0, "3169"
+    const-string/jumbo v0, "3170"
+    const-string/jumbo v0, "3171"
+    const-string/jumbo v0, "3172"
+    const-string/jumbo v0, "3173"
+    const-string/jumbo v0, "3174"
+    const-string/jumbo v0, "3175"
+    const-string/jumbo v0, "3176"
+    const-string/jumbo v0, "3177"
+    const-string/jumbo v0, "3178"
+    const-string/jumbo v0, "3179"
+    const-string/jumbo v0, "3180"
+    const-string/jumbo v0, "3181"
+    const-string/jumbo v0, "3182"
+    const-string/jumbo v0, "3183"
+    const-string/jumbo v0, "3184"
+    const-string/jumbo v0, "3185"
+    const-string/jumbo v0, "3186"
+    const-string/jumbo v0, "3187"
+    const-string/jumbo v0, "3188"
+    const-string/jumbo v0, "3189"
+    const-string/jumbo v0, "3190"
+    const-string/jumbo v0, "3191"
+    const-string/jumbo v0, "3192"
+    const-string/jumbo v0, "3193"
+    const-string/jumbo v0, "3194"
+    const-string/jumbo v0, "3195"
+    const-string/jumbo v0, "3196"
+    const-string/jumbo v0, "3197"
+    const-string/jumbo v0, "3198"
+    const-string/jumbo v0, "3199"
+    const-string/jumbo v0, "3200"
+    const-string/jumbo v0, "3201"
+    const-string/jumbo v0, "3202"
+    const-string/jumbo v0, "3203"
+    const-string/jumbo v0, "3204"
+    const-string/jumbo v0, "3205"
+    const-string/jumbo v0, "3206"
+    const-string/jumbo v0, "3207"
+    const-string/jumbo v0, "3208"
+    const-string/jumbo v0, "3209"
+    const-string/jumbo v0, "3210"
+    const-string/jumbo v0, "3211"
+    const-string/jumbo v0, "3212"
+    const-string/jumbo v0, "3213"
+    const-string/jumbo v0, "3214"
+    const-string/jumbo v0, "3215"
+    const-string/jumbo v0, "3216"
+    const-string/jumbo v0, "3217"
+    const-string/jumbo v0, "3218"
+    const-string/jumbo v0, "3219"
+    const-string/jumbo v0, "3220"
+    const-string/jumbo v0, "3221"
+    const-string/jumbo v0, "3222"
+    const-string/jumbo v0, "3223"
+    const-string/jumbo v0, "3224"
+    const-string/jumbo v0, "3225"
+    const-string/jumbo v0, "3226"
+    const-string/jumbo v0, "3227"
+    const-string/jumbo v0, "3228"
+    const-string/jumbo v0, "3229"
+    const-string/jumbo v0, "3230"
+    const-string/jumbo v0, "3231"
+    const-string/jumbo v0, "3232"
+    const-string/jumbo v0, "3233"
+    const-string/jumbo v0, "3234"
+    const-string/jumbo v0, "3235"
+    const-string/jumbo v0, "3236"
+    const-string/jumbo v0, "3237"
+    const-string/jumbo v0, "3238"
+    const-string/jumbo v0, "3239"
+    const-string/jumbo v0, "3240"
+    const-string/jumbo v0, "3241"
+    const-string/jumbo v0, "3242"
+    const-string/jumbo v0, "3243"
+    const-string/jumbo v0, "3244"
+    const-string/jumbo v0, "3245"
+    const-string/jumbo v0, "3246"
+    const-string/jumbo v0, "3247"
+    const-string/jumbo v0, "3248"
+    const-string/jumbo v0, "3249"
+    const-string/jumbo v0, "3250"
+    const-string/jumbo v0, "3251"
+    const-string/jumbo v0, "3252"
+    const-string/jumbo v0, "3253"
+    const-string/jumbo v0, "3254"
+    const-string/jumbo v0, "3255"
+    const-string/jumbo v0, "3256"
+    const-string/jumbo v0, "3257"
+    const-string/jumbo v0, "3258"
+    const-string/jumbo v0, "3259"
+    const-string/jumbo v0, "3260"
+    const-string/jumbo v0, "3261"
+    const-string/jumbo v0, "3262"
+    const-string/jumbo v0, "3263"
+    const-string/jumbo v0, "3264"
+    const-string/jumbo v0, "3265"
+    const-string/jumbo v0, "3266"
+    const-string/jumbo v0, "3267"
+    const-string/jumbo v0, "3268"
+    const-string/jumbo v0, "3269"
+    const-string/jumbo v0, "3270"
+    const-string/jumbo v0, "3271"
+    const-string/jumbo v0, "3272"
+    const-string/jumbo v0, "3273"
+    const-string/jumbo v0, "3274"
+    const-string/jumbo v0, "3275"
+    const-string/jumbo v0, "3276"
+    const-string/jumbo v0, "3277"
+    const-string/jumbo v0, "3278"
+    const-string/jumbo v0, "3279"
+    const-string/jumbo v0, "3280"
+    const-string/jumbo v0, "3281"
+    const-string/jumbo v0, "3282"
+    const-string/jumbo v0, "3283"
+    const-string/jumbo v0, "3284"
+    const-string/jumbo v0, "3285"
+    const-string/jumbo v0, "3286"
+    const-string/jumbo v0, "3287"
+    const-string/jumbo v0, "3288"
+    const-string/jumbo v0, "3289"
+    const-string/jumbo v0, "3290"
+    const-string/jumbo v0, "3291"
+    const-string/jumbo v0, "3292"
+    const-string/jumbo v0, "3293"
+    const-string/jumbo v0, "3294"
+    const-string/jumbo v0, "3295"
+    const-string/jumbo v0, "3296"
+    const-string/jumbo v0, "3297"
+    const-string/jumbo v0, "3298"
+    const-string/jumbo v0, "3299"
+    const-string/jumbo v0, "3300"
+    const-string/jumbo v0, "3301"
+    const-string/jumbo v0, "3302"
+    const-string/jumbo v0, "3303"
+    const-string/jumbo v0, "3304"
+    const-string/jumbo v0, "3305"
+    const-string/jumbo v0, "3306"
+    const-string/jumbo v0, "3307"
+    const-string/jumbo v0, "3308"
+    const-string/jumbo v0, "3309"
+    const-string/jumbo v0, "3310"
+    const-string/jumbo v0, "3311"
+    const-string/jumbo v0, "3312"
+    const-string/jumbo v0, "3313"
+    const-string/jumbo v0, "3314"
+    const-string/jumbo v0, "3315"
+    const-string/jumbo v0, "3316"
+    const-string/jumbo v0, "3317"
+    const-string/jumbo v0, "3318"
+    const-string/jumbo v0, "3319"
+    const-string/jumbo v0, "3320"
+    const-string/jumbo v0, "3321"
+    const-string/jumbo v0, "3322"
+    const-string/jumbo v0, "3323"
+    const-string/jumbo v0, "3324"
+    const-string/jumbo v0, "3325"
+    const-string/jumbo v0, "3326"
+    const-string/jumbo v0, "3327"
+    const-string/jumbo v0, "3328"
+    const-string/jumbo v0, "3329"
+    const-string/jumbo v0, "3330"
+    const-string/jumbo v0, "3331"
+    const-string/jumbo v0, "3332"
+    const-string/jumbo v0, "3333"
+    const-string/jumbo v0, "3334"
+    const-string/jumbo v0, "3335"
+    const-string/jumbo v0, "3336"
+    const-string/jumbo v0, "3337"
+    const-string/jumbo v0, "3338"
+    const-string/jumbo v0, "3339"
+    const-string/jumbo v0, "3340"
+    const-string/jumbo v0, "3341"
+    const-string/jumbo v0, "3342"
+    const-string/jumbo v0, "3343"
+    const-string/jumbo v0, "3344"
+    const-string/jumbo v0, "3345"
+    const-string/jumbo v0, "3346"
+    const-string/jumbo v0, "3347"
+    const-string/jumbo v0, "3348"
+    const-string/jumbo v0, "3349"
+    const-string/jumbo v0, "3350"
+    const-string/jumbo v0, "3351"
+    const-string/jumbo v0, "3352"
+    const-string/jumbo v0, "3353"
+    const-string/jumbo v0, "3354"
+    const-string/jumbo v0, "3355"
+    const-string/jumbo v0, "3356"
+    const-string/jumbo v0, "3357"
+    const-string/jumbo v0, "3358"
+    const-string/jumbo v0, "3359"
+    const-string/jumbo v0, "3360"
+    const-string/jumbo v0, "3361"
+    const-string/jumbo v0, "3362"
+    const-string/jumbo v0, "3363"
+    const-string/jumbo v0, "3364"
+    const-string/jumbo v0, "3365"
+    const-string/jumbo v0, "3366"
+    const-string/jumbo v0, "3367"
+    const-string/jumbo v0, "3368"
+    const-string/jumbo v0, "3369"
+    const-string/jumbo v0, "3370"
+    const-string/jumbo v0, "3371"
+    const-string/jumbo v0, "3372"
+    const-string/jumbo v0, "3373"
+    const-string/jumbo v0, "3374"
+    const-string/jumbo v0, "3375"
+    const-string/jumbo v0, "3376"
+    const-string/jumbo v0, "3377"
+    const-string/jumbo v0, "3378"
+    const-string/jumbo v0, "3379"
+    const-string/jumbo v0, "3380"
+    const-string/jumbo v0, "3381"
+    const-string/jumbo v0, "3382"
+    const-string/jumbo v0, "3383"
+    const-string/jumbo v0, "3384"
+    const-string/jumbo v0, "3385"
+    const-string/jumbo v0, "3386"
+    const-string/jumbo v0, "3387"
+    const-string/jumbo v0, "3388"
+    const-string/jumbo v0, "3389"
+    const-string/jumbo v0, "3390"
+    const-string/jumbo v0, "3391"
+    const-string/jumbo v0, "3392"
+    const-string/jumbo v0, "3393"
+    const-string/jumbo v0, "3394"
+    const-string/jumbo v0, "3395"
+    const-string/jumbo v0, "3396"
+    const-string/jumbo v0, "3397"
+    const-string/jumbo v0, "3398"
+    const-string/jumbo v0, "3399"
+    const-string/jumbo v0, "3400"
+    const-string/jumbo v0, "3401"
+    const-string/jumbo v0, "3402"
+    const-string/jumbo v0, "3403"
+    const-string/jumbo v0, "3404"
+    const-string/jumbo v0, "3405"
+    const-string/jumbo v0, "3406"
+    const-string/jumbo v0, "3407"
+    const-string/jumbo v0, "3408"
+    const-string/jumbo v0, "3409"
+    const-string/jumbo v0, "3410"
+    const-string/jumbo v0, "3411"
+    const-string/jumbo v0, "3412"
+    const-string/jumbo v0, "3413"
+    const-string/jumbo v0, "3414"
+    const-string/jumbo v0, "3415"
+    const-string/jumbo v0, "3416"
+    const-string/jumbo v0, "3417"
+    const-string/jumbo v0, "3418"
+    const-string/jumbo v0, "3419"
+    const-string/jumbo v0, "3420"
+    const-string/jumbo v0, "3421"
+    const-string/jumbo v0, "3422"
+    const-string/jumbo v0, "3423"
+    const-string/jumbo v0, "3424"
+    const-string/jumbo v0, "3425"
+    const-string/jumbo v0, "3426"
+    const-string/jumbo v0, "3427"
+    const-string/jumbo v0, "3428"
+    const-string/jumbo v0, "3429"
+    const-string/jumbo v0, "3430"
+    const-string/jumbo v0, "3431"
+    const-string/jumbo v0, "3432"
+    const-string/jumbo v0, "3433"
+    const-string/jumbo v0, "3434"
+    const-string/jumbo v0, "3435"
+    const-string/jumbo v0, "3436"
+    const-string/jumbo v0, "3437"
+    const-string/jumbo v0, "3438"
+    const-string/jumbo v0, "3439"
+    const-string/jumbo v0, "3440"
+    const-string/jumbo v0, "3441"
+    const-string/jumbo v0, "3442"
+    const-string/jumbo v0, "3443"
+    const-string/jumbo v0, "3444"
+    const-string/jumbo v0, "3445"
+    const-string/jumbo v0, "3446"
+    const-string/jumbo v0, "3447"
+    const-string/jumbo v0, "3448"
+    const-string/jumbo v0, "3449"
+    const-string/jumbo v0, "3450"
+    const-string/jumbo v0, "3451"
+    const-string/jumbo v0, "3452"
+    const-string/jumbo v0, "3453"
+    const-string/jumbo v0, "3454"
+    const-string/jumbo v0, "3455"
+    const-string/jumbo v0, "3456"
+    const-string/jumbo v0, "3457"
+    const-string/jumbo v0, "3458"
+    const-string/jumbo v0, "3459"
+    const-string/jumbo v0, "3460"
+    const-string/jumbo v0, "3461"
+    const-string/jumbo v0, "3462"
+    const-string/jumbo v0, "3463"
+    const-string/jumbo v0, "3464"
+    const-string/jumbo v0, "3465"
+    const-string/jumbo v0, "3466"
+    const-string/jumbo v0, "3467"
+    const-string/jumbo v0, "3468"
+    const-string/jumbo v0, "3469"
+    const-string/jumbo v0, "3470"
+    const-string/jumbo v0, "3471"
+    const-string/jumbo v0, "3472"
+    const-string/jumbo v0, "3473"
+    const-string/jumbo v0, "3474"
+    const-string/jumbo v0, "3475"
+    const-string/jumbo v0, "3476"
+    const-string/jumbo v0, "3477"
+    const-string/jumbo v0, "3478"
+    const-string/jumbo v0, "3479"
+    const-string/jumbo v0, "3480"
+    const-string/jumbo v0, "3481"
+    const-string/jumbo v0, "3482"
+    const-string/jumbo v0, "3483"
+    const-string/jumbo v0, "3484"
+    const-string/jumbo v0, "3485"
+    const-string/jumbo v0, "3486"
+    const-string/jumbo v0, "3487"
+    const-string/jumbo v0, "3488"
+    const-string/jumbo v0, "3489"
+    const-string/jumbo v0, "3490"
+    const-string/jumbo v0, "3491"
+    const-string/jumbo v0, "3492"
+    const-string/jumbo v0, "3493"
+    const-string/jumbo v0, "3494"
+    const-string/jumbo v0, "3495"
+    const-string/jumbo v0, "3496"
+    const-string/jumbo v0, "3497"
+    const-string/jumbo v0, "3498"
+    const-string/jumbo v0, "3499"
+    const-string/jumbo v0, "3500"
+    const-string/jumbo v0, "3501"
+    const-string/jumbo v0, "3502"
+    const-string/jumbo v0, "3503"
+    const-string/jumbo v0, "3504"
+    const-string/jumbo v0, "3505"
+    const-string/jumbo v0, "3506"
+    const-string/jumbo v0, "3507"
+    const-string/jumbo v0, "3508"
+    const-string/jumbo v0, "3509"
+    const-string/jumbo v0, "3510"
+    const-string/jumbo v0, "3511"
+    const-string/jumbo v0, "3512"
+    const-string/jumbo v0, "3513"
+    const-string/jumbo v0, "3514"
+    const-string/jumbo v0, "3515"
+    const-string/jumbo v0, "3516"
+    const-string/jumbo v0, "3517"
+    const-string/jumbo v0, "3518"
+    const-string/jumbo v0, "3519"
+    const-string/jumbo v0, "3520"
+    const-string/jumbo v0, "3521"
+    const-string/jumbo v0, "3522"
+    const-string/jumbo v0, "3523"
+    const-string/jumbo v0, "3524"
+    const-string/jumbo v0, "3525"
+    const-string/jumbo v0, "3526"
+    const-string/jumbo v0, "3527"
+    const-string/jumbo v0, "3528"
+    const-string/jumbo v0, "3529"
+    const-string/jumbo v0, "3530"
+    const-string/jumbo v0, "3531"
+    const-string/jumbo v0, "3532"
+    const-string/jumbo v0, "3533"
+    const-string/jumbo v0, "3534"
+    const-string/jumbo v0, "3535"
+    const-string/jumbo v0, "3536"
+    const-string/jumbo v0, "3537"
+    const-string/jumbo v0, "3538"
+    const-string/jumbo v0, "3539"
+    const-string/jumbo v0, "3540"
+    const-string/jumbo v0, "3541"
+    const-string/jumbo v0, "3542"
+    const-string/jumbo v0, "3543"
+    const-string/jumbo v0, "3544"
+    const-string/jumbo v0, "3545"
+    const-string/jumbo v0, "3546"
+    const-string/jumbo v0, "3547"
+    const-string/jumbo v0, "3548"
+    const-string/jumbo v0, "3549"
+    const-string/jumbo v0, "3550"
+    const-string/jumbo v0, "3551"
+    const-string/jumbo v0, "3552"
+    const-string/jumbo v0, "3553"
+    const-string/jumbo v0, "3554"
+    const-string/jumbo v0, "3555"
+    const-string/jumbo v0, "3556"
+    const-string/jumbo v0, "3557"
+    const-string/jumbo v0, "3558"
+    const-string/jumbo v0, "3559"
+    const-string/jumbo v0, "3560"
+    const-string/jumbo v0, "3561"
+    const-string/jumbo v0, "3562"
+    const-string/jumbo v0, "3563"
+    const-string/jumbo v0, "3564"
+    const-string/jumbo v0, "3565"
+    const-string/jumbo v0, "3566"
+    const-string/jumbo v0, "3567"
+    const-string/jumbo v0, "3568"
+    const-string/jumbo v0, "3569"
+    const-string/jumbo v0, "3570"
+    const-string/jumbo v0, "3571"
+    const-string/jumbo v0, "3572"
+    const-string/jumbo v0, "3573"
+    const-string/jumbo v0, "3574"
+    const-string/jumbo v0, "3575"
+    const-string/jumbo v0, "3576"
+    const-string/jumbo v0, "3577"
+    const-string/jumbo v0, "3578"
+    const-string/jumbo v0, "3579"
+    const-string/jumbo v0, "3580"
+    const-string/jumbo v0, "3581"
+    const-string/jumbo v0, "3582"
+    const-string/jumbo v0, "3583"
+    const-string/jumbo v0, "3584"
+    const-string/jumbo v0, "3585"
+    const-string/jumbo v0, "3586"
+    const-string/jumbo v0, "3587"
+    const-string/jumbo v0, "3588"
+    const-string/jumbo v0, "3589"
+    const-string/jumbo v0, "3590"
+    const-string/jumbo v0, "3591"
+    const-string/jumbo v0, "3592"
+    const-string/jumbo v0, "3593"
+    const-string/jumbo v0, "3594"
+    const-string/jumbo v0, "3595"
+    const-string/jumbo v0, "3596"
+    const-string/jumbo v0, "3597"
+    const-string/jumbo v0, "3598"
+    const-string/jumbo v0, "3599"
+    const-string/jumbo v0, "3600"
+    const-string/jumbo v0, "3601"
+    const-string/jumbo v0, "3602"
+    const-string/jumbo v0, "3603"
+    const-string/jumbo v0, "3604"
+    const-string/jumbo v0, "3605"
+    const-string/jumbo v0, "3606"
+    const-string/jumbo v0, "3607"
+    const-string/jumbo v0, "3608"
+    const-string/jumbo v0, "3609"
+    const-string/jumbo v0, "3610"
+    const-string/jumbo v0, "3611"
+    const-string/jumbo v0, "3612"
+    const-string/jumbo v0, "3613"
+    const-string/jumbo v0, "3614"
+    const-string/jumbo v0, "3615"
+    const-string/jumbo v0, "3616"
+    const-string/jumbo v0, "3617"
+    const-string/jumbo v0, "3618"
+    const-string/jumbo v0, "3619"
+    const-string/jumbo v0, "3620"
+    const-string/jumbo v0, "3621"
+    const-string/jumbo v0, "3622"
+    const-string/jumbo v0, "3623"
+    const-string/jumbo v0, "3624"
+    const-string/jumbo v0, "3625"
+    const-string/jumbo v0, "3626"
+    const-string/jumbo v0, "3627"
+    const-string/jumbo v0, "3628"
+    const-string/jumbo v0, "3629"
+    const-string/jumbo v0, "3630"
+    const-string/jumbo v0, "3631"
+    const-string/jumbo v0, "3632"
+    const-string/jumbo v0, "3633"
+    const-string/jumbo v0, "3634"
+    const-string/jumbo v0, "3635"
+    const-string/jumbo v0, "3636"
+    const-string/jumbo v0, "3637"
+    const-string/jumbo v0, "3638"
+    const-string/jumbo v0, "3639"
+    const-string/jumbo v0, "3640"
+    const-string/jumbo v0, "3641"
+    const-string/jumbo v0, "3642"
+    const-string/jumbo v0, "3643"
+    const-string/jumbo v0, "3644"
+    const-string/jumbo v0, "3645"
+    const-string/jumbo v0, "3646"
+    const-string/jumbo v0, "3647"
+    const-string/jumbo v0, "3648"
+    const-string/jumbo v0, "3649"
+    const-string/jumbo v0, "3650"
+    const-string/jumbo v0, "3651"
+    const-string/jumbo v0, "3652"
+    const-string/jumbo v0, "3653"
+    const-string/jumbo v0, "3654"
+    const-string/jumbo v0, "3655"
+    const-string/jumbo v0, "3656"
+    const-string/jumbo v0, "3657"
+    const-string/jumbo v0, "3658"
+    const-string/jumbo v0, "3659"
+    const-string/jumbo v0, "3660"
+    const-string/jumbo v0, "3661"
+    const-string/jumbo v0, "3662"
+    const-string/jumbo v0, "3663"
+    const-string/jumbo v0, "3664"
+    const-string/jumbo v0, "3665"
+    const-string/jumbo v0, "3666"
+    const-string/jumbo v0, "3667"
+    const-string/jumbo v0, "3668"
+    const-string/jumbo v0, "3669"
+    const-string/jumbo v0, "3670"
+    const-string/jumbo v0, "3671"
+    const-string/jumbo v0, "3672"
+    const-string/jumbo v0, "3673"
+    const-string/jumbo v0, "3674"
+    const-string/jumbo v0, "3675"
+    const-string/jumbo v0, "3676"
+    const-string/jumbo v0, "3677"
+    const-string/jumbo v0, "3678"
+    const-string/jumbo v0, "3679"
+    const-string/jumbo v0, "3680"
+    const-string/jumbo v0, "3681"
+    const-string/jumbo v0, "3682"
+    const-string/jumbo v0, "3683"
+    const-string/jumbo v0, "3684"
+    const-string/jumbo v0, "3685"
+    const-string/jumbo v0, "3686"
+    const-string/jumbo v0, "3687"
+    const-string/jumbo v0, "3688"
+    const-string/jumbo v0, "3689"
+    const-string/jumbo v0, "3690"
+    const-string/jumbo v0, "3691"
+    const-string/jumbo v0, "3692"
+    const-string/jumbo v0, "3693"
+    const-string/jumbo v0, "3694"
+    const-string/jumbo v0, "3695"
+    const-string/jumbo v0, "3696"
+    const-string/jumbo v0, "3697"
+    const-string/jumbo v0, "3698"
+    const-string/jumbo v0, "3699"
+    const-string/jumbo v0, "3700"
+    const-string/jumbo v0, "3701"
+    const-string/jumbo v0, "3702"
+    const-string/jumbo v0, "3703"
+    const-string/jumbo v0, "3704"
+    const-string/jumbo v0, "3705"
+    const-string/jumbo v0, "3706"
+    const-string/jumbo v0, "3707"
+    const-string/jumbo v0, "3708"
+    const-string/jumbo v0, "3709"
+    const-string/jumbo v0, "3710"
+    const-string/jumbo v0, "3711"
+    const-string/jumbo v0, "3712"
+    const-string/jumbo v0, "3713"
+    const-string/jumbo v0, "3714"
+    const-string/jumbo v0, "3715"
+    const-string/jumbo v0, "3716"
+    const-string/jumbo v0, "3717"
+    const-string/jumbo v0, "3718"
+    const-string/jumbo v0, "3719"
+    const-string/jumbo v0, "3720"
+    const-string/jumbo v0, "3721"
+    const-string/jumbo v0, "3722"
+    const-string/jumbo v0, "3723"
+    const-string/jumbo v0, "3724"
+    const-string/jumbo v0, "3725"
+    const-string/jumbo v0, "3726"
+    const-string/jumbo v0, "3727"
+    const-string/jumbo v0, "3728"
+    const-string/jumbo v0, "3729"
+    const-string/jumbo v0, "3730"
+    const-string/jumbo v0, "3731"
+    const-string/jumbo v0, "3732"
+    const-string/jumbo v0, "3733"
+    const-string/jumbo v0, "3734"
+    const-string/jumbo v0, "3735"
+    const-string/jumbo v0, "3736"
+    const-string/jumbo v0, "3737"
+    const-string/jumbo v0, "3738"
+    const-string/jumbo v0, "3739"
+    const-string/jumbo v0, "3740"
+    const-string/jumbo v0, "3741"
+    const-string/jumbo v0, "3742"
+    const-string/jumbo v0, "3743"
+    const-string/jumbo v0, "3744"
+    const-string/jumbo v0, "3745"
+    const-string/jumbo v0, "3746"
+    const-string/jumbo v0, "3747"
+    const-string/jumbo v0, "3748"
+    const-string/jumbo v0, "3749"
+    const-string/jumbo v0, "3750"
+    const-string/jumbo v0, "3751"
+    const-string/jumbo v0, "3752"
+    const-string/jumbo v0, "3753"
+    const-string/jumbo v0, "3754"
+    const-string/jumbo v0, "3755"
+    const-string/jumbo v0, "3756"
+    const-string/jumbo v0, "3757"
+    const-string/jumbo v0, "3758"
+    const-string/jumbo v0, "3759"
+    const-string/jumbo v0, "3760"
+    const-string/jumbo v0, "3761"
+    const-string/jumbo v0, "3762"
+    const-string/jumbo v0, "3763"
+    const-string/jumbo v0, "3764"
+    const-string/jumbo v0, "3765"
+    const-string/jumbo v0, "3766"
+    const-string/jumbo v0, "3767"
+    const-string/jumbo v0, "3768"
+    const-string/jumbo v0, "3769"
+    const-string/jumbo v0, "3770"
+    const-string/jumbo v0, "3771"
+    const-string/jumbo v0, "3772"
+    const-string/jumbo v0, "3773"
+    const-string/jumbo v0, "3774"
+    const-string/jumbo v0, "3775"
+    const-string/jumbo v0, "3776"
+    const-string/jumbo v0, "3777"
+    const-string/jumbo v0, "3778"
+    const-string/jumbo v0, "3779"
+    const-string/jumbo v0, "3780"
+    const-string/jumbo v0, "3781"
+    const-string/jumbo v0, "3782"
+    const-string/jumbo v0, "3783"
+    const-string/jumbo v0, "3784"
+    const-string/jumbo v0, "3785"
+    const-string/jumbo v0, "3786"
+    const-string/jumbo v0, "3787"
+    const-string/jumbo v0, "3788"
+    const-string/jumbo v0, "3789"
+    const-string/jumbo v0, "3790"
+    const-string/jumbo v0, "3791"
+    const-string/jumbo v0, "3792"
+    const-string/jumbo v0, "3793"
+    const-string/jumbo v0, "3794"
+    const-string/jumbo v0, "3795"
+    const-string/jumbo v0, "3796"
+    const-string/jumbo v0, "3797"
+    const-string/jumbo v0, "3798"
+    const-string/jumbo v0, "3799"
+    const-string/jumbo v0, "3800"
+    const-string/jumbo v0, "3801"
+    const-string/jumbo v0, "3802"
+    const-string/jumbo v0, "3803"
+    const-string/jumbo v0, "3804"
+    const-string/jumbo v0, "3805"
+    const-string/jumbo v0, "3806"
+    const-string/jumbo v0, "3807"
+    const-string/jumbo v0, "3808"
+    const-string/jumbo v0, "3809"
+    const-string/jumbo v0, "3810"
+    const-string/jumbo v0, "3811"
+    const-string/jumbo v0, "3812"
+    const-string/jumbo v0, "3813"
+    const-string/jumbo v0, "3814"
+    const-string/jumbo v0, "3815"
+    const-string/jumbo v0, "3816"
+    const-string/jumbo v0, "3817"
+    const-string/jumbo v0, "3818"
+    const-string/jumbo v0, "3819"
+    const-string/jumbo v0, "3820"
+    const-string/jumbo v0, "3821"
+    const-string/jumbo v0, "3822"
+    const-string/jumbo v0, "3823"
+    const-string/jumbo v0, "3824"
+    const-string/jumbo v0, "3825"
+    const-string/jumbo v0, "3826"
+    const-string/jumbo v0, "3827"
+    const-string/jumbo v0, "3828"
+    const-string/jumbo v0, "3829"
+    const-string/jumbo v0, "3830"
+    const-string/jumbo v0, "3831"
+    const-string/jumbo v0, "3832"
+    const-string/jumbo v0, "3833"
+    const-string/jumbo v0, "3834"
+    const-string/jumbo v0, "3835"
+    const-string/jumbo v0, "3836"
+    const-string/jumbo v0, "3837"
+    const-string/jumbo v0, "3838"
+    const-string/jumbo v0, "3839"
+    const-string/jumbo v0, "3840"
+    const-string/jumbo v0, "3841"
+    const-string/jumbo v0, "3842"
+    const-string/jumbo v0, "3843"
+    const-string/jumbo v0, "3844"
+    const-string/jumbo v0, "3845"
+    const-string/jumbo v0, "3846"
+    const-string/jumbo v0, "3847"
+    const-string/jumbo v0, "3848"
+    const-string/jumbo v0, "3849"
+    const-string/jumbo v0, "3850"
+    const-string/jumbo v0, "3851"
+    const-string/jumbo v0, "3852"
+    const-string/jumbo v0, "3853"
+    const-string/jumbo v0, "3854"
+    const-string/jumbo v0, "3855"
+    const-string/jumbo v0, "3856"
+    const-string/jumbo v0, "3857"
+    const-string/jumbo v0, "3858"
+    const-string/jumbo v0, "3859"
+    const-string/jumbo v0, "3860"
+    const-string/jumbo v0, "3861"
+    const-string/jumbo v0, "3862"
+    const-string/jumbo v0, "3863"
+    const-string/jumbo v0, "3864"
+    const-string/jumbo v0, "3865"
+    const-string/jumbo v0, "3866"
+    const-string/jumbo v0, "3867"
+    const-string/jumbo v0, "3868"
+    const-string/jumbo v0, "3869"
+    const-string/jumbo v0, "3870"
+    const-string/jumbo v0, "3871"
+    const-string/jumbo v0, "3872"
+    const-string/jumbo v0, "3873"
+    const-string/jumbo v0, "3874"
+    const-string/jumbo v0, "3875"
+    const-string/jumbo v0, "3876"
+    const-string/jumbo v0, "3877"
+    const-string/jumbo v0, "3878"
+    const-string/jumbo v0, "3879"
+    const-string/jumbo v0, "3880"
+    const-string/jumbo v0, "3881"
+    const-string/jumbo v0, "3882"
+    const-string/jumbo v0, "3883"
+    const-string/jumbo v0, "3884"
+    const-string/jumbo v0, "3885"
+    const-string/jumbo v0, "3886"
+    const-string/jumbo v0, "3887"
+    const-string/jumbo v0, "3888"
+    const-string/jumbo v0, "3889"
+    const-string/jumbo v0, "3890"
+    const-string/jumbo v0, "3891"
+    const-string/jumbo v0, "3892"
+    const-string/jumbo v0, "3893"
+    const-string/jumbo v0, "3894"
+    const-string/jumbo v0, "3895"
+    const-string/jumbo v0, "3896"
+    const-string/jumbo v0, "3897"
+    const-string/jumbo v0, "3898"
+    const-string/jumbo v0, "3899"
+    const-string/jumbo v0, "3900"
+    const-string/jumbo v0, "3901"
+    const-string/jumbo v0, "3902"
+    const-string/jumbo v0, "3903"
+    const-string/jumbo v0, "3904"
+    const-string/jumbo v0, "3905"
+    const-string/jumbo v0, "3906"
+    const-string/jumbo v0, "3907"
+    const-string/jumbo v0, "3908"
+    const-string/jumbo v0, "3909"
+    const-string/jumbo v0, "3910"
+    const-string/jumbo v0, "3911"
+    const-string/jumbo v0, "3912"
+    const-string/jumbo v0, "3913"
+    const-string/jumbo v0, "3914"
+    const-string/jumbo v0, "3915"
+    const-string/jumbo v0, "3916"
+    const-string/jumbo v0, "3917"
+    const-string/jumbo v0, "3918"
+    const-string/jumbo v0, "3919"
+    const-string/jumbo v0, "3920"
+    const-string/jumbo v0, "3921"
+    const-string/jumbo v0, "3922"
+    const-string/jumbo v0, "3923"
+    const-string/jumbo v0, "3924"
+    const-string/jumbo v0, "3925"
+    const-string/jumbo v0, "3926"
+    const-string/jumbo v0, "3927"
+    const-string/jumbo v0, "3928"
+    const-string/jumbo v0, "3929"
+    const-string/jumbo v0, "3930"
+    const-string/jumbo v0, "3931"
+    const-string/jumbo v0, "3932"
+    const-string/jumbo v0, "3933"
+    const-string/jumbo v0, "3934"
+    const-string/jumbo v0, "3935"
+    const-string/jumbo v0, "3936"
+    const-string/jumbo v0, "3937"
+    const-string/jumbo v0, "3938"
+    const-string/jumbo v0, "3939"
+    const-string/jumbo v0, "3940"
+    const-string/jumbo v0, "3941"
+    const-string/jumbo v0, "3942"
+    const-string/jumbo v0, "3943"
+    const-string/jumbo v0, "3944"
+    const-string/jumbo v0, "3945"
+    const-string/jumbo v0, "3946"
+    const-string/jumbo v0, "3947"
+    const-string/jumbo v0, "3948"
+    const-string/jumbo v0, "3949"
+    const-string/jumbo v0, "3950"
+    const-string/jumbo v0, "3951"
+    const-string/jumbo v0, "3952"
+    const-string/jumbo v0, "3953"
+    const-string/jumbo v0, "3954"
+    const-string/jumbo v0, "3955"
+    const-string/jumbo v0, "3956"
+    const-string/jumbo v0, "3957"
+    const-string/jumbo v0, "3958"
+    const-string/jumbo v0, "3959"
+    const-string/jumbo v0, "3960"
+    const-string/jumbo v0, "3961"
+    const-string/jumbo v0, "3962"
+    const-string/jumbo v0, "3963"
+    const-string/jumbo v0, "3964"
+    const-string/jumbo v0, "3965"
+    const-string/jumbo v0, "3966"
+    const-string/jumbo v0, "3967"
+    const-string/jumbo v0, "3968"
+    const-string/jumbo v0, "3969"
+    const-string/jumbo v0, "3970"
+    const-string/jumbo v0, "3971"
+    const-string/jumbo v0, "3972"
+    const-string/jumbo v0, "3973"
+    const-string/jumbo v0, "3974"
+    const-string/jumbo v0, "3975"
+    const-string/jumbo v0, "3976"
+    const-string/jumbo v0, "3977"
+    const-string/jumbo v0, "3978"
+    const-string/jumbo v0, "3979"
+    const-string/jumbo v0, "3980"
+    const-string/jumbo v0, "3981"
+    const-string/jumbo v0, "3982"
+    const-string/jumbo v0, "3983"
+    const-string/jumbo v0, "3984"
+    const-string/jumbo v0, "3985"
+    const-string/jumbo v0, "3986"
+    const-string/jumbo v0, "3987"
+    const-string/jumbo v0, "3988"
+    const-string/jumbo v0, "3989"
+    const-string/jumbo v0, "3990"
+    const-string/jumbo v0, "3991"
+    const-string/jumbo v0, "3992"
+    const-string/jumbo v0, "3993"
+    const-string/jumbo v0, "3994"
+    const-string/jumbo v0, "3995"
+    const-string/jumbo v0, "3996"
+    const-string/jumbo v0, "3997"
+    const-string/jumbo v0, "3998"
+    const-string/jumbo v0, "3999"
+    const-string/jumbo v0, "4000"
+    const-string/jumbo v0, "4001"
+    const-string/jumbo v0, "4002"
+    const-string/jumbo v0, "4003"
+    const-string/jumbo v0, "4004"
+    const-string/jumbo v0, "4005"
+    const-string/jumbo v0, "4006"
+    const-string/jumbo v0, "4007"
+    const-string/jumbo v0, "4008"
+    const-string/jumbo v0, "4009"
+    const-string/jumbo v0, "4010"
+    const-string/jumbo v0, "4011"
+    const-string/jumbo v0, "4012"
+    const-string/jumbo v0, "4013"
+    const-string/jumbo v0, "4014"
+    const-string/jumbo v0, "4015"
+    const-string/jumbo v0, "4016"
+    const-string/jumbo v0, "4017"
+    const-string/jumbo v0, "4018"
+    const-string/jumbo v0, "4019"
+    const-string/jumbo v0, "4020"
+    const-string/jumbo v0, "4021"
+    const-string/jumbo v0, "4022"
+    const-string/jumbo v0, "4023"
+    const-string/jumbo v0, "4024"
+    const-string/jumbo v0, "4025"
+    const-string/jumbo v0, "4026"
+    const-string/jumbo v0, "4027"
+    const-string/jumbo v0, "4028"
+    const-string/jumbo v0, "4029"
+    const-string/jumbo v0, "4030"
+    const-string/jumbo v0, "4031"
+    const-string/jumbo v0, "4032"
+    const-string/jumbo v0, "4033"
+    const-string/jumbo v0, "4034"
+    const-string/jumbo v0, "4035"
+    const-string/jumbo v0, "4036"
+    const-string/jumbo v0, "4037"
+    const-string/jumbo v0, "4038"
+    const-string/jumbo v0, "4039"
+    const-string/jumbo v0, "4040"
+    const-string/jumbo v0, "4041"
+    const-string/jumbo v0, "4042"
+    const-string/jumbo v0, "4043"
+    const-string/jumbo v0, "4044"
+    const-string/jumbo v0, "4045"
+    const-string/jumbo v0, "4046"
+    const-string/jumbo v0, "4047"
+    const-string/jumbo v0, "4048"
+    const-string/jumbo v0, "4049"
+    const-string/jumbo v0, "4050"
+    const-string/jumbo v0, "4051"
+    const-string/jumbo v0, "4052"
+    const-string/jumbo v0, "4053"
+    const-string/jumbo v0, "4054"
+    const-string/jumbo v0, "4055"
+    const-string/jumbo v0, "4056"
+    const-string/jumbo v0, "4057"
+    const-string/jumbo v0, "4058"
+    const-string/jumbo v0, "4059"
+    const-string/jumbo v0, "4060"
+    const-string/jumbo v0, "4061"
+    const-string/jumbo v0, "4062"
+    const-string/jumbo v0, "4063"
+    const-string/jumbo v0, "4064"
+    const-string/jumbo v0, "4065"
+    const-string/jumbo v0, "4066"
+    const-string/jumbo v0, "4067"
+    const-string/jumbo v0, "4068"
+    const-string/jumbo v0, "4069"
+    const-string/jumbo v0, "4070"
+    const-string/jumbo v0, "4071"
+    const-string/jumbo v0, "4072"
+    const-string/jumbo v0, "4073"
+    const-string/jumbo v0, "4074"
+    const-string/jumbo v0, "4075"
+    const-string/jumbo v0, "4076"
+    const-string/jumbo v0, "4077"
+    const-string/jumbo v0, "4078"
+    const-string/jumbo v0, "4079"
+    const-string/jumbo v0, "4080"
+    const-string/jumbo v0, "4081"
+    const-string/jumbo v0, "4082"
+    const-string/jumbo v0, "4083"
+    const-string/jumbo v0, "4084"
+    const-string/jumbo v0, "4085"
+    const-string/jumbo v0, "4086"
+    const-string/jumbo v0, "4087"
+    const-string/jumbo v0, "4088"
+    const-string/jumbo v0, "4089"
+    const-string/jumbo v0, "4090"
+    const-string/jumbo v0, "4091"
+    const-string/jumbo v0, "4092"
+    const-string/jumbo v0, "4093"
+    const-string/jumbo v0, "4094"
+    const-string/jumbo v0, "4095"
+    const-string/jumbo v0, "4096"
+    const-string/jumbo v0, "4097"
+    const-string/jumbo v0, "4098"
+    const-string/jumbo v0, "4099"
+    const-string/jumbo v0, "4100"
+    const-string/jumbo v0, "4101"
+    const-string/jumbo v0, "4102"
+    const-string/jumbo v0, "4103"
+    const-string/jumbo v0, "4104"
+    const-string/jumbo v0, "4105"
+    const-string/jumbo v0, "4106"
+    const-string/jumbo v0, "4107"
+    const-string/jumbo v0, "4108"
+    const-string/jumbo v0, "4109"
+    const-string/jumbo v0, "4110"
+    const-string/jumbo v0, "4111"
+    const-string/jumbo v0, "4112"
+    const-string/jumbo v0, "4113"
+    const-string/jumbo v0, "4114"
+    const-string/jumbo v0, "4115"
+    const-string/jumbo v0, "4116"
+    const-string/jumbo v0, "4117"
+    const-string/jumbo v0, "4118"
+    const-string/jumbo v0, "4119"
+    const-string/jumbo v0, "4120"
+    const-string/jumbo v0, "4121"
+    const-string/jumbo v0, "4122"
+    const-string/jumbo v0, "4123"
+    const-string/jumbo v0, "4124"
+    const-string/jumbo v0, "4125"
+    const-string/jumbo v0, "4126"
+    const-string/jumbo v0, "4127"
+    const-string/jumbo v0, "4128"
+    const-string/jumbo v0, "4129"
+    const-string/jumbo v0, "4130"
+    const-string/jumbo v0, "4131"
+    const-string/jumbo v0, "4132"
+    const-string/jumbo v0, "4133"
+    const-string/jumbo v0, "4134"
+    const-string/jumbo v0, "4135"
+    const-string/jumbo v0, "4136"
+    const-string/jumbo v0, "4137"
+    const-string/jumbo v0, "4138"
+    const-string/jumbo v0, "4139"
+    const-string/jumbo v0, "4140"
+    const-string/jumbo v0, "4141"
+    const-string/jumbo v0, "4142"
+    const-string/jumbo v0, "4143"
+    const-string/jumbo v0, "4144"
+    const-string/jumbo v0, "4145"
+    const-string/jumbo v0, "4146"
+    const-string/jumbo v0, "4147"
+    const-string/jumbo v0, "4148"
+    const-string/jumbo v0, "4149"
+    const-string/jumbo v0, "4150"
+    const-string/jumbo v0, "4151"
+    const-string/jumbo v0, "4152"
+    const-string/jumbo v0, "4153"
+    const-string/jumbo v0, "4154"
+    const-string/jumbo v0, "4155"
+    const-string/jumbo v0, "4156"
+    const-string/jumbo v0, "4157"
+    const-string/jumbo v0, "4158"
+    const-string/jumbo v0, "4159"
+    const-string/jumbo v0, "4160"
+    const-string/jumbo v0, "4161"
+    const-string/jumbo v0, "4162"
+    const-string/jumbo v0, "4163"
+    const-string/jumbo v0, "4164"
+    const-string/jumbo v0, "4165"
+    const-string/jumbo v0, "4166"
+    const-string/jumbo v0, "4167"
+    const-string/jumbo v0, "4168"
+    const-string/jumbo v0, "4169"
+    const-string/jumbo v0, "4170"
+    const-string/jumbo v0, "4171"
+    const-string/jumbo v0, "4172"
+    const-string/jumbo v0, "4173"
+    const-string/jumbo v0, "4174"
+    const-string/jumbo v0, "4175"
+    const-string/jumbo v0, "4176"
+    const-string/jumbo v0, "4177"
+    const-string/jumbo v0, "4178"
+    const-string/jumbo v0, "4179"
+    const-string/jumbo v0, "4180"
+    const-string/jumbo v0, "4181"
+    const-string/jumbo v0, "4182"
+    const-string/jumbo v0, "4183"
+    const-string/jumbo v0, "4184"
+    const-string/jumbo v0, "4185"
+    const-string/jumbo v0, "4186"
+    const-string/jumbo v0, "4187"
+    const-string/jumbo v0, "4188"
+    const-string/jumbo v0, "4189"
+    const-string/jumbo v0, "4190"
+    const-string/jumbo v0, "4191"
+    const-string/jumbo v0, "4192"
+    const-string/jumbo v0, "4193"
+    const-string/jumbo v0, "4194"
+    const-string/jumbo v0, "4195"
+    const-string/jumbo v0, "4196"
+    const-string/jumbo v0, "4197"
+    const-string/jumbo v0, "4198"
+    const-string/jumbo v0, "4199"
+    const-string/jumbo v0, "4200"
+    const-string/jumbo v0, "4201"
+    const-string/jumbo v0, "4202"
+    const-string/jumbo v0, "4203"
+    const-string/jumbo v0, "4204"
+    const-string/jumbo v0, "4205"
+    const-string/jumbo v0, "4206"
+    const-string/jumbo v0, "4207"
+    const-string/jumbo v0, "4208"
+    const-string/jumbo v0, "4209"
+    const-string/jumbo v0, "4210"
+    const-string/jumbo v0, "4211"
+    const-string/jumbo v0, "4212"
+    const-string/jumbo v0, "4213"
+    const-string/jumbo v0, "4214"
+    const-string/jumbo v0, "4215"
+    const-string/jumbo v0, "4216"
+    const-string/jumbo v0, "4217"
+    const-string/jumbo v0, "4218"
+    const-string/jumbo v0, "4219"
+    const-string/jumbo v0, "4220"
+    const-string/jumbo v0, "4221"
+    const-string/jumbo v0, "4222"
+    const-string/jumbo v0, "4223"
+    const-string/jumbo v0, "4224"
+    const-string/jumbo v0, "4225"
+    const-string/jumbo v0, "4226"
+    const-string/jumbo v0, "4227"
+    const-string/jumbo v0, "4228"
+    const-string/jumbo v0, "4229"
+    const-string/jumbo v0, "4230"
+    const-string/jumbo v0, "4231"
+    const-string/jumbo v0, "4232"
+    const-string/jumbo v0, "4233"
+    const-string/jumbo v0, "4234"
+    const-string/jumbo v0, "4235"
+    const-string/jumbo v0, "4236"
+    const-string/jumbo v0, "4237"
+    const-string/jumbo v0, "4238"
+    const-string/jumbo v0, "4239"
+    const-string/jumbo v0, "4240"
+    const-string/jumbo v0, "4241"
+    const-string/jumbo v0, "4242"
+    const-string/jumbo v0, "4243"
+    const-string/jumbo v0, "4244"
+    const-string/jumbo v0, "4245"
+    const-string/jumbo v0, "4246"
+    const-string/jumbo v0, "4247"
+    const-string/jumbo v0, "4248"
+    const-string/jumbo v0, "4249"
+    const-string/jumbo v0, "4250"
+    const-string/jumbo v0, "4251"
+    const-string/jumbo v0, "4252"
+    const-string/jumbo v0, "4253"
+    const-string/jumbo v0, "4254"
+    const-string/jumbo v0, "4255"
+    const-string/jumbo v0, "4256"
+    const-string/jumbo v0, "4257"
+    const-string/jumbo v0, "4258"
+    const-string/jumbo v0, "4259"
+    const-string/jumbo v0, "4260"
+    const-string/jumbo v0, "4261"
+    const-string/jumbo v0, "4262"
+    const-string/jumbo v0, "4263"
+    const-string/jumbo v0, "4264"
+    const-string/jumbo v0, "4265"
+    const-string/jumbo v0, "4266"
+    const-string/jumbo v0, "4267"
+    const-string/jumbo v0, "4268"
+    const-string/jumbo v0, "4269"
+    const-string/jumbo v0, "4270"
+    const-string/jumbo v0, "4271"
+    const-string/jumbo v0, "4272"
+    const-string/jumbo v0, "4273"
+    const-string/jumbo v0, "4274"
+    const-string/jumbo v0, "4275"
+    const-string/jumbo v0, "4276"
+    const-string/jumbo v0, "4277"
+    const-string/jumbo v0, "4278"
+    const-string/jumbo v0, "4279"
+    const-string/jumbo v0, "4280"
+    const-string/jumbo v0, "4281"
+    const-string/jumbo v0, "4282"
+    const-string/jumbo v0, "4283"
+    const-string/jumbo v0, "4284"
+    const-string/jumbo v0, "4285"
+    const-string/jumbo v0, "4286"
+    const-string/jumbo v0, "4287"
+    const-string/jumbo v0, "4288"
+    const-string/jumbo v0, "4289"
+    const-string/jumbo v0, "4290"
+    const-string/jumbo v0, "4291"
+    const-string/jumbo v0, "4292"
+    const-string/jumbo v0, "4293"
+    const-string/jumbo v0, "4294"
+    const-string/jumbo v0, "4295"
+    const-string/jumbo v0, "4296"
+    const-string/jumbo v0, "4297"
+    const-string/jumbo v0, "4298"
+    const-string/jumbo v0, "4299"
+    const-string/jumbo v0, "4300"
+    const-string/jumbo v0, "4301"
+    const-string/jumbo v0, "4302"
+    const-string/jumbo v0, "4303"
+    const-string/jumbo v0, "4304"
+    const-string/jumbo v0, "4305"
+    const-string/jumbo v0, "4306"
+    const-string/jumbo v0, "4307"
+    const-string/jumbo v0, "4308"
+    const-string/jumbo v0, "4309"
+    const-string/jumbo v0, "4310"
+    const-string/jumbo v0, "4311"
+    const-string/jumbo v0, "4312"
+    const-string/jumbo v0, "4313"
+    const-string/jumbo v0, "4314"
+    const-string/jumbo v0, "4315"
+    const-string/jumbo v0, "4316"
+    const-string/jumbo v0, "4317"
+    const-string/jumbo v0, "4318"
+    const-string/jumbo v0, "4319"
+    const-string/jumbo v0, "4320"
+    const-string/jumbo v0, "4321"
+    const-string/jumbo v0, "4322"
+    const-string/jumbo v0, "4323"
+    const-string/jumbo v0, "4324"
+    const-string/jumbo v0, "4325"
+    const-string/jumbo v0, "4326"
+    const-string/jumbo v0, "4327"
+    const-string/jumbo v0, "4328"
+    const-string/jumbo v0, "4329"
+    const-string/jumbo v0, "4330"
+    const-string/jumbo v0, "4331"
+    const-string/jumbo v0, "4332"
+    const-string/jumbo v0, "4333"
+    const-string/jumbo v0, "4334"
+    const-string/jumbo v0, "4335"
+    const-string/jumbo v0, "4336"
+    const-string/jumbo v0, "4337"
+    const-string/jumbo v0, "4338"
+    const-string/jumbo v0, "4339"
+    const-string/jumbo v0, "4340"
+    const-string/jumbo v0, "4341"
+    const-string/jumbo v0, "4342"
+    const-string/jumbo v0, "4343"
+    const-string/jumbo v0, "4344"
+    const-string/jumbo v0, "4345"
+    const-string/jumbo v0, "4346"
+    const-string/jumbo v0, "4347"
+    const-string/jumbo v0, "4348"
+    const-string/jumbo v0, "4349"
+    const-string/jumbo v0, "4350"
+    const-string/jumbo v0, "4351"
+    const-string/jumbo v0, "4352"
+    const-string/jumbo v0, "4353"
+    const-string/jumbo v0, "4354"
+    const-string/jumbo v0, "4355"
+    const-string/jumbo v0, "4356"
+    const-string/jumbo v0, "4357"
+    const-string/jumbo v0, "4358"
+    const-string/jumbo v0, "4359"
+    const-string/jumbo v0, "4360"
+    const-string/jumbo v0, "4361"
+    const-string/jumbo v0, "4362"
+    const-string/jumbo v0, "4363"
+    const-string/jumbo v0, "4364"
+    const-string/jumbo v0, "4365"
+    const-string/jumbo v0, "4366"
+    const-string/jumbo v0, "4367"
+    const-string/jumbo v0, "4368"
+    const-string/jumbo v0, "4369"
+    const-string/jumbo v0, "4370"
+    const-string/jumbo v0, "4371"
+    const-string/jumbo v0, "4372"
+    const-string/jumbo v0, "4373"
+    const-string/jumbo v0, "4374"
+    const-string/jumbo v0, "4375"
+    const-string/jumbo v0, "4376"
+    const-string/jumbo v0, "4377"
+    const-string/jumbo v0, "4378"
+    const-string/jumbo v0, "4379"
+    const-string/jumbo v0, "4380"
+    const-string/jumbo v0, "4381"
+    const-string/jumbo v0, "4382"
+    const-string/jumbo v0, "4383"
+    const-string/jumbo v0, "4384"
+    const-string/jumbo v0, "4385"
+    const-string/jumbo v0, "4386"
+    const-string/jumbo v0, "4387"
+    const-string/jumbo v0, "4388"
+    const-string/jumbo v0, "4389"
+    const-string/jumbo v0, "4390"
+    const-string/jumbo v0, "4391"
+    const-string/jumbo v0, "4392"
+    const-string/jumbo v0, "4393"
+    const-string/jumbo v0, "4394"
+    const-string/jumbo v0, "4395"
+    const-string/jumbo v0, "4396"
+    const-string/jumbo v0, "4397"
+    const-string/jumbo v0, "4398"
+    const-string/jumbo v0, "4399"
+    const-string/jumbo v0, "4400"
+    const-string/jumbo v0, "4401"
+    const-string/jumbo v0, "4402"
+    const-string/jumbo v0, "4403"
+    const-string/jumbo v0, "4404"
+    const-string/jumbo v0, "4405"
+    const-string/jumbo v0, "4406"
+    const-string/jumbo v0, "4407"
+    const-string/jumbo v0, "4408"
+    const-string/jumbo v0, "4409"
+    const-string/jumbo v0, "4410"
+    const-string/jumbo v0, "4411"
+    const-string/jumbo v0, "4412"
+    const-string/jumbo v0, "4413"
+    const-string/jumbo v0, "4414"
+    const-string/jumbo v0, "4415"
+    const-string/jumbo v0, "4416"
+    const-string/jumbo v0, "4417"
+    const-string/jumbo v0, "4418"
+    const-string/jumbo v0, "4419"
+    const-string/jumbo v0, "4420"
+    const-string/jumbo v0, "4421"
+    const-string/jumbo v0, "4422"
+    const-string/jumbo v0, "4423"
+    const-string/jumbo v0, "4424"
+    const-string/jumbo v0, "4425"
+    const-string/jumbo v0, "4426"
+    const-string/jumbo v0, "4427"
+    const-string/jumbo v0, "4428"
+    const-string/jumbo v0, "4429"
+    const-string/jumbo v0, "4430"
+    const-string/jumbo v0, "4431"
+    const-string/jumbo v0, "4432"
+    const-string/jumbo v0, "4433"
+    const-string/jumbo v0, "4434"
+    const-string/jumbo v0, "4435"
+    const-string/jumbo v0, "4436"
+    const-string/jumbo v0, "4437"
+    const-string/jumbo v0, "4438"
+    const-string/jumbo v0, "4439"
+    const-string/jumbo v0, "4440"
+    const-string/jumbo v0, "4441"
+    const-string/jumbo v0, "4442"
+    const-string/jumbo v0, "4443"
+    const-string/jumbo v0, "4444"
+    const-string/jumbo v0, "4445"
+    const-string/jumbo v0, "4446"
+    const-string/jumbo v0, "4447"
+    const-string/jumbo v0, "4448"
+    const-string/jumbo v0, "4449"
+    const-string/jumbo v0, "4450"
+    const-string/jumbo v0, "4451"
+    const-string/jumbo v0, "4452"
+    const-string/jumbo v0, "4453"
+    const-string/jumbo v0, "4454"
+    const-string/jumbo v0, "4455"
+    const-string/jumbo v0, "4456"
+    const-string/jumbo v0, "4457"
+    const-string/jumbo v0, "4458"
+    const-string/jumbo v0, "4459"
+    const-string/jumbo v0, "4460"
+    const-string/jumbo v0, "4461"
+    const-string/jumbo v0, "4462"
+    const-string/jumbo v0, "4463"
+    const-string/jumbo v0, "4464"
+    const-string/jumbo v0, "4465"
+    const-string/jumbo v0, "4466"
+    const-string/jumbo v0, "4467"
+    const-string/jumbo v0, "4468"
+    const-string/jumbo v0, "4469"
+    const-string/jumbo v0, "4470"
+    const-string/jumbo v0, "4471"
+    const-string/jumbo v0, "4472"
+    const-string/jumbo v0, "4473"
+    const-string/jumbo v0, "4474"
+    const-string/jumbo v0, "4475"
+    const-string/jumbo v0, "4476"
+    const-string/jumbo v0, "4477"
+    const-string/jumbo v0, "4478"
+    const-string/jumbo v0, "4479"
+    const-string/jumbo v0, "4480"
+    const-string/jumbo v0, "4481"
+    const-string/jumbo v0, "4482"
+    const-string/jumbo v0, "4483"
+    const-string/jumbo v0, "4484"
+    const-string/jumbo v0, "4485"
+    const-string/jumbo v0, "4486"
+    const-string/jumbo v0, "4487"
+    const-string/jumbo v0, "4488"
+    const-string/jumbo v0, "4489"
+    const-string/jumbo v0, "4490"
+    const-string/jumbo v0, "4491"
+    const-string/jumbo v0, "4492"
+    const-string/jumbo v0, "4493"
+    const-string/jumbo v0, "4494"
+    const-string/jumbo v0, "4495"
+    const-string/jumbo v0, "4496"
+    const-string/jumbo v0, "4497"
+    const-string/jumbo v0, "4498"
+    const-string/jumbo v0, "4499"
+    const-string/jumbo v0, "4500"
+    const-string/jumbo v0, "4501"
+    const-string/jumbo v0, "4502"
+    const-string/jumbo v0, "4503"
+    const-string/jumbo v0, "4504"
+    const-string/jumbo v0, "4505"
+    const-string/jumbo v0, "4506"
+    const-string/jumbo v0, "4507"
+    const-string/jumbo v0, "4508"
+    const-string/jumbo v0, "4509"
+    const-string/jumbo v0, "4510"
+    const-string/jumbo v0, "4511"
+    const-string/jumbo v0, "4512"
+    const-string/jumbo v0, "4513"
+    const-string/jumbo v0, "4514"
+    const-string/jumbo v0, "4515"
+    const-string/jumbo v0, "4516"
+    const-string/jumbo v0, "4517"
+    const-string/jumbo v0, "4518"
+    const-string/jumbo v0, "4519"
+    const-string/jumbo v0, "4520"
+    const-string/jumbo v0, "4521"
+    const-string/jumbo v0, "4522"
+    const-string/jumbo v0, "4523"
+    const-string/jumbo v0, "4524"
+    const-string/jumbo v0, "4525"
+    const-string/jumbo v0, "4526"
+    const-string/jumbo v0, "4527"
+    const-string/jumbo v0, "4528"
+    const-string/jumbo v0, "4529"
+    const-string/jumbo v0, "4530"
+    const-string/jumbo v0, "4531"
+    const-string/jumbo v0, "4532"
+    const-string/jumbo v0, "4533"
+    const-string/jumbo v0, "4534"
+    const-string/jumbo v0, "4535"
+    const-string/jumbo v0, "4536"
+    const-string/jumbo v0, "4537"
+    const-string/jumbo v0, "4538"
+    const-string/jumbo v0, "4539"
+    const-string/jumbo v0, "4540"
+    const-string/jumbo v0, "4541"
+    const-string/jumbo v0, "4542"
+    const-string/jumbo v0, "4543"
+    const-string/jumbo v0, "4544"
+    const-string/jumbo v0, "4545"
+    const-string/jumbo v0, "4546"
+    const-string/jumbo v0, "4547"
+    const-string/jumbo v0, "4548"
+    const-string/jumbo v0, "4549"
+    const-string/jumbo v0, "4550"
+    const-string/jumbo v0, "4551"
+    const-string/jumbo v0, "4552"
+    const-string/jumbo v0, "4553"
+    const-string/jumbo v0, "4554"
+    const-string/jumbo v0, "4555"
+    const-string/jumbo v0, "4556"
+    const-string/jumbo v0, "4557"
+    const-string/jumbo v0, "4558"
+    const-string/jumbo v0, "4559"
+    const-string/jumbo v0, "4560"
+    const-string/jumbo v0, "4561"
+    const-string/jumbo v0, "4562"
+    const-string/jumbo v0, "4563"
+    const-string/jumbo v0, "4564"
+    const-string/jumbo v0, "4565"
+    const-string/jumbo v0, "4566"
+    const-string/jumbo v0, "4567"
+    const-string/jumbo v0, "4568"
+    const-string/jumbo v0, "4569"
+    const-string/jumbo v0, "4570"
+    const-string/jumbo v0, "4571"
+    const-string/jumbo v0, "4572"
+    const-string/jumbo v0, "4573"
+    const-string/jumbo v0, "4574"
+    const-string/jumbo v0, "4575"
+    const-string/jumbo v0, "4576"
+    const-string/jumbo v0, "4577"
+    const-string/jumbo v0, "4578"
+    const-string/jumbo v0, "4579"
+    const-string/jumbo v0, "4580"
+    const-string/jumbo v0, "4581"
+    const-string/jumbo v0, "4582"
+    const-string/jumbo v0, "4583"
+    const-string/jumbo v0, "4584"
+    const-string/jumbo v0, "4585"
+    const-string/jumbo v0, "4586"
+    const-string/jumbo v0, "4587"
+    const-string/jumbo v0, "4588"
+    const-string/jumbo v0, "4589"
+    const-string/jumbo v0, "4590"
+    const-string/jumbo v0, "4591"
+    const-string/jumbo v0, "4592"
+    const-string/jumbo v0, "4593"
+    const-string/jumbo v0, "4594"
+    const-string/jumbo v0, "4595"
+    const-string/jumbo v0, "4596"
+    const-string/jumbo v0, "4597"
+    const-string/jumbo v0, "4598"
+    const-string/jumbo v0, "4599"
+    const-string/jumbo v0, "4600"
+    const-string/jumbo v0, "4601"
+    const-string/jumbo v0, "4602"
+    const-string/jumbo v0, "4603"
+    const-string/jumbo v0, "4604"
+    const-string/jumbo v0, "4605"
+    const-string/jumbo v0, "4606"
+    const-string/jumbo v0, "4607"
+    const-string/jumbo v0, "4608"
+    const-string/jumbo v0, "4609"
+    const-string/jumbo v0, "4610"
+    const-string/jumbo v0, "4611"
+    const-string/jumbo v0, "4612"
+    const-string/jumbo v0, "4613"
+    const-string/jumbo v0, "4614"
+    const-string/jumbo v0, "4615"
+    const-string/jumbo v0, "4616"
+    const-string/jumbo v0, "4617"
+    const-string/jumbo v0, "4618"
+    const-string/jumbo v0, "4619"
+    const-string/jumbo v0, "4620"
+    const-string/jumbo v0, "4621"
+    const-string/jumbo v0, "4622"
+    const-string/jumbo v0, "4623"
+    const-string/jumbo v0, "4624"
+    const-string/jumbo v0, "4625"
+    const-string/jumbo v0, "4626"
+    const-string/jumbo v0, "4627"
+    const-string/jumbo v0, "4628"
+    const-string/jumbo v0, "4629"
+    const-string/jumbo v0, "4630"
+    const-string/jumbo v0, "4631"
+    const-string/jumbo v0, "4632"
+    const-string/jumbo v0, "4633"
+    const-string/jumbo v0, "4634"
+    const-string/jumbo v0, "4635"
+    const-string/jumbo v0, "4636"
+    const-string/jumbo v0, "4637"
+    const-string/jumbo v0, "4638"
+    const-string/jumbo v0, "4639"
+    const-string/jumbo v0, "4640"
+    const-string/jumbo v0, "4641"
+    const-string/jumbo v0, "4642"
+    const-string/jumbo v0, "4643"
+    const-string/jumbo v0, "4644"
+    const-string/jumbo v0, "4645"
+    const-string/jumbo v0, "4646"
+    const-string/jumbo v0, "4647"
+    const-string/jumbo v0, "4648"
+    const-string/jumbo v0, "4649"
+    const-string/jumbo v0, "4650"
+    const-string/jumbo v0, "4651"
+    const-string/jumbo v0, "4652"
+    const-string/jumbo v0, "4653"
+    const-string/jumbo v0, "4654"
+    const-string/jumbo v0, "4655"
+    const-string/jumbo v0, "4656"
+    const-string/jumbo v0, "4657"
+    const-string/jumbo v0, "4658"
+    const-string/jumbo v0, "4659"
+    const-string/jumbo v0, "4660"
+    const-string/jumbo v0, "4661"
+    const-string/jumbo v0, "4662"
+    const-string/jumbo v0, "4663"
+    const-string/jumbo v0, "4664"
+    const-string/jumbo v0, "4665"
+    const-string/jumbo v0, "4666"
+    const-string/jumbo v0, "4667"
+    const-string/jumbo v0, "4668"
+    const-string/jumbo v0, "4669"
+    const-string/jumbo v0, "4670"
+    const-string/jumbo v0, "4671"
+    const-string/jumbo v0, "4672"
+    const-string/jumbo v0, "4673"
+    const-string/jumbo v0, "4674"
+    const-string/jumbo v0, "4675"
+    const-string/jumbo v0, "4676"
+    const-string/jumbo v0, "4677"
+    const-string/jumbo v0, "4678"
+    const-string/jumbo v0, "4679"
+    const-string/jumbo v0, "4680"
+    const-string/jumbo v0, "4681"
+    const-string/jumbo v0, "4682"
+    const-string/jumbo v0, "4683"
+    const-string/jumbo v0, "4684"
+    const-string/jumbo v0, "4685"
+    const-string/jumbo v0, "4686"
+    const-string/jumbo v0, "4687"
+    const-string/jumbo v0, "4688"
+    const-string/jumbo v0, "4689"
+    const-string/jumbo v0, "4690"
+    const-string/jumbo v0, "4691"
+    const-string/jumbo v0, "4692"
+    const-string/jumbo v0, "4693"
+    const-string/jumbo v0, "4694"
+    const-string/jumbo v0, "4695"
+    const-string/jumbo v0, "4696"
+    const-string/jumbo v0, "4697"
+    const-string/jumbo v0, "4698"
+    const-string/jumbo v0, "4699"
+    const-string/jumbo v0, "4700"
+    const-string/jumbo v0, "4701"
+    const-string/jumbo v0, "4702"
+    const-string/jumbo v0, "4703"
+    const-string/jumbo v0, "4704"
+    const-string/jumbo v0, "4705"
+    const-string/jumbo v0, "4706"
+    const-string/jumbo v0, "4707"
+    const-string/jumbo v0, "4708"
+    const-string/jumbo v0, "4709"
+    const-string/jumbo v0, "4710"
+    const-string/jumbo v0, "4711"
+    const-string/jumbo v0, "4712"
+    const-string/jumbo v0, "4713"
+    const-string/jumbo v0, "4714"
+    const-string/jumbo v0, "4715"
+    const-string/jumbo v0, "4716"
+    const-string/jumbo v0, "4717"
+    const-string/jumbo v0, "4718"
+    const-string/jumbo v0, "4719"
+    const-string/jumbo v0, "4720"
+    const-string/jumbo v0, "4721"
+    const-string/jumbo v0, "4722"
+    const-string/jumbo v0, "4723"
+    const-string/jumbo v0, "4724"
+    const-string/jumbo v0, "4725"
+    const-string/jumbo v0, "4726"
+    const-string/jumbo v0, "4727"
+    const-string/jumbo v0, "4728"
+    const-string/jumbo v0, "4729"
+    const-string/jumbo v0, "4730"
+    const-string/jumbo v0, "4731"
+    const-string/jumbo v0, "4732"
+    const-string/jumbo v0, "4733"
+    const-string/jumbo v0, "4734"
+    const-string/jumbo v0, "4735"
+    const-string/jumbo v0, "4736"
+    const-string/jumbo v0, "4737"
+    const-string/jumbo v0, "4738"
+    const-string/jumbo v0, "4739"
+    const-string/jumbo v0, "4740"
+    const-string/jumbo v0, "4741"
+    const-string/jumbo v0, "4742"
+    const-string/jumbo v0, "4743"
+    const-string/jumbo v0, "4744"
+    const-string/jumbo v0, "4745"
+    const-string/jumbo v0, "4746"
+    const-string/jumbo v0, "4747"
+    const-string/jumbo v0, "4748"
+    const-string/jumbo v0, "4749"
+    const-string/jumbo v0, "4750"
+    const-string/jumbo v0, "4751"
+    const-string/jumbo v0, "4752"
+    const-string/jumbo v0, "4753"
+    const-string/jumbo v0, "4754"
+    const-string/jumbo v0, "4755"
+    const-string/jumbo v0, "4756"
+    const-string/jumbo v0, "4757"
+    const-string/jumbo v0, "4758"
+    const-string/jumbo v0, "4759"
+    const-string/jumbo v0, "4760"
+    const-string/jumbo v0, "4761"
+    const-string/jumbo v0, "4762"
+    const-string/jumbo v0, "4763"
+    const-string/jumbo v0, "4764"
+    const-string/jumbo v0, "4765"
+    const-string/jumbo v0, "4766"
+    const-string/jumbo v0, "4767"
+    const-string/jumbo v0, "4768"
+    const-string/jumbo v0, "4769"
+    const-string/jumbo v0, "4770"
+    const-string/jumbo v0, "4771"
+    const-string/jumbo v0, "4772"
+    const-string/jumbo v0, "4773"
+    const-string/jumbo v0, "4774"
+    const-string/jumbo v0, "4775"
+    const-string/jumbo v0, "4776"
+    const-string/jumbo v0, "4777"
+    const-string/jumbo v0, "4778"
+    const-string/jumbo v0, "4779"
+    const-string/jumbo v0, "4780"
+    const-string/jumbo v0, "4781"
+    const-string/jumbo v0, "4782"
+    const-string/jumbo v0, "4783"
+    const-string/jumbo v0, "4784"
+    const-string/jumbo v0, "4785"
+    const-string/jumbo v0, "4786"
+    const-string/jumbo v0, "4787"
+    const-string/jumbo v0, "4788"
+    const-string/jumbo v0, "4789"
+    const-string/jumbo v0, "4790"
+    const-string/jumbo v0, "4791"
+    const-string/jumbo v0, "4792"
+    const-string/jumbo v0, "4793"
+    const-string/jumbo v0, "4794"
+    const-string/jumbo v0, "4795"
+    const-string/jumbo v0, "4796"
+    const-string/jumbo v0, "4797"
+    const-string/jumbo v0, "4798"
+    const-string/jumbo v0, "4799"
+    const-string/jumbo v0, "4800"
+    const-string/jumbo v0, "4801"
+    const-string/jumbo v0, "4802"
+    const-string/jumbo v0, "4803"
+    const-string/jumbo v0, "4804"
+    const-string/jumbo v0, "4805"
+    const-string/jumbo v0, "4806"
+    const-string/jumbo v0, "4807"
+    const-string/jumbo v0, "4808"
+    const-string/jumbo v0, "4809"
+    const-string/jumbo v0, "4810"
+    const-string/jumbo v0, "4811"
+    const-string/jumbo v0, "4812"
+    const-string/jumbo v0, "4813"
+    const-string/jumbo v0, "4814"
+    const-string/jumbo v0, "4815"
+    const-string/jumbo v0, "4816"
+    const-string/jumbo v0, "4817"
+    const-string/jumbo v0, "4818"
+    const-string/jumbo v0, "4819"
+    const-string/jumbo v0, "4820"
+    const-string/jumbo v0, "4821"
+    const-string/jumbo v0, "4822"
+    const-string/jumbo v0, "4823"
+    const-string/jumbo v0, "4824"
+    const-string/jumbo v0, "4825"
+    const-string/jumbo v0, "4826"
+    const-string/jumbo v0, "4827"
+    const-string/jumbo v0, "4828"
+    const-string/jumbo v0, "4829"
+    const-string/jumbo v0, "4830"
+    const-string/jumbo v0, "4831"
+    const-string/jumbo v0, "4832"
+    const-string/jumbo v0, "4833"
+    const-string/jumbo v0, "4834"
+    const-string/jumbo v0, "4835"
+    const-string/jumbo v0, "4836"
+    const-string/jumbo v0, "4837"
+    const-string/jumbo v0, "4838"
+    const-string/jumbo v0, "4839"
+    const-string/jumbo v0, "4840"
+    const-string/jumbo v0, "4841"
+    const-string/jumbo v0, "4842"
+    const-string/jumbo v0, "4843"
+    const-string/jumbo v0, "4844"
+    const-string/jumbo v0, "4845"
+    const-string/jumbo v0, "4846"
+    const-string/jumbo v0, "4847"
+    const-string/jumbo v0, "4848"
+    const-string/jumbo v0, "4849"
+    const-string/jumbo v0, "4850"
+    const-string/jumbo v0, "4851"
+    const-string/jumbo v0, "4852"
+    const-string/jumbo v0, "4853"
+    const-string/jumbo v0, "4854"
+    const-string/jumbo v0, "4855"
+    const-string/jumbo v0, "4856"
+    const-string/jumbo v0, "4857"
+    const-string/jumbo v0, "4858"
+    const-string/jumbo v0, "4859"
+    const-string/jumbo v0, "4860"
+    const-string/jumbo v0, "4861"
+    const-string/jumbo v0, "4862"
+    const-string/jumbo v0, "4863"
+    const-string/jumbo v0, "4864"
+    const-string/jumbo v0, "4865"
+    const-string/jumbo v0, "4866"
+    const-string/jumbo v0, "4867"
+    const-string/jumbo v0, "4868"
+    const-string/jumbo v0, "4869"
+    const-string/jumbo v0, "4870"
+    const-string/jumbo v0, "4871"
+    const-string/jumbo v0, "4872"
+    const-string/jumbo v0, "4873"
+    const-string/jumbo v0, "4874"
+    const-string/jumbo v0, "4875"
+    const-string/jumbo v0, "4876"
+    const-string/jumbo v0, "4877"
+    const-string/jumbo v0, "4878"
+    const-string/jumbo v0, "4879"
+    const-string/jumbo v0, "4880"
+    const-string/jumbo v0, "4881"
+    const-string/jumbo v0, "4882"
+    const-string/jumbo v0, "4883"
+    const-string/jumbo v0, "4884"
+    const-string/jumbo v0, "4885"
+    const-string/jumbo v0, "4886"
+    const-string/jumbo v0, "4887"
+    const-string/jumbo v0, "4888"
+    const-string/jumbo v0, "4889"
+    const-string/jumbo v0, "4890"
+    const-string/jumbo v0, "4891"
+    const-string/jumbo v0, "4892"
+    const-string/jumbo v0, "4893"
+    const-string/jumbo v0, "4894"
+    const-string/jumbo v0, "4895"
+    const-string/jumbo v0, "4896"
+    const-string/jumbo v0, "4897"
+    const-string/jumbo v0, "4898"
+    const-string/jumbo v0, "4899"
+    const-string/jumbo v0, "4900"
+    const-string/jumbo v0, "4901"
+    const-string/jumbo v0, "4902"
+    const-string/jumbo v0, "4903"
+    const-string/jumbo v0, "4904"
+    const-string/jumbo v0, "4905"
+    const-string/jumbo v0, "4906"
+    const-string/jumbo v0, "4907"
+    const-string/jumbo v0, "4908"
+    const-string/jumbo v0, "4909"
+    const-string/jumbo v0, "4910"
+    const-string/jumbo v0, "4911"
+    const-string/jumbo v0, "4912"
+    const-string/jumbo v0, "4913"
+    const-string/jumbo v0, "4914"
+    const-string/jumbo v0, "4915"
+    const-string/jumbo v0, "4916"
+    const-string/jumbo v0, "4917"
+    const-string/jumbo v0, "4918"
+    const-string/jumbo v0, "4919"
+    const-string/jumbo v0, "4920"
+    const-string/jumbo v0, "4921"
+    const-string/jumbo v0, "4922"
+    const-string/jumbo v0, "4923"
+    const-string/jumbo v0, "4924"
+    const-string/jumbo v0, "4925"
+    const-string/jumbo v0, "4926"
+    const-string/jumbo v0, "4927"
+    const-string/jumbo v0, "4928"
+    const-string/jumbo v0, "4929"
+    const-string/jumbo v0, "4930"
+    const-string/jumbo v0, "4931"
+    const-string/jumbo v0, "4932"
+    const-string/jumbo v0, "4933"
+    const-string/jumbo v0, "4934"
+    const-string/jumbo v0, "4935"
+    const-string/jumbo v0, "4936"
+    const-string/jumbo v0, "4937"
+    const-string/jumbo v0, "4938"
+    const-string/jumbo v0, "4939"
+    const-string/jumbo v0, "4940"
+    const-string/jumbo v0, "4941"
+    const-string/jumbo v0, "4942"
+    const-string/jumbo v0, "4943"
+    const-string/jumbo v0, "4944"
+    const-string/jumbo v0, "4945"
+    const-string/jumbo v0, "4946"
+    const-string/jumbo v0, "4947"
+    const-string/jumbo v0, "4948"
+    const-string/jumbo v0, "4949"
+    const-string/jumbo v0, "4950"
+    const-string/jumbo v0, "4951"
+    const-string/jumbo v0, "4952"
+    const-string/jumbo v0, "4953"
+    const-string/jumbo v0, "4954"
+    const-string/jumbo v0, "4955"
+    const-string/jumbo v0, "4956"
+    const-string/jumbo v0, "4957"
+    const-string/jumbo v0, "4958"
+    const-string/jumbo v0, "4959"
+    const-string/jumbo v0, "4960"
+    const-string/jumbo v0, "4961"
+    const-string/jumbo v0, "4962"
+    const-string/jumbo v0, "4963"
+    const-string/jumbo v0, "4964"
+    const-string/jumbo v0, "4965"
+    const-string/jumbo v0, "4966"
+    const-string/jumbo v0, "4967"
+    const-string/jumbo v0, "4968"
+    const-string/jumbo v0, "4969"
+    const-string/jumbo v0, "4970"
+    const-string/jumbo v0, "4971"
+    const-string/jumbo v0, "4972"
+    const-string/jumbo v0, "4973"
+    const-string/jumbo v0, "4974"
+    const-string/jumbo v0, "4975"
+    const-string/jumbo v0, "4976"
+    const-string/jumbo v0, "4977"
+    const-string/jumbo v0, "4978"
+    const-string/jumbo v0, "4979"
+    const-string/jumbo v0, "4980"
+    const-string/jumbo v0, "4981"
+    const-string/jumbo v0, "4982"
+    const-string/jumbo v0, "4983"
+    const-string/jumbo v0, "4984"
+    const-string/jumbo v0, "4985"
+    const-string/jumbo v0, "4986"
+    const-string/jumbo v0, "4987"
+    const-string/jumbo v0, "4988"
+    const-string/jumbo v0, "4989"
+    const-string/jumbo v0, "4990"
+    const-string/jumbo v0, "4991"
+    const-string/jumbo v0, "4992"
+    const-string/jumbo v0, "4993"
+    const-string/jumbo v0, "4994"
+    const-string/jumbo v0, "4995"
+    const-string/jumbo v0, "4996"
+    const-string/jumbo v0, "4997"
+    const-string/jumbo v0, "4998"
+    const-string/jumbo v0, "4999"
+    const-string/jumbo v0, "5000"
+    const-string/jumbo v0, "5001"
+    const-string/jumbo v0, "5002"
+    const-string/jumbo v0, "5003"
+    const-string/jumbo v0, "5004"
+    const-string/jumbo v0, "5005"
+    const-string/jumbo v0, "5006"
+    const-string/jumbo v0, "5007"
+    const-string/jumbo v0, "5008"
+    const-string/jumbo v0, "5009"
+    const-string/jumbo v0, "5010"
+    const-string/jumbo v0, "5011"
+    const-string/jumbo v0, "5012"
+    const-string/jumbo v0, "5013"
+    const-string/jumbo v0, "5014"
+    const-string/jumbo v0, "5015"
+    const-string/jumbo v0, "5016"
+    const-string/jumbo v0, "5017"
+    const-string/jumbo v0, "5018"
+    const-string/jumbo v0, "5019"
+    const-string/jumbo v0, "5020"
+    const-string/jumbo v0, "5021"
+    const-string/jumbo v0, "5022"
+    const-string/jumbo v0, "5023"
+    const-string/jumbo v0, "5024"
+    const-string/jumbo v0, "5025"
+    const-string/jumbo v0, "5026"
+    const-string/jumbo v0, "5027"
+    const-string/jumbo v0, "5028"
+    const-string/jumbo v0, "5029"
+    const-string/jumbo v0, "5030"
+    const-string/jumbo v0, "5031"
+    const-string/jumbo v0, "5032"
+    const-string/jumbo v0, "5033"
+    const-string/jumbo v0, "5034"
+    const-string/jumbo v0, "5035"
+    const-string/jumbo v0, "5036"
+    const-string/jumbo v0, "5037"
+    const-string/jumbo v0, "5038"
+    const-string/jumbo v0, "5039"
+    const-string/jumbo v0, "5040"
+    const-string/jumbo v0, "5041"
+    const-string/jumbo v0, "5042"
+    const-string/jumbo v0, "5043"
+    const-string/jumbo v0, "5044"
+    const-string/jumbo v0, "5045"
+    const-string/jumbo v0, "5046"
+    const-string/jumbo v0, "5047"
+    const-string/jumbo v0, "5048"
+    const-string/jumbo v0, "5049"
+    const-string/jumbo v0, "5050"
+    const-string/jumbo v0, "5051"
+    const-string/jumbo v0, "5052"
+    const-string/jumbo v0, "5053"
+    const-string/jumbo v0, "5054"
+    const-string/jumbo v0, "5055"
+    const-string/jumbo v0, "5056"
+    const-string/jumbo v0, "5057"
+    const-string/jumbo v0, "5058"
+    const-string/jumbo v0, "5059"
+    const-string/jumbo v0, "5060"
+    const-string/jumbo v0, "5061"
+    const-string/jumbo v0, "5062"
+    const-string/jumbo v0, "5063"
+    const-string/jumbo v0, "5064"
+    const-string/jumbo v0, "5065"
+    const-string/jumbo v0, "5066"
+    const-string/jumbo v0, "5067"
+    const-string/jumbo v0, "5068"
+    const-string/jumbo v0, "5069"
+    const-string/jumbo v0, "5070"
+    const-string/jumbo v0, "5071"
+    const-string/jumbo v0, "5072"
+    const-string/jumbo v0, "5073"
+    const-string/jumbo v0, "5074"
+    const-string/jumbo v0, "5075"
+    const-string/jumbo v0, "5076"
+    const-string/jumbo v0, "5077"
+    const-string/jumbo v0, "5078"
+    const-string/jumbo v0, "5079"
+    const-string/jumbo v0, "5080"
+    const-string/jumbo v0, "5081"
+    const-string/jumbo v0, "5082"
+    const-string/jumbo v0, "5083"
+    const-string/jumbo v0, "5084"
+    const-string/jumbo v0, "5085"
+    const-string/jumbo v0, "5086"
+    const-string/jumbo v0, "5087"
+    const-string/jumbo v0, "5088"
+    const-string/jumbo v0, "5089"
+    const-string/jumbo v0, "5090"
+    const-string/jumbo v0, "5091"
+    const-string/jumbo v0, "5092"
+    const-string/jumbo v0, "5093"
+    const-string/jumbo v0, "5094"
+    const-string/jumbo v0, "5095"
+    const-string/jumbo v0, "5096"
+    const-string/jumbo v0, "5097"
+    const-string/jumbo v0, "5098"
+    const-string/jumbo v0, "5099"
+    const-string/jumbo v0, "5100"
+    const-string/jumbo v0, "5101"
+    const-string/jumbo v0, "5102"
+    const-string/jumbo v0, "5103"
+    const-string/jumbo v0, "5104"
+    const-string/jumbo v0, "5105"
+    const-string/jumbo v0, "5106"
+    const-string/jumbo v0, "5107"
+    const-string/jumbo v0, "5108"
+    const-string/jumbo v0, "5109"
+    const-string/jumbo v0, "5110"
+    const-string/jumbo v0, "5111"
+    const-string/jumbo v0, "5112"
+    const-string/jumbo v0, "5113"
+    const-string/jumbo v0, "5114"
+    const-string/jumbo v0, "5115"
+    const-string/jumbo v0, "5116"
+    const-string/jumbo v0, "5117"
+    const-string/jumbo v0, "5118"
+    const-string/jumbo v0, "5119"
+    const-string/jumbo v0, "5120"
+    const-string/jumbo v0, "5121"
+    const-string/jumbo v0, "5122"
+    const-string/jumbo v0, "5123"
+    const-string/jumbo v0, "5124"
+    const-string/jumbo v0, "5125"
+    const-string/jumbo v0, "5126"
+    const-string/jumbo v0, "5127"
+    const-string/jumbo v0, "5128"
+    const-string/jumbo v0, "5129"
+    const-string/jumbo v0, "5130"
+    const-string/jumbo v0, "5131"
+    const-string/jumbo v0, "5132"
+    const-string/jumbo v0, "5133"
+    const-string/jumbo v0, "5134"
+    const-string/jumbo v0, "5135"
+    const-string/jumbo v0, "5136"
+    const-string/jumbo v0, "5137"
+    const-string/jumbo v0, "5138"
+    const-string/jumbo v0, "5139"
+    const-string/jumbo v0, "5140"
+    const-string/jumbo v0, "5141"
+    const-string/jumbo v0, "5142"
+    const-string/jumbo v0, "5143"
+    const-string/jumbo v0, "5144"
+    const-string/jumbo v0, "5145"
+    const-string/jumbo v0, "5146"
+    const-string/jumbo v0, "5147"
+    const-string/jumbo v0, "5148"
+    const-string/jumbo v0, "5149"
+    const-string/jumbo v0, "5150"
+    const-string/jumbo v0, "5151"
+    const-string/jumbo v0, "5152"
+    const-string/jumbo v0, "5153"
+    const-string/jumbo v0, "5154"
+    const-string/jumbo v0, "5155"
+    const-string/jumbo v0, "5156"
+    const-string/jumbo v0, "5157"
+    const-string/jumbo v0, "5158"
+    const-string/jumbo v0, "5159"
+    const-string/jumbo v0, "5160"
+    const-string/jumbo v0, "5161"
+    const-string/jumbo v0, "5162"
+    const-string/jumbo v0, "5163"
+    const-string/jumbo v0, "5164"
+    const-string/jumbo v0, "5165"
+    const-string/jumbo v0, "5166"
+    const-string/jumbo v0, "5167"
+    const-string/jumbo v0, "5168"
+    const-string/jumbo v0, "5169"
+    const-string/jumbo v0, "5170"
+    const-string/jumbo v0, "5171"
+    const-string/jumbo v0, "5172"
+    const-string/jumbo v0, "5173"
+    const-string/jumbo v0, "5174"
+    const-string/jumbo v0, "5175"
+    const-string/jumbo v0, "5176"
+    const-string/jumbo v0, "5177"
+    const-string/jumbo v0, "5178"
+    const-string/jumbo v0, "5179"
+    const-string/jumbo v0, "5180"
+    const-string/jumbo v0, "5181"
+    const-string/jumbo v0, "5182"
+    const-string/jumbo v0, "5183"
+    const-string/jumbo v0, "5184"
+    const-string/jumbo v0, "5185"
+    const-string/jumbo v0, "5186"
+    const-string/jumbo v0, "5187"
+    const-string/jumbo v0, "5188"
+    const-string/jumbo v0, "5189"
+    const-string/jumbo v0, "5190"
+    const-string/jumbo v0, "5191"
+    const-string/jumbo v0, "5192"
+    const-string/jumbo v0, "5193"
+    const-string/jumbo v0, "5194"
+    const-string/jumbo v0, "5195"
+    const-string/jumbo v0, "5196"
+    const-string/jumbo v0, "5197"
+    const-string/jumbo v0, "5198"
+    const-string/jumbo v0, "5199"
+    const-string/jumbo v0, "5200"
+    const-string/jumbo v0, "5201"
+    const-string/jumbo v0, "5202"
+    const-string/jumbo v0, "5203"
+    const-string/jumbo v0, "5204"
+    const-string/jumbo v0, "5205"
+    const-string/jumbo v0, "5206"
+    const-string/jumbo v0, "5207"
+    const-string/jumbo v0, "5208"
+    const-string/jumbo v0, "5209"
+    const-string/jumbo v0, "5210"
+    const-string/jumbo v0, "5211"
+    const-string/jumbo v0, "5212"
+    const-string/jumbo v0, "5213"
+    const-string/jumbo v0, "5214"
+    const-string/jumbo v0, "5215"
+    const-string/jumbo v0, "5216"
+    const-string/jumbo v0, "5217"
+    const-string/jumbo v0, "5218"
+    const-string/jumbo v0, "5219"
+    const-string/jumbo v0, "5220"
+    const-string/jumbo v0, "5221"
+    const-string/jumbo v0, "5222"
+    const-string/jumbo v0, "5223"
+    const-string/jumbo v0, "5224"
+    const-string/jumbo v0, "5225"
+    const-string/jumbo v0, "5226"
+    const-string/jumbo v0, "5227"
+    const-string/jumbo v0, "5228"
+    const-string/jumbo v0, "5229"
+    const-string/jumbo v0, "5230"
+    const-string/jumbo v0, "5231"
+    const-string/jumbo v0, "5232"
+    const-string/jumbo v0, "5233"
+    const-string/jumbo v0, "5234"
+    const-string/jumbo v0, "5235"
+    const-string/jumbo v0, "5236"
+    const-string/jumbo v0, "5237"
+    const-string/jumbo v0, "5238"
+    const-string/jumbo v0, "5239"
+    const-string/jumbo v0, "5240"
+    const-string/jumbo v0, "5241"
+    const-string/jumbo v0, "5242"
+    const-string/jumbo v0, "5243"
+    const-string/jumbo v0, "5244"
+    const-string/jumbo v0, "5245"
+    const-string/jumbo v0, "5246"
+    const-string/jumbo v0, "5247"
+    const-string/jumbo v0, "5248"
+    const-string/jumbo v0, "5249"
+    const-string/jumbo v0, "5250"
+    const-string/jumbo v0, "5251"
+    const-string/jumbo v0, "5252"
+    const-string/jumbo v0, "5253"
+    const-string/jumbo v0, "5254"
+    const-string/jumbo v0, "5255"
+    const-string/jumbo v0, "5256"
+    const-string/jumbo v0, "5257"
+    const-string/jumbo v0, "5258"
+    const-string/jumbo v0, "5259"
+    const-string/jumbo v0, "5260"
+    const-string/jumbo v0, "5261"
+    const-string/jumbo v0, "5262"
+    const-string/jumbo v0, "5263"
+    const-string/jumbo v0, "5264"
+    const-string/jumbo v0, "5265"
+    const-string/jumbo v0, "5266"
+    const-string/jumbo v0, "5267"
+    const-string/jumbo v0, "5268"
+    const-string/jumbo v0, "5269"
+    const-string/jumbo v0, "5270"
+    const-string/jumbo v0, "5271"
+    const-string/jumbo v0, "5272"
+    const-string/jumbo v0, "5273"
+    const-string/jumbo v0, "5274"
+    const-string/jumbo v0, "5275"
+    const-string/jumbo v0, "5276"
+    const-string/jumbo v0, "5277"
+    const-string/jumbo v0, "5278"
+    const-string/jumbo v0, "5279"
+    const-string/jumbo v0, "5280"
+    const-string/jumbo v0, "5281"
+    const-string/jumbo v0, "5282"
+    const-string/jumbo v0, "5283"
+    const-string/jumbo v0, "5284"
+    const-string/jumbo v0, "5285"
+    const-string/jumbo v0, "5286"
+    const-string/jumbo v0, "5287"
+    const-string/jumbo v0, "5288"
+    const-string/jumbo v0, "5289"
+    const-string/jumbo v0, "5290"
+    const-string/jumbo v0, "5291"
+    const-string/jumbo v0, "5292"
+    const-string/jumbo v0, "5293"
+    const-string/jumbo v0, "5294"
+    const-string/jumbo v0, "5295"
+    const-string/jumbo v0, "5296"
+    const-string/jumbo v0, "5297"
+    const-string/jumbo v0, "5298"
+    const-string/jumbo v0, "5299"
+    const-string/jumbo v0, "5300"
+    const-string/jumbo v0, "5301"
+    const-string/jumbo v0, "5302"
+    const-string/jumbo v0, "5303"
+    const-string/jumbo v0, "5304"
+    const-string/jumbo v0, "5305"
+    const-string/jumbo v0, "5306"
+    const-string/jumbo v0, "5307"
+    const-string/jumbo v0, "5308"
+    const-string/jumbo v0, "5309"
+    const-string/jumbo v0, "5310"
+    const-string/jumbo v0, "5311"
+    const-string/jumbo v0, "5312"
+    const-string/jumbo v0, "5313"
+    const-string/jumbo v0, "5314"
+    const-string/jumbo v0, "5315"
+    const-string/jumbo v0, "5316"
+    const-string/jumbo v0, "5317"
+    const-string/jumbo v0, "5318"
+    const-string/jumbo v0, "5319"
+    const-string/jumbo v0, "5320"
+    const-string/jumbo v0, "5321"
+    const-string/jumbo v0, "5322"
+    const-string/jumbo v0, "5323"
+    const-string/jumbo v0, "5324"
+    const-string/jumbo v0, "5325"
+    const-string/jumbo v0, "5326"
+    const-string/jumbo v0, "5327"
+    const-string/jumbo v0, "5328"
+    const-string/jumbo v0, "5329"
+    const-string/jumbo v0, "5330"
+    const-string/jumbo v0, "5331"
+    const-string/jumbo v0, "5332"
+    const-string/jumbo v0, "5333"
+    const-string/jumbo v0, "5334"
+    const-string/jumbo v0, "5335"
+    const-string/jumbo v0, "5336"
+    const-string/jumbo v0, "5337"
+    const-string/jumbo v0, "5338"
+    const-string/jumbo v0, "5339"
+    const-string/jumbo v0, "5340"
+    const-string/jumbo v0, "5341"
+    const-string/jumbo v0, "5342"
+    const-string/jumbo v0, "5343"
+    const-string/jumbo v0, "5344"
+    const-string/jumbo v0, "5345"
+    const-string/jumbo v0, "5346"
+    const-string/jumbo v0, "5347"
+    const-string/jumbo v0, "5348"
+    const-string/jumbo v0, "5349"
+    const-string/jumbo v0, "5350"
+    const-string/jumbo v0, "5351"
+    const-string/jumbo v0, "5352"
+    const-string/jumbo v0, "5353"
+    const-string/jumbo v0, "5354"
+    const-string/jumbo v0, "5355"
+    const-string/jumbo v0, "5356"
+    const-string/jumbo v0, "5357"
+    const-string/jumbo v0, "5358"
+    const-string/jumbo v0, "5359"
+    const-string/jumbo v0, "5360"
+    const-string/jumbo v0, "5361"
+    const-string/jumbo v0, "5362"
+    const-string/jumbo v0, "5363"
+    const-string/jumbo v0, "5364"
+    const-string/jumbo v0, "5365"
+    const-string/jumbo v0, "5366"
+    const-string/jumbo v0, "5367"
+    const-string/jumbo v0, "5368"
+    const-string/jumbo v0, "5369"
+    const-string/jumbo v0, "5370"
+    const-string/jumbo v0, "5371"
+    const-string/jumbo v0, "5372"
+    const-string/jumbo v0, "5373"
+    const-string/jumbo v0, "5374"
+    const-string/jumbo v0, "5375"
+    const-string/jumbo v0, "5376"
+    const-string/jumbo v0, "5377"
+    const-string/jumbo v0, "5378"
+    const-string/jumbo v0, "5379"
+    const-string/jumbo v0, "5380"
+    const-string/jumbo v0, "5381"
+    const-string/jumbo v0, "5382"
+    const-string/jumbo v0, "5383"
+    const-string/jumbo v0, "5384"
+    const-string/jumbo v0, "5385"
+    const-string/jumbo v0, "5386"
+    const-string/jumbo v0, "5387"
+    const-string/jumbo v0, "5388"
+    const-string/jumbo v0, "5389"
+    const-string/jumbo v0, "5390"
+    const-string/jumbo v0, "5391"
+    const-string/jumbo v0, "5392"
+    const-string/jumbo v0, "5393"
+    const-string/jumbo v0, "5394"
+    const-string/jumbo v0, "5395"
+    const-string/jumbo v0, "5396"
+    const-string/jumbo v0, "5397"
+    const-string/jumbo v0, "5398"
+    const-string/jumbo v0, "5399"
+    const-string/jumbo v0, "5400"
+    const-string/jumbo v0, "5401"
+    const-string/jumbo v0, "5402"
+    const-string/jumbo v0, "5403"
+    const-string/jumbo v0, "5404"
+    const-string/jumbo v0, "5405"
+    const-string/jumbo v0, "5406"
+    const-string/jumbo v0, "5407"
+    const-string/jumbo v0, "5408"
+    const-string/jumbo v0, "5409"
+    const-string/jumbo v0, "5410"
+    const-string/jumbo v0, "5411"
+    const-string/jumbo v0, "5412"
+    const-string/jumbo v0, "5413"
+    const-string/jumbo v0, "5414"
+    const-string/jumbo v0, "5415"
+    const-string/jumbo v0, "5416"
+    const-string/jumbo v0, "5417"
+    const-string/jumbo v0, "5418"
+    const-string/jumbo v0, "5419"
+    const-string/jumbo v0, "5420"
+    const-string/jumbo v0, "5421"
+    const-string/jumbo v0, "5422"
+    const-string/jumbo v0, "5423"
+    const-string/jumbo v0, "5424"
+    const-string/jumbo v0, "5425"
+    const-string/jumbo v0, "5426"
+    const-string/jumbo v0, "5427"
+    const-string/jumbo v0, "5428"
+    const-string/jumbo v0, "5429"
+    const-string/jumbo v0, "5430"
+    const-string/jumbo v0, "5431"
+    const-string/jumbo v0, "5432"
+    const-string/jumbo v0, "5433"
+    const-string/jumbo v0, "5434"
+    const-string/jumbo v0, "5435"
+    const-string/jumbo v0, "5436"
+    const-string/jumbo v0, "5437"
+    const-string/jumbo v0, "5438"
+    const-string/jumbo v0, "5439"
+    const-string/jumbo v0, "5440"
+    const-string/jumbo v0, "5441"
+    const-string/jumbo v0, "5442"
+    const-string/jumbo v0, "5443"
+    const-string/jumbo v0, "5444"
+    const-string/jumbo v0, "5445"
+    const-string/jumbo v0, "5446"
+    const-string/jumbo v0, "5447"
+    const-string/jumbo v0, "5448"
+    const-string/jumbo v0, "5449"
+    const-string/jumbo v0, "5450"
+    const-string/jumbo v0, "5451"
+    const-string/jumbo v0, "5452"
+    const-string/jumbo v0, "5453"
+    const-string/jumbo v0, "5454"
+    const-string/jumbo v0, "5455"
+    const-string/jumbo v0, "5456"
+    const-string/jumbo v0, "5457"
+    const-string/jumbo v0, "5458"
+    const-string/jumbo v0, "5459"
+    const-string/jumbo v0, "5460"
+    const-string/jumbo v0, "5461"
+    const-string/jumbo v0, "5462"
+    const-string/jumbo v0, "5463"
+    const-string/jumbo v0, "5464"
+    const-string/jumbo v0, "5465"
+    const-string/jumbo v0, "5466"
+    const-string/jumbo v0, "5467"
+    const-string/jumbo v0, "5468"
+    const-string/jumbo v0, "5469"
+    const-string/jumbo v0, "5470"
+    const-string/jumbo v0, "5471"
+    const-string/jumbo v0, "5472"
+    const-string/jumbo v0, "5473"
+    const-string/jumbo v0, "5474"
+    const-string/jumbo v0, "5475"
+    const-string/jumbo v0, "5476"
+    const-string/jumbo v0, "5477"
+    const-string/jumbo v0, "5478"
+    const-string/jumbo v0, "5479"
+    const-string/jumbo v0, "5480"
+    const-string/jumbo v0, "5481"
+    const-string/jumbo v0, "5482"
+    const-string/jumbo v0, "5483"
+    const-string/jumbo v0, "5484"
+    const-string/jumbo v0, "5485"
+    const-string/jumbo v0, "5486"
+    const-string/jumbo v0, "5487"
+    const-string/jumbo v0, "5488"
+    const-string/jumbo v0, "5489"
+    const-string/jumbo v0, "5490"
+    const-string/jumbo v0, "5491"
+    const-string/jumbo v0, "5492"
+    const-string/jumbo v0, "5493"
+    const-string/jumbo v0, "5494"
+    const-string/jumbo v0, "5495"
+    const-string/jumbo v0, "5496"
+    const-string/jumbo v0, "5497"
+    const-string/jumbo v0, "5498"
+    const-string/jumbo v0, "5499"
+    const-string/jumbo v0, "5500"
+    const-string/jumbo v0, "5501"
+    const-string/jumbo v0, "5502"
+    const-string/jumbo v0, "5503"
+    const-string/jumbo v0, "5504"
+    const-string/jumbo v0, "5505"
+    const-string/jumbo v0, "5506"
+    const-string/jumbo v0, "5507"
+    const-string/jumbo v0, "5508"
+    const-string/jumbo v0, "5509"
+    const-string/jumbo v0, "5510"
+    const-string/jumbo v0, "5511"
+    const-string/jumbo v0, "5512"
+    const-string/jumbo v0, "5513"
+    const-string/jumbo v0, "5514"
+    const-string/jumbo v0, "5515"
+    const-string/jumbo v0, "5516"
+    const-string/jumbo v0, "5517"
+    const-string/jumbo v0, "5518"
+    const-string/jumbo v0, "5519"
+    const-string/jumbo v0, "5520"
+    const-string/jumbo v0, "5521"
+    const-string/jumbo v0, "5522"
+    const-string/jumbo v0, "5523"
+    const-string/jumbo v0, "5524"
+    const-string/jumbo v0, "5525"
+    const-string/jumbo v0, "5526"
+    const-string/jumbo v0, "5527"
+    const-string/jumbo v0, "5528"
+    const-string/jumbo v0, "5529"
+    const-string/jumbo v0, "5530"
+    const-string/jumbo v0, "5531"
+    const-string/jumbo v0, "5532"
+    const-string/jumbo v0, "5533"
+    const-string/jumbo v0, "5534"
+    const-string/jumbo v0, "5535"
+    const-string/jumbo v0, "5536"
+    const-string/jumbo v0, "5537"
+    const-string/jumbo v0, "5538"
+    const-string/jumbo v0, "5539"
+    const-string/jumbo v0, "5540"
+    const-string/jumbo v0, "5541"
+    const-string/jumbo v0, "5542"
+    const-string/jumbo v0, "5543"
+    const-string/jumbo v0, "5544"
+    const-string/jumbo v0, "5545"
+    const-string/jumbo v0, "5546"
+    const-string/jumbo v0, "5547"
+    const-string/jumbo v0, "5548"
+    const-string/jumbo v0, "5549"
+    const-string/jumbo v0, "5550"
+    const-string/jumbo v0, "5551"
+    const-string/jumbo v0, "5552"
+    const-string/jumbo v0, "5553"
+    const-string/jumbo v0, "5554"
+    const-string/jumbo v0, "5555"
+    const-string/jumbo v0, "5556"
+    const-string/jumbo v0, "5557"
+    const-string/jumbo v0, "5558"
+    const-string/jumbo v0, "5559"
+    const-string/jumbo v0, "5560"
+    const-string/jumbo v0, "5561"
+    const-string/jumbo v0, "5562"
+    const-string/jumbo v0, "5563"
+    const-string/jumbo v0, "5564"
+    const-string/jumbo v0, "5565"
+    const-string/jumbo v0, "5566"
+    const-string/jumbo v0, "5567"
+    const-string/jumbo v0, "5568"
+    const-string/jumbo v0, "5569"
+    const-string/jumbo v0, "5570"
+    const-string/jumbo v0, "5571"
+    const-string/jumbo v0, "5572"
+    const-string/jumbo v0, "5573"
+    const-string/jumbo v0, "5574"
+    const-string/jumbo v0, "5575"
+    const-string/jumbo v0, "5576"
+    const-string/jumbo v0, "5577"
+    const-string/jumbo v0, "5578"
+    const-string/jumbo v0, "5579"
+    const-string/jumbo v0, "5580"
+    const-string/jumbo v0, "5581"
+    const-string/jumbo v0, "5582"
+    const-string/jumbo v0, "5583"
+    const-string/jumbo v0, "5584"
+    const-string/jumbo v0, "5585"
+    const-string/jumbo v0, "5586"
+    const-string/jumbo v0, "5587"
+    const-string/jumbo v0, "5588"
+    const-string/jumbo v0, "5589"
+    const-string/jumbo v0, "5590"
+    const-string/jumbo v0, "5591"
+    const-string/jumbo v0, "5592"
+    const-string/jumbo v0, "5593"
+    const-string/jumbo v0, "5594"
+    const-string/jumbo v0, "5595"
+    const-string/jumbo v0, "5596"
+    const-string/jumbo v0, "5597"
+    const-string/jumbo v0, "5598"
+    const-string/jumbo v0, "5599"
+    const-string/jumbo v0, "5600"
+    const-string/jumbo v0, "5601"
+    const-string/jumbo v0, "5602"
+    const-string/jumbo v0, "5603"
+    const-string/jumbo v0, "5604"
+    const-string/jumbo v0, "5605"
+    const-string/jumbo v0, "5606"
+    const-string/jumbo v0, "5607"
+    const-string/jumbo v0, "5608"
+    const-string/jumbo v0, "5609"
+    const-string/jumbo v0, "5610"
+    const-string/jumbo v0, "5611"
+    const-string/jumbo v0, "5612"
+    const-string/jumbo v0, "5613"
+    const-string/jumbo v0, "5614"
+    const-string/jumbo v0, "5615"
+    const-string/jumbo v0, "5616"
+    const-string/jumbo v0, "5617"
+    const-string/jumbo v0, "5618"
+    const-string/jumbo v0, "5619"
+    const-string/jumbo v0, "5620"
+    const-string/jumbo v0, "5621"
+    const-string/jumbo v0, "5622"
+    const-string/jumbo v0, "5623"
+    const-string/jumbo v0, "5624"
+    const-string/jumbo v0, "5625"
+    const-string/jumbo v0, "5626"
+    const-string/jumbo v0, "5627"
+    const-string/jumbo v0, "5628"
+    const-string/jumbo v0, "5629"
+    const-string/jumbo v0, "5630"
+    const-string/jumbo v0, "5631"
+    const-string/jumbo v0, "5632"
+    const-string/jumbo v0, "5633"
+    const-string/jumbo v0, "5634"
+    const-string/jumbo v0, "5635"
+    const-string/jumbo v0, "5636"
+    const-string/jumbo v0, "5637"
+    const-string/jumbo v0, "5638"
+    const-string/jumbo v0, "5639"
+    const-string/jumbo v0, "5640"
+    const-string/jumbo v0, "5641"
+    const-string/jumbo v0, "5642"
+    const-string/jumbo v0, "5643"
+    const-string/jumbo v0, "5644"
+    const-string/jumbo v0, "5645"
+    const-string/jumbo v0, "5646"
+    const-string/jumbo v0, "5647"
+    const-string/jumbo v0, "5648"
+    const-string/jumbo v0, "5649"
+    const-string/jumbo v0, "5650"
+    const-string/jumbo v0, "5651"
+    const-string/jumbo v0, "5652"
+    const-string/jumbo v0, "5653"
+    const-string/jumbo v0, "5654"
+    const-string/jumbo v0, "5655"
+    const-string/jumbo v0, "5656"
+    const-string/jumbo v0, "5657"
+    const-string/jumbo v0, "5658"
+    const-string/jumbo v0, "5659"
+    const-string/jumbo v0, "5660"
+    const-string/jumbo v0, "5661"
+    const-string/jumbo v0, "5662"
+    const-string/jumbo v0, "5663"
+    const-string/jumbo v0, "5664"
+    const-string/jumbo v0, "5665"
+    const-string/jumbo v0, "5666"
+    const-string/jumbo v0, "5667"
+    const-string/jumbo v0, "5668"
+    const-string/jumbo v0, "5669"
+    const-string/jumbo v0, "5670"
+    const-string/jumbo v0, "5671"
+    const-string/jumbo v0, "5672"
+    const-string/jumbo v0, "5673"
+    const-string/jumbo v0, "5674"
+    const-string/jumbo v0, "5675"
+    const-string/jumbo v0, "5676"
+    const-string/jumbo v0, "5677"
+    const-string/jumbo v0, "5678"
+    const-string/jumbo v0, "5679"
+    const-string/jumbo v0, "5680"
+    const-string/jumbo v0, "5681"
+    const-string/jumbo v0, "5682"
+    const-string/jumbo v0, "5683"
+    const-string/jumbo v0, "5684"
+    const-string/jumbo v0, "5685"
+    const-string/jumbo v0, "5686"
+    const-string/jumbo v0, "5687"
+    const-string/jumbo v0, "5688"
+    const-string/jumbo v0, "5689"
+    const-string/jumbo v0, "5690"
+    const-string/jumbo v0, "5691"
+    const-string/jumbo v0, "5692"
+    const-string/jumbo v0, "5693"
+    const-string/jumbo v0, "5694"
+    const-string/jumbo v0, "5695"
+    const-string/jumbo v0, "5696"
+    const-string/jumbo v0, "5697"
+    const-string/jumbo v0, "5698"
+    const-string/jumbo v0, "5699"
+    const-string/jumbo v0, "5700"
+    const-string/jumbo v0, "5701"
+    const-string/jumbo v0, "5702"
+    const-string/jumbo v0, "5703"
+    const-string/jumbo v0, "5704"
+    const-string/jumbo v0, "5705"
+    const-string/jumbo v0, "5706"
+    const-string/jumbo v0, "5707"
+    const-string/jumbo v0, "5708"
+    const-string/jumbo v0, "5709"
+    const-string/jumbo v0, "5710"
+    const-string/jumbo v0, "5711"
+    const-string/jumbo v0, "5712"
+    const-string/jumbo v0, "5713"
+    const-string/jumbo v0, "5714"
+    const-string/jumbo v0, "5715"
+    const-string/jumbo v0, "5716"
+    const-string/jumbo v0, "5717"
+    const-string/jumbo v0, "5718"
+    const-string/jumbo v0, "5719"
+    const-string/jumbo v0, "5720"
+    const-string/jumbo v0, "5721"
+    const-string/jumbo v0, "5722"
+    const-string/jumbo v0, "5723"
+    const-string/jumbo v0, "5724"
+    const-string/jumbo v0, "5725"
+    const-string/jumbo v0, "5726"
+    const-string/jumbo v0, "5727"
+    const-string/jumbo v0, "5728"
+    const-string/jumbo v0, "5729"
+    const-string/jumbo v0, "5730"
+    const-string/jumbo v0, "5731"
+    const-string/jumbo v0, "5732"
+    const-string/jumbo v0, "5733"
+    const-string/jumbo v0, "5734"
+    const-string/jumbo v0, "5735"
+    const-string/jumbo v0, "5736"
+    const-string/jumbo v0, "5737"
+    const-string/jumbo v0, "5738"
+    const-string/jumbo v0, "5739"
+    const-string/jumbo v0, "5740"
+    const-string/jumbo v0, "5741"
+    const-string/jumbo v0, "5742"
+    const-string/jumbo v0, "5743"
+    const-string/jumbo v0, "5744"
+    const-string/jumbo v0, "5745"
+    const-string/jumbo v0, "5746"
+    const-string/jumbo v0, "5747"
+    const-string/jumbo v0, "5748"
+    const-string/jumbo v0, "5749"
+    const-string/jumbo v0, "5750"
+    const-string/jumbo v0, "5751"
+    const-string/jumbo v0, "5752"
+    const-string/jumbo v0, "5753"
+    const-string/jumbo v0, "5754"
+    const-string/jumbo v0, "5755"
+    const-string/jumbo v0, "5756"
+    const-string/jumbo v0, "5757"
+    const-string/jumbo v0, "5758"
+    const-string/jumbo v0, "5759"
+    const-string/jumbo v0, "5760"
+    const-string/jumbo v0, "5761"
+    const-string/jumbo v0, "5762"
+    const-string/jumbo v0, "5763"
+    const-string/jumbo v0, "5764"
+    const-string/jumbo v0, "5765"
+    const-string/jumbo v0, "5766"
+    const-string/jumbo v0, "5767"
+    const-string/jumbo v0, "5768"
+    const-string/jumbo v0, "5769"
+    const-string/jumbo v0, "5770"
+    const-string/jumbo v0, "5771"
+    const-string/jumbo v0, "5772"
+    const-string/jumbo v0, "5773"
+    const-string/jumbo v0, "5774"
+    const-string/jumbo v0, "5775"
+    const-string/jumbo v0, "5776"
+    const-string/jumbo v0, "5777"
+    const-string/jumbo v0, "5778"
+    const-string/jumbo v0, "5779"
+    const-string/jumbo v0, "5780"
+    const-string/jumbo v0, "5781"
+    const-string/jumbo v0, "5782"
+    const-string/jumbo v0, "5783"
+    const-string/jumbo v0, "5784"
+    const-string/jumbo v0, "5785"
+    const-string/jumbo v0, "5786"
+    const-string/jumbo v0, "5787"
+    const-string/jumbo v0, "5788"
+    const-string/jumbo v0, "5789"
+    const-string/jumbo v0, "5790"
+    const-string/jumbo v0, "5791"
+    const-string/jumbo v0, "5792"
+    const-string/jumbo v0, "5793"
+    const-string/jumbo v0, "5794"
+    const-string/jumbo v0, "5795"
+    const-string/jumbo v0, "5796"
+    const-string/jumbo v0, "5797"
+    const-string/jumbo v0, "5798"
+    const-string/jumbo v0, "5799"
+    const-string/jumbo v0, "5800"
+    const-string/jumbo v0, "5801"
+    const-string/jumbo v0, "5802"
+    const-string/jumbo v0, "5803"
+    const-string/jumbo v0, "5804"
+    const-string/jumbo v0, "5805"
+    const-string/jumbo v0, "5806"
+    const-string/jumbo v0, "5807"
+    const-string/jumbo v0, "5808"
+    const-string/jumbo v0, "5809"
+    const-string/jumbo v0, "5810"
+    const-string/jumbo v0, "5811"
+    const-string/jumbo v0, "5812"
+    const-string/jumbo v0, "5813"
+    const-string/jumbo v0, "5814"
+    const-string/jumbo v0, "5815"
+    const-string/jumbo v0, "5816"
+    const-string/jumbo v0, "5817"
+    const-string/jumbo v0, "5818"
+    const-string/jumbo v0, "5819"
+    const-string/jumbo v0, "5820"
+    const-string/jumbo v0, "5821"
+    const-string/jumbo v0, "5822"
+    const-string/jumbo v0, "5823"
+    const-string/jumbo v0, "5824"
+    const-string/jumbo v0, "5825"
+    const-string/jumbo v0, "5826"
+    const-string/jumbo v0, "5827"
+    const-string/jumbo v0, "5828"
+    const-string/jumbo v0, "5829"
+    const-string/jumbo v0, "5830"
+    const-string/jumbo v0, "5831"
+    const-string/jumbo v0, "5832"
+    const-string/jumbo v0, "5833"
+    const-string/jumbo v0, "5834"
+    const-string/jumbo v0, "5835"
+    const-string/jumbo v0, "5836"
+    const-string/jumbo v0, "5837"
+    const-string/jumbo v0, "5838"
+    const-string/jumbo v0, "5839"
+    const-string/jumbo v0, "5840"
+    const-string/jumbo v0, "5841"
+    const-string/jumbo v0, "5842"
+    const-string/jumbo v0, "5843"
+    const-string/jumbo v0, "5844"
+    const-string/jumbo v0, "5845"
+    const-string/jumbo v0, "5846"
+    const-string/jumbo v0, "5847"
+    const-string/jumbo v0, "5848"
+    const-string/jumbo v0, "5849"
+    const-string/jumbo v0, "5850"
+    const-string/jumbo v0, "5851"
+    const-string/jumbo v0, "5852"
+    const-string/jumbo v0, "5853"
+    const-string/jumbo v0, "5854"
+    const-string/jumbo v0, "5855"
+    const-string/jumbo v0, "5856"
+    const-string/jumbo v0, "5857"
+    const-string/jumbo v0, "5858"
+    const-string/jumbo v0, "5859"
+    const-string/jumbo v0, "5860"
+    const-string/jumbo v0, "5861"
+    const-string/jumbo v0, "5862"
+    const-string/jumbo v0, "5863"
+    const-string/jumbo v0, "5864"
+    const-string/jumbo v0, "5865"
+    const-string/jumbo v0, "5866"
+    const-string/jumbo v0, "5867"
+    const-string/jumbo v0, "5868"
+    const-string/jumbo v0, "5869"
+    const-string/jumbo v0, "5870"
+    const-string/jumbo v0, "5871"
+    const-string/jumbo v0, "5872"
+    const-string/jumbo v0, "5873"
+    const-string/jumbo v0, "5874"
+    const-string/jumbo v0, "5875"
+    const-string/jumbo v0, "5876"
+    const-string/jumbo v0, "5877"
+    const-string/jumbo v0, "5878"
+    const-string/jumbo v0, "5879"
+    const-string/jumbo v0, "5880"
+    const-string/jumbo v0, "5881"
+    const-string/jumbo v0, "5882"
+    const-string/jumbo v0, "5883"
+    const-string/jumbo v0, "5884"
+    const-string/jumbo v0, "5885"
+    const-string/jumbo v0, "5886"
+    const-string/jumbo v0, "5887"
+    const-string/jumbo v0, "5888"
+    const-string/jumbo v0, "5889"
+    const-string/jumbo v0, "5890"
+    const-string/jumbo v0, "5891"
+    const-string/jumbo v0, "5892"
+    const-string/jumbo v0, "5893"
+    const-string/jumbo v0, "5894"
+    const-string/jumbo v0, "5895"
+    const-string/jumbo v0, "5896"
+    const-string/jumbo v0, "5897"
+    const-string/jumbo v0, "5898"
+    const-string/jumbo v0, "5899"
+    const-string/jumbo v0, "5900"
+    const-string/jumbo v0, "5901"
+    const-string/jumbo v0, "5902"
+    const-string/jumbo v0, "5903"
+    const-string/jumbo v0, "5904"
+    const-string/jumbo v0, "5905"
+    const-string/jumbo v0, "5906"
+    const-string/jumbo v0, "5907"
+    const-string/jumbo v0, "5908"
+    const-string/jumbo v0, "5909"
+    const-string/jumbo v0, "5910"
+    const-string/jumbo v0, "5911"
+    const-string/jumbo v0, "5912"
+    const-string/jumbo v0, "5913"
+    const-string/jumbo v0, "5914"
+    const-string/jumbo v0, "5915"
+    const-string/jumbo v0, "5916"
+    const-string/jumbo v0, "5917"
+    const-string/jumbo v0, "5918"
+    const-string/jumbo v0, "5919"
+    const-string/jumbo v0, "5920"
+    const-string/jumbo v0, "5921"
+    const-string/jumbo v0, "5922"
+    const-string/jumbo v0, "5923"
+    const-string/jumbo v0, "5924"
+    const-string/jumbo v0, "5925"
+    const-string/jumbo v0, "5926"
+    const-string/jumbo v0, "5927"
+    const-string/jumbo v0, "5928"
+    const-string/jumbo v0, "5929"
+    const-string/jumbo v0, "5930"
+    const-string/jumbo v0, "5931"
+    const-string/jumbo v0, "5932"
+    const-string/jumbo v0, "5933"
+    const-string/jumbo v0, "5934"
+    const-string/jumbo v0, "5935"
+    const-string/jumbo v0, "5936"
+    const-string/jumbo v0, "5937"
+    const-string/jumbo v0, "5938"
+    const-string/jumbo v0, "5939"
+    const-string/jumbo v0, "5940"
+    const-string/jumbo v0, "5941"
+    const-string/jumbo v0, "5942"
+    const-string/jumbo v0, "5943"
+    const-string/jumbo v0, "5944"
+    const-string/jumbo v0, "5945"
+    const-string/jumbo v0, "5946"
+    const-string/jumbo v0, "5947"
+    const-string/jumbo v0, "5948"
+    const-string/jumbo v0, "5949"
+    const-string/jumbo v0, "5950"
+    const-string/jumbo v0, "5951"
+    const-string/jumbo v0, "5952"
+    const-string/jumbo v0, "5953"
+    const-string/jumbo v0, "5954"
+    const-string/jumbo v0, "5955"
+    const-string/jumbo v0, "5956"
+    const-string/jumbo v0, "5957"
+    const-string/jumbo v0, "5958"
+    const-string/jumbo v0, "5959"
+    const-string/jumbo v0, "5960"
+    const-string/jumbo v0, "5961"
+    const-string/jumbo v0, "5962"
+    const-string/jumbo v0, "5963"
+    const-string/jumbo v0, "5964"
+    const-string/jumbo v0, "5965"
+    const-string/jumbo v0, "5966"
+    const-string/jumbo v0, "5967"
+    const-string/jumbo v0, "5968"
+    const-string/jumbo v0, "5969"
+    const-string/jumbo v0, "5970"
+    const-string/jumbo v0, "5971"
+    const-string/jumbo v0, "5972"
+    const-string/jumbo v0, "5973"
+    const-string/jumbo v0, "5974"
+    const-string/jumbo v0, "5975"
+    const-string/jumbo v0, "5976"
+    const-string/jumbo v0, "5977"
+    const-string/jumbo v0, "5978"
+    const-string/jumbo v0, "5979"
+    const-string/jumbo v0, "5980"
+    const-string/jumbo v0, "5981"
+    const-string/jumbo v0, "5982"
+    const-string/jumbo v0, "5983"
+    const-string/jumbo v0, "5984"
+    const-string/jumbo v0, "5985"
+    const-string/jumbo v0, "5986"
+    const-string/jumbo v0, "5987"
+    const-string/jumbo v0, "5988"
+    const-string/jumbo v0, "5989"
+    const-string/jumbo v0, "5990"
+    const-string/jumbo v0, "5991"
+    const-string/jumbo v0, "5992"
+    const-string/jumbo v0, "5993"
+    const-string/jumbo v0, "5994"
+    const-string/jumbo v0, "5995"
+    const-string/jumbo v0, "5996"
+    const-string/jumbo v0, "5997"
+    const-string/jumbo v0, "5998"
+    const-string/jumbo v0, "5999"
+    const-string/jumbo v0, "6000"
+    const-string/jumbo v0, "6001"
+    const-string/jumbo v0, "6002"
+    const-string/jumbo v0, "6003"
+    const-string/jumbo v0, "6004"
+    const-string/jumbo v0, "6005"
+    const-string/jumbo v0, "6006"
+    const-string/jumbo v0, "6007"
+    const-string/jumbo v0, "6008"
+    const-string/jumbo v0, "6009"
+    const-string/jumbo v0, "6010"
+    const-string/jumbo v0, "6011"
+    const-string/jumbo v0, "6012"
+    const-string/jumbo v0, "6013"
+    const-string/jumbo v0, "6014"
+    const-string/jumbo v0, "6015"
+    const-string/jumbo v0, "6016"
+    const-string/jumbo v0, "6017"
+    const-string/jumbo v0, "6018"
+    const-string/jumbo v0, "6019"
+    const-string/jumbo v0, "6020"
+    const-string/jumbo v0, "6021"
+    const-string/jumbo v0, "6022"
+    const-string/jumbo v0, "6023"
+    const-string/jumbo v0, "6024"
+    const-string/jumbo v0, "6025"
+    const-string/jumbo v0, "6026"
+    const-string/jumbo v0, "6027"
+    const-string/jumbo v0, "6028"
+    const-string/jumbo v0, "6029"
+    const-string/jumbo v0, "6030"
+    const-string/jumbo v0, "6031"
+    const-string/jumbo v0, "6032"
+    const-string/jumbo v0, "6033"
+    const-string/jumbo v0, "6034"
+    const-string/jumbo v0, "6035"
+    const-string/jumbo v0, "6036"
+    const-string/jumbo v0, "6037"
+    const-string/jumbo v0, "6038"
+    const-string/jumbo v0, "6039"
+    const-string/jumbo v0, "6040"
+    const-string/jumbo v0, "6041"
+    const-string/jumbo v0, "6042"
+    const-string/jumbo v0, "6043"
+    const-string/jumbo v0, "6044"
+    const-string/jumbo v0, "6045"
+    const-string/jumbo v0, "6046"
+    const-string/jumbo v0, "6047"
+    const-string/jumbo v0, "6048"
+    const-string/jumbo v0, "6049"
+    const-string/jumbo v0, "6050"
+    const-string/jumbo v0, "6051"
+    const-string/jumbo v0, "6052"
+    const-string/jumbo v0, "6053"
+    const-string/jumbo v0, "6054"
+    const-string/jumbo v0, "6055"
+    const-string/jumbo v0, "6056"
+    const-string/jumbo v0, "6057"
+    const-string/jumbo v0, "6058"
+    const-string/jumbo v0, "6059"
+    const-string/jumbo v0, "6060"
+    const-string/jumbo v0, "6061"
+    const-string/jumbo v0, "6062"
+    const-string/jumbo v0, "6063"
+    const-string/jumbo v0, "6064"
+    const-string/jumbo v0, "6065"
+    const-string/jumbo v0, "6066"
+    const-string/jumbo v0, "6067"
+    const-string/jumbo v0, "6068"
+    const-string/jumbo v0, "6069"
+    const-string/jumbo v0, "6070"
+    const-string/jumbo v0, "6071"
+    const-string/jumbo v0, "6072"
+    const-string/jumbo v0, "6073"
+    const-string/jumbo v0, "6074"
+    const-string/jumbo v0, "6075"
+    const-string/jumbo v0, "6076"
+    const-string/jumbo v0, "6077"
+    const-string/jumbo v0, "6078"
+    const-string/jumbo v0, "6079"
+    const-string/jumbo v0, "6080"
+    const-string/jumbo v0, "6081"
+    const-string/jumbo v0, "6082"
+    const-string/jumbo v0, "6083"
+    const-string/jumbo v0, "6084"
+    const-string/jumbo v0, "6085"
+    const-string/jumbo v0, "6086"
+    const-string/jumbo v0, "6087"
+    const-string/jumbo v0, "6088"
+    const-string/jumbo v0, "6089"
+    const-string/jumbo v0, "6090"
+    const-string/jumbo v0, "6091"
+    const-string/jumbo v0, "6092"
+    const-string/jumbo v0, "6093"
+    const-string/jumbo v0, "6094"
+    const-string/jumbo v0, "6095"
+    const-string/jumbo v0, "6096"
+    const-string/jumbo v0, "6097"
+    const-string/jumbo v0, "6098"
+    const-string/jumbo v0, "6099"
+    const-string/jumbo v0, "6100"
+    const-string/jumbo v0, "6101"
+    const-string/jumbo v0, "6102"
+    const-string/jumbo v0, "6103"
+    const-string/jumbo v0, "6104"
+    const-string/jumbo v0, "6105"
+    const-string/jumbo v0, "6106"
+    const-string/jumbo v0, "6107"
+    const-string/jumbo v0, "6108"
+    const-string/jumbo v0, "6109"
+    const-string/jumbo v0, "6110"
+    const-string/jumbo v0, "6111"
+    const-string/jumbo v0, "6112"
+    const-string/jumbo v0, "6113"
+    const-string/jumbo v0, "6114"
+    const-string/jumbo v0, "6115"
+    const-string/jumbo v0, "6116"
+    const-string/jumbo v0, "6117"
+    const-string/jumbo v0, "6118"
+    const-string/jumbo v0, "6119"
+    const-string/jumbo v0, "6120"
+    const-string/jumbo v0, "6121"
+    const-string/jumbo v0, "6122"
+    const-string/jumbo v0, "6123"
+    const-string/jumbo v0, "6124"
+    const-string/jumbo v0, "6125"
+    const-string/jumbo v0, "6126"
+    const-string/jumbo v0, "6127"
+    const-string/jumbo v0, "6128"
+    const-string/jumbo v0, "6129"
+    const-string/jumbo v0, "6130"
+    const-string/jumbo v0, "6131"
+    const-string/jumbo v0, "6132"
+    const-string/jumbo v0, "6133"
+    const-string/jumbo v0, "6134"
+    const-string/jumbo v0, "6135"
+    const-string/jumbo v0, "6136"
+    const-string/jumbo v0, "6137"
+    const-string/jumbo v0, "6138"
+    const-string/jumbo v0, "6139"
+    const-string/jumbo v0, "6140"
+    const-string/jumbo v0, "6141"
+    const-string/jumbo v0, "6142"
+    const-string/jumbo v0, "6143"
+    const-string/jumbo v0, "6144"
+    const-string/jumbo v0, "6145"
+    const-string/jumbo v0, "6146"
+    const-string/jumbo v0, "6147"
+    const-string/jumbo v0, "6148"
+    const-string/jumbo v0, "6149"
+    const-string/jumbo v0, "6150"
+    const-string/jumbo v0, "6151"
+    const-string/jumbo v0, "6152"
+    const-string/jumbo v0, "6153"
+    const-string/jumbo v0, "6154"
+    const-string/jumbo v0, "6155"
+    const-string/jumbo v0, "6156"
+    const-string/jumbo v0, "6157"
+    const-string/jumbo v0, "6158"
+    const-string/jumbo v0, "6159"
+    const-string/jumbo v0, "6160"
+    const-string/jumbo v0, "6161"
+    const-string/jumbo v0, "6162"
+    const-string/jumbo v0, "6163"
+    const-string/jumbo v0, "6164"
+    const-string/jumbo v0, "6165"
+    const-string/jumbo v0, "6166"
+    const-string/jumbo v0, "6167"
+    const-string/jumbo v0, "6168"
+    const-string/jumbo v0, "6169"
+    const-string/jumbo v0, "6170"
+    const-string/jumbo v0, "6171"
+    const-string/jumbo v0, "6172"
+    const-string/jumbo v0, "6173"
+    const-string/jumbo v0, "6174"
+    const-string/jumbo v0, "6175"
+    const-string/jumbo v0, "6176"
+    const-string/jumbo v0, "6177"
+    const-string/jumbo v0, "6178"
+    const-string/jumbo v0, "6179"
+    const-string/jumbo v0, "6180"
+    const-string/jumbo v0, "6181"
+    const-string/jumbo v0, "6182"
+    const-string/jumbo v0, "6183"
+    const-string/jumbo v0, "6184"
+    const-string/jumbo v0, "6185"
+    const-string/jumbo v0, "6186"
+    const-string/jumbo v0, "6187"
+    const-string/jumbo v0, "6188"
+    const-string/jumbo v0, "6189"
+    const-string/jumbo v0, "6190"
+    const-string/jumbo v0, "6191"
+    const-string/jumbo v0, "6192"
+    const-string/jumbo v0, "6193"
+    const-string/jumbo v0, "6194"
+    const-string/jumbo v0, "6195"
+    const-string/jumbo v0, "6196"
+    const-string/jumbo v0, "6197"
+    const-string/jumbo v0, "6198"
+    const-string/jumbo v0, "6199"
+    const-string/jumbo v0, "6200"
+    const-string/jumbo v0, "6201"
+    const-string/jumbo v0, "6202"
+    const-string/jumbo v0, "6203"
+    const-string/jumbo v0, "6204"
+    const-string/jumbo v0, "6205"
+    const-string/jumbo v0, "6206"
+    const-string/jumbo v0, "6207"
+    const-string/jumbo v0, "6208"
+    const-string/jumbo v0, "6209"
+    const-string/jumbo v0, "6210"
+    const-string/jumbo v0, "6211"
+    const-string/jumbo v0, "6212"
+    const-string/jumbo v0, "6213"
+    const-string/jumbo v0, "6214"
+    const-string/jumbo v0, "6215"
+    const-string/jumbo v0, "6216"
+    const-string/jumbo v0, "6217"
+    const-string/jumbo v0, "6218"
+    const-string/jumbo v0, "6219"
+    const-string/jumbo v0, "6220"
+    const-string/jumbo v0, "6221"
+    const-string/jumbo v0, "6222"
+    const-string/jumbo v0, "6223"
+    const-string/jumbo v0, "6224"
+    const-string/jumbo v0, "6225"
+    const-string/jumbo v0, "6226"
+    const-string/jumbo v0, "6227"
+    const-string/jumbo v0, "6228"
+    const-string/jumbo v0, "6229"
+    const-string/jumbo v0, "6230"
+    const-string/jumbo v0, "6231"
+    const-string/jumbo v0, "6232"
+    const-string/jumbo v0, "6233"
+    const-string/jumbo v0, "6234"
+    const-string/jumbo v0, "6235"
+    const-string/jumbo v0, "6236"
+    const-string/jumbo v0, "6237"
+    const-string/jumbo v0, "6238"
+    const-string/jumbo v0, "6239"
+    const-string/jumbo v0, "6240"
+    const-string/jumbo v0, "6241"
+    const-string/jumbo v0, "6242"
+    const-string/jumbo v0, "6243"
+    const-string/jumbo v0, "6244"
+    const-string/jumbo v0, "6245"
+    const-string/jumbo v0, "6246"
+    const-string/jumbo v0, "6247"
+    const-string/jumbo v0, "6248"
+    const-string/jumbo v0, "6249"
+    const-string/jumbo v0, "6250"
+    const-string/jumbo v0, "6251"
+    const-string/jumbo v0, "6252"
+    const-string/jumbo v0, "6253"
+    const-string/jumbo v0, "6254"
+    const-string/jumbo v0, "6255"
+    const-string/jumbo v0, "6256"
+    const-string/jumbo v0, "6257"
+    const-string/jumbo v0, "6258"
+    const-string/jumbo v0, "6259"
+    const-string/jumbo v0, "6260"
+    const-string/jumbo v0, "6261"
+    const-string/jumbo v0, "6262"
+    const-string/jumbo v0, "6263"
+    const-string/jumbo v0, "6264"
+    const-string/jumbo v0, "6265"
+    const-string/jumbo v0, "6266"
+    const-string/jumbo v0, "6267"
+    const-string/jumbo v0, "6268"
+    const-string/jumbo v0, "6269"
+    const-string/jumbo v0, "6270"
+    const-string/jumbo v0, "6271"
+    const-string/jumbo v0, "6272"
+    const-string/jumbo v0, "6273"
+    const-string/jumbo v0, "6274"
+    const-string/jumbo v0, "6275"
+    const-string/jumbo v0, "6276"
+    const-string/jumbo v0, "6277"
+    const-string/jumbo v0, "6278"
+    const-string/jumbo v0, "6279"
+    const-string/jumbo v0, "6280"
+    const-string/jumbo v0, "6281"
+    const-string/jumbo v0, "6282"
+    const-string/jumbo v0, "6283"
+    const-string/jumbo v0, "6284"
+    const-string/jumbo v0, "6285"
+    const-string/jumbo v0, "6286"
+    const-string/jumbo v0, "6287"
+    const-string/jumbo v0, "6288"
+    const-string/jumbo v0, "6289"
+    const-string/jumbo v0, "6290"
+    const-string/jumbo v0, "6291"
+    const-string/jumbo v0, "6292"
+    const-string/jumbo v0, "6293"
+    const-string/jumbo v0, "6294"
+    const-string/jumbo v0, "6295"
+    const-string/jumbo v0, "6296"
+    const-string/jumbo v0, "6297"
+    const-string/jumbo v0, "6298"
+    const-string/jumbo v0, "6299"
+    const-string/jumbo v0, "6300"
+    const-string/jumbo v0, "6301"
+    const-string/jumbo v0, "6302"
+    const-string/jumbo v0, "6303"
+    const-string/jumbo v0, "6304"
+    const-string/jumbo v0, "6305"
+    const-string/jumbo v0, "6306"
+    const-string/jumbo v0, "6307"
+    const-string/jumbo v0, "6308"
+    const-string/jumbo v0, "6309"
+    const-string/jumbo v0, "6310"
+    const-string/jumbo v0, "6311"
+    const-string/jumbo v0, "6312"
+    const-string/jumbo v0, "6313"
+    const-string/jumbo v0, "6314"
+    const-string/jumbo v0, "6315"
+    const-string/jumbo v0, "6316"
+    const-string/jumbo v0, "6317"
+    const-string/jumbo v0, "6318"
+    const-string/jumbo v0, "6319"
+    const-string/jumbo v0, "6320"
+    const-string/jumbo v0, "6321"
+    const-string/jumbo v0, "6322"
+    const-string/jumbo v0, "6323"
+    const-string/jumbo v0, "6324"
+    const-string/jumbo v0, "6325"
+    const-string/jumbo v0, "6326"
+    const-string/jumbo v0, "6327"
+    const-string/jumbo v0, "6328"
+    const-string/jumbo v0, "6329"
+    const-string/jumbo v0, "6330"
+    const-string/jumbo v0, "6331"
+    const-string/jumbo v0, "6332"
+    const-string/jumbo v0, "6333"
+    const-string/jumbo v0, "6334"
+    const-string/jumbo v0, "6335"
+    const-string/jumbo v0, "6336"
+    const-string/jumbo v0, "6337"
+    const-string/jumbo v0, "6338"
+    const-string/jumbo v0, "6339"
+    const-string/jumbo v0, "6340"
+    const-string/jumbo v0, "6341"
+    const-string/jumbo v0, "6342"
+    const-string/jumbo v0, "6343"
+    const-string/jumbo v0, "6344"
+    const-string/jumbo v0, "6345"
+    const-string/jumbo v0, "6346"
+    const-string/jumbo v0, "6347"
+    const-string/jumbo v0, "6348"
+    const-string/jumbo v0, "6349"
+    const-string/jumbo v0, "6350"
+    const-string/jumbo v0, "6351"
+    const-string/jumbo v0, "6352"
+    const-string/jumbo v0, "6353"
+    const-string/jumbo v0, "6354"
+    const-string/jumbo v0, "6355"
+    const-string/jumbo v0, "6356"
+    const-string/jumbo v0, "6357"
+    const-string/jumbo v0, "6358"
+    const-string/jumbo v0, "6359"
+    const-string/jumbo v0, "6360"
+    const-string/jumbo v0, "6361"
+    const-string/jumbo v0, "6362"
+    const-string/jumbo v0, "6363"
+    const-string/jumbo v0, "6364"
+    const-string/jumbo v0, "6365"
+    const-string/jumbo v0, "6366"
+    const-string/jumbo v0, "6367"
+    const-string/jumbo v0, "6368"
+    const-string/jumbo v0, "6369"
+    const-string/jumbo v0, "6370"
+    const-string/jumbo v0, "6371"
+    const-string/jumbo v0, "6372"
+    const-string/jumbo v0, "6373"
+    const-string/jumbo v0, "6374"
+    const-string/jumbo v0, "6375"
+    const-string/jumbo v0, "6376"
+    const-string/jumbo v0, "6377"
+    const-string/jumbo v0, "6378"
+    const-string/jumbo v0, "6379"
+    const-string/jumbo v0, "6380"
+    const-string/jumbo v0, "6381"
+    const-string/jumbo v0, "6382"
+    const-string/jumbo v0, "6383"
+    const-string/jumbo v0, "6384"
+    const-string/jumbo v0, "6385"
+    const-string/jumbo v0, "6386"
+    const-string/jumbo v0, "6387"
+    const-string/jumbo v0, "6388"
+    const-string/jumbo v0, "6389"
+    const-string/jumbo v0, "6390"
+    const-string/jumbo v0, "6391"
+    const-string/jumbo v0, "6392"
+    const-string/jumbo v0, "6393"
+    const-string/jumbo v0, "6394"
+    const-string/jumbo v0, "6395"
+    const-string/jumbo v0, "6396"
+    const-string/jumbo v0, "6397"
+    const-string/jumbo v0, "6398"
+    const-string/jumbo v0, "6399"
+    const-string/jumbo v0, "6400"
+    const-string/jumbo v0, "6401"
+    const-string/jumbo v0, "6402"
+    const-string/jumbo v0, "6403"
+    const-string/jumbo v0, "6404"
+    const-string/jumbo v0, "6405"
+    const-string/jumbo v0, "6406"
+    const-string/jumbo v0, "6407"
+    const-string/jumbo v0, "6408"
+    const-string/jumbo v0, "6409"
+    const-string/jumbo v0, "6410"
+    const-string/jumbo v0, "6411"
+    const-string/jumbo v0, "6412"
+    const-string/jumbo v0, "6413"
+    const-string/jumbo v0, "6414"
+    const-string/jumbo v0, "6415"
+    const-string/jumbo v0, "6416"
+    const-string/jumbo v0, "6417"
+    const-string/jumbo v0, "6418"
+    const-string/jumbo v0, "6419"
+    const-string/jumbo v0, "6420"
+    const-string/jumbo v0, "6421"
+    const-string/jumbo v0, "6422"
+    const-string/jumbo v0, "6423"
+    const-string/jumbo v0, "6424"
+    const-string/jumbo v0, "6425"
+    const-string/jumbo v0, "6426"
+    const-string/jumbo v0, "6427"
+    const-string/jumbo v0, "6428"
+    const-string/jumbo v0, "6429"
+    const-string/jumbo v0, "6430"
+    const-string/jumbo v0, "6431"
+    const-string/jumbo v0, "6432"
+    const-string/jumbo v0, "6433"
+    const-string/jumbo v0, "6434"
+    const-string/jumbo v0, "6435"
+    const-string/jumbo v0, "6436"
+    const-string/jumbo v0, "6437"
+    const-string/jumbo v0, "6438"
+    const-string/jumbo v0, "6439"
+    const-string/jumbo v0, "6440"
+    const-string/jumbo v0, "6441"
+    const-string/jumbo v0, "6442"
+    const-string/jumbo v0, "6443"
+    const-string/jumbo v0, "6444"
+    const-string/jumbo v0, "6445"
+    const-string/jumbo v0, "6446"
+    const-string/jumbo v0, "6447"
+    const-string/jumbo v0, "6448"
+    const-string/jumbo v0, "6449"
+    const-string/jumbo v0, "6450"
+    const-string/jumbo v0, "6451"
+    const-string/jumbo v0, "6452"
+    const-string/jumbo v0, "6453"
+    const-string/jumbo v0, "6454"
+    const-string/jumbo v0, "6455"
+    const-string/jumbo v0, "6456"
+    const-string/jumbo v0, "6457"
+    const-string/jumbo v0, "6458"
+    const-string/jumbo v0, "6459"
+    const-string/jumbo v0, "6460"
+    const-string/jumbo v0, "6461"
+    const-string/jumbo v0, "6462"
+    const-string/jumbo v0, "6463"
+    const-string/jumbo v0, "6464"
+    const-string/jumbo v0, "6465"
+    const-string/jumbo v0, "6466"
+    const-string/jumbo v0, "6467"
+    const-string/jumbo v0, "6468"
+    const-string/jumbo v0, "6469"
+    const-string/jumbo v0, "6470"
+    const-string/jumbo v0, "6471"
+    const-string/jumbo v0, "6472"
+    const-string/jumbo v0, "6473"
+    const-string/jumbo v0, "6474"
+    const-string/jumbo v0, "6475"
+    const-string/jumbo v0, "6476"
+    const-string/jumbo v0, "6477"
+    const-string/jumbo v0, "6478"
+    const-string/jumbo v0, "6479"
+    const-string/jumbo v0, "6480"
+    const-string/jumbo v0, "6481"
+    const-string/jumbo v0, "6482"
+    const-string/jumbo v0, "6483"
+    const-string/jumbo v0, "6484"
+    const-string/jumbo v0, "6485"
+    const-string/jumbo v0, "6486"
+    const-string/jumbo v0, "6487"
+    const-string/jumbo v0, "6488"
+    const-string/jumbo v0, "6489"
+    const-string/jumbo v0, "6490"
+    const-string/jumbo v0, "6491"
+    const-string/jumbo v0, "6492"
+    const-string/jumbo v0, "6493"
+    const-string/jumbo v0, "6494"
+    const-string/jumbo v0, "6495"
+    const-string/jumbo v0, "6496"
+    const-string/jumbo v0, "6497"
+    const-string/jumbo v0, "6498"
+    const-string/jumbo v0, "6499"
+    const-string/jumbo v0, "6500"
+    const-string/jumbo v0, "6501"
+    const-string/jumbo v0, "6502"
+    const-string/jumbo v0, "6503"
+    const-string/jumbo v0, "6504"
+    const-string/jumbo v0, "6505"
+    const-string/jumbo v0, "6506"
+    const-string/jumbo v0, "6507"
+    const-string/jumbo v0, "6508"
+    const-string/jumbo v0, "6509"
+    const-string/jumbo v0, "6510"
+    const-string/jumbo v0, "6511"
+    const-string/jumbo v0, "6512"
+    const-string/jumbo v0, "6513"
+    const-string/jumbo v0, "6514"
+    const-string/jumbo v0, "6515"
+    const-string/jumbo v0, "6516"
+    const-string/jumbo v0, "6517"
+    const-string/jumbo v0, "6518"
+    const-string/jumbo v0, "6519"
+    const-string/jumbo v0, "6520"
+    const-string/jumbo v0, "6521"
+    const-string/jumbo v0, "6522"
+    const-string/jumbo v0, "6523"
+    const-string/jumbo v0, "6524"
+    const-string/jumbo v0, "6525"
+    const-string/jumbo v0, "6526"
+    const-string/jumbo v0, "6527"
+    const-string/jumbo v0, "6528"
+    const-string/jumbo v0, "6529"
+    const-string/jumbo v0, "6530"
+    const-string/jumbo v0, "6531"
+    const-string/jumbo v0, "6532"
+    const-string/jumbo v0, "6533"
+    const-string/jumbo v0, "6534"
+    const-string/jumbo v0, "6535"
+    const-string/jumbo v0, "6536"
+    const-string/jumbo v0, "6537"
+    const-string/jumbo v0, "6538"
+    const-string/jumbo v0, "6539"
+    const-string/jumbo v0, "6540"
+    const-string/jumbo v0, "6541"
+    const-string/jumbo v0, "6542"
+    const-string/jumbo v0, "6543"
+    const-string/jumbo v0, "6544"
+    const-string/jumbo v0, "6545"
+    const-string/jumbo v0, "6546"
+    const-string/jumbo v0, "6547"
+    const-string/jumbo v0, "6548"
+    const-string/jumbo v0, "6549"
+    const-string/jumbo v0, "6550"
+    const-string/jumbo v0, "6551"
+    const-string/jumbo v0, "6552"
+    const-string/jumbo v0, "6553"
+    const-string/jumbo v0, "6554"
+    const-string/jumbo v0, "6555"
+    const-string/jumbo v0, "6556"
+    const-string/jumbo v0, "6557"
+    const-string/jumbo v0, "6558"
+    const-string/jumbo v0, "6559"
+    const-string/jumbo v0, "6560"
+    const-string/jumbo v0, "6561"
+    const-string/jumbo v0, "6562"
+    const-string/jumbo v0, "6563"
+    const-string/jumbo v0, "6564"
+    const-string/jumbo v0, "6565"
+    const-string/jumbo v0, "6566"
+    const-string/jumbo v0, "6567"
+    const-string/jumbo v0, "6568"
+    const-string/jumbo v0, "6569"
+    const-string/jumbo v0, "6570"
+    const-string/jumbo v0, "6571"
+    const-string/jumbo v0, "6572"
+    const-string/jumbo v0, "6573"
+    const-string/jumbo v0, "6574"
+    const-string/jumbo v0, "6575"
+    const-string/jumbo v0, "6576"
+    const-string/jumbo v0, "6577"
+    const-string/jumbo v0, "6578"
+    const-string/jumbo v0, "6579"
+    const-string/jumbo v0, "6580"
+    const-string/jumbo v0, "6581"
+    const-string/jumbo v0, "6582"
+    const-string/jumbo v0, "6583"
+    const-string/jumbo v0, "6584"
+    const-string/jumbo v0, "6585"
+    const-string/jumbo v0, "6586"
+    const-string/jumbo v0, "6587"
+    const-string/jumbo v0, "6588"
+    const-string/jumbo v0, "6589"
+    const-string/jumbo v0, "6590"
+    const-string/jumbo v0, "6591"
+    const-string/jumbo v0, "6592"
+    const-string/jumbo v0, "6593"
+    const-string/jumbo v0, "6594"
+    const-string/jumbo v0, "6595"
+    const-string/jumbo v0, "6596"
+    const-string/jumbo v0, "6597"
+    const-string/jumbo v0, "6598"
+    const-string/jumbo v0, "6599"
+    const-string/jumbo v0, "6600"
+    const-string/jumbo v0, "6601"
+    const-string/jumbo v0, "6602"
+    const-string/jumbo v0, "6603"
+    const-string/jumbo v0, "6604"
+    const-string/jumbo v0, "6605"
+    const-string/jumbo v0, "6606"
+    const-string/jumbo v0, "6607"
+    const-string/jumbo v0, "6608"
+    const-string/jumbo v0, "6609"
+    const-string/jumbo v0, "6610"
+    const-string/jumbo v0, "6611"
+    const-string/jumbo v0, "6612"
+    const-string/jumbo v0, "6613"
+    const-string/jumbo v0, "6614"
+    const-string/jumbo v0, "6615"
+    const-string/jumbo v0, "6616"
+    const-string/jumbo v0, "6617"
+    const-string/jumbo v0, "6618"
+    const-string/jumbo v0, "6619"
+    const-string/jumbo v0, "6620"
+    const-string/jumbo v0, "6621"
+    const-string/jumbo v0, "6622"
+    const-string/jumbo v0, "6623"
+    const-string/jumbo v0, "6624"
+    const-string/jumbo v0, "6625"
+    const-string/jumbo v0, "6626"
+    const-string/jumbo v0, "6627"
+    const-string/jumbo v0, "6628"
+    const-string/jumbo v0, "6629"
+    const-string/jumbo v0, "6630"
+    const-string/jumbo v0, "6631"
+    const-string/jumbo v0, "6632"
+    const-string/jumbo v0, "6633"
+    const-string/jumbo v0, "6634"
+    const-string/jumbo v0, "6635"
+    const-string/jumbo v0, "6636"
+    const-string/jumbo v0, "6637"
+    const-string/jumbo v0, "6638"
+    const-string/jumbo v0, "6639"
+    const-string/jumbo v0, "6640"
+    const-string/jumbo v0, "6641"
+    const-string/jumbo v0, "6642"
+    const-string/jumbo v0, "6643"
+    const-string/jumbo v0, "6644"
+    const-string/jumbo v0, "6645"
+    const-string/jumbo v0, "6646"
+    const-string/jumbo v0, "6647"
+    const-string/jumbo v0, "6648"
+    const-string/jumbo v0, "6649"
+    const-string/jumbo v0, "6650"
+    const-string/jumbo v0, "6651"
+    const-string/jumbo v0, "6652"
+    const-string/jumbo v0, "6653"
+    const-string/jumbo v0, "6654"
+    const-string/jumbo v0, "6655"
+    const-string/jumbo v0, "6656"
+    const-string/jumbo v0, "6657"
+    const-string/jumbo v0, "6658"
+    const-string/jumbo v0, "6659"
+    const-string/jumbo v0, "6660"
+    const-string/jumbo v0, "6661"
+    const-string/jumbo v0, "6662"
+    const-string/jumbo v0, "6663"
+    const-string/jumbo v0, "6664"
+    const-string/jumbo v0, "6665"
+    const-string/jumbo v0, "6666"
+    const-string/jumbo v0, "6667"
+    const-string/jumbo v0, "6668"
+    const-string/jumbo v0, "6669"
+    const-string/jumbo v0, "6670"
+    const-string/jumbo v0, "6671"
+    const-string/jumbo v0, "6672"
+    const-string/jumbo v0, "6673"
+    const-string/jumbo v0, "6674"
+    const-string/jumbo v0, "6675"
+    const-string/jumbo v0, "6676"
+    const-string/jumbo v0, "6677"
+    const-string/jumbo v0, "6678"
+    const-string/jumbo v0, "6679"
+    const-string/jumbo v0, "6680"
+    const-string/jumbo v0, "6681"
+    const-string/jumbo v0, "6682"
+    const-string/jumbo v0, "6683"
+    const-string/jumbo v0, "6684"
+    const-string/jumbo v0, "6685"
+    const-string/jumbo v0, "6686"
+    const-string/jumbo v0, "6687"
+    const-string/jumbo v0, "6688"
+    const-string/jumbo v0, "6689"
+    const-string/jumbo v0, "6690"
+    const-string/jumbo v0, "6691"
+    const-string/jumbo v0, "6692"
+    const-string/jumbo v0, "6693"
+    const-string/jumbo v0, "6694"
+    const-string/jumbo v0, "6695"
+    const-string/jumbo v0, "6696"
+    const-string/jumbo v0, "6697"
+    const-string/jumbo v0, "6698"
+    const-string/jumbo v0, "6699"
+    const-string/jumbo v0, "6700"
+    const-string/jumbo v0, "6701"
+    const-string/jumbo v0, "6702"
+    const-string/jumbo v0, "6703"
+    const-string/jumbo v0, "6704"
+    const-string/jumbo v0, "6705"
+    const-string/jumbo v0, "6706"
+    const-string/jumbo v0, "6707"
+    const-string/jumbo v0, "6708"
+    const-string/jumbo v0, "6709"
+    const-string/jumbo v0, "6710"
+    const-string/jumbo v0, "6711"
+    const-string/jumbo v0, "6712"
+    const-string/jumbo v0, "6713"
+    const-string/jumbo v0, "6714"
+    const-string/jumbo v0, "6715"
+    const-string/jumbo v0, "6716"
+    const-string/jumbo v0, "6717"
+    const-string/jumbo v0, "6718"
+    const-string/jumbo v0, "6719"
+    const-string/jumbo v0, "6720"
+    const-string/jumbo v0, "6721"
+    const-string/jumbo v0, "6722"
+    const-string/jumbo v0, "6723"
+    const-string/jumbo v0, "6724"
+    const-string/jumbo v0, "6725"
+    const-string/jumbo v0, "6726"
+    const-string/jumbo v0, "6727"
+    const-string/jumbo v0, "6728"
+    const-string/jumbo v0, "6729"
+    const-string/jumbo v0, "6730"
+    const-string/jumbo v0, "6731"
+    const-string/jumbo v0, "6732"
+    const-string/jumbo v0, "6733"
+    const-string/jumbo v0, "6734"
+    const-string/jumbo v0, "6735"
+    const-string/jumbo v0, "6736"
+    const-string/jumbo v0, "6737"
+    const-string/jumbo v0, "6738"
+    const-string/jumbo v0, "6739"
+    const-string/jumbo v0, "6740"
+    const-string/jumbo v0, "6741"
+    const-string/jumbo v0, "6742"
+    const-string/jumbo v0, "6743"
+    const-string/jumbo v0, "6744"
+    const-string/jumbo v0, "6745"
+    const-string/jumbo v0, "6746"
+    const-string/jumbo v0, "6747"
+    const-string/jumbo v0, "6748"
+    const-string/jumbo v0, "6749"
+    const-string/jumbo v0, "6750"
+    const-string/jumbo v0, "6751"
+    const-string/jumbo v0, "6752"
+    const-string/jumbo v0, "6753"
+    const-string/jumbo v0, "6754"
+    const-string/jumbo v0, "6755"
+    const-string/jumbo v0, "6756"
+    const-string/jumbo v0, "6757"
+    const-string/jumbo v0, "6758"
+    const-string/jumbo v0, "6759"
+    const-string/jumbo v0, "6760"
+    const-string/jumbo v0, "6761"
+    const-string/jumbo v0, "6762"
+    const-string/jumbo v0, "6763"
+    const-string/jumbo v0, "6764"
+    const-string/jumbo v0, "6765"
+    const-string/jumbo v0, "6766"
+    const-string/jumbo v0, "6767"
+    const-string/jumbo v0, "6768"
+    const-string/jumbo v0, "6769"
+    const-string/jumbo v0, "6770"
+    const-string/jumbo v0, "6771"
+    const-string/jumbo v0, "6772"
+    const-string/jumbo v0, "6773"
+    const-string/jumbo v0, "6774"
+    const-string/jumbo v0, "6775"
+    const-string/jumbo v0, "6776"
+    const-string/jumbo v0, "6777"
+    const-string/jumbo v0, "6778"
+    const-string/jumbo v0, "6779"
+    const-string/jumbo v0, "6780"
+    const-string/jumbo v0, "6781"
+    const-string/jumbo v0, "6782"
+    const-string/jumbo v0, "6783"
+    const-string/jumbo v0, "6784"
+    const-string/jumbo v0, "6785"
+    const-string/jumbo v0, "6786"
+    const-string/jumbo v0, "6787"
+    const-string/jumbo v0, "6788"
+    const-string/jumbo v0, "6789"
+    const-string/jumbo v0, "6790"
+    const-string/jumbo v0, "6791"
+    const-string/jumbo v0, "6792"
+    const-string/jumbo v0, "6793"
+    const-string/jumbo v0, "6794"
+    const-string/jumbo v0, "6795"
+    const-string/jumbo v0, "6796"
+    const-string/jumbo v0, "6797"
+    const-string/jumbo v0, "6798"
+    const-string/jumbo v0, "6799"
+    const-string/jumbo v0, "6800"
+    const-string/jumbo v0, "6801"
+    const-string/jumbo v0, "6802"
+    const-string/jumbo v0, "6803"
+    const-string/jumbo v0, "6804"
+    const-string/jumbo v0, "6805"
+    const-string/jumbo v0, "6806"
+    const-string/jumbo v0, "6807"
+    const-string/jumbo v0, "6808"
+    const-string/jumbo v0, "6809"
+    const-string/jumbo v0, "6810"
+    const-string/jumbo v0, "6811"
+    const-string/jumbo v0, "6812"
+    const-string/jumbo v0, "6813"
+    const-string/jumbo v0, "6814"
+    const-string/jumbo v0, "6815"
+    const-string/jumbo v0, "6816"
+    const-string/jumbo v0, "6817"
+    const-string/jumbo v0, "6818"
+    const-string/jumbo v0, "6819"
+    const-string/jumbo v0, "6820"
+    const-string/jumbo v0, "6821"
+    const-string/jumbo v0, "6822"
+    const-string/jumbo v0, "6823"
+    const-string/jumbo v0, "6824"
+    const-string/jumbo v0, "6825"
+    const-string/jumbo v0, "6826"
+    const-string/jumbo v0, "6827"
+    const-string/jumbo v0, "6828"
+    const-string/jumbo v0, "6829"
+    const-string/jumbo v0, "6830"
+    const-string/jumbo v0, "6831"
+    const-string/jumbo v0, "6832"
+    const-string/jumbo v0, "6833"
+    const-string/jumbo v0, "6834"
+    const-string/jumbo v0, "6835"
+    const-string/jumbo v0, "6836"
+    const-string/jumbo v0, "6837"
+    const-string/jumbo v0, "6838"
+    const-string/jumbo v0, "6839"
+    const-string/jumbo v0, "6840"
+    const-string/jumbo v0, "6841"
+    const-string/jumbo v0, "6842"
+    const-string/jumbo v0, "6843"
+    const-string/jumbo v0, "6844"
+    const-string/jumbo v0, "6845"
+    const-string/jumbo v0, "6846"
+    const-string/jumbo v0, "6847"
+    const-string/jumbo v0, "6848"
+    const-string/jumbo v0, "6849"
+    const-string/jumbo v0, "6850"
+    const-string/jumbo v0, "6851"
+    const-string/jumbo v0, "6852"
+    const-string/jumbo v0, "6853"
+    const-string/jumbo v0, "6854"
+    const-string/jumbo v0, "6855"
+    const-string/jumbo v0, "6856"
+    const-string/jumbo v0, "6857"
+    const-string/jumbo v0, "6858"
+    const-string/jumbo v0, "6859"
+    const-string/jumbo v0, "6860"
+    const-string/jumbo v0, "6861"
+    const-string/jumbo v0, "6862"
+    const-string/jumbo v0, "6863"
+    const-string/jumbo v0, "6864"
+    const-string/jumbo v0, "6865"
+    const-string/jumbo v0, "6866"
+    const-string/jumbo v0, "6867"
+    const-string/jumbo v0, "6868"
+    const-string/jumbo v0, "6869"
+    const-string/jumbo v0, "6870"
+    const-string/jumbo v0, "6871"
+    const-string/jumbo v0, "6872"
+    const-string/jumbo v0, "6873"
+    const-string/jumbo v0, "6874"
+    const-string/jumbo v0, "6875"
+    const-string/jumbo v0, "6876"
+    const-string/jumbo v0, "6877"
+    const-string/jumbo v0, "6878"
+    const-string/jumbo v0, "6879"
+    const-string/jumbo v0, "6880"
+    const-string/jumbo v0, "6881"
+    const-string/jumbo v0, "6882"
+    const-string/jumbo v0, "6883"
+    const-string/jumbo v0, "6884"
+    const-string/jumbo v0, "6885"
+    const-string/jumbo v0, "6886"
+    const-string/jumbo v0, "6887"
+    const-string/jumbo v0, "6888"
+    const-string/jumbo v0, "6889"
+    const-string/jumbo v0, "6890"
+    const-string/jumbo v0, "6891"
+    const-string/jumbo v0, "6892"
+    const-string/jumbo v0, "6893"
+    const-string/jumbo v0, "6894"
+    const-string/jumbo v0, "6895"
+    const-string/jumbo v0, "6896"
+    const-string/jumbo v0, "6897"
+    const-string/jumbo v0, "6898"
+    const-string/jumbo v0, "6899"
+    const-string/jumbo v0, "6900"
+    const-string/jumbo v0, "6901"
+    const-string/jumbo v0, "6902"
+    const-string/jumbo v0, "6903"
+    const-string/jumbo v0, "6904"
+    const-string/jumbo v0, "6905"
+    const-string/jumbo v0, "6906"
+    const-string/jumbo v0, "6907"
+    const-string/jumbo v0, "6908"
+    const-string/jumbo v0, "6909"
+    const-string/jumbo v0, "6910"
+    const-string/jumbo v0, "6911"
+    const-string/jumbo v0, "6912"
+    const-string/jumbo v0, "6913"
+    const-string/jumbo v0, "6914"
+    const-string/jumbo v0, "6915"
+    const-string/jumbo v0, "6916"
+    const-string/jumbo v0, "6917"
+    const-string/jumbo v0, "6918"
+    const-string/jumbo v0, "6919"
+    const-string/jumbo v0, "6920"
+    const-string/jumbo v0, "6921"
+    const-string/jumbo v0, "6922"
+    const-string/jumbo v0, "6923"
+    const-string/jumbo v0, "6924"
+    const-string/jumbo v0, "6925"
+    const-string/jumbo v0, "6926"
+    const-string/jumbo v0, "6927"
+    const-string/jumbo v0, "6928"
+    const-string/jumbo v0, "6929"
+    const-string/jumbo v0, "6930"
+    const-string/jumbo v0, "6931"
+    const-string/jumbo v0, "6932"
+    const-string/jumbo v0, "6933"
+    const-string/jumbo v0, "6934"
+    const-string/jumbo v0, "6935"
+    const-string/jumbo v0, "6936"
+    const-string/jumbo v0, "6937"
+    const-string/jumbo v0, "6938"
+    const-string/jumbo v0, "6939"
+    const-string/jumbo v0, "6940"
+    const-string/jumbo v0, "6941"
+    const-string/jumbo v0, "6942"
+    const-string/jumbo v0, "6943"
+    const-string/jumbo v0, "6944"
+    const-string/jumbo v0, "6945"
+    const-string/jumbo v0, "6946"
+    const-string/jumbo v0, "6947"
+    const-string/jumbo v0, "6948"
+    const-string/jumbo v0, "6949"
+    const-string/jumbo v0, "6950"
+    const-string/jumbo v0, "6951"
+    const-string/jumbo v0, "6952"
+    const-string/jumbo v0, "6953"
+    const-string/jumbo v0, "6954"
+    const-string/jumbo v0, "6955"
+    const-string/jumbo v0, "6956"
+    const-string/jumbo v0, "6957"
+    const-string/jumbo v0, "6958"
+    const-string/jumbo v0, "6959"
+    const-string/jumbo v0, "6960"
+    const-string/jumbo v0, "6961"
+    const-string/jumbo v0, "6962"
+    const-string/jumbo v0, "6963"
+    const-string/jumbo v0, "6964"
+    const-string/jumbo v0, "6965"
+    const-string/jumbo v0, "6966"
+    const-string/jumbo v0, "6967"
+    const-string/jumbo v0, "6968"
+    const-string/jumbo v0, "6969"
+    const-string/jumbo v0, "6970"
+    const-string/jumbo v0, "6971"
+    const-string/jumbo v0, "6972"
+    const-string/jumbo v0, "6973"
+    const-string/jumbo v0, "6974"
+    const-string/jumbo v0, "6975"
+    const-string/jumbo v0, "6976"
+    const-string/jumbo v0, "6977"
+    const-string/jumbo v0, "6978"
+    const-string/jumbo v0, "6979"
+    const-string/jumbo v0, "6980"
+    const-string/jumbo v0, "6981"
+    const-string/jumbo v0, "6982"
+    const-string/jumbo v0, "6983"
+    const-string/jumbo v0, "6984"
+    const-string/jumbo v0, "6985"
+    const-string/jumbo v0, "6986"
+    const-string/jumbo v0, "6987"
+    const-string/jumbo v0, "6988"
+    const-string/jumbo v0, "6989"
+    const-string/jumbo v0, "6990"
+    const-string/jumbo v0, "6991"
+    const-string/jumbo v0, "6992"
+    const-string/jumbo v0, "6993"
+    const-string/jumbo v0, "6994"
+    const-string/jumbo v0, "6995"
+    const-string/jumbo v0, "6996"
+    const-string/jumbo v0, "6997"
+    const-string/jumbo v0, "6998"
+    const-string/jumbo v0, "6999"
+    const-string/jumbo v0, "7000"
+    const-string/jumbo v0, "7001"
+    const-string/jumbo v0, "7002"
+    const-string/jumbo v0, "7003"
+    const-string/jumbo v0, "7004"
+    const-string/jumbo v0, "7005"
+    const-string/jumbo v0, "7006"
+    const-string/jumbo v0, "7007"
+    const-string/jumbo v0, "7008"
+    const-string/jumbo v0, "7009"
+    const-string/jumbo v0, "7010"
+    const-string/jumbo v0, "7011"
+    const-string/jumbo v0, "7012"
+    const-string/jumbo v0, "7013"
+    const-string/jumbo v0, "7014"
+    const-string/jumbo v0, "7015"
+    const-string/jumbo v0, "7016"
+    const-string/jumbo v0, "7017"
+    const-string/jumbo v0, "7018"
+    const-string/jumbo v0, "7019"
+    const-string/jumbo v0, "7020"
+    const-string/jumbo v0, "7021"
+    const-string/jumbo v0, "7022"
+    const-string/jumbo v0, "7023"
+    const-string/jumbo v0, "7024"
+    const-string/jumbo v0, "7025"
+    const-string/jumbo v0, "7026"
+    const-string/jumbo v0, "7027"
+    const-string/jumbo v0, "7028"
+    const-string/jumbo v0, "7029"
+    const-string/jumbo v0, "7030"
+    const-string/jumbo v0, "7031"
+    const-string/jumbo v0, "7032"
+    const-string/jumbo v0, "7033"
+    const-string/jumbo v0, "7034"
+    const-string/jumbo v0, "7035"
+    const-string/jumbo v0, "7036"
+    const-string/jumbo v0, "7037"
+    const-string/jumbo v0, "7038"
+    const-string/jumbo v0, "7039"
+    const-string/jumbo v0, "7040"
+    const-string/jumbo v0, "7041"
+    const-string/jumbo v0, "7042"
+    const-string/jumbo v0, "7043"
+    const-string/jumbo v0, "7044"
+    const-string/jumbo v0, "7045"
+    const-string/jumbo v0, "7046"
+    const-string/jumbo v0, "7047"
+    const-string/jumbo v0, "7048"
+    const-string/jumbo v0, "7049"
+    const-string/jumbo v0, "7050"
+    const-string/jumbo v0, "7051"
+    const-string/jumbo v0, "7052"
+    const-string/jumbo v0, "7053"
+    const-string/jumbo v0, "7054"
+    const-string/jumbo v0, "7055"
+    const-string/jumbo v0, "7056"
+    const-string/jumbo v0, "7057"
+    const-string/jumbo v0, "7058"
+    const-string/jumbo v0, "7059"
+    const-string/jumbo v0, "7060"
+    const-string/jumbo v0, "7061"
+    const-string/jumbo v0, "7062"
+    const-string/jumbo v0, "7063"
+    const-string/jumbo v0, "7064"
+    const-string/jumbo v0, "7065"
+    const-string/jumbo v0, "7066"
+    const-string/jumbo v0, "7067"
+    const-string/jumbo v0, "7068"
+    const-string/jumbo v0, "7069"
+    const-string/jumbo v0, "7070"
+    const-string/jumbo v0, "7071"
+    const-string/jumbo v0, "7072"
+    const-string/jumbo v0, "7073"
+    const-string/jumbo v0, "7074"
+    const-string/jumbo v0, "7075"
+    const-string/jumbo v0, "7076"
+    const-string/jumbo v0, "7077"
+    const-string/jumbo v0, "7078"
+    const-string/jumbo v0, "7079"
+    const-string/jumbo v0, "7080"
+    const-string/jumbo v0, "7081"
+    const-string/jumbo v0, "7082"
+    const-string/jumbo v0, "7083"
+    const-string/jumbo v0, "7084"
+    const-string/jumbo v0, "7085"
+    const-string/jumbo v0, "7086"
+    const-string/jumbo v0, "7087"
+    const-string/jumbo v0, "7088"
+    const-string/jumbo v0, "7089"
+    const-string/jumbo v0, "7090"
+    const-string/jumbo v0, "7091"
+    const-string/jumbo v0, "7092"
+    const-string/jumbo v0, "7093"
+    const-string/jumbo v0, "7094"
+    const-string/jumbo v0, "7095"
+    const-string/jumbo v0, "7096"
+    const-string/jumbo v0, "7097"
+    const-string/jumbo v0, "7098"
+    const-string/jumbo v0, "7099"
+    const-string/jumbo v0, "7100"
+    const-string/jumbo v0, "7101"
+    const-string/jumbo v0, "7102"
+    const-string/jumbo v0, "7103"
+    const-string/jumbo v0, "7104"
+    const-string/jumbo v0, "7105"
+    const-string/jumbo v0, "7106"
+    const-string/jumbo v0, "7107"
+    const-string/jumbo v0, "7108"
+    const-string/jumbo v0, "7109"
+    const-string/jumbo v0, "7110"
+    const-string/jumbo v0, "7111"
+    const-string/jumbo v0, "7112"
+    const-string/jumbo v0, "7113"
+    const-string/jumbo v0, "7114"
+    const-string/jumbo v0, "7115"
+    const-string/jumbo v0, "7116"
+    const-string/jumbo v0, "7117"
+    const-string/jumbo v0, "7118"
+    const-string/jumbo v0, "7119"
+    const-string/jumbo v0, "7120"
+    const-string/jumbo v0, "7121"
+    const-string/jumbo v0, "7122"
+    const-string/jumbo v0, "7123"
+    const-string/jumbo v0, "7124"
+    const-string/jumbo v0, "7125"
+    const-string/jumbo v0, "7126"
+    const-string/jumbo v0, "7127"
+    const-string/jumbo v0, "7128"
+    const-string/jumbo v0, "7129"
+    const-string/jumbo v0, "7130"
+    const-string/jumbo v0, "7131"
+    const-string/jumbo v0, "7132"
+    const-string/jumbo v0, "7133"
+    const-string/jumbo v0, "7134"
+    const-string/jumbo v0, "7135"
+    const-string/jumbo v0, "7136"
+    const-string/jumbo v0, "7137"
+    const-string/jumbo v0, "7138"
+    const-string/jumbo v0, "7139"
+    const-string/jumbo v0, "7140"
+    const-string/jumbo v0, "7141"
+    const-string/jumbo v0, "7142"
+    const-string/jumbo v0, "7143"
+    const-string/jumbo v0, "7144"
+    const-string/jumbo v0, "7145"
+    const-string/jumbo v0, "7146"
+    const-string/jumbo v0, "7147"
+    const-string/jumbo v0, "7148"
+    const-string/jumbo v0, "7149"
+    const-string/jumbo v0, "7150"
+    const-string/jumbo v0, "7151"
+    const-string/jumbo v0, "7152"
+    const-string/jumbo v0, "7153"
+    const-string/jumbo v0, "7154"
+    const-string/jumbo v0, "7155"
+    const-string/jumbo v0, "7156"
+    const-string/jumbo v0, "7157"
+    const-string/jumbo v0, "7158"
+    const-string/jumbo v0, "7159"
+    const-string/jumbo v0, "7160"
+    const-string/jumbo v0, "7161"
+    const-string/jumbo v0, "7162"
+    const-string/jumbo v0, "7163"
+    const-string/jumbo v0, "7164"
+    const-string/jumbo v0, "7165"
+    const-string/jumbo v0, "7166"
+    const-string/jumbo v0, "7167"
+    const-string/jumbo v0, "7168"
+    const-string/jumbo v0, "7169"
+    const-string/jumbo v0, "7170"
+    const-string/jumbo v0, "7171"
+    const-string/jumbo v0, "7172"
+    const-string/jumbo v0, "7173"
+    const-string/jumbo v0, "7174"
+    const-string/jumbo v0, "7175"
+    const-string/jumbo v0, "7176"
+    const-string/jumbo v0, "7177"
+    const-string/jumbo v0, "7178"
+    const-string/jumbo v0, "7179"
+    const-string/jumbo v0, "7180"
+    const-string/jumbo v0, "7181"
+    const-string/jumbo v0, "7182"
+    const-string/jumbo v0, "7183"
+    const-string/jumbo v0, "7184"
+    const-string/jumbo v0, "7185"
+    const-string/jumbo v0, "7186"
+    const-string/jumbo v0, "7187"
+    const-string/jumbo v0, "7188"
+    const-string/jumbo v0, "7189"
+    const-string/jumbo v0, "7190"
+    const-string/jumbo v0, "7191"
+    const-string/jumbo v0, "7192"
+    const-string/jumbo v0, "7193"
+    const-string/jumbo v0, "7194"
+    const-string/jumbo v0, "7195"
+    const-string/jumbo v0, "7196"
+    const-string/jumbo v0, "7197"
+    const-string/jumbo v0, "7198"
+    const-string/jumbo v0, "7199"
+    const-string/jumbo v0, "7200"
+    const-string/jumbo v0, "7201"
+    const-string/jumbo v0, "7202"
+    const-string/jumbo v0, "7203"
+    const-string/jumbo v0, "7204"
+    const-string/jumbo v0, "7205"
+    const-string/jumbo v0, "7206"
+    const-string/jumbo v0, "7207"
+    const-string/jumbo v0, "7208"
+    const-string/jumbo v0, "7209"
+    const-string/jumbo v0, "7210"
+    const-string/jumbo v0, "7211"
+    const-string/jumbo v0, "7212"
+    const-string/jumbo v0, "7213"
+    const-string/jumbo v0, "7214"
+    const-string/jumbo v0, "7215"
+    const-string/jumbo v0, "7216"
+    const-string/jumbo v0, "7217"
+    const-string/jumbo v0, "7218"
+    const-string/jumbo v0, "7219"
+    const-string/jumbo v0, "7220"
+    const-string/jumbo v0, "7221"
+    const-string/jumbo v0, "7222"
+    const-string/jumbo v0, "7223"
+    const-string/jumbo v0, "7224"
+    const-string/jumbo v0, "7225"
+    const-string/jumbo v0, "7226"
+    const-string/jumbo v0, "7227"
+    const-string/jumbo v0, "7228"
+    const-string/jumbo v0, "7229"
+    const-string/jumbo v0, "7230"
+    const-string/jumbo v0, "7231"
+    const-string/jumbo v0, "7232"
+    const-string/jumbo v0, "7233"
+    const-string/jumbo v0, "7234"
+    const-string/jumbo v0, "7235"
+    const-string/jumbo v0, "7236"
+    const-string/jumbo v0, "7237"
+    const-string/jumbo v0, "7238"
+    const-string/jumbo v0, "7239"
+    const-string/jumbo v0, "7240"
+    const-string/jumbo v0, "7241"
+    const-string/jumbo v0, "7242"
+    const-string/jumbo v0, "7243"
+    const-string/jumbo v0, "7244"
+    const-string/jumbo v0, "7245"
+    const-string/jumbo v0, "7246"
+    const-string/jumbo v0, "7247"
+    const-string/jumbo v0, "7248"
+    const-string/jumbo v0, "7249"
+    const-string/jumbo v0, "7250"
+    const-string/jumbo v0, "7251"
+    const-string/jumbo v0, "7252"
+    const-string/jumbo v0, "7253"
+    const-string/jumbo v0, "7254"
+    const-string/jumbo v0, "7255"
+    const-string/jumbo v0, "7256"
+    const-string/jumbo v0, "7257"
+    const-string/jumbo v0, "7258"
+    const-string/jumbo v0, "7259"
+    const-string/jumbo v0, "7260"
+    const-string/jumbo v0, "7261"
+    const-string/jumbo v0, "7262"
+    const-string/jumbo v0, "7263"
+    const-string/jumbo v0, "7264"
+    const-string/jumbo v0, "7265"
+    const-string/jumbo v0, "7266"
+    const-string/jumbo v0, "7267"
+    const-string/jumbo v0, "7268"
+    const-string/jumbo v0, "7269"
+    const-string/jumbo v0, "7270"
+    const-string/jumbo v0, "7271"
+    const-string/jumbo v0, "7272"
+    const-string/jumbo v0, "7273"
+    const-string/jumbo v0, "7274"
+    const-string/jumbo v0, "7275"
+    const-string/jumbo v0, "7276"
+    const-string/jumbo v0, "7277"
+    const-string/jumbo v0, "7278"
+    const-string/jumbo v0, "7279"
+    const-string/jumbo v0, "7280"
+    const-string/jumbo v0, "7281"
+    const-string/jumbo v0, "7282"
+    const-string/jumbo v0, "7283"
+    const-string/jumbo v0, "7284"
+    const-string/jumbo v0, "7285"
+    const-string/jumbo v0, "7286"
+    const-string/jumbo v0, "7287"
+    const-string/jumbo v0, "7288"
+    const-string/jumbo v0, "7289"
+    const-string/jumbo v0, "7290"
+    const-string/jumbo v0, "7291"
+    const-string/jumbo v0, "7292"
+    const-string/jumbo v0, "7293"
+    const-string/jumbo v0, "7294"
+    const-string/jumbo v0, "7295"
+    const-string/jumbo v0, "7296"
+    const-string/jumbo v0, "7297"
+    const-string/jumbo v0, "7298"
+    const-string/jumbo v0, "7299"
+    const-string/jumbo v0, "7300"
+    const-string/jumbo v0, "7301"
+    const-string/jumbo v0, "7302"
+    const-string/jumbo v0, "7303"
+    const-string/jumbo v0, "7304"
+    const-string/jumbo v0, "7305"
+    const-string/jumbo v0, "7306"
+    const-string/jumbo v0, "7307"
+    const-string/jumbo v0, "7308"
+    const-string/jumbo v0, "7309"
+    const-string/jumbo v0, "7310"
+    const-string/jumbo v0, "7311"
+    const-string/jumbo v0, "7312"
+    const-string/jumbo v0, "7313"
+    const-string/jumbo v0, "7314"
+    const-string/jumbo v0, "7315"
+    const-string/jumbo v0, "7316"
+    const-string/jumbo v0, "7317"
+    const-string/jumbo v0, "7318"
+    const-string/jumbo v0, "7319"
+    const-string/jumbo v0, "7320"
+    const-string/jumbo v0, "7321"
+    const-string/jumbo v0, "7322"
+    const-string/jumbo v0, "7323"
+    const-string/jumbo v0, "7324"
+    const-string/jumbo v0, "7325"
+    const-string/jumbo v0, "7326"
+    const-string/jumbo v0, "7327"
+    const-string/jumbo v0, "7328"
+    const-string/jumbo v0, "7329"
+    const-string/jumbo v0, "7330"
+    const-string/jumbo v0, "7331"
+    const-string/jumbo v0, "7332"
+    const-string/jumbo v0, "7333"
+    const-string/jumbo v0, "7334"
+    const-string/jumbo v0, "7335"
+    const-string/jumbo v0, "7336"
+    const-string/jumbo v0, "7337"
+    const-string/jumbo v0, "7338"
+    const-string/jumbo v0, "7339"
+    const-string/jumbo v0, "7340"
+    const-string/jumbo v0, "7341"
+    const-string/jumbo v0, "7342"
+    const-string/jumbo v0, "7343"
+    const-string/jumbo v0, "7344"
+    const-string/jumbo v0, "7345"
+    const-string/jumbo v0, "7346"
+    const-string/jumbo v0, "7347"
+    const-string/jumbo v0, "7348"
+    const-string/jumbo v0, "7349"
+    const-string/jumbo v0, "7350"
+    const-string/jumbo v0, "7351"
+    const-string/jumbo v0, "7352"
+    const-string/jumbo v0, "7353"
+    const-string/jumbo v0, "7354"
+    const-string/jumbo v0, "7355"
+    const-string/jumbo v0, "7356"
+    const-string/jumbo v0, "7357"
+    const-string/jumbo v0, "7358"
+    const-string/jumbo v0, "7359"
+    const-string/jumbo v0, "7360"
+    const-string/jumbo v0, "7361"
+    const-string/jumbo v0, "7362"
+    const-string/jumbo v0, "7363"
+    const-string/jumbo v0, "7364"
+    const-string/jumbo v0, "7365"
+    const-string/jumbo v0, "7366"
+    const-string/jumbo v0, "7367"
+    const-string/jumbo v0, "7368"
+    const-string/jumbo v0, "7369"
+    const-string/jumbo v0, "7370"
+    const-string/jumbo v0, "7371"
+    const-string/jumbo v0, "7372"
+    const-string/jumbo v0, "7373"
+    const-string/jumbo v0, "7374"
+    const-string/jumbo v0, "7375"
+    const-string/jumbo v0, "7376"
+    const-string/jumbo v0, "7377"
+    const-string/jumbo v0, "7378"
+    const-string/jumbo v0, "7379"
+    const-string/jumbo v0, "7380"
+    const-string/jumbo v0, "7381"
+    const-string/jumbo v0, "7382"
+    const-string/jumbo v0, "7383"
+    const-string/jumbo v0, "7384"
+    const-string/jumbo v0, "7385"
+    const-string/jumbo v0, "7386"
+    const-string/jumbo v0, "7387"
+    const-string/jumbo v0, "7388"
+    const-string/jumbo v0, "7389"
+    const-string/jumbo v0, "7390"
+    const-string/jumbo v0, "7391"
+    const-string/jumbo v0, "7392"
+    const-string/jumbo v0, "7393"
+    const-string/jumbo v0, "7394"
+    const-string/jumbo v0, "7395"
+    const-string/jumbo v0, "7396"
+    const-string/jumbo v0, "7397"
+    const-string/jumbo v0, "7398"
+    const-string/jumbo v0, "7399"
+    const-string/jumbo v0, "7400"
+    const-string/jumbo v0, "7401"
+    const-string/jumbo v0, "7402"
+    const-string/jumbo v0, "7403"
+    const-string/jumbo v0, "7404"
+    const-string/jumbo v0, "7405"
+    const-string/jumbo v0, "7406"
+    const-string/jumbo v0, "7407"
+    const-string/jumbo v0, "7408"
+    const-string/jumbo v0, "7409"
+    const-string/jumbo v0, "7410"
+    const-string/jumbo v0, "7411"
+    const-string/jumbo v0, "7412"
+    const-string/jumbo v0, "7413"
+    const-string/jumbo v0, "7414"
+    const-string/jumbo v0, "7415"
+    const-string/jumbo v0, "7416"
+    const-string/jumbo v0, "7417"
+    const-string/jumbo v0, "7418"
+    const-string/jumbo v0, "7419"
+    const-string/jumbo v0, "7420"
+    const-string/jumbo v0, "7421"
+    const-string/jumbo v0, "7422"
+    const-string/jumbo v0, "7423"
+    const-string/jumbo v0, "7424"
+    const-string/jumbo v0, "7425"
+    const-string/jumbo v0, "7426"
+    const-string/jumbo v0, "7427"
+    const-string/jumbo v0, "7428"
+    const-string/jumbo v0, "7429"
+    const-string/jumbo v0, "7430"
+    const-string/jumbo v0, "7431"
+    const-string/jumbo v0, "7432"
+    const-string/jumbo v0, "7433"
+    const-string/jumbo v0, "7434"
+    const-string/jumbo v0, "7435"
+    const-string/jumbo v0, "7436"
+    const-string/jumbo v0, "7437"
+    const-string/jumbo v0, "7438"
+    const-string/jumbo v0, "7439"
+    const-string/jumbo v0, "7440"
+    const-string/jumbo v0, "7441"
+    const-string/jumbo v0, "7442"
+    const-string/jumbo v0, "7443"
+    const-string/jumbo v0, "7444"
+    const-string/jumbo v0, "7445"
+    const-string/jumbo v0, "7446"
+    const-string/jumbo v0, "7447"
+    const-string/jumbo v0, "7448"
+    const-string/jumbo v0, "7449"
+    const-string/jumbo v0, "7450"
+    const-string/jumbo v0, "7451"
+    const-string/jumbo v0, "7452"
+    const-string/jumbo v0, "7453"
+    const-string/jumbo v0, "7454"
+    const-string/jumbo v0, "7455"
+    const-string/jumbo v0, "7456"
+    const-string/jumbo v0, "7457"
+    const-string/jumbo v0, "7458"
+    const-string/jumbo v0, "7459"
+    const-string/jumbo v0, "7460"
+    const-string/jumbo v0, "7461"
+    const-string/jumbo v0, "7462"
+    const-string/jumbo v0, "7463"
+    const-string/jumbo v0, "7464"
+    const-string/jumbo v0, "7465"
+    const-string/jumbo v0, "7466"
+    const-string/jumbo v0, "7467"
+    const-string/jumbo v0, "7468"
+    const-string/jumbo v0, "7469"
+    const-string/jumbo v0, "7470"
+    const-string/jumbo v0, "7471"
+    const-string/jumbo v0, "7472"
+    const-string/jumbo v0, "7473"
+    const-string/jumbo v0, "7474"
+    const-string/jumbo v0, "7475"
+    const-string/jumbo v0, "7476"
+    const-string/jumbo v0, "7477"
+    const-string/jumbo v0, "7478"
+    const-string/jumbo v0, "7479"
+    const-string/jumbo v0, "7480"
+    const-string/jumbo v0, "7481"
+    const-string/jumbo v0, "7482"
+    const-string/jumbo v0, "7483"
+    const-string/jumbo v0, "7484"
+    const-string/jumbo v0, "7485"
+    const-string/jumbo v0, "7486"
+    const-string/jumbo v0, "7487"
+    const-string/jumbo v0, "7488"
+    const-string/jumbo v0, "7489"
+    const-string/jumbo v0, "7490"
+    const-string/jumbo v0, "7491"
+    const-string/jumbo v0, "7492"
+    const-string/jumbo v0, "7493"
+    const-string/jumbo v0, "7494"
+    const-string/jumbo v0, "7495"
+    const-string/jumbo v0, "7496"
+    const-string/jumbo v0, "7497"
+    const-string/jumbo v0, "7498"
+    const-string/jumbo v0, "7499"
+    const-string/jumbo v0, "7500"
+    const-string/jumbo v0, "7501"
+    const-string/jumbo v0, "7502"
+    const-string/jumbo v0, "7503"
+    const-string/jumbo v0, "7504"
+    const-string/jumbo v0, "7505"
+    const-string/jumbo v0, "7506"
+    const-string/jumbo v0, "7507"
+    const-string/jumbo v0, "7508"
+    const-string/jumbo v0, "7509"
+    const-string/jumbo v0, "7510"
+    const-string/jumbo v0, "7511"
+    const-string/jumbo v0, "7512"
+    const-string/jumbo v0, "7513"
+    const-string/jumbo v0, "7514"
+    const-string/jumbo v0, "7515"
+    const-string/jumbo v0, "7516"
+    const-string/jumbo v0, "7517"
+    const-string/jumbo v0, "7518"
+    const-string/jumbo v0, "7519"
+    const-string/jumbo v0, "7520"
+    const-string/jumbo v0, "7521"
+    const-string/jumbo v0, "7522"
+    const-string/jumbo v0, "7523"
+    const-string/jumbo v0, "7524"
+    const-string/jumbo v0, "7525"
+    const-string/jumbo v0, "7526"
+    const-string/jumbo v0, "7527"
+    const-string/jumbo v0, "7528"
+    const-string/jumbo v0, "7529"
+    const-string/jumbo v0, "7530"
+    const-string/jumbo v0, "7531"
+    const-string/jumbo v0, "7532"
+    const-string/jumbo v0, "7533"
+    const-string/jumbo v0, "7534"
+    const-string/jumbo v0, "7535"
+    const-string/jumbo v0, "7536"
+    const-string/jumbo v0, "7537"
+    const-string/jumbo v0, "7538"
+    const-string/jumbo v0, "7539"
+    const-string/jumbo v0, "7540"
+    const-string/jumbo v0, "7541"
+    const-string/jumbo v0, "7542"
+    const-string/jumbo v0, "7543"
+    const-string/jumbo v0, "7544"
+    const-string/jumbo v0, "7545"
+    const-string/jumbo v0, "7546"
+    const-string/jumbo v0, "7547"
+    const-string/jumbo v0, "7548"
+    const-string/jumbo v0, "7549"
+    const-string/jumbo v0, "7550"
+    const-string/jumbo v0, "7551"
+    const-string/jumbo v0, "7552"
+    const-string/jumbo v0, "7553"
+    const-string/jumbo v0, "7554"
+    const-string/jumbo v0, "7555"
+    const-string/jumbo v0, "7556"
+    const-string/jumbo v0, "7557"
+    const-string/jumbo v0, "7558"
+    const-string/jumbo v0, "7559"
+    const-string/jumbo v0, "7560"
+    const-string/jumbo v0, "7561"
+    const-string/jumbo v0, "7562"
+    const-string/jumbo v0, "7563"
+    const-string/jumbo v0, "7564"
+    const-string/jumbo v0, "7565"
+    const-string/jumbo v0, "7566"
+    const-string/jumbo v0, "7567"
+    const-string/jumbo v0, "7568"
+    const-string/jumbo v0, "7569"
+    const-string/jumbo v0, "7570"
+    const-string/jumbo v0, "7571"
+    const-string/jumbo v0, "7572"
+    const-string/jumbo v0, "7573"
+    const-string/jumbo v0, "7574"
+    const-string/jumbo v0, "7575"
+    const-string/jumbo v0, "7576"
+    const-string/jumbo v0, "7577"
+    const-string/jumbo v0, "7578"
+    const-string/jumbo v0, "7579"
+    const-string/jumbo v0, "7580"
+    const-string/jumbo v0, "7581"
+    const-string/jumbo v0, "7582"
+    const-string/jumbo v0, "7583"
+    const-string/jumbo v0, "7584"
+    const-string/jumbo v0, "7585"
+    const-string/jumbo v0, "7586"
+    const-string/jumbo v0, "7587"
+    const-string/jumbo v0, "7588"
+    const-string/jumbo v0, "7589"
+    const-string/jumbo v0, "7590"
+    const-string/jumbo v0, "7591"
+    const-string/jumbo v0, "7592"
+    const-string/jumbo v0, "7593"
+    const-string/jumbo v0, "7594"
+    const-string/jumbo v0, "7595"
+    const-string/jumbo v0, "7596"
+    const-string/jumbo v0, "7597"
+    const-string/jumbo v0, "7598"
+    const-string/jumbo v0, "7599"
+    const-string/jumbo v0, "7600"
+    const-string/jumbo v0, "7601"
+    const-string/jumbo v0, "7602"
+    const-string/jumbo v0, "7603"
+    const-string/jumbo v0, "7604"
+    const-string/jumbo v0, "7605"
+    const-string/jumbo v0, "7606"
+    const-string/jumbo v0, "7607"
+    const-string/jumbo v0, "7608"
+    const-string/jumbo v0, "7609"
+    const-string/jumbo v0, "7610"
+    const-string/jumbo v0, "7611"
+    const-string/jumbo v0, "7612"
+    const-string/jumbo v0, "7613"
+    const-string/jumbo v0, "7614"
+    const-string/jumbo v0, "7615"
+    const-string/jumbo v0, "7616"
+    const-string/jumbo v0, "7617"
+    const-string/jumbo v0, "7618"
+    const-string/jumbo v0, "7619"
+    const-string/jumbo v0, "7620"
+    const-string/jumbo v0, "7621"
+    const-string/jumbo v0, "7622"
+    const-string/jumbo v0, "7623"
+    const-string/jumbo v0, "7624"
+    const-string/jumbo v0, "7625"
+    const-string/jumbo v0, "7626"
+    const-string/jumbo v0, "7627"
+    const-string/jumbo v0, "7628"
+    const-string/jumbo v0, "7629"
+    const-string/jumbo v0, "7630"
+    const-string/jumbo v0, "7631"
+    const-string/jumbo v0, "7632"
+    const-string/jumbo v0, "7633"
+    const-string/jumbo v0, "7634"
+    const-string/jumbo v0, "7635"
+    const-string/jumbo v0, "7636"
+    const-string/jumbo v0, "7637"
+    const-string/jumbo v0, "7638"
+    const-string/jumbo v0, "7639"
+    const-string/jumbo v0, "7640"
+    const-string/jumbo v0, "7641"
+    const-string/jumbo v0, "7642"
+    const-string/jumbo v0, "7643"
+    const-string/jumbo v0, "7644"
+    const-string/jumbo v0, "7645"
+    const-string/jumbo v0, "7646"
+    const-string/jumbo v0, "7647"
+    const-string/jumbo v0, "7648"
+    const-string/jumbo v0, "7649"
+    const-string/jumbo v0, "7650"
+    const-string/jumbo v0, "7651"
+    const-string/jumbo v0, "7652"
+    const-string/jumbo v0, "7653"
+    const-string/jumbo v0, "7654"
+    const-string/jumbo v0, "7655"
+    const-string/jumbo v0, "7656"
+    const-string/jumbo v0, "7657"
+    const-string/jumbo v0, "7658"
+    const-string/jumbo v0, "7659"
+    const-string/jumbo v0, "7660"
+    const-string/jumbo v0, "7661"
+    const-string/jumbo v0, "7662"
+    const-string/jumbo v0, "7663"
+    const-string/jumbo v0, "7664"
+    const-string/jumbo v0, "7665"
+    const-string/jumbo v0, "7666"
+    const-string/jumbo v0, "7667"
+    const-string/jumbo v0, "7668"
+    const-string/jumbo v0, "7669"
+    const-string/jumbo v0, "7670"
+    const-string/jumbo v0, "7671"
+    const-string/jumbo v0, "7672"
+    const-string/jumbo v0, "7673"
+    const-string/jumbo v0, "7674"
+    const-string/jumbo v0, "7675"
+    const-string/jumbo v0, "7676"
+    const-string/jumbo v0, "7677"
+    const-string/jumbo v0, "7678"
+    const-string/jumbo v0, "7679"
+    const-string/jumbo v0, "7680"
+    const-string/jumbo v0, "7681"
+    const-string/jumbo v0, "7682"
+    const-string/jumbo v0, "7683"
+    const-string/jumbo v0, "7684"
+    const-string/jumbo v0, "7685"
+    const-string/jumbo v0, "7686"
+    const-string/jumbo v0, "7687"
+    const-string/jumbo v0, "7688"
+    const-string/jumbo v0, "7689"
+    const-string/jumbo v0, "7690"
+    const-string/jumbo v0, "7691"
+    const-string/jumbo v0, "7692"
+    const-string/jumbo v0, "7693"
+    const-string/jumbo v0, "7694"
+    const-string/jumbo v0, "7695"
+    const-string/jumbo v0, "7696"
+    const-string/jumbo v0, "7697"
+    const-string/jumbo v0, "7698"
+    const-string/jumbo v0, "7699"
+    const-string/jumbo v0, "7700"
+    const-string/jumbo v0, "7701"
+    const-string/jumbo v0, "7702"
+    const-string/jumbo v0, "7703"
+    const-string/jumbo v0, "7704"
+    const-string/jumbo v0, "7705"
+    const-string/jumbo v0, "7706"
+    const-string/jumbo v0, "7707"
+    const-string/jumbo v0, "7708"
+    const-string/jumbo v0, "7709"
+    const-string/jumbo v0, "7710"
+    const-string/jumbo v0, "7711"
+    const-string/jumbo v0, "7712"
+    const-string/jumbo v0, "7713"
+    const-string/jumbo v0, "7714"
+    const-string/jumbo v0, "7715"
+    const-string/jumbo v0, "7716"
+    const-string/jumbo v0, "7717"
+    const-string/jumbo v0, "7718"
+    const-string/jumbo v0, "7719"
+    const-string/jumbo v0, "7720"
+    const-string/jumbo v0, "7721"
+    const-string/jumbo v0, "7722"
+    const-string/jumbo v0, "7723"
+    const-string/jumbo v0, "7724"
+    const-string/jumbo v0, "7725"
+    const-string/jumbo v0, "7726"
+    const-string/jumbo v0, "7727"
+    const-string/jumbo v0, "7728"
+    const-string/jumbo v0, "7729"
+    const-string/jumbo v0, "7730"
+    const-string/jumbo v0, "7731"
+    const-string/jumbo v0, "7732"
+    const-string/jumbo v0, "7733"
+    const-string/jumbo v0, "7734"
+    const-string/jumbo v0, "7735"
+    const-string/jumbo v0, "7736"
+    const-string/jumbo v0, "7737"
+    const-string/jumbo v0, "7738"
+    const-string/jumbo v0, "7739"
+    const-string/jumbo v0, "7740"
+    const-string/jumbo v0, "7741"
+    const-string/jumbo v0, "7742"
+    const-string/jumbo v0, "7743"
+    const-string/jumbo v0, "7744"
+    const-string/jumbo v0, "7745"
+    const-string/jumbo v0, "7746"
+    const-string/jumbo v0, "7747"
+    const-string/jumbo v0, "7748"
+    const-string/jumbo v0, "7749"
+    const-string/jumbo v0, "7750"
+    const-string/jumbo v0, "7751"
+    const-string/jumbo v0, "7752"
+    const-string/jumbo v0, "7753"
+    const-string/jumbo v0, "7754"
+    const-string/jumbo v0, "7755"
+    const-string/jumbo v0, "7756"
+    const-string/jumbo v0, "7757"
+    const-string/jumbo v0, "7758"
+    const-string/jumbo v0, "7759"
+    const-string/jumbo v0, "7760"
+    const-string/jumbo v0, "7761"
+    const-string/jumbo v0, "7762"
+    const-string/jumbo v0, "7763"
+    const-string/jumbo v0, "7764"
+    const-string/jumbo v0, "7765"
+    const-string/jumbo v0, "7766"
+    const-string/jumbo v0, "7767"
+    const-string/jumbo v0, "7768"
+    const-string/jumbo v0, "7769"
+    const-string/jumbo v0, "7770"
+    const-string/jumbo v0, "7771"
+    const-string/jumbo v0, "7772"
+    const-string/jumbo v0, "7773"
+    const-string/jumbo v0, "7774"
+    const-string/jumbo v0, "7775"
+    const-string/jumbo v0, "7776"
+    const-string/jumbo v0, "7777"
+    const-string/jumbo v0, "7778"
+    const-string/jumbo v0, "7779"
+    const-string/jumbo v0, "7780"
+    const-string/jumbo v0, "7781"
+    const-string/jumbo v0, "7782"
+    const-string/jumbo v0, "7783"
+    const-string/jumbo v0, "7784"
+    const-string/jumbo v0, "7785"
+    const-string/jumbo v0, "7786"
+    const-string/jumbo v0, "7787"
+    const-string/jumbo v0, "7788"
+    const-string/jumbo v0, "7789"
+    const-string/jumbo v0, "7790"
+    const-string/jumbo v0, "7791"
+    const-string/jumbo v0, "7792"
+    const-string/jumbo v0, "7793"
+    const-string/jumbo v0, "7794"
+    const-string/jumbo v0, "7795"
+    const-string/jumbo v0, "7796"
+    const-string/jumbo v0, "7797"
+    const-string/jumbo v0, "7798"
+    const-string/jumbo v0, "7799"
+    const-string/jumbo v0, "7800"
+    const-string/jumbo v0, "7801"
+    const-string/jumbo v0, "7802"
+    const-string/jumbo v0, "7803"
+    const-string/jumbo v0, "7804"
+    const-string/jumbo v0, "7805"
+    const-string/jumbo v0, "7806"
+    const-string/jumbo v0, "7807"
+    const-string/jumbo v0, "7808"
+    const-string/jumbo v0, "7809"
+    const-string/jumbo v0, "7810"
+    const-string/jumbo v0, "7811"
+    const-string/jumbo v0, "7812"
+    const-string/jumbo v0, "7813"
+    const-string/jumbo v0, "7814"
+    const-string/jumbo v0, "7815"
+    const-string/jumbo v0, "7816"
+    const-string/jumbo v0, "7817"
+    const-string/jumbo v0, "7818"
+    const-string/jumbo v0, "7819"
+    const-string/jumbo v0, "7820"
+    const-string/jumbo v0, "7821"
+    const-string/jumbo v0, "7822"
+    const-string/jumbo v0, "7823"
+    const-string/jumbo v0, "7824"
+    const-string/jumbo v0, "7825"
+    const-string/jumbo v0, "7826"
+    const-string/jumbo v0, "7827"
+    const-string/jumbo v0, "7828"
+    const-string/jumbo v0, "7829"
+    const-string/jumbo v0, "7830"
+    const-string/jumbo v0, "7831"
+    const-string/jumbo v0, "7832"
+    const-string/jumbo v0, "7833"
+    const-string/jumbo v0, "7834"
+    const-string/jumbo v0, "7835"
+    const-string/jumbo v0, "7836"
+    const-string/jumbo v0, "7837"
+    const-string/jumbo v0, "7838"
+    const-string/jumbo v0, "7839"
+    const-string/jumbo v0, "7840"
+    const-string/jumbo v0, "7841"
+    const-string/jumbo v0, "7842"
+    const-string/jumbo v0, "7843"
+    const-string/jumbo v0, "7844"
+    const-string/jumbo v0, "7845"
+    const-string/jumbo v0, "7846"
+    const-string/jumbo v0, "7847"
+    const-string/jumbo v0, "7848"
+    const-string/jumbo v0, "7849"
+    const-string/jumbo v0, "7850"
+    const-string/jumbo v0, "7851"
+    const-string/jumbo v0, "7852"
+    const-string/jumbo v0, "7853"
+    const-string/jumbo v0, "7854"
+    const-string/jumbo v0, "7855"
+    const-string/jumbo v0, "7856"
+    const-string/jumbo v0, "7857"
+    const-string/jumbo v0, "7858"
+    const-string/jumbo v0, "7859"
+    const-string/jumbo v0, "7860"
+    const-string/jumbo v0, "7861"
+    const-string/jumbo v0, "7862"
+    const-string/jumbo v0, "7863"
+    const-string/jumbo v0, "7864"
+    const-string/jumbo v0, "7865"
+    const-string/jumbo v0, "7866"
+    const-string/jumbo v0, "7867"
+    const-string/jumbo v0, "7868"
+    const-string/jumbo v0, "7869"
+    const-string/jumbo v0, "7870"
+    const-string/jumbo v0, "7871"
+    const-string/jumbo v0, "7872"
+    const-string/jumbo v0, "7873"
+    const-string/jumbo v0, "7874"
+    const-string/jumbo v0, "7875"
+    const-string/jumbo v0, "7876"
+    const-string/jumbo v0, "7877"
+    const-string/jumbo v0, "7878"
+    const-string/jumbo v0, "7879"
+    const-string/jumbo v0, "7880"
+    const-string/jumbo v0, "7881"
+    const-string/jumbo v0, "7882"
+    const-string/jumbo v0, "7883"
+    const-string/jumbo v0, "7884"
+    const-string/jumbo v0, "7885"
+    const-string/jumbo v0, "7886"
+    const-string/jumbo v0, "7887"
+    const-string/jumbo v0, "7888"
+    const-string/jumbo v0, "7889"
+    const-string/jumbo v0, "7890"
+    const-string/jumbo v0, "7891"
+    const-string/jumbo v0, "7892"
+    const-string/jumbo v0, "7893"
+    const-string/jumbo v0, "7894"
+    const-string/jumbo v0, "7895"
+    const-string/jumbo v0, "7896"
+    const-string/jumbo v0, "7897"
+    const-string/jumbo v0, "7898"
+    const-string/jumbo v0, "7899"
+    const-string/jumbo v0, "7900"
+    const-string/jumbo v0, "7901"
+    const-string/jumbo v0, "7902"
+    const-string/jumbo v0, "7903"
+    const-string/jumbo v0, "7904"
+    const-string/jumbo v0, "7905"
+    const-string/jumbo v0, "7906"
+    const-string/jumbo v0, "7907"
+    const-string/jumbo v0, "7908"
+    const-string/jumbo v0, "7909"
+    const-string/jumbo v0, "7910"
+    const-string/jumbo v0, "7911"
+    const-string/jumbo v0, "7912"
+    const-string/jumbo v0, "7913"
+    const-string/jumbo v0, "7914"
+    const-string/jumbo v0, "7915"
+    const-string/jumbo v0, "7916"
+    const-string/jumbo v0, "7917"
+    const-string/jumbo v0, "7918"
+    const-string/jumbo v0, "7919"
+    const-string/jumbo v0, "7920"
+    const-string/jumbo v0, "7921"
+    const-string/jumbo v0, "7922"
+    const-string/jumbo v0, "7923"
+    const-string/jumbo v0, "7924"
+    const-string/jumbo v0, "7925"
+    const-string/jumbo v0, "7926"
+    const-string/jumbo v0, "7927"
+    const-string/jumbo v0, "7928"
+    const-string/jumbo v0, "7929"
+    const-string/jumbo v0, "7930"
+    const-string/jumbo v0, "7931"
+    const-string/jumbo v0, "7932"
+    const-string/jumbo v0, "7933"
+    const-string/jumbo v0, "7934"
+    const-string/jumbo v0, "7935"
+    const-string/jumbo v0, "7936"
+    const-string/jumbo v0, "7937"
+    const-string/jumbo v0, "7938"
+    const-string/jumbo v0, "7939"
+    const-string/jumbo v0, "7940"
+    const-string/jumbo v0, "7941"
+    const-string/jumbo v0, "7942"
+    const-string/jumbo v0, "7943"
+    const-string/jumbo v0, "7944"
+    const-string/jumbo v0, "7945"
+    const-string/jumbo v0, "7946"
+    const-string/jumbo v0, "7947"
+    const-string/jumbo v0, "7948"
+    const-string/jumbo v0, "7949"
+    const-string/jumbo v0, "7950"
+    const-string/jumbo v0, "7951"
+    const-string/jumbo v0, "7952"
+    const-string/jumbo v0, "7953"
+    const-string/jumbo v0, "7954"
+    const-string/jumbo v0, "7955"
+    const-string/jumbo v0, "7956"
+    const-string/jumbo v0, "7957"
+    const-string/jumbo v0, "7958"
+    const-string/jumbo v0, "7959"
+    const-string/jumbo v0, "7960"
+    const-string/jumbo v0, "7961"
+    const-string/jumbo v0, "7962"
+    const-string/jumbo v0, "7963"
+    const-string/jumbo v0, "7964"
+    const-string/jumbo v0, "7965"
+    const-string/jumbo v0, "7966"
+    const-string/jumbo v0, "7967"
+    const-string/jumbo v0, "7968"
+    const-string/jumbo v0, "7969"
+    const-string/jumbo v0, "7970"
+    const-string/jumbo v0, "7971"
+    const-string/jumbo v0, "7972"
+    const-string/jumbo v0, "7973"
+    const-string/jumbo v0, "7974"
+    const-string/jumbo v0, "7975"
+    const-string/jumbo v0, "7976"
+    const-string/jumbo v0, "7977"
+    const-string/jumbo v0, "7978"
+    const-string/jumbo v0, "7979"
+    const-string/jumbo v0, "7980"
+    const-string/jumbo v0, "7981"
+    const-string/jumbo v0, "7982"
+    const-string/jumbo v0, "7983"
+    const-string/jumbo v0, "7984"
+    const-string/jumbo v0, "7985"
+    const-string/jumbo v0, "7986"
+    const-string/jumbo v0, "7987"
+    const-string/jumbo v0, "7988"
+    const-string/jumbo v0, "7989"
+    const-string/jumbo v0, "7990"
+    const-string/jumbo v0, "7991"
+    const-string/jumbo v0, "7992"
+    const-string/jumbo v0, "7993"
+    const-string/jumbo v0, "7994"
+    const-string/jumbo v0, "7995"
+    const-string/jumbo v0, "7996"
+    const-string/jumbo v0, "7997"
+    const-string/jumbo v0, "7998"
+    const-string/jumbo v0, "7999"
+    const-string/jumbo v0, "8000"
+    const-string/jumbo v0, "8001"
+    const-string/jumbo v0, "8002"
+    const-string/jumbo v0, "8003"
+    const-string/jumbo v0, "8004"
+    const-string/jumbo v0, "8005"
+    const-string/jumbo v0, "8006"
+    const-string/jumbo v0, "8007"
+    const-string/jumbo v0, "8008"
+    const-string/jumbo v0, "8009"
+    const-string/jumbo v0, "8010"
+    const-string/jumbo v0, "8011"
+    const-string/jumbo v0, "8012"
+    const-string/jumbo v0, "8013"
+    const-string/jumbo v0, "8014"
+    const-string/jumbo v0, "8015"
+    const-string/jumbo v0, "8016"
+    const-string/jumbo v0, "8017"
+    const-string/jumbo v0, "8018"
+    const-string/jumbo v0, "8019"
+    const-string/jumbo v0, "8020"
+    const-string/jumbo v0, "8021"
+    const-string/jumbo v0, "8022"
+    const-string/jumbo v0, "8023"
+    const-string/jumbo v0, "8024"
+    const-string/jumbo v0, "8025"
+    const-string/jumbo v0, "8026"
+    const-string/jumbo v0, "8027"
+    const-string/jumbo v0, "8028"
+    const-string/jumbo v0, "8029"
+    const-string/jumbo v0, "8030"
+    const-string/jumbo v0, "8031"
+    const-string/jumbo v0, "8032"
+    const-string/jumbo v0, "8033"
+    const-string/jumbo v0, "8034"
+    const-string/jumbo v0, "8035"
+    const-string/jumbo v0, "8036"
+    const-string/jumbo v0, "8037"
+    const-string/jumbo v0, "8038"
+    const-string/jumbo v0, "8039"
+    const-string/jumbo v0, "8040"
+    const-string/jumbo v0, "8041"
+    const-string/jumbo v0, "8042"
+    const-string/jumbo v0, "8043"
+    const-string/jumbo v0, "8044"
+    const-string/jumbo v0, "8045"
+    const-string/jumbo v0, "8046"
+    const-string/jumbo v0, "8047"
+    const-string/jumbo v0, "8048"
+    const-string/jumbo v0, "8049"
+    const-string/jumbo v0, "8050"
+    const-string/jumbo v0, "8051"
+    const-string/jumbo v0, "8052"
+    const-string/jumbo v0, "8053"
+    const-string/jumbo v0, "8054"
+    const-string/jumbo v0, "8055"
+    const-string/jumbo v0, "8056"
+    const-string/jumbo v0, "8057"
+    const-string/jumbo v0, "8058"
+    const-string/jumbo v0, "8059"
+    const-string/jumbo v0, "8060"
+    const-string/jumbo v0, "8061"
+    const-string/jumbo v0, "8062"
+    const-string/jumbo v0, "8063"
+    const-string/jumbo v0, "8064"
+    const-string/jumbo v0, "8065"
+    const-string/jumbo v0, "8066"
+    const-string/jumbo v0, "8067"
+    const-string/jumbo v0, "8068"
+    const-string/jumbo v0, "8069"
+    const-string/jumbo v0, "8070"
+    const-string/jumbo v0, "8071"
+    const-string/jumbo v0, "8072"
+    const-string/jumbo v0, "8073"
+    const-string/jumbo v0, "8074"
+    const-string/jumbo v0, "8075"
+    const-string/jumbo v0, "8076"
+    const-string/jumbo v0, "8077"
+    const-string/jumbo v0, "8078"
+    const-string/jumbo v0, "8079"
+    const-string/jumbo v0, "8080"
+    const-string/jumbo v0, "8081"
+    const-string/jumbo v0, "8082"
+    const-string/jumbo v0, "8083"
+    const-string/jumbo v0, "8084"
+    const-string/jumbo v0, "8085"
+    const-string/jumbo v0, "8086"
+    const-string/jumbo v0, "8087"
+    const-string/jumbo v0, "8088"
+    const-string/jumbo v0, "8089"
+    const-string/jumbo v0, "8090"
+    const-string/jumbo v0, "8091"
+    const-string/jumbo v0, "8092"
+    const-string/jumbo v0, "8093"
+    const-string/jumbo v0, "8094"
+    const-string/jumbo v0, "8095"
+    const-string/jumbo v0, "8096"
+    const-string/jumbo v0, "8097"
+    const-string/jumbo v0, "8098"
+    const-string/jumbo v0, "8099"
+    const-string/jumbo v0, "8100"
+    const-string/jumbo v0, "8101"
+    const-string/jumbo v0, "8102"
+    const-string/jumbo v0, "8103"
+    const-string/jumbo v0, "8104"
+    const-string/jumbo v0, "8105"
+    const-string/jumbo v0, "8106"
+    const-string/jumbo v0, "8107"
+    const-string/jumbo v0, "8108"
+    const-string/jumbo v0, "8109"
+    const-string/jumbo v0, "8110"
+    const-string/jumbo v0, "8111"
+    const-string/jumbo v0, "8112"
+    const-string/jumbo v0, "8113"
+    const-string/jumbo v0, "8114"
+    const-string/jumbo v0, "8115"
+    const-string/jumbo v0, "8116"
+    const-string/jumbo v0, "8117"
+    const-string/jumbo v0, "8118"
+    const-string/jumbo v0, "8119"
+    const-string/jumbo v0, "8120"
+    const-string/jumbo v0, "8121"
+    const-string/jumbo v0, "8122"
+    const-string/jumbo v0, "8123"
+    const-string/jumbo v0, "8124"
+    const-string/jumbo v0, "8125"
+    const-string/jumbo v0, "8126"
+    const-string/jumbo v0, "8127"
+    const-string/jumbo v0, "8128"
+    const-string/jumbo v0, "8129"
+    const-string/jumbo v0, "8130"
+    const-string/jumbo v0, "8131"
+    const-string/jumbo v0, "8132"
+    const-string/jumbo v0, "8133"
+    const-string/jumbo v0, "8134"
+    const-string/jumbo v0, "8135"
+    const-string/jumbo v0, "8136"
+    const-string/jumbo v0, "8137"
+    const-string/jumbo v0, "8138"
+    const-string/jumbo v0, "8139"
+    const-string/jumbo v0, "8140"
+    const-string/jumbo v0, "8141"
+    const-string/jumbo v0, "8142"
+    const-string/jumbo v0, "8143"
+    const-string/jumbo v0, "8144"
+    const-string/jumbo v0, "8145"
+    const-string/jumbo v0, "8146"
+    const-string/jumbo v0, "8147"
+    const-string/jumbo v0, "8148"
+    const-string/jumbo v0, "8149"
+    const-string/jumbo v0, "8150"
+    const-string/jumbo v0, "8151"
+    const-string/jumbo v0, "8152"
+    const-string/jumbo v0, "8153"
+    const-string/jumbo v0, "8154"
+    const-string/jumbo v0, "8155"
+    const-string/jumbo v0, "8156"
+    const-string/jumbo v0, "8157"
+    const-string/jumbo v0, "8158"
+    const-string/jumbo v0, "8159"
+    const-string/jumbo v0, "8160"
+    const-string/jumbo v0, "8161"
+    const-string/jumbo v0, "8162"
+    const-string/jumbo v0, "8163"
+    const-string/jumbo v0, "8164"
+    const-string/jumbo v0, "8165"
+    const-string/jumbo v0, "8166"
+    const-string/jumbo v0, "8167"
+    const-string/jumbo v0, "8168"
+    const-string/jumbo v0, "8169"
+    const-string/jumbo v0, "8170"
+    const-string/jumbo v0, "8171"
+    const-string/jumbo v0, "8172"
+    const-string/jumbo v0, "8173"
+    const-string/jumbo v0, "8174"
+    const-string/jumbo v0, "8175"
+    const-string/jumbo v0, "8176"
+    const-string/jumbo v0, "8177"
+    const-string/jumbo v0, "8178"
+    const-string/jumbo v0, "8179"
+    const-string/jumbo v0, "8180"
+    const-string/jumbo v0, "8181"
+    const-string/jumbo v0, "8182"
+    const-string/jumbo v0, "8183"
+    const-string/jumbo v0, "8184"
+    const-string/jumbo v0, "8185"
+    const-string/jumbo v0, "8186"
+    const-string/jumbo v0, "8187"
+    const-string/jumbo v0, "8188"
+    const-string/jumbo v0, "8189"
+    const-string/jumbo v0, "8190"
+    const-string/jumbo v0, "8191"
+    const-string/jumbo v0, "8192"
+    const-string/jumbo v0, "8193"
+    const-string/jumbo v0, "8194"
+    const-string/jumbo v0, "8195"
+    const-string/jumbo v0, "8196"
+    const-string/jumbo v0, "8197"
+    const-string/jumbo v0, "8198"
+    const-string/jumbo v0, "8199"
+    const-string/jumbo v0, "8200"
+    const-string/jumbo v0, "8201"
+    const-string/jumbo v0, "8202"
+    const-string/jumbo v0, "8203"
+    const-string/jumbo v0, "8204"
+    const-string/jumbo v0, "8205"
+    const-string/jumbo v0, "8206"
+    const-string/jumbo v0, "8207"
+    const-string/jumbo v0, "8208"
+    const-string/jumbo v0, "8209"
+    const-string/jumbo v0, "8210"
+    const-string/jumbo v0, "8211"
+    const-string/jumbo v0, "8212"
+    const-string/jumbo v0, "8213"
+    const-string/jumbo v0, "8214"
+    const-string/jumbo v0, "8215"
+    const-string/jumbo v0, "8216"
+    const-string/jumbo v0, "8217"
+    const-string/jumbo v0, "8218"
+    const-string/jumbo v0, "8219"
+    const-string/jumbo v0, "8220"
+    const-string/jumbo v0, "8221"
+    const-string/jumbo v0, "8222"
+    const-string/jumbo v0, "8223"
+    const-string/jumbo v0, "8224"
+    const-string/jumbo v0, "8225"
+    const-string/jumbo v0, "8226"
+    const-string/jumbo v0, "8227"
+    const-string/jumbo v0, "8228"
+    const-string/jumbo v0, "8229"
+    const-string/jumbo v0, "8230"
+    const-string/jumbo v0, "8231"
+    const-string/jumbo v0, "8232"
+    const-string/jumbo v0, "8233"
+    const-string/jumbo v0, "8234"
+    const-string/jumbo v0, "8235"
+    const-string/jumbo v0, "8236"
+    const-string/jumbo v0, "8237"
+    const-string/jumbo v0, "8238"
+    const-string/jumbo v0, "8239"
+    const-string/jumbo v0, "8240"
+    const-string/jumbo v0, "8241"
+    const-string/jumbo v0, "8242"
+    const-string/jumbo v0, "8243"
+    const-string/jumbo v0, "8244"
+    const-string/jumbo v0, "8245"
+    const-string/jumbo v0, "8246"
+    const-string/jumbo v0, "8247"
+    const-string/jumbo v0, "8248"
+    const-string/jumbo v0, "8249"
+    const-string/jumbo v0, "8250"
+    const-string/jumbo v0, "8251"
+    const-string/jumbo v0, "8252"
+    const-string/jumbo v0, "8253"
+    const-string/jumbo v0, "8254"
+    const-string/jumbo v0, "8255"
+    const-string/jumbo v0, "8256"
+    const-string/jumbo v0, "8257"
+    const-string/jumbo v0, "8258"
+    const-string/jumbo v0, "8259"
+    const-string/jumbo v0, "8260"
+    const-string/jumbo v0, "8261"
+    const-string/jumbo v0, "8262"
+    const-string/jumbo v0, "8263"
+    const-string/jumbo v0, "8264"
+    const-string/jumbo v0, "8265"
+    const-string/jumbo v0, "8266"
+    const-string/jumbo v0, "8267"
+    const-string/jumbo v0, "8268"
+    const-string/jumbo v0, "8269"
+    const-string/jumbo v0, "8270"
+    const-string/jumbo v0, "8271"
+    const-string/jumbo v0, "8272"
+    const-string/jumbo v0, "8273"
+    const-string/jumbo v0, "8274"
+    const-string/jumbo v0, "8275"
+    const-string/jumbo v0, "8276"
+    const-string/jumbo v0, "8277"
+    const-string/jumbo v0, "8278"
+    const-string/jumbo v0, "8279"
+    const-string/jumbo v0, "8280"
+    const-string/jumbo v0, "8281"
+    const-string/jumbo v0, "8282"
+    const-string/jumbo v0, "8283"
+    const-string/jumbo v0, "8284"
+    const-string/jumbo v0, "8285"
+    const-string/jumbo v0, "8286"
+    const-string/jumbo v0, "8287"
+    const-string/jumbo v0, "8288"
+    const-string/jumbo v0, "8289"
+    const-string/jumbo v0, "8290"
+    const-string/jumbo v0, "8291"
+    const-string/jumbo v0, "8292"
+    const-string/jumbo v0, "8293"
+    const-string/jumbo v0, "8294"
+    const-string/jumbo v0, "8295"
+    const-string/jumbo v0, "8296"
+    const-string/jumbo v0, "8297"
+    const-string/jumbo v0, "8298"
+    const-string/jumbo v0, "8299"
+    const-string/jumbo v0, "8300"
+    const-string/jumbo v0, "8301"
+    const-string/jumbo v0, "8302"
+    const-string/jumbo v0, "8303"
+    const-string/jumbo v0, "8304"
+    const-string/jumbo v0, "8305"
+    const-string/jumbo v0, "8306"
+    const-string/jumbo v0, "8307"
+    const-string/jumbo v0, "8308"
+    const-string/jumbo v0, "8309"
+    const-string/jumbo v0, "8310"
+    const-string/jumbo v0, "8311"
+    const-string/jumbo v0, "8312"
+    const-string/jumbo v0, "8313"
+    const-string/jumbo v0, "8314"
+    const-string/jumbo v0, "8315"
+    const-string/jumbo v0, "8316"
+    const-string/jumbo v0, "8317"
+    const-string/jumbo v0, "8318"
+    const-string/jumbo v0, "8319"
+    const-string/jumbo v0, "8320"
+    const-string/jumbo v0, "8321"
+    const-string/jumbo v0, "8322"
+    const-string/jumbo v0, "8323"
+    const-string/jumbo v0, "8324"
+    const-string/jumbo v0, "8325"
+    const-string/jumbo v0, "8326"
+    const-string/jumbo v0, "8327"
+    const-string/jumbo v0, "8328"
+    const-string/jumbo v0, "8329"
+    const-string/jumbo v0, "8330"
+    const-string/jumbo v0, "8331"
+    const-string/jumbo v0, "8332"
+    const-string/jumbo v0, "8333"
+    const-string/jumbo v0, "8334"
+    const-string/jumbo v0, "8335"
+    const-string/jumbo v0, "8336"
+    const-string/jumbo v0, "8337"
+    const-string/jumbo v0, "8338"
+    const-string/jumbo v0, "8339"
+    const-string/jumbo v0, "8340"
+    const-string/jumbo v0, "8341"
+    const-string/jumbo v0, "8342"
+    const-string/jumbo v0, "8343"
+    const-string/jumbo v0, "8344"
+    const-string/jumbo v0, "8345"
+    const-string/jumbo v0, "8346"
+    const-string/jumbo v0, "8347"
+    const-string/jumbo v0, "8348"
+    const-string/jumbo v0, "8349"
+    const-string/jumbo v0, "8350"
+    const-string/jumbo v0, "8351"
+    const-string/jumbo v0, "8352"
+    const-string/jumbo v0, "8353"
+    const-string/jumbo v0, "8354"
+    const-string/jumbo v0, "8355"
+    const-string/jumbo v0, "8356"
+    const-string/jumbo v0, "8357"
+    const-string/jumbo v0, "8358"
+    const-string/jumbo v0, "8359"
+    const-string/jumbo v0, "8360"
+    const-string/jumbo v0, "8361"
+    const-string/jumbo v0, "8362"
+    const-string/jumbo v0, "8363"
+    const-string/jumbo v0, "8364"
+    const-string/jumbo v0, "8365"
+    const-string/jumbo v0, "8366"
+    const-string/jumbo v0, "8367"
+    const-string/jumbo v0, "8368"
+    const-string/jumbo v0, "8369"
+    const-string/jumbo v0, "8370"
+    const-string/jumbo v0, "8371"
+    const-string/jumbo v0, "8372"
+    const-string/jumbo v0, "8373"
+    const-string/jumbo v0, "8374"
+    const-string/jumbo v0, "8375"
+    const-string/jumbo v0, "8376"
+    const-string/jumbo v0, "8377"
+    const-string/jumbo v0, "8378"
+    const-string/jumbo v0, "8379"
+    const-string/jumbo v0, "8380"
+    const-string/jumbo v0, "8381"
+    const-string/jumbo v0, "8382"
+    const-string/jumbo v0, "8383"
+    const-string/jumbo v0, "8384"
+    const-string/jumbo v0, "8385"
+    const-string/jumbo v0, "8386"
+    const-string/jumbo v0, "8387"
+    const-string/jumbo v0, "8388"
+    const-string/jumbo v0, "8389"
+    const-string/jumbo v0, "8390"
+    const-string/jumbo v0, "8391"
+    const-string/jumbo v0, "8392"
+    const-string/jumbo v0, "8393"
+    const-string/jumbo v0, "8394"
+    const-string/jumbo v0, "8395"
+    const-string/jumbo v0, "8396"
+    const-string/jumbo v0, "8397"
+    const-string/jumbo v0, "8398"
+    const-string/jumbo v0, "8399"
+    const-string/jumbo v0, "8400"
+    const-string/jumbo v0, "8401"
+    const-string/jumbo v0, "8402"
+    const-string/jumbo v0, "8403"
+    const-string/jumbo v0, "8404"
+    const-string/jumbo v0, "8405"
+    const-string/jumbo v0, "8406"
+    const-string/jumbo v0, "8407"
+    const-string/jumbo v0, "8408"
+    const-string/jumbo v0, "8409"
+    const-string/jumbo v0, "8410"
+    const-string/jumbo v0, "8411"
+    const-string/jumbo v0, "8412"
+    const-string/jumbo v0, "8413"
+    const-string/jumbo v0, "8414"
+    const-string/jumbo v0, "8415"
+    const-string/jumbo v0, "8416"
+    const-string/jumbo v0, "8417"
+    const-string/jumbo v0, "8418"
+    const-string/jumbo v0, "8419"
+    const-string/jumbo v0, "8420"
+    const-string/jumbo v0, "8421"
+    const-string/jumbo v0, "8422"
+    const-string/jumbo v0, "8423"
+    const-string/jumbo v0, "8424"
+    const-string/jumbo v0, "8425"
+    const-string/jumbo v0, "8426"
+    const-string/jumbo v0, "8427"
+    const-string/jumbo v0, "8428"
+    const-string/jumbo v0, "8429"
+    const-string/jumbo v0, "8430"
+    const-string/jumbo v0, "8431"
+    const-string/jumbo v0, "8432"
+    const-string/jumbo v0, "8433"
+    const-string/jumbo v0, "8434"
+    const-string/jumbo v0, "8435"
+    const-string/jumbo v0, "8436"
+    const-string/jumbo v0, "8437"
+    const-string/jumbo v0, "8438"
+    const-string/jumbo v0, "8439"
+    const-string/jumbo v0, "8440"
+    const-string/jumbo v0, "8441"
+    const-string/jumbo v0, "8442"
+    const-string/jumbo v0, "8443"
+    const-string/jumbo v0, "8444"
+    const-string/jumbo v0, "8445"
+    const-string/jumbo v0, "8446"
+    const-string/jumbo v0, "8447"
+    const-string/jumbo v0, "8448"
+    const-string/jumbo v0, "8449"
+    const-string/jumbo v0, "8450"
+    const-string/jumbo v0, "8451"
+    const-string/jumbo v0, "8452"
+    const-string/jumbo v0, "8453"
+    const-string/jumbo v0, "8454"
+    const-string/jumbo v0, "8455"
+    const-string/jumbo v0, "8456"
+    const-string/jumbo v0, "8457"
+    const-string/jumbo v0, "8458"
+    const-string/jumbo v0, "8459"
+    const-string/jumbo v0, "8460"
+    const-string/jumbo v0, "8461"
+    const-string/jumbo v0, "8462"
+    const-string/jumbo v0, "8463"
+    const-string/jumbo v0, "8464"
+    const-string/jumbo v0, "8465"
+    const-string/jumbo v0, "8466"
+    const-string/jumbo v0, "8467"
+    const-string/jumbo v0, "8468"
+    const-string/jumbo v0, "8469"
+    const-string/jumbo v0, "8470"
+    const-string/jumbo v0, "8471"
+    const-string/jumbo v0, "8472"
+    const-string/jumbo v0, "8473"
+    const-string/jumbo v0, "8474"
+    const-string/jumbo v0, "8475"
+    const-string/jumbo v0, "8476"
+    const-string/jumbo v0, "8477"
+    const-string/jumbo v0, "8478"
+    const-string/jumbo v0, "8479"
+    const-string/jumbo v0, "8480"
+    const-string/jumbo v0, "8481"
+    const-string/jumbo v0, "8482"
+    const-string/jumbo v0, "8483"
+    const-string/jumbo v0, "8484"
+    const-string/jumbo v0, "8485"
+    const-string/jumbo v0, "8486"
+    const-string/jumbo v0, "8487"
+    const-string/jumbo v0, "8488"
+    const-string/jumbo v0, "8489"
+    const-string/jumbo v0, "8490"
+    const-string/jumbo v0, "8491"
+    const-string/jumbo v0, "8492"
+    const-string/jumbo v0, "8493"
+    const-string/jumbo v0, "8494"
+    const-string/jumbo v0, "8495"
+    const-string/jumbo v0, "8496"
+    const-string/jumbo v0, "8497"
+    const-string/jumbo v0, "8498"
+    const-string/jumbo v0, "8499"
+    const-string/jumbo v0, "8500"
+    const-string/jumbo v0, "8501"
+    const-string/jumbo v0, "8502"
+    const-string/jumbo v0, "8503"
+    const-string/jumbo v0, "8504"
+    const-string/jumbo v0, "8505"
+    const-string/jumbo v0, "8506"
+    const-string/jumbo v0, "8507"
+    const-string/jumbo v0, "8508"
+    const-string/jumbo v0, "8509"
+    const-string/jumbo v0, "8510"
+    const-string/jumbo v0, "8511"
+    const-string/jumbo v0, "8512"
+    const-string/jumbo v0, "8513"
+    const-string/jumbo v0, "8514"
+    const-string/jumbo v0, "8515"
+    const-string/jumbo v0, "8516"
+    const-string/jumbo v0, "8517"
+    const-string/jumbo v0, "8518"
+    const-string/jumbo v0, "8519"
+    const-string/jumbo v0, "8520"
+    const-string/jumbo v0, "8521"
+    const-string/jumbo v0, "8522"
+    const-string/jumbo v0, "8523"
+    const-string/jumbo v0, "8524"
+    const-string/jumbo v0, "8525"
+    const-string/jumbo v0, "8526"
+    const-string/jumbo v0, "8527"
+    const-string/jumbo v0, "8528"
+    const-string/jumbo v0, "8529"
+    const-string/jumbo v0, "8530"
+    const-string/jumbo v0, "8531"
+    const-string/jumbo v0, "8532"
+    const-string/jumbo v0, "8533"
+    const-string/jumbo v0, "8534"
+    const-string/jumbo v0, "8535"
+    const-string/jumbo v0, "8536"
+    const-string/jumbo v0, "8537"
+    const-string/jumbo v0, "8538"
+    const-string/jumbo v0, "8539"
+    const-string/jumbo v0, "8540"
+    const-string/jumbo v0, "8541"
+    const-string/jumbo v0, "8542"
+    const-string/jumbo v0, "8543"
+    const-string/jumbo v0, "8544"
+    const-string/jumbo v0, "8545"
+    const-string/jumbo v0, "8546"
+    const-string/jumbo v0, "8547"
+    const-string/jumbo v0, "8548"
+    const-string/jumbo v0, "8549"
+    const-string/jumbo v0, "8550"
+    const-string/jumbo v0, "8551"
+    const-string/jumbo v0, "8552"
+    const-string/jumbo v0, "8553"
+    const-string/jumbo v0, "8554"
+    const-string/jumbo v0, "8555"
+    const-string/jumbo v0, "8556"
+    const-string/jumbo v0, "8557"
+    const-string/jumbo v0, "8558"
+    const-string/jumbo v0, "8559"
+    const-string/jumbo v0, "8560"
+    const-string/jumbo v0, "8561"
+    const-string/jumbo v0, "8562"
+    const-string/jumbo v0, "8563"
+    const-string/jumbo v0, "8564"
+    const-string/jumbo v0, "8565"
+    const-string/jumbo v0, "8566"
+    const-string/jumbo v0, "8567"
+    const-string/jumbo v0, "8568"
+    const-string/jumbo v0, "8569"
+    const-string/jumbo v0, "8570"
+    const-string/jumbo v0, "8571"
+    const-string/jumbo v0, "8572"
+    const-string/jumbo v0, "8573"
+    const-string/jumbo v0, "8574"
+    const-string/jumbo v0, "8575"
+    const-string/jumbo v0, "8576"
+    const-string/jumbo v0, "8577"
+    const-string/jumbo v0, "8578"
+    const-string/jumbo v0, "8579"
+    const-string/jumbo v0, "8580"
+    const-string/jumbo v0, "8581"
+    const-string/jumbo v0, "8582"
+    const-string/jumbo v0, "8583"
+    const-string/jumbo v0, "8584"
+    const-string/jumbo v0, "8585"
+    const-string/jumbo v0, "8586"
+    const-string/jumbo v0, "8587"
+    const-string/jumbo v0, "8588"
+    const-string/jumbo v0, "8589"
+    const-string/jumbo v0, "8590"
+    const-string/jumbo v0, "8591"
+    const-string/jumbo v0, "8592"
+    const-string/jumbo v0, "8593"
+    const-string/jumbo v0, "8594"
+    const-string/jumbo v0, "8595"
+    const-string/jumbo v0, "8596"
+    const-string/jumbo v0, "8597"
+    const-string/jumbo v0, "8598"
+    const-string/jumbo v0, "8599"
+    const-string/jumbo v0, "8600"
+    const-string/jumbo v0, "8601"
+    const-string/jumbo v0, "8602"
+    const-string/jumbo v0, "8603"
+    const-string/jumbo v0, "8604"
+    const-string/jumbo v0, "8605"
+    const-string/jumbo v0, "8606"
+    const-string/jumbo v0, "8607"
+    const-string/jumbo v0, "8608"
+    const-string/jumbo v0, "8609"
+    const-string/jumbo v0, "8610"
+    const-string/jumbo v0, "8611"
+    const-string/jumbo v0, "8612"
+    const-string/jumbo v0, "8613"
+    const-string/jumbo v0, "8614"
+    const-string/jumbo v0, "8615"
+    const-string/jumbo v0, "8616"
+    const-string/jumbo v0, "8617"
+    const-string/jumbo v0, "8618"
+    const-string/jumbo v0, "8619"
+    const-string/jumbo v0, "8620"
+    const-string/jumbo v0, "8621"
+    const-string/jumbo v0, "8622"
+    const-string/jumbo v0, "8623"
+    const-string/jumbo v0, "8624"
+    const-string/jumbo v0, "8625"
+    const-string/jumbo v0, "8626"
+    const-string/jumbo v0, "8627"
+    const-string/jumbo v0, "8628"
+    const-string/jumbo v0, "8629"
+    const-string/jumbo v0, "8630"
+    const-string/jumbo v0, "8631"
+    const-string/jumbo v0, "8632"
+    const-string/jumbo v0, "8633"
+    const-string/jumbo v0, "8634"
+    const-string/jumbo v0, "8635"
+    const-string/jumbo v0, "8636"
+    const-string/jumbo v0, "8637"
+    const-string/jumbo v0, "8638"
+    const-string/jumbo v0, "8639"
+    const-string/jumbo v0, "8640"
+    const-string/jumbo v0, "8641"
+    const-string/jumbo v0, "8642"
+    const-string/jumbo v0, "8643"
+    const-string/jumbo v0, "8644"
+    const-string/jumbo v0, "8645"
+    const-string/jumbo v0, "8646"
+    const-string/jumbo v0, "8647"
+    const-string/jumbo v0, "8648"
+    const-string/jumbo v0, "8649"
+    const-string/jumbo v0, "8650"
+    const-string/jumbo v0, "8651"
+    const-string/jumbo v0, "8652"
+    const-string/jumbo v0, "8653"
+    const-string/jumbo v0, "8654"
+    const-string/jumbo v0, "8655"
+    const-string/jumbo v0, "8656"
+    const-string/jumbo v0, "8657"
+    const-string/jumbo v0, "8658"
+    const-string/jumbo v0, "8659"
+    const-string/jumbo v0, "8660"
+    const-string/jumbo v0, "8661"
+    const-string/jumbo v0, "8662"
+    const-string/jumbo v0, "8663"
+    const-string/jumbo v0, "8664"
+    const-string/jumbo v0, "8665"
+    const-string/jumbo v0, "8666"
+    const-string/jumbo v0, "8667"
+    const-string/jumbo v0, "8668"
+    const-string/jumbo v0, "8669"
+    const-string/jumbo v0, "8670"
+    const-string/jumbo v0, "8671"
+    const-string/jumbo v0, "8672"
+    const-string/jumbo v0, "8673"
+    const-string/jumbo v0, "8674"
+    const-string/jumbo v0, "8675"
+    const-string/jumbo v0, "8676"
+    const-string/jumbo v0, "8677"
+    const-string/jumbo v0, "8678"
+    const-string/jumbo v0, "8679"
+    const-string/jumbo v0, "8680"
+    const-string/jumbo v0, "8681"
+    const-string/jumbo v0, "8682"
+    const-string/jumbo v0, "8683"
+    const-string/jumbo v0, "8684"
+    const-string/jumbo v0, "8685"
+    const-string/jumbo v0, "8686"
+    const-string/jumbo v0, "8687"
+    const-string/jumbo v0, "8688"
+    const-string/jumbo v0, "8689"
+    const-string/jumbo v0, "8690"
+    const-string/jumbo v0, "8691"
+    const-string/jumbo v0, "8692"
+    const-string/jumbo v0, "8693"
+    const-string/jumbo v0, "8694"
+    const-string/jumbo v0, "8695"
+    const-string/jumbo v0, "8696"
+    const-string/jumbo v0, "8697"
+    const-string/jumbo v0, "8698"
+    const-string/jumbo v0, "8699"
+    const-string/jumbo v0, "8700"
+    const-string/jumbo v0, "8701"
+    const-string/jumbo v0, "8702"
+    const-string/jumbo v0, "8703"
+    const-string/jumbo v0, "8704"
+    const-string/jumbo v0, "8705"
+    const-string/jumbo v0, "8706"
+    const-string/jumbo v0, "8707"
+    const-string/jumbo v0, "8708"
+    const-string/jumbo v0, "8709"
+    const-string/jumbo v0, "8710"
+    const-string/jumbo v0, "8711"
+    const-string/jumbo v0, "8712"
+    const-string/jumbo v0, "8713"
+    const-string/jumbo v0, "8714"
+    const-string/jumbo v0, "8715"
+    const-string/jumbo v0, "8716"
+    const-string/jumbo v0, "8717"
+    const-string/jumbo v0, "8718"
+    const-string/jumbo v0, "8719"
+    const-string/jumbo v0, "8720"
+    const-string/jumbo v0, "8721"
+    const-string/jumbo v0, "8722"
+    const-string/jumbo v0, "8723"
+    const-string/jumbo v0, "8724"
+    const-string/jumbo v0, "8725"
+    const-string/jumbo v0, "8726"
+    const-string/jumbo v0, "8727"
+    const-string/jumbo v0, "8728"
+    const-string/jumbo v0, "8729"
+    const-string/jumbo v0, "8730"
+    const-string/jumbo v0, "8731"
+    const-string/jumbo v0, "8732"
+    const-string/jumbo v0, "8733"
+    const-string/jumbo v0, "8734"
+    const-string/jumbo v0, "8735"
+    const-string/jumbo v0, "8736"
+    const-string/jumbo v0, "8737"
+    const-string/jumbo v0, "8738"
+    const-string/jumbo v0, "8739"
+    const-string/jumbo v0, "8740"
+    const-string/jumbo v0, "8741"
+    const-string/jumbo v0, "8742"
+    const-string/jumbo v0, "8743"
+    const-string/jumbo v0, "8744"
+    const-string/jumbo v0, "8745"
+    const-string/jumbo v0, "8746"
+    const-string/jumbo v0, "8747"
+    const-string/jumbo v0, "8748"
+    const-string/jumbo v0, "8749"
+    const-string/jumbo v0, "8750"
+    const-string/jumbo v0, "8751"
+    const-string/jumbo v0, "8752"
+    const-string/jumbo v0, "8753"
+    const-string/jumbo v0, "8754"
+    const-string/jumbo v0, "8755"
+    const-string/jumbo v0, "8756"
+    const-string/jumbo v0, "8757"
+    const-string/jumbo v0, "8758"
+    const-string/jumbo v0, "8759"
+    const-string/jumbo v0, "8760"
+    const-string/jumbo v0, "8761"
+    const-string/jumbo v0, "8762"
+    const-string/jumbo v0, "8763"
+    const-string/jumbo v0, "8764"
+    const-string/jumbo v0, "8765"
+    const-string/jumbo v0, "8766"
+    const-string/jumbo v0, "8767"
+    const-string/jumbo v0, "8768"
+    const-string/jumbo v0, "8769"
+    const-string/jumbo v0, "8770"
+    const-string/jumbo v0, "8771"
+    const-string/jumbo v0, "8772"
+    const-string/jumbo v0, "8773"
+    const-string/jumbo v0, "8774"
+    const-string/jumbo v0, "8775"
+    const-string/jumbo v0, "8776"
+    const-string/jumbo v0, "8777"
+    const-string/jumbo v0, "8778"
+    const-string/jumbo v0, "8779"
+    const-string/jumbo v0, "8780"
+    const-string/jumbo v0, "8781"
+    const-string/jumbo v0, "8782"
+    const-string/jumbo v0, "8783"
+    const-string/jumbo v0, "8784"
+    const-string/jumbo v0, "8785"
+    const-string/jumbo v0, "8786"
+    const-string/jumbo v0, "8787"
+    const-string/jumbo v0, "8788"
+    const-string/jumbo v0, "8789"
+    const-string/jumbo v0, "8790"
+    const-string/jumbo v0, "8791"
+    const-string/jumbo v0, "8792"
+    const-string/jumbo v0, "8793"
+    const-string/jumbo v0, "8794"
+    const-string/jumbo v0, "8795"
+    const-string/jumbo v0, "8796"
+    const-string/jumbo v0, "8797"
+    const-string/jumbo v0, "8798"
+    const-string/jumbo v0, "8799"
+    const-string/jumbo v0, "8800"
+    const-string/jumbo v0, "8801"
+    const-string/jumbo v0, "8802"
+    const-string/jumbo v0, "8803"
+    const-string/jumbo v0, "8804"
+    const-string/jumbo v0, "8805"
+    const-string/jumbo v0, "8806"
+    const-string/jumbo v0, "8807"
+    const-string/jumbo v0, "8808"
+    const-string/jumbo v0, "8809"
+    const-string/jumbo v0, "8810"
+    const-string/jumbo v0, "8811"
+    const-string/jumbo v0, "8812"
+    const-string/jumbo v0, "8813"
+    const-string/jumbo v0, "8814"
+    const-string/jumbo v0, "8815"
+    const-string/jumbo v0, "8816"
+    const-string/jumbo v0, "8817"
+    const-string/jumbo v0, "8818"
+    const-string/jumbo v0, "8819"
+    const-string/jumbo v0, "8820"
+    const-string/jumbo v0, "8821"
+    const-string/jumbo v0, "8822"
+    const-string/jumbo v0, "8823"
+    const-string/jumbo v0, "8824"
+    const-string/jumbo v0, "8825"
+    const-string/jumbo v0, "8826"
+    const-string/jumbo v0, "8827"
+    const-string/jumbo v0, "8828"
+    const-string/jumbo v0, "8829"
+    const-string/jumbo v0, "8830"
+    const-string/jumbo v0, "8831"
+    const-string/jumbo v0, "8832"
+    const-string/jumbo v0, "8833"
+    const-string/jumbo v0, "8834"
+    const-string/jumbo v0, "8835"
+    const-string/jumbo v0, "8836"
+    const-string/jumbo v0, "8837"
+    const-string/jumbo v0, "8838"
+    const-string/jumbo v0, "8839"
+    const-string/jumbo v0, "8840"
+    const-string/jumbo v0, "8841"
+    const-string/jumbo v0, "8842"
+    const-string/jumbo v0, "8843"
+    const-string/jumbo v0, "8844"
+    const-string/jumbo v0, "8845"
+    const-string/jumbo v0, "8846"
+    const-string/jumbo v0, "8847"
+    const-string/jumbo v0, "8848"
+    const-string/jumbo v0, "8849"
+    const-string/jumbo v0, "8850"
+    const-string/jumbo v0, "8851"
+    const-string/jumbo v0, "8852"
+    const-string/jumbo v0, "8853"
+    const-string/jumbo v0, "8854"
+    const-string/jumbo v0, "8855"
+    const-string/jumbo v0, "8856"
+    const-string/jumbo v0, "8857"
+    const-string/jumbo v0, "8858"
+    const-string/jumbo v0, "8859"
+    const-string/jumbo v0, "8860"
+    const-string/jumbo v0, "8861"
+    const-string/jumbo v0, "8862"
+    const-string/jumbo v0, "8863"
+    const-string/jumbo v0, "8864"
+    const-string/jumbo v0, "8865"
+    const-string/jumbo v0, "8866"
+    const-string/jumbo v0, "8867"
+    const-string/jumbo v0, "8868"
+    const-string/jumbo v0, "8869"
+    const-string/jumbo v0, "8870"
+    const-string/jumbo v0, "8871"
+    const-string/jumbo v0, "8872"
+    const-string/jumbo v0, "8873"
+    const-string/jumbo v0, "8874"
+    const-string/jumbo v0, "8875"
+    const-string/jumbo v0, "8876"
+    const-string/jumbo v0, "8877"
+    const-string/jumbo v0, "8878"
+    const-string/jumbo v0, "8879"
+    const-string/jumbo v0, "8880"
+    const-string/jumbo v0, "8881"
+    const-string/jumbo v0, "8882"
+    const-string/jumbo v0, "8883"
+    const-string/jumbo v0, "8884"
+    const-string/jumbo v0, "8885"
+    const-string/jumbo v0, "8886"
+    const-string/jumbo v0, "8887"
+    const-string/jumbo v0, "8888"
+    const-string/jumbo v0, "8889"
+    const-string/jumbo v0, "8890"
+    const-string/jumbo v0, "8891"
+    const-string/jumbo v0, "8892"
+    const-string/jumbo v0, "8893"
+    const-string/jumbo v0, "8894"
+    const-string/jumbo v0, "8895"
+    const-string/jumbo v0, "8896"
+    const-string/jumbo v0, "8897"
+    const-string/jumbo v0, "8898"
+    const-string/jumbo v0, "8899"
+    const-string/jumbo v0, "8900"
+    const-string/jumbo v0, "8901"
+    const-string/jumbo v0, "8902"
+    const-string/jumbo v0, "8903"
+    const-string/jumbo v0, "8904"
+    const-string/jumbo v0, "8905"
+    const-string/jumbo v0, "8906"
+    const-string/jumbo v0, "8907"
+    const-string/jumbo v0, "8908"
+    const-string/jumbo v0, "8909"
+    const-string/jumbo v0, "8910"
+    const-string/jumbo v0, "8911"
+    const-string/jumbo v0, "8912"
+    const-string/jumbo v0, "8913"
+    const-string/jumbo v0, "8914"
+    const-string/jumbo v0, "8915"
+    const-string/jumbo v0, "8916"
+    const-string/jumbo v0, "8917"
+    const-string/jumbo v0, "8918"
+    const-string/jumbo v0, "8919"
+    const-string/jumbo v0, "8920"
+    const-string/jumbo v0, "8921"
+    const-string/jumbo v0, "8922"
+    const-string/jumbo v0, "8923"
+    const-string/jumbo v0, "8924"
+    const-string/jumbo v0, "8925"
+    const-string/jumbo v0, "8926"
+    const-string/jumbo v0, "8927"
+    const-string/jumbo v0, "8928"
+    const-string/jumbo v0, "8929"
+    const-string/jumbo v0, "8930"
+    const-string/jumbo v0, "8931"
+    const-string/jumbo v0, "8932"
+    const-string/jumbo v0, "8933"
+    const-string/jumbo v0, "8934"
+    const-string/jumbo v0, "8935"
+    const-string/jumbo v0, "8936"
+    const-string/jumbo v0, "8937"
+    const-string/jumbo v0, "8938"
+    const-string/jumbo v0, "8939"
+    const-string/jumbo v0, "8940"
+    const-string/jumbo v0, "8941"
+    const-string/jumbo v0, "8942"
+    const-string/jumbo v0, "8943"
+    const-string/jumbo v0, "8944"
+    const-string/jumbo v0, "8945"
+    const-string/jumbo v0, "8946"
+    const-string/jumbo v0, "8947"
+    const-string/jumbo v0, "8948"
+    const-string/jumbo v0, "8949"
+    const-string/jumbo v0, "8950"
+    const-string/jumbo v0, "8951"
+    const-string/jumbo v0, "8952"
+    const-string/jumbo v0, "8953"
+    const-string/jumbo v0, "8954"
+    const-string/jumbo v0, "8955"
+    const-string/jumbo v0, "8956"
+    const-string/jumbo v0, "8957"
+    const-string/jumbo v0, "8958"
+    const-string/jumbo v0, "8959"
+    const-string/jumbo v0, "8960"
+    const-string/jumbo v0, "8961"
+    const-string/jumbo v0, "8962"
+    const-string/jumbo v0, "8963"
+    const-string/jumbo v0, "8964"
+    const-string/jumbo v0, "8965"
+    const-string/jumbo v0, "8966"
+    const-string/jumbo v0, "8967"
+    const-string/jumbo v0, "8968"
+    const-string/jumbo v0, "8969"
+    const-string/jumbo v0, "8970"
+    const-string/jumbo v0, "8971"
+    const-string/jumbo v0, "8972"
+    const-string/jumbo v0, "8973"
+    const-string/jumbo v0, "8974"
+    const-string/jumbo v0, "8975"
+    const-string/jumbo v0, "8976"
+    const-string/jumbo v0, "8977"
+    const-string/jumbo v0, "8978"
+    const-string/jumbo v0, "8979"
+    const-string/jumbo v0, "8980"
+    const-string/jumbo v0, "8981"
+    const-string/jumbo v0, "8982"
+    const-string/jumbo v0, "8983"
+    const-string/jumbo v0, "8984"
+    const-string/jumbo v0, "8985"
+    const-string/jumbo v0, "8986"
+    const-string/jumbo v0, "8987"
+    const-string/jumbo v0, "8988"
+    const-string/jumbo v0, "8989"
+    const-string/jumbo v0, "8990"
+    const-string/jumbo v0, "8991"
+    const-string/jumbo v0, "8992"
+    const-string/jumbo v0, "8993"
+    const-string/jumbo v0, "8994"
+    const-string/jumbo v0, "8995"
+    const-string/jumbo v0, "8996"
+    const-string/jumbo v0, "8997"
+    const-string/jumbo v0, "8998"
+    const-string/jumbo v0, "8999"
+    const-string/jumbo v0, "9000"
+    const-string/jumbo v0, "9001"
+    const-string/jumbo v0, "9002"
+    const-string/jumbo v0, "9003"
+    const-string/jumbo v0, "9004"
+    const-string/jumbo v0, "9005"
+    const-string/jumbo v0, "9006"
+    const-string/jumbo v0, "9007"
+    const-string/jumbo v0, "9008"
+    const-string/jumbo v0, "9009"
+    const-string/jumbo v0, "9010"
+    const-string/jumbo v0, "9011"
+    const-string/jumbo v0, "9012"
+    const-string/jumbo v0, "9013"
+    const-string/jumbo v0, "9014"
+    const-string/jumbo v0, "9015"
+    const-string/jumbo v0, "9016"
+    const-string/jumbo v0, "9017"
+    const-string/jumbo v0, "9018"
+    const-string/jumbo v0, "9019"
+    const-string/jumbo v0, "9020"
+    const-string/jumbo v0, "9021"
+    const-string/jumbo v0, "9022"
+    const-string/jumbo v0, "9023"
+    const-string/jumbo v0, "9024"
+    const-string/jumbo v0, "9025"
+    const-string/jumbo v0, "9026"
+    const-string/jumbo v0, "9027"
+    const-string/jumbo v0, "9028"
+    const-string/jumbo v0, "9029"
+    const-string/jumbo v0, "9030"
+    const-string/jumbo v0, "9031"
+    const-string/jumbo v0, "9032"
+    const-string/jumbo v0, "9033"
+    const-string/jumbo v0, "9034"
+    const-string/jumbo v0, "9035"
+    const-string/jumbo v0, "9036"
+    const-string/jumbo v0, "9037"
+    const-string/jumbo v0, "9038"
+    const-string/jumbo v0, "9039"
+    const-string/jumbo v0, "9040"
+    const-string/jumbo v0, "9041"
+    const-string/jumbo v0, "9042"
+    const-string/jumbo v0, "9043"
+    const-string/jumbo v0, "9044"
+    const-string/jumbo v0, "9045"
+    const-string/jumbo v0, "9046"
+    const-string/jumbo v0, "9047"
+    const-string/jumbo v0, "9048"
+    const-string/jumbo v0, "9049"
+    const-string/jumbo v0, "9050"
+    const-string/jumbo v0, "9051"
+    const-string/jumbo v0, "9052"
+    const-string/jumbo v0, "9053"
+    const-string/jumbo v0, "9054"
+    const-string/jumbo v0, "9055"
+    const-string/jumbo v0, "9056"
+    const-string/jumbo v0, "9057"
+    const-string/jumbo v0, "9058"
+    const-string/jumbo v0, "9059"
+    const-string/jumbo v0, "9060"
+    const-string/jumbo v0, "9061"
+    const-string/jumbo v0, "9062"
+    const-string/jumbo v0, "9063"
+    const-string/jumbo v0, "9064"
+    const-string/jumbo v0, "9065"
+    const-string/jumbo v0, "9066"
+    const-string/jumbo v0, "9067"
+    const-string/jumbo v0, "9068"
+    const-string/jumbo v0, "9069"
+    const-string/jumbo v0, "9070"
+    const-string/jumbo v0, "9071"
+    const-string/jumbo v0, "9072"
+    const-string/jumbo v0, "9073"
+    const-string/jumbo v0, "9074"
+    const-string/jumbo v0, "9075"
+    const-string/jumbo v0, "9076"
+    const-string/jumbo v0, "9077"
+    const-string/jumbo v0, "9078"
+    const-string/jumbo v0, "9079"
+    const-string/jumbo v0, "9080"
+    const-string/jumbo v0, "9081"
+    const-string/jumbo v0, "9082"
+    const-string/jumbo v0, "9083"
+    const-string/jumbo v0, "9084"
+    const-string/jumbo v0, "9085"
+    const-string/jumbo v0, "9086"
+    const-string/jumbo v0, "9087"
+    const-string/jumbo v0, "9088"
+    const-string/jumbo v0, "9089"
+    const-string/jumbo v0, "9090"
+    const-string/jumbo v0, "9091"
+    const-string/jumbo v0, "9092"
+    const-string/jumbo v0, "9093"
+    const-string/jumbo v0, "9094"
+    const-string/jumbo v0, "9095"
+    const-string/jumbo v0, "9096"
+    const-string/jumbo v0, "9097"
+    const-string/jumbo v0, "9098"
+    const-string/jumbo v0, "9099"
+    const-string/jumbo v0, "9100"
+    const-string/jumbo v0, "9101"
+    const-string/jumbo v0, "9102"
+    const-string/jumbo v0, "9103"
+    const-string/jumbo v0, "9104"
+    const-string/jumbo v0, "9105"
+    const-string/jumbo v0, "9106"
+    const-string/jumbo v0, "9107"
+    const-string/jumbo v0, "9108"
+    const-string/jumbo v0, "9109"
+    const-string/jumbo v0, "9110"
+    const-string/jumbo v0, "9111"
+    const-string/jumbo v0, "9112"
+    const-string/jumbo v0, "9113"
+    const-string/jumbo v0, "9114"
+    const-string/jumbo v0, "9115"
+    const-string/jumbo v0, "9116"
+    const-string/jumbo v0, "9117"
+    const-string/jumbo v0, "9118"
+    const-string/jumbo v0, "9119"
+    const-string/jumbo v0, "9120"
+    const-string/jumbo v0, "9121"
+    const-string/jumbo v0, "9122"
+    const-string/jumbo v0, "9123"
+    const-string/jumbo v0, "9124"
+    const-string/jumbo v0, "9125"
+    const-string/jumbo v0, "9126"
+    const-string/jumbo v0, "9127"
+    const-string/jumbo v0, "9128"
+    const-string/jumbo v0, "9129"
+    const-string/jumbo v0, "9130"
+    const-string/jumbo v0, "9131"
+    const-string/jumbo v0, "9132"
+    const-string/jumbo v0, "9133"
+    const-string/jumbo v0, "9134"
+    const-string/jumbo v0, "9135"
+    const-string/jumbo v0, "9136"
+    const-string/jumbo v0, "9137"
+    const-string/jumbo v0, "9138"
+    const-string/jumbo v0, "9139"
+    const-string/jumbo v0, "9140"
+    const-string/jumbo v0, "9141"
+    const-string/jumbo v0, "9142"
+    const-string/jumbo v0, "9143"
+    const-string/jumbo v0, "9144"
+    const-string/jumbo v0, "9145"
+    const-string/jumbo v0, "9146"
+    const-string/jumbo v0, "9147"
+    const-string/jumbo v0, "9148"
+    const-string/jumbo v0, "9149"
+    const-string/jumbo v0, "9150"
+    const-string/jumbo v0, "9151"
+    const-string/jumbo v0, "9152"
+    const-string/jumbo v0, "9153"
+    const-string/jumbo v0, "9154"
+    const-string/jumbo v0, "9155"
+    const-string/jumbo v0, "9156"
+    const-string/jumbo v0, "9157"
+    const-string/jumbo v0, "9158"
+    const-string/jumbo v0, "9159"
+    const-string/jumbo v0, "9160"
+    const-string/jumbo v0, "9161"
+    const-string/jumbo v0, "9162"
+    const-string/jumbo v0, "9163"
+    const-string/jumbo v0, "9164"
+    const-string/jumbo v0, "9165"
+    const-string/jumbo v0, "9166"
+    const-string/jumbo v0, "9167"
+    const-string/jumbo v0, "9168"
+    const-string/jumbo v0, "9169"
+    const-string/jumbo v0, "9170"
+    const-string/jumbo v0, "9171"
+    const-string/jumbo v0, "9172"
+    const-string/jumbo v0, "9173"
+    const-string/jumbo v0, "9174"
+    const-string/jumbo v0, "9175"
+    const-string/jumbo v0, "9176"
+    const-string/jumbo v0, "9177"
+    const-string/jumbo v0, "9178"
+    const-string/jumbo v0, "9179"
+    const-string/jumbo v0, "9180"
+    const-string/jumbo v0, "9181"
+    const-string/jumbo v0, "9182"
+    const-string/jumbo v0, "9183"
+    const-string/jumbo v0, "9184"
+    const-string/jumbo v0, "9185"
+    const-string/jumbo v0, "9186"
+    const-string/jumbo v0, "9187"
+    const-string/jumbo v0, "9188"
+    const-string/jumbo v0, "9189"
+    const-string/jumbo v0, "9190"
+    const-string/jumbo v0, "9191"
+    const-string/jumbo v0, "9192"
+    const-string/jumbo v0, "9193"
+    const-string/jumbo v0, "9194"
+    const-string/jumbo v0, "9195"
+    const-string/jumbo v0, "9196"
+    const-string/jumbo v0, "9197"
+    const-string/jumbo v0, "9198"
+    const-string/jumbo v0, "9199"
+    const-string/jumbo v0, "9200"
+    const-string/jumbo v0, "9201"
+    const-string/jumbo v0, "9202"
+    const-string/jumbo v0, "9203"
+    const-string/jumbo v0, "9204"
+    const-string/jumbo v0, "9205"
+    const-string/jumbo v0, "9206"
+    const-string/jumbo v0, "9207"
+    const-string/jumbo v0, "9208"
+    const-string/jumbo v0, "9209"
+    const-string/jumbo v0, "9210"
+    const-string/jumbo v0, "9211"
+    const-string/jumbo v0, "9212"
+    const-string/jumbo v0, "9213"
+    const-string/jumbo v0, "9214"
+    const-string/jumbo v0, "9215"
+    const-string/jumbo v0, "9216"
+    const-string/jumbo v0, "9217"
+    const-string/jumbo v0, "9218"
+    const-string/jumbo v0, "9219"
+    const-string/jumbo v0, "9220"
+    const-string/jumbo v0, "9221"
+    const-string/jumbo v0, "9222"
+    const-string/jumbo v0, "9223"
+    const-string/jumbo v0, "9224"
+    const-string/jumbo v0, "9225"
+    const-string/jumbo v0, "9226"
+    const-string/jumbo v0, "9227"
+    const-string/jumbo v0, "9228"
+    const-string/jumbo v0, "9229"
+    const-string/jumbo v0, "9230"
+    const-string/jumbo v0, "9231"
+    const-string/jumbo v0, "9232"
+    const-string/jumbo v0, "9233"
+    const-string/jumbo v0, "9234"
+    const-string/jumbo v0, "9235"
+    const-string/jumbo v0, "9236"
+    const-string/jumbo v0, "9237"
+    const-string/jumbo v0, "9238"
+    const-string/jumbo v0, "9239"
+    const-string/jumbo v0, "9240"
+    const-string/jumbo v0, "9241"
+    const-string/jumbo v0, "9242"
+    const-string/jumbo v0, "9243"
+    const-string/jumbo v0, "9244"
+    const-string/jumbo v0, "9245"
+    const-string/jumbo v0, "9246"
+    const-string/jumbo v0, "9247"
+    const-string/jumbo v0, "9248"
+    const-string/jumbo v0, "9249"
+    const-string/jumbo v0, "9250"
+    const-string/jumbo v0, "9251"
+    const-string/jumbo v0, "9252"
+    const-string/jumbo v0, "9253"
+    const-string/jumbo v0, "9254"
+    const-string/jumbo v0, "9255"
+    const-string/jumbo v0, "9256"
+    const-string/jumbo v0, "9257"
+    const-string/jumbo v0, "9258"
+    const-string/jumbo v0, "9259"
+    const-string/jumbo v0, "9260"
+    const-string/jumbo v0, "9261"
+    const-string/jumbo v0, "9262"
+    const-string/jumbo v0, "9263"
+    const-string/jumbo v0, "9264"
+    const-string/jumbo v0, "9265"
+    const-string/jumbo v0, "9266"
+    const-string/jumbo v0, "9267"
+    const-string/jumbo v0, "9268"
+    const-string/jumbo v0, "9269"
+    const-string/jumbo v0, "9270"
+    const-string/jumbo v0, "9271"
+    const-string/jumbo v0, "9272"
+    const-string/jumbo v0, "9273"
+    const-string/jumbo v0, "9274"
+    const-string/jumbo v0, "9275"
+    const-string/jumbo v0, "9276"
+    const-string/jumbo v0, "9277"
+    const-string/jumbo v0, "9278"
+    const-string/jumbo v0, "9279"
+    const-string/jumbo v0, "9280"
+    const-string/jumbo v0, "9281"
+    const-string/jumbo v0, "9282"
+    const-string/jumbo v0, "9283"
+    const-string/jumbo v0, "9284"
+    const-string/jumbo v0, "9285"
+    const-string/jumbo v0, "9286"
+    const-string/jumbo v0, "9287"
+    const-string/jumbo v0, "9288"
+    const-string/jumbo v0, "9289"
+    const-string/jumbo v0, "9290"
+    const-string/jumbo v0, "9291"
+    const-string/jumbo v0, "9292"
+    const-string/jumbo v0, "9293"
+    const-string/jumbo v0, "9294"
+    const-string/jumbo v0, "9295"
+    const-string/jumbo v0, "9296"
+    const-string/jumbo v0, "9297"
+    const-string/jumbo v0, "9298"
+    const-string/jumbo v0, "9299"
+    const-string/jumbo v0, "9300"
+    const-string/jumbo v0, "9301"
+    const-string/jumbo v0, "9302"
+    const-string/jumbo v0, "9303"
+    const-string/jumbo v0, "9304"
+    const-string/jumbo v0, "9305"
+    const-string/jumbo v0, "9306"
+    const-string/jumbo v0, "9307"
+    const-string/jumbo v0, "9308"
+    const-string/jumbo v0, "9309"
+    const-string/jumbo v0, "9310"
+    const-string/jumbo v0, "9311"
+    const-string/jumbo v0, "9312"
+    const-string/jumbo v0, "9313"
+    const-string/jumbo v0, "9314"
+    const-string/jumbo v0, "9315"
+    const-string/jumbo v0, "9316"
+    const-string/jumbo v0, "9317"
+    const-string/jumbo v0, "9318"
+    const-string/jumbo v0, "9319"
+    const-string/jumbo v0, "9320"
+    const-string/jumbo v0, "9321"
+    const-string/jumbo v0, "9322"
+    const-string/jumbo v0, "9323"
+    const-string/jumbo v0, "9324"
+    const-string/jumbo v0, "9325"
+    const-string/jumbo v0, "9326"
+    const-string/jumbo v0, "9327"
+    const-string/jumbo v0, "9328"
+    const-string/jumbo v0, "9329"
+    const-string/jumbo v0, "9330"
+    const-string/jumbo v0, "9331"
+    const-string/jumbo v0, "9332"
+    const-string/jumbo v0, "9333"
+    const-string/jumbo v0, "9334"
+    const-string/jumbo v0, "9335"
+    const-string/jumbo v0, "9336"
+    const-string/jumbo v0, "9337"
+    const-string/jumbo v0, "9338"
+    const-string/jumbo v0, "9339"
+    const-string/jumbo v0, "9340"
+    const-string/jumbo v0, "9341"
+    const-string/jumbo v0, "9342"
+    const-string/jumbo v0, "9343"
+    const-string/jumbo v0, "9344"
+    const-string/jumbo v0, "9345"
+    const-string/jumbo v0, "9346"
+    const-string/jumbo v0, "9347"
+    const-string/jumbo v0, "9348"
+    const-string/jumbo v0, "9349"
+    const-string/jumbo v0, "9350"
+    const-string/jumbo v0, "9351"
+    const-string/jumbo v0, "9352"
+    const-string/jumbo v0, "9353"
+    const-string/jumbo v0, "9354"
+    const-string/jumbo v0, "9355"
+    const-string/jumbo v0, "9356"
+    const-string/jumbo v0, "9357"
+    const-string/jumbo v0, "9358"
+    const-string/jumbo v0, "9359"
+    const-string/jumbo v0, "9360"
+    const-string/jumbo v0, "9361"
+    const-string/jumbo v0, "9362"
+    const-string/jumbo v0, "9363"
+    const-string/jumbo v0, "9364"
+    const-string/jumbo v0, "9365"
+    const-string/jumbo v0, "9366"
+    const-string/jumbo v0, "9367"
+    const-string/jumbo v0, "9368"
+    const-string/jumbo v0, "9369"
+    const-string/jumbo v0, "9370"
+    const-string/jumbo v0, "9371"
+    const-string/jumbo v0, "9372"
+    const-string/jumbo v0, "9373"
+    const-string/jumbo v0, "9374"
+    const-string/jumbo v0, "9375"
+    const-string/jumbo v0, "9376"
+    const-string/jumbo v0, "9377"
+    const-string/jumbo v0, "9378"
+    const-string/jumbo v0, "9379"
+    const-string/jumbo v0, "9380"
+    const-string/jumbo v0, "9381"
+    const-string/jumbo v0, "9382"
+    const-string/jumbo v0, "9383"
+    const-string/jumbo v0, "9384"
+    const-string/jumbo v0, "9385"
+    const-string/jumbo v0, "9386"
+    const-string/jumbo v0, "9387"
+    const-string/jumbo v0, "9388"
+    const-string/jumbo v0, "9389"
+    const-string/jumbo v0, "9390"
+    const-string/jumbo v0, "9391"
+    const-string/jumbo v0, "9392"
+    const-string/jumbo v0, "9393"
+    const-string/jumbo v0, "9394"
+    const-string/jumbo v0, "9395"
+    const-string/jumbo v0, "9396"
+    const-string/jumbo v0, "9397"
+    const-string/jumbo v0, "9398"
+    const-string/jumbo v0, "9399"
+    const-string/jumbo v0, "9400"
+    const-string/jumbo v0, "9401"
+    const-string/jumbo v0, "9402"
+    const-string/jumbo v0, "9403"
+    const-string/jumbo v0, "9404"
+    const-string/jumbo v0, "9405"
+    const-string/jumbo v0, "9406"
+    const-string/jumbo v0, "9407"
+    const-string/jumbo v0, "9408"
+    const-string/jumbo v0, "9409"
+    const-string/jumbo v0, "9410"
+    const-string/jumbo v0, "9411"
+    const-string/jumbo v0, "9412"
+    const-string/jumbo v0, "9413"
+    const-string/jumbo v0, "9414"
+    const-string/jumbo v0, "9415"
+    const-string/jumbo v0, "9416"
+    const-string/jumbo v0, "9417"
+    const-string/jumbo v0, "9418"
+    const-string/jumbo v0, "9419"
+    const-string/jumbo v0, "9420"
+    const-string/jumbo v0, "9421"
+    const-string/jumbo v0, "9422"
+    const-string/jumbo v0, "9423"
+    const-string/jumbo v0, "9424"
+    const-string/jumbo v0, "9425"
+    const-string/jumbo v0, "9426"
+    const-string/jumbo v0, "9427"
+    const-string/jumbo v0, "9428"
+    const-string/jumbo v0, "9429"
+    const-string/jumbo v0, "9430"
+    const-string/jumbo v0, "9431"
+    const-string/jumbo v0, "9432"
+    const-string/jumbo v0, "9433"
+    const-string/jumbo v0, "9434"
+    const-string/jumbo v0, "9435"
+    const-string/jumbo v0, "9436"
+    const-string/jumbo v0, "9437"
+    const-string/jumbo v0, "9438"
+    const-string/jumbo v0, "9439"
+    const-string/jumbo v0, "9440"
+    const-string/jumbo v0, "9441"
+    const-string/jumbo v0, "9442"
+    const-string/jumbo v0, "9443"
+    const-string/jumbo v0, "9444"
+    const-string/jumbo v0, "9445"
+    const-string/jumbo v0, "9446"
+    const-string/jumbo v0, "9447"
+    const-string/jumbo v0, "9448"
+    const-string/jumbo v0, "9449"
+    const-string/jumbo v0, "9450"
+    const-string/jumbo v0, "9451"
+    const-string/jumbo v0, "9452"
+    const-string/jumbo v0, "9453"
+    const-string/jumbo v0, "9454"
+    const-string/jumbo v0, "9455"
+    const-string/jumbo v0, "9456"
+    const-string/jumbo v0, "9457"
+    const-string/jumbo v0, "9458"
+    const-string/jumbo v0, "9459"
+    const-string/jumbo v0, "9460"
+    const-string/jumbo v0, "9461"
+    const-string/jumbo v0, "9462"
+    const-string/jumbo v0, "9463"
+    const-string/jumbo v0, "9464"
+    const-string/jumbo v0, "9465"
+    const-string/jumbo v0, "9466"
+    const-string/jumbo v0, "9467"
+    const-string/jumbo v0, "9468"
+    const-string/jumbo v0, "9469"
+    const-string/jumbo v0, "9470"
+    const-string/jumbo v0, "9471"
+    const-string/jumbo v0, "9472"
+    const-string/jumbo v0, "9473"
+    const-string/jumbo v0, "9474"
+    const-string/jumbo v0, "9475"
+    const-string/jumbo v0, "9476"
+    const-string/jumbo v0, "9477"
+    const-string/jumbo v0, "9478"
+    const-string/jumbo v0, "9479"
+    const-string/jumbo v0, "9480"
+    const-string/jumbo v0, "9481"
+    const-string/jumbo v0, "9482"
+    const-string/jumbo v0, "9483"
+    const-string/jumbo v0, "9484"
+    const-string/jumbo v0, "9485"
+    const-string/jumbo v0, "9486"
+    const-string/jumbo v0, "9487"
+    const-string/jumbo v0, "9488"
+    const-string/jumbo v0, "9489"
+    const-string/jumbo v0, "9490"
+    const-string/jumbo v0, "9491"
+    const-string/jumbo v0, "9492"
+    const-string/jumbo v0, "9493"
+    const-string/jumbo v0, "9494"
+    const-string/jumbo v0, "9495"
+    const-string/jumbo v0, "9496"
+    const-string/jumbo v0, "9497"
+    const-string/jumbo v0, "9498"
+    const-string/jumbo v0, "9499"
+    const-string/jumbo v0, "9500"
+    const-string/jumbo v0, "9501"
+    const-string/jumbo v0, "9502"
+    const-string/jumbo v0, "9503"
+    const-string/jumbo v0, "9504"
+    const-string/jumbo v0, "9505"
+    const-string/jumbo v0, "9506"
+    const-string/jumbo v0, "9507"
+    const-string/jumbo v0, "9508"
+    const-string/jumbo v0, "9509"
+    const-string/jumbo v0, "9510"
+    const-string/jumbo v0, "9511"
+    const-string/jumbo v0, "9512"
+    const-string/jumbo v0, "9513"
+    const-string/jumbo v0, "9514"
+    const-string/jumbo v0, "9515"
+    const-string/jumbo v0, "9516"
+    const-string/jumbo v0, "9517"
+    const-string/jumbo v0, "9518"
+    const-string/jumbo v0, "9519"
+    const-string/jumbo v0, "9520"
+    const-string/jumbo v0, "9521"
+    const-string/jumbo v0, "9522"
+    const-string/jumbo v0, "9523"
+    const-string/jumbo v0, "9524"
+    const-string/jumbo v0, "9525"
+    const-string/jumbo v0, "9526"
+    const-string/jumbo v0, "9527"
+    const-string/jumbo v0, "9528"
+    const-string/jumbo v0, "9529"
+    const-string/jumbo v0, "9530"
+    const-string/jumbo v0, "9531"
+    const-string/jumbo v0, "9532"
+    const-string/jumbo v0, "9533"
+    const-string/jumbo v0, "9534"
+    const-string/jumbo v0, "9535"
+    const-string/jumbo v0, "9536"
+    const-string/jumbo v0, "9537"
+    const-string/jumbo v0, "9538"
+    const-string/jumbo v0, "9539"
+    const-string/jumbo v0, "9540"
+    const-string/jumbo v0, "9541"
+    const-string/jumbo v0, "9542"
+    const-string/jumbo v0, "9543"
+    const-string/jumbo v0, "9544"
+    const-string/jumbo v0, "9545"
+    const-string/jumbo v0, "9546"
+    const-string/jumbo v0, "9547"
+    const-string/jumbo v0, "9548"
+    const-string/jumbo v0, "9549"
+    const-string/jumbo v0, "9550"
+    const-string/jumbo v0, "9551"
+    const-string/jumbo v0, "9552"
+    const-string/jumbo v0, "9553"
+    const-string/jumbo v0, "9554"
+    const-string/jumbo v0, "9555"
+    const-string/jumbo v0, "9556"
+    const-string/jumbo v0, "9557"
+    const-string/jumbo v0, "9558"
+    const-string/jumbo v0, "9559"
+    const-string/jumbo v0, "9560"
+    const-string/jumbo v0, "9561"
+    const-string/jumbo v0, "9562"
+    const-string/jumbo v0, "9563"
+    const-string/jumbo v0, "9564"
+    const-string/jumbo v0, "9565"
+    const-string/jumbo v0, "9566"
+    const-string/jumbo v0, "9567"
+    const-string/jumbo v0, "9568"
+    const-string/jumbo v0, "9569"
+    const-string/jumbo v0, "9570"
+    const-string/jumbo v0, "9571"
+    const-string/jumbo v0, "9572"
+    const-string/jumbo v0, "9573"
+    const-string/jumbo v0, "9574"
+    const-string/jumbo v0, "9575"
+    const-string/jumbo v0, "9576"
+    const-string/jumbo v0, "9577"
+    const-string/jumbo v0, "9578"
+    const-string/jumbo v0, "9579"
+    const-string/jumbo v0, "9580"
+    const-string/jumbo v0, "9581"
+    const-string/jumbo v0, "9582"
+    const-string/jumbo v0, "9583"
+    const-string/jumbo v0, "9584"
+    const-string/jumbo v0, "9585"
+    const-string/jumbo v0, "9586"
+    const-string/jumbo v0, "9587"
+    const-string/jumbo v0, "9588"
+    const-string/jumbo v0, "9589"
+    const-string/jumbo v0, "9590"
+    const-string/jumbo v0, "9591"
+    const-string/jumbo v0, "9592"
+    const-string/jumbo v0, "9593"
+    const-string/jumbo v0, "9594"
+    const-string/jumbo v0, "9595"
+    const-string/jumbo v0, "9596"
+    const-string/jumbo v0, "9597"
+    const-string/jumbo v0, "9598"
+    const-string/jumbo v0, "9599"
+    const-string/jumbo v0, "9600"
+    const-string/jumbo v0, "9601"
+    const-string/jumbo v0, "9602"
+    const-string/jumbo v0, "9603"
+    const-string/jumbo v0, "9604"
+    const-string/jumbo v0, "9605"
+    const-string/jumbo v0, "9606"
+    const-string/jumbo v0, "9607"
+    const-string/jumbo v0, "9608"
+    const-string/jumbo v0, "9609"
+    const-string/jumbo v0, "9610"
+    const-string/jumbo v0, "9611"
+    const-string/jumbo v0, "9612"
+    const-string/jumbo v0, "9613"
+    const-string/jumbo v0, "9614"
+    const-string/jumbo v0, "9615"
+    const-string/jumbo v0, "9616"
+    const-string/jumbo v0, "9617"
+    const-string/jumbo v0, "9618"
+    const-string/jumbo v0, "9619"
+    const-string/jumbo v0, "9620"
+    const-string/jumbo v0, "9621"
+    const-string/jumbo v0, "9622"
+    const-string/jumbo v0, "9623"
+    const-string/jumbo v0, "9624"
+    const-string/jumbo v0, "9625"
+    const-string/jumbo v0, "9626"
+    const-string/jumbo v0, "9627"
+    const-string/jumbo v0, "9628"
+    const-string/jumbo v0, "9629"
+    const-string/jumbo v0, "9630"
+    const-string/jumbo v0, "9631"
+    const-string/jumbo v0, "9632"
+    const-string/jumbo v0, "9633"
+    const-string/jumbo v0, "9634"
+    const-string/jumbo v0, "9635"
+    const-string/jumbo v0, "9636"
+    const-string/jumbo v0, "9637"
+    const-string/jumbo v0, "9638"
+    const-string/jumbo v0, "9639"
+    const-string/jumbo v0, "9640"
+    const-string/jumbo v0, "9641"
+    const-string/jumbo v0, "9642"
+    const-string/jumbo v0, "9643"
+    const-string/jumbo v0, "9644"
+    const-string/jumbo v0, "9645"
+    const-string/jumbo v0, "9646"
+    const-string/jumbo v0, "9647"
+    const-string/jumbo v0, "9648"
+    const-string/jumbo v0, "9649"
+    const-string/jumbo v0, "9650"
+    const-string/jumbo v0, "9651"
+    const-string/jumbo v0, "9652"
+    const-string/jumbo v0, "9653"
+    const-string/jumbo v0, "9654"
+    const-string/jumbo v0, "9655"
+    const-string/jumbo v0, "9656"
+    const-string/jumbo v0, "9657"
+    const-string/jumbo v0, "9658"
+    const-string/jumbo v0, "9659"
+    const-string/jumbo v0, "9660"
+    const-string/jumbo v0, "9661"
+    const-string/jumbo v0, "9662"
+    const-string/jumbo v0, "9663"
+    const-string/jumbo v0, "9664"
+    const-string/jumbo v0, "9665"
+    const-string/jumbo v0, "9666"
+    const-string/jumbo v0, "9667"
+    const-string/jumbo v0, "9668"
+    const-string/jumbo v0, "9669"
+    const-string/jumbo v0, "9670"
+    const-string/jumbo v0, "9671"
+    const-string/jumbo v0, "9672"
+    const-string/jumbo v0, "9673"
+    const-string/jumbo v0, "9674"
+    const-string/jumbo v0, "9675"
+    const-string/jumbo v0, "9676"
+    const-string/jumbo v0, "9677"
+    const-string/jumbo v0, "9678"
+    const-string/jumbo v0, "9679"
+    const-string/jumbo v0, "9680"
+    const-string/jumbo v0, "9681"
+    const-string/jumbo v0, "9682"
+    const-string/jumbo v0, "9683"
+    const-string/jumbo v0, "9684"
+    const-string/jumbo v0, "9685"
+    const-string/jumbo v0, "9686"
+    const-string/jumbo v0, "9687"
+    const-string/jumbo v0, "9688"
+    const-string/jumbo v0, "9689"
+    const-string/jumbo v0, "9690"
+    const-string/jumbo v0, "9691"
+    const-string/jumbo v0, "9692"
+    const-string/jumbo v0, "9693"
+    const-string/jumbo v0, "9694"
+    const-string/jumbo v0, "9695"
+    const-string/jumbo v0, "9696"
+    const-string/jumbo v0, "9697"
+    const-string/jumbo v0, "9698"
+    const-string/jumbo v0, "9699"
+    const-string/jumbo v0, "9700"
+    const-string/jumbo v0, "9701"
+    const-string/jumbo v0, "9702"
+    const-string/jumbo v0, "9703"
+    const-string/jumbo v0, "9704"
+    const-string/jumbo v0, "9705"
+    const-string/jumbo v0, "9706"
+    const-string/jumbo v0, "9707"
+    const-string/jumbo v0, "9708"
+    const-string/jumbo v0, "9709"
+    const-string/jumbo v0, "9710"
+    const-string/jumbo v0, "9711"
+    const-string/jumbo v0, "9712"
+    const-string/jumbo v0, "9713"
+    const-string/jumbo v0, "9714"
+    const-string/jumbo v0, "9715"
+    const-string/jumbo v0, "9716"
+    const-string/jumbo v0, "9717"
+    const-string/jumbo v0, "9718"
+    const-string/jumbo v0, "9719"
+    const-string/jumbo v0, "9720"
+    const-string/jumbo v0, "9721"
+    const-string/jumbo v0, "9722"
+    const-string/jumbo v0, "9723"
+    const-string/jumbo v0, "9724"
+    const-string/jumbo v0, "9725"
+    const-string/jumbo v0, "9726"
+    const-string/jumbo v0, "9727"
+    const-string/jumbo v0, "9728"
+    const-string/jumbo v0, "9729"
+    const-string/jumbo v0, "9730"
+    const-string/jumbo v0, "9731"
+    const-string/jumbo v0, "9732"
+    const-string/jumbo v0, "9733"
+    const-string/jumbo v0, "9734"
+    const-string/jumbo v0, "9735"
+    const-string/jumbo v0, "9736"
+    const-string/jumbo v0, "9737"
+    const-string/jumbo v0, "9738"
+    const-string/jumbo v0, "9739"
+    const-string/jumbo v0, "9740"
+    const-string/jumbo v0, "9741"
+    const-string/jumbo v0, "9742"
+    const-string/jumbo v0, "9743"
+    const-string/jumbo v0, "9744"
+    const-string/jumbo v0, "9745"
+    const-string/jumbo v0, "9746"
+    const-string/jumbo v0, "9747"
+    const-string/jumbo v0, "9748"
+    const-string/jumbo v0, "9749"
+    const-string/jumbo v0, "9750"
+    const-string/jumbo v0, "9751"
+    const-string/jumbo v0, "9752"
+    const-string/jumbo v0, "9753"
+    const-string/jumbo v0, "9754"
+    const-string/jumbo v0, "9755"
+    const-string/jumbo v0, "9756"
+    const-string/jumbo v0, "9757"
+    const-string/jumbo v0, "9758"
+    const-string/jumbo v0, "9759"
+    const-string/jumbo v0, "9760"
+    const-string/jumbo v0, "9761"
+    const-string/jumbo v0, "9762"
+    const-string/jumbo v0, "9763"
+    const-string/jumbo v0, "9764"
+    const-string/jumbo v0, "9765"
+    const-string/jumbo v0, "9766"
+    const-string/jumbo v0, "9767"
+    const-string/jumbo v0, "9768"
+    const-string/jumbo v0, "9769"
+    const-string/jumbo v0, "9770"
+    const-string/jumbo v0, "9771"
+    const-string/jumbo v0, "9772"
+    const-string/jumbo v0, "9773"
+    const-string/jumbo v0, "9774"
+    const-string/jumbo v0, "9775"
+    const-string/jumbo v0, "9776"
+    const-string/jumbo v0, "9777"
+    const-string/jumbo v0, "9778"
+    const-string/jumbo v0, "9779"
+    const-string/jumbo v0, "9780"
+    const-string/jumbo v0, "9781"
+    const-string/jumbo v0, "9782"
+    const-string/jumbo v0, "9783"
+    const-string/jumbo v0, "9784"
+    const-string/jumbo v0, "9785"
+    const-string/jumbo v0, "9786"
+    const-string/jumbo v0, "9787"
+    const-string/jumbo v0, "9788"
+    const-string/jumbo v0, "9789"
+    const-string/jumbo v0, "9790"
+    const-string/jumbo v0, "9791"
+    const-string/jumbo v0, "9792"
+    const-string/jumbo v0, "9793"
+    const-string/jumbo v0, "9794"
+    const-string/jumbo v0, "9795"
+    const-string/jumbo v0, "9796"
+    const-string/jumbo v0, "9797"
+    const-string/jumbo v0, "9798"
+    const-string/jumbo v0, "9799"
+    const-string/jumbo v0, "9800"
+    const-string/jumbo v0, "9801"
+    const-string/jumbo v0, "9802"
+    const-string/jumbo v0, "9803"
+    const-string/jumbo v0, "9804"
+    const-string/jumbo v0, "9805"
+    const-string/jumbo v0, "9806"
+    const-string/jumbo v0, "9807"
+    const-string/jumbo v0, "9808"
+    const-string/jumbo v0, "9809"
+    const-string/jumbo v0, "9810"
+    const-string/jumbo v0, "9811"
+    const-string/jumbo v0, "9812"
+    const-string/jumbo v0, "9813"
+    const-string/jumbo v0, "9814"
+    const-string/jumbo v0, "9815"
+    const-string/jumbo v0, "9816"
+    const-string/jumbo v0, "9817"
+    const-string/jumbo v0, "9818"
+    const-string/jumbo v0, "9819"
+    const-string/jumbo v0, "9820"
+    const-string/jumbo v0, "9821"
+    const-string/jumbo v0, "9822"
+    const-string/jumbo v0, "9823"
+    const-string/jumbo v0, "9824"
+    const-string/jumbo v0, "9825"
+    const-string/jumbo v0, "9826"
+    const-string/jumbo v0, "9827"
+    const-string/jumbo v0, "9828"
+    const-string/jumbo v0, "9829"
+    const-string/jumbo v0, "9830"
+    const-string/jumbo v0, "9831"
+    const-string/jumbo v0, "9832"
+    const-string/jumbo v0, "9833"
+    const-string/jumbo v0, "9834"
+    const-string/jumbo v0, "9835"
+    const-string/jumbo v0, "9836"
+    const-string/jumbo v0, "9837"
+    const-string/jumbo v0, "9838"
+    const-string/jumbo v0, "9839"
+    const-string/jumbo v0, "9840"
+    const-string/jumbo v0, "9841"
+    const-string/jumbo v0, "9842"
+    const-string/jumbo v0, "9843"
+    const-string/jumbo v0, "9844"
+    const-string/jumbo v0, "9845"
+    const-string/jumbo v0, "9846"
+    const-string/jumbo v0, "9847"
+    const-string/jumbo v0, "9848"
+    const-string/jumbo v0, "9849"
+    const-string/jumbo v0, "9850"
+    const-string/jumbo v0, "9851"
+    const-string/jumbo v0, "9852"
+    const-string/jumbo v0, "9853"
+    const-string/jumbo v0, "9854"
+    const-string/jumbo v0, "9855"
+    const-string/jumbo v0, "9856"
+    const-string/jumbo v0, "9857"
+    const-string/jumbo v0, "9858"
+    const-string/jumbo v0, "9859"
+    const-string/jumbo v0, "9860"
+    const-string/jumbo v0, "9861"
+    const-string/jumbo v0, "9862"
+    const-string/jumbo v0, "9863"
+    const-string/jumbo v0, "9864"
+    const-string/jumbo v0, "9865"
+    const-string/jumbo v0, "9866"
+    const-string/jumbo v0, "9867"
+    const-string/jumbo v0, "9868"
+    const-string/jumbo v0, "9869"
+    const-string/jumbo v0, "9870"
+    const-string/jumbo v0, "9871"
+    const-string/jumbo v0, "9872"
+    const-string/jumbo v0, "9873"
+    const-string/jumbo v0, "9874"
+    const-string/jumbo v0, "9875"
+    const-string/jumbo v0, "9876"
+    const-string/jumbo v0, "9877"
+    const-string/jumbo v0, "9878"
+    const-string/jumbo v0, "9879"
+    const-string/jumbo v0, "9880"
+    const-string/jumbo v0, "9881"
+    const-string/jumbo v0, "9882"
+    const-string/jumbo v0, "9883"
+    const-string/jumbo v0, "9884"
+    const-string/jumbo v0, "9885"
+    const-string/jumbo v0, "9886"
+    const-string/jumbo v0, "9887"
+    const-string/jumbo v0, "9888"
+    const-string/jumbo v0, "9889"
+    const-string/jumbo v0, "9890"
+    const-string/jumbo v0, "9891"
+    const-string/jumbo v0, "9892"
+    const-string/jumbo v0, "9893"
+    const-string/jumbo v0, "9894"
+    const-string/jumbo v0, "9895"
+    const-string/jumbo v0, "9896"
+    const-string/jumbo v0, "9897"
+    const-string/jumbo v0, "9898"
+    const-string/jumbo v0, "9899"
+    const-string/jumbo v0, "9900"
+    const-string/jumbo v0, "9901"
+    const-string/jumbo v0, "9902"
+    const-string/jumbo v0, "9903"
+    const-string/jumbo v0, "9904"
+    const-string/jumbo v0, "9905"
+    const-string/jumbo v0, "9906"
+    const-string/jumbo v0, "9907"
+    const-string/jumbo v0, "9908"
+    const-string/jumbo v0, "9909"
+    const-string/jumbo v0, "9910"
+    const-string/jumbo v0, "9911"
+    const-string/jumbo v0, "9912"
+    const-string/jumbo v0, "9913"
+    const-string/jumbo v0, "9914"
+    const-string/jumbo v0, "9915"
+    const-string/jumbo v0, "9916"
+    const-string/jumbo v0, "9917"
+    const-string/jumbo v0, "9918"
+    const-string/jumbo v0, "9919"
+    const-string/jumbo v0, "9920"
+    const-string/jumbo v0, "9921"
+    const-string/jumbo v0, "9922"
+    const-string/jumbo v0, "9923"
+    const-string/jumbo v0, "9924"
+    const-string/jumbo v0, "9925"
+    const-string/jumbo v0, "9926"
+    const-string/jumbo v0, "9927"
+    const-string/jumbo v0, "9928"
+    const-string/jumbo v0, "9929"
+    const-string/jumbo v0, "9930"
+    const-string/jumbo v0, "9931"
+    const-string/jumbo v0, "9932"
+    const-string/jumbo v0, "9933"
+    const-string/jumbo v0, "9934"
+    const-string/jumbo v0, "9935"
+    const-string/jumbo v0, "9936"
+    const-string/jumbo v0, "9937"
+    const-string/jumbo v0, "9938"
+    const-string/jumbo v0, "9939"
+    const-string/jumbo v0, "9940"
+    const-string/jumbo v0, "9941"
+    const-string/jumbo v0, "9942"
+    const-string/jumbo v0, "9943"
+    const-string/jumbo v0, "9944"
+    const-string/jumbo v0, "9945"
+    const-string/jumbo v0, "9946"
+    const-string/jumbo v0, "9947"
+    const-string/jumbo v0, "9948"
+    const-string/jumbo v0, "9949"
+    const-string/jumbo v0, "9950"
+    const-string/jumbo v0, "9951"
+    const-string/jumbo v0, "9952"
+    const-string/jumbo v0, "9953"
+    const-string/jumbo v0, "9954"
+    const-string/jumbo v0, "9955"
+    const-string/jumbo v0, "9956"
+    const-string/jumbo v0, "9957"
+    const-string/jumbo v0, "9958"
+    const-string/jumbo v0, "9959"
+    const-string/jumbo v0, "9960"
+    const-string/jumbo v0, "9961"
+    const-string/jumbo v0, "9962"
+    const-string/jumbo v0, "9963"
+    const-string/jumbo v0, "9964"
+    const-string/jumbo v0, "9965"
+    const-string/jumbo v0, "9966"
+    const-string/jumbo v0, "9967"
+    const-string/jumbo v0, "9968"
+    const-string/jumbo v0, "9969"
+    const-string/jumbo v0, "9970"
+    const-string/jumbo v0, "9971"
+    const-string/jumbo v0, "9972"
+    const-string/jumbo v0, "9973"
+    const-string/jumbo v0, "9974"
+    const-string/jumbo v0, "9975"
+    const-string/jumbo v0, "9976"
+    const-string/jumbo v0, "9977"
+    const-string/jumbo v0, "9978"
+    const-string/jumbo v0, "9979"
+    const-string/jumbo v0, "9980"
+    const-string/jumbo v0, "9981"
+    const-string/jumbo v0, "9982"
+    const-string/jumbo v0, "9983"
+    const-string/jumbo v0, "9984"
+    const-string/jumbo v0, "9985"
+    const-string/jumbo v0, "9986"
+    const-string/jumbo v0, "9987"
+    const-string/jumbo v0, "9988"
+    const-string/jumbo v0, "9989"
+    const-string/jumbo v0, "9990"
+    const-string/jumbo v0, "9991"
+    const-string/jumbo v0, "9992"
+    const-string/jumbo v0, "9993"
+    const-string/jumbo v0, "9994"
+    const-string/jumbo v0, "9995"
+    const-string/jumbo v0, "9996"
+    const-string/jumbo v0, "9997"
+    const-string/jumbo v0, "9998"
+    const-string/jumbo v0, "9999"
+    const-string/jumbo v0, "10000"
+    const-string/jumbo v0, "10001"
+    const-string/jumbo v0, "10002"
+    const-string/jumbo v0, "10003"
+    const-string/jumbo v0, "10004"
+    const-string/jumbo v0, "10005"
+    const-string/jumbo v0, "10006"
+    const-string/jumbo v0, "10007"
+    const-string/jumbo v0, "10008"
+    const-string/jumbo v0, "10009"
+    const-string/jumbo v0, "10010"
+    const-string/jumbo v0, "10011"
+    const-string/jumbo v0, "10012"
+    const-string/jumbo v0, "10013"
+    const-string/jumbo v0, "10014"
+    const-string/jumbo v0, "10015"
+    const-string/jumbo v0, "10016"
+    const-string/jumbo v0, "10017"
+    const-string/jumbo v0, "10018"
+    const-string/jumbo v0, "10019"
+    const-string/jumbo v0, "10020"
+    const-string/jumbo v0, "10021"
+    const-string/jumbo v0, "10022"
+    const-string/jumbo v0, "10023"
+    const-string/jumbo v0, "10024"
+    const-string/jumbo v0, "10025"
+    const-string/jumbo v0, "10026"
+    const-string/jumbo v0, "10027"
+    const-string/jumbo v0, "10028"
+    const-string/jumbo v0, "10029"
+    const-string/jumbo v0, "10030"
+    const-string/jumbo v0, "10031"
+    const-string/jumbo v0, "10032"
+    const-string/jumbo v0, "10033"
+    const-string/jumbo v0, "10034"
+    const-string/jumbo v0, "10035"
+    const-string/jumbo v0, "10036"
+    const-string/jumbo v0, "10037"
+    const-string/jumbo v0, "10038"
+    const-string/jumbo v0, "10039"
+    const-string/jumbo v0, "10040"
+    const-string/jumbo v0, "10041"
+    const-string/jumbo v0, "10042"
+    const-string/jumbo v0, "10043"
+    const-string/jumbo v0, "10044"
+    const-string/jumbo v0, "10045"
+    const-string/jumbo v0, "10046"
+    const-string/jumbo v0, "10047"
+    const-string/jumbo v0, "10048"
+    const-string/jumbo v0, "10049"
+    const-string/jumbo v0, "10050"
+    const-string/jumbo v0, "10051"
+    const-string/jumbo v0, "10052"
+    const-string/jumbo v0, "10053"
+    const-string/jumbo v0, "10054"
+    const-string/jumbo v0, "10055"
+    const-string/jumbo v0, "10056"
+    const-string/jumbo v0, "10057"
+    const-string/jumbo v0, "10058"
+    const-string/jumbo v0, "10059"
+    const-string/jumbo v0, "10060"
+    const-string/jumbo v0, "10061"
+    const-string/jumbo v0, "10062"
+    const-string/jumbo v0, "10063"
+    const-string/jumbo v0, "10064"
+    const-string/jumbo v0, "10065"
+    const-string/jumbo v0, "10066"
+    const-string/jumbo v0, "10067"
+    const-string/jumbo v0, "10068"
+    const-string/jumbo v0, "10069"
+    const-string/jumbo v0, "10070"
+    const-string/jumbo v0, "10071"
+    const-string/jumbo v0, "10072"
+    const-string/jumbo v0, "10073"
+    const-string/jumbo v0, "10074"
+    const-string/jumbo v0, "10075"
+    const-string/jumbo v0, "10076"
+    const-string/jumbo v0, "10077"
+    const-string/jumbo v0, "10078"
+    const-string/jumbo v0, "10079"
+    const-string/jumbo v0, "10080"
+    const-string/jumbo v0, "10081"
+    const-string/jumbo v0, "10082"
+    const-string/jumbo v0, "10083"
+    const-string/jumbo v0, "10084"
+    const-string/jumbo v0, "10085"
+    const-string/jumbo v0, "10086"
+    const-string/jumbo v0, "10087"
+    const-string/jumbo v0, "10088"
+    const-string/jumbo v0, "10089"
+    const-string/jumbo v0, "10090"
+    const-string/jumbo v0, "10091"
+    const-string/jumbo v0, "10092"
+    const-string/jumbo v0, "10093"
+    const-string/jumbo v0, "10094"
+    const-string/jumbo v0, "10095"
+    const-string/jumbo v0, "10096"
+    const-string/jumbo v0, "10097"
+    const-string/jumbo v0, "10098"
+    const-string/jumbo v0, "10099"
+    const-string/jumbo v0, "10100"
+    const-string/jumbo v0, "10101"
+    const-string/jumbo v0, "10102"
+    const-string/jumbo v0, "10103"
+    const-string/jumbo v0, "10104"
+    const-string/jumbo v0, "10105"
+    const-string/jumbo v0, "10106"
+    const-string/jumbo v0, "10107"
+    const-string/jumbo v0, "10108"
+    const-string/jumbo v0, "10109"
+    const-string/jumbo v0, "10110"
+    const-string/jumbo v0, "10111"
+    const-string/jumbo v0, "10112"
+    const-string/jumbo v0, "10113"
+    const-string/jumbo v0, "10114"
+    const-string/jumbo v0, "10115"
+    const-string/jumbo v0, "10116"
+    const-string/jumbo v0, "10117"
+    const-string/jumbo v0, "10118"
+    const-string/jumbo v0, "10119"
+    const-string/jumbo v0, "10120"
+    const-string/jumbo v0, "10121"
+    const-string/jumbo v0, "10122"
+    const-string/jumbo v0, "10123"
+    const-string/jumbo v0, "10124"
+    const-string/jumbo v0, "10125"
+    const-string/jumbo v0, "10126"
+    const-string/jumbo v0, "10127"
+    const-string/jumbo v0, "10128"
+    const-string/jumbo v0, "10129"
+    const-string/jumbo v0, "10130"
+    const-string/jumbo v0, "10131"
+    const-string/jumbo v0, "10132"
+    const-string/jumbo v0, "10133"
+    const-string/jumbo v0, "10134"
+    const-string/jumbo v0, "10135"
+    const-string/jumbo v0, "10136"
+    const-string/jumbo v0, "10137"
+    const-string/jumbo v0, "10138"
+    const-string/jumbo v0, "10139"
+    const-string/jumbo v0, "10140"
+    const-string/jumbo v0, "10141"
+    const-string/jumbo v0, "10142"
+    const-string/jumbo v0, "10143"
+    const-string/jumbo v0, "10144"
+    const-string/jumbo v0, "10145"
+    const-string/jumbo v0, "10146"
+    const-string/jumbo v0, "10147"
+    const-string/jumbo v0, "10148"
+    const-string/jumbo v0, "10149"
+    const-string/jumbo v0, "10150"
+    const-string/jumbo v0, "10151"
+    const-string/jumbo v0, "10152"
+    const-string/jumbo v0, "10153"
+    const-string/jumbo v0, "10154"
+    const-string/jumbo v0, "10155"
+    const-string/jumbo v0, "10156"
+    const-string/jumbo v0, "10157"
+    const-string/jumbo v0, "10158"
+    const-string/jumbo v0, "10159"
+    const-string/jumbo v0, "10160"
+    const-string/jumbo v0, "10161"
+    const-string/jumbo v0, "10162"
+    const-string/jumbo v0, "10163"
+    const-string/jumbo v0, "10164"
+    const-string/jumbo v0, "10165"
+    const-string/jumbo v0, "10166"
+    const-string/jumbo v0, "10167"
+    const-string/jumbo v0, "10168"
+    const-string/jumbo v0, "10169"
+    const-string/jumbo v0, "10170"
+    const-string/jumbo v0, "10171"
+    const-string/jumbo v0, "10172"
+    const-string/jumbo v0, "10173"
+    const-string/jumbo v0, "10174"
+    const-string/jumbo v0, "10175"
+    const-string/jumbo v0, "10176"
+    const-string/jumbo v0, "10177"
+    const-string/jumbo v0, "10178"
+    const-string/jumbo v0, "10179"
+    const-string/jumbo v0, "10180"
+    const-string/jumbo v0, "10181"
+    const-string/jumbo v0, "10182"
+    const-string/jumbo v0, "10183"
+    const-string/jumbo v0, "10184"
+    const-string/jumbo v0, "10185"
+    const-string/jumbo v0, "10186"
+    const-string/jumbo v0, "10187"
+    const-string/jumbo v0, "10188"
+    const-string/jumbo v0, "10189"
+    const-string/jumbo v0, "10190"
+    const-string/jumbo v0, "10191"
+    const-string/jumbo v0, "10192"
+    const-string/jumbo v0, "10193"
+    const-string/jumbo v0, "10194"
+    const-string/jumbo v0, "10195"
+    const-string/jumbo v0, "10196"
+    const-string/jumbo v0, "10197"
+    const-string/jumbo v0, "10198"
+    const-string/jumbo v0, "10199"
+    const-string/jumbo v0, "10200"
+    const-string/jumbo v0, "10201"
+    const-string/jumbo v0, "10202"
+    const-string/jumbo v0, "10203"
+    const-string/jumbo v0, "10204"
+    const-string/jumbo v0, "10205"
+    const-string/jumbo v0, "10206"
+    const-string/jumbo v0, "10207"
+    const-string/jumbo v0, "10208"
+    const-string/jumbo v0, "10209"
+    const-string/jumbo v0, "10210"
+    const-string/jumbo v0, "10211"
+    const-string/jumbo v0, "10212"
+    const-string/jumbo v0, "10213"
+    const-string/jumbo v0, "10214"
+    const-string/jumbo v0, "10215"
+    const-string/jumbo v0, "10216"
+    const-string/jumbo v0, "10217"
+    const-string/jumbo v0, "10218"
+    const-string/jumbo v0, "10219"
+    const-string/jumbo v0, "10220"
+    const-string/jumbo v0, "10221"
+    const-string/jumbo v0, "10222"
+    const-string/jumbo v0, "10223"
+    const-string/jumbo v0, "10224"
+    const-string/jumbo v0, "10225"
+    const-string/jumbo v0, "10226"
+    const-string/jumbo v0, "10227"
+    const-string/jumbo v0, "10228"
+    const-string/jumbo v0, "10229"
+    const-string/jumbo v0, "10230"
+    const-string/jumbo v0, "10231"
+    const-string/jumbo v0, "10232"
+    const-string/jumbo v0, "10233"
+    const-string/jumbo v0, "10234"
+    const-string/jumbo v0, "10235"
+    const-string/jumbo v0, "10236"
+    const-string/jumbo v0, "10237"
+    const-string/jumbo v0, "10238"
+    const-string/jumbo v0, "10239"
+    const-string/jumbo v0, "10240"
+    const-string/jumbo v0, "10241"
+    const-string/jumbo v0, "10242"
+    const-string/jumbo v0, "10243"
+    const-string/jumbo v0, "10244"
+    const-string/jumbo v0, "10245"
+    const-string/jumbo v0, "10246"
+    const-string/jumbo v0, "10247"
+    const-string/jumbo v0, "10248"
+    const-string/jumbo v0, "10249"
+    const-string/jumbo v0, "10250"
+    const-string/jumbo v0, "10251"
+    const-string/jumbo v0, "10252"
+    const-string/jumbo v0, "10253"
+    const-string/jumbo v0, "10254"
+    const-string/jumbo v0, "10255"
+    const-string/jumbo v0, "10256"
+    const-string/jumbo v0, "10257"
+    const-string/jumbo v0, "10258"
+    const-string/jumbo v0, "10259"
+    const-string/jumbo v0, "10260"
+    const-string/jumbo v0, "10261"
+    const-string/jumbo v0, "10262"
+    const-string/jumbo v0, "10263"
+    const-string/jumbo v0, "10264"
+    const-string/jumbo v0, "10265"
+    const-string/jumbo v0, "10266"
+    const-string/jumbo v0, "10267"
+    const-string/jumbo v0, "10268"
+    const-string/jumbo v0, "10269"
+    const-string/jumbo v0, "10270"
+    const-string/jumbo v0, "10271"
+    const-string/jumbo v0, "10272"
+    const-string/jumbo v0, "10273"
+    const-string/jumbo v0, "10274"
+    const-string/jumbo v0, "10275"
+    const-string/jumbo v0, "10276"
+    const-string/jumbo v0, "10277"
+    const-string/jumbo v0, "10278"
+    const-string/jumbo v0, "10279"
+    const-string/jumbo v0, "10280"
+    const-string/jumbo v0, "10281"
+    const-string/jumbo v0, "10282"
+    const-string/jumbo v0, "10283"
+    const-string/jumbo v0, "10284"
+    const-string/jumbo v0, "10285"
+    const-string/jumbo v0, "10286"
+    const-string/jumbo v0, "10287"
+    const-string/jumbo v0, "10288"
+    const-string/jumbo v0, "10289"
+    const-string/jumbo v0, "10290"
+    const-string/jumbo v0, "10291"
+    const-string/jumbo v0, "10292"
+    const-string/jumbo v0, "10293"
+    const-string/jumbo v0, "10294"
+    const-string/jumbo v0, "10295"
+    const-string/jumbo v0, "10296"
+    const-string/jumbo v0, "10297"
+    const-string/jumbo v0, "10298"
+    const-string/jumbo v0, "10299"
+    const-string/jumbo v0, "10300"
+    const-string/jumbo v0, "10301"
+    const-string/jumbo v0, "10302"
+    const-string/jumbo v0, "10303"
+    const-string/jumbo v0, "10304"
+    const-string/jumbo v0, "10305"
+    const-string/jumbo v0, "10306"
+    const-string/jumbo v0, "10307"
+    const-string/jumbo v0, "10308"
+    const-string/jumbo v0, "10309"
+    const-string/jumbo v0, "10310"
+    const-string/jumbo v0, "10311"
+    const-string/jumbo v0, "10312"
+    const-string/jumbo v0, "10313"
+    const-string/jumbo v0, "10314"
+    const-string/jumbo v0, "10315"
+    const-string/jumbo v0, "10316"
+    const-string/jumbo v0, "10317"
+    const-string/jumbo v0, "10318"
+    const-string/jumbo v0, "10319"
+    const-string/jumbo v0, "10320"
+    const-string/jumbo v0, "10321"
+    const-string/jumbo v0, "10322"
+    const-string/jumbo v0, "10323"
+    const-string/jumbo v0, "10324"
+    const-string/jumbo v0, "10325"
+    const-string/jumbo v0, "10326"
+    const-string/jumbo v0, "10327"
+    const-string/jumbo v0, "10328"
+    const-string/jumbo v0, "10329"
+    const-string/jumbo v0, "10330"
+    const-string/jumbo v0, "10331"
+    const-string/jumbo v0, "10332"
+    const-string/jumbo v0, "10333"
+    const-string/jumbo v0, "10334"
+    const-string/jumbo v0, "10335"
+    const-string/jumbo v0, "10336"
+    const-string/jumbo v0, "10337"
+    const-string/jumbo v0, "10338"
+    const-string/jumbo v0, "10339"
+    const-string/jumbo v0, "10340"
+    const-string/jumbo v0, "10341"
+    const-string/jumbo v0, "10342"
+    const-string/jumbo v0, "10343"
+    const-string/jumbo v0, "10344"
+    const-string/jumbo v0, "10345"
+    const-string/jumbo v0, "10346"
+    const-string/jumbo v0, "10347"
+    const-string/jumbo v0, "10348"
+    const-string/jumbo v0, "10349"
+    const-string/jumbo v0, "10350"
+    const-string/jumbo v0, "10351"
+    const-string/jumbo v0, "10352"
+    const-string/jumbo v0, "10353"
+    const-string/jumbo v0, "10354"
+    const-string/jumbo v0, "10355"
+    const-string/jumbo v0, "10356"
+    const-string/jumbo v0, "10357"
+    const-string/jumbo v0, "10358"
+    const-string/jumbo v0, "10359"
+    const-string/jumbo v0, "10360"
+    const-string/jumbo v0, "10361"
+    const-string/jumbo v0, "10362"
+    const-string/jumbo v0, "10363"
+    const-string/jumbo v0, "10364"
+    const-string/jumbo v0, "10365"
+    const-string/jumbo v0, "10366"
+    const-string/jumbo v0, "10367"
+    const-string/jumbo v0, "10368"
+    const-string/jumbo v0, "10369"
+    const-string/jumbo v0, "10370"
+    const-string/jumbo v0, "10371"
+    const-string/jumbo v0, "10372"
+    const-string/jumbo v0, "10373"
+    const-string/jumbo v0, "10374"
+    const-string/jumbo v0, "10375"
+    const-string/jumbo v0, "10376"
+    const-string/jumbo v0, "10377"
+    const-string/jumbo v0, "10378"
+    const-string/jumbo v0, "10379"
+    const-string/jumbo v0, "10380"
+    const-string/jumbo v0, "10381"
+    const-string/jumbo v0, "10382"
+    const-string/jumbo v0, "10383"
+    const-string/jumbo v0, "10384"
+    const-string/jumbo v0, "10385"
+    const-string/jumbo v0, "10386"
+    const-string/jumbo v0, "10387"
+    const-string/jumbo v0, "10388"
+    const-string/jumbo v0, "10389"
+    const-string/jumbo v0, "10390"
+    const-string/jumbo v0, "10391"
+    const-string/jumbo v0, "10392"
+    const-string/jumbo v0, "10393"
+    const-string/jumbo v0, "10394"
+    const-string/jumbo v0, "10395"
+    const-string/jumbo v0, "10396"
+    const-string/jumbo v0, "10397"
+    const-string/jumbo v0, "10398"
+    const-string/jumbo v0, "10399"
+    const-string/jumbo v0, "10400"
+    const-string/jumbo v0, "10401"
+    const-string/jumbo v0, "10402"
+    const-string/jumbo v0, "10403"
+    const-string/jumbo v0, "10404"
+    const-string/jumbo v0, "10405"
+    const-string/jumbo v0, "10406"
+    const-string/jumbo v0, "10407"
+    const-string/jumbo v0, "10408"
+    const-string/jumbo v0, "10409"
+    const-string/jumbo v0, "10410"
+    const-string/jumbo v0, "10411"
+    const-string/jumbo v0, "10412"
+    const-string/jumbo v0, "10413"
+    const-string/jumbo v0, "10414"
+    const-string/jumbo v0, "10415"
+    const-string/jumbo v0, "10416"
+    const-string/jumbo v0, "10417"
+    const-string/jumbo v0, "10418"
+    const-string/jumbo v0, "10419"
+    const-string/jumbo v0, "10420"
+    const-string/jumbo v0, "10421"
+    const-string/jumbo v0, "10422"
+    const-string/jumbo v0, "10423"
+    const-string/jumbo v0, "10424"
+    const-string/jumbo v0, "10425"
+    const-string/jumbo v0, "10426"
+    const-string/jumbo v0, "10427"
+    const-string/jumbo v0, "10428"
+    const-string/jumbo v0, "10429"
+    const-string/jumbo v0, "10430"
+    const-string/jumbo v0, "10431"
+    const-string/jumbo v0, "10432"
+    const-string/jumbo v0, "10433"
+    const-string/jumbo v0, "10434"
+    const-string/jumbo v0, "10435"
+    const-string/jumbo v0, "10436"
+    const-string/jumbo v0, "10437"
+    const-string/jumbo v0, "10438"
+    const-string/jumbo v0, "10439"
+    const-string/jumbo v0, "10440"
+    const-string/jumbo v0, "10441"
+    const-string/jumbo v0, "10442"
+    const-string/jumbo v0, "10443"
+    const-string/jumbo v0, "10444"
+    const-string/jumbo v0, "10445"
+    const-string/jumbo v0, "10446"
+    const-string/jumbo v0, "10447"
+    const-string/jumbo v0, "10448"
+    const-string/jumbo v0, "10449"
+    const-string/jumbo v0, "10450"
+    const-string/jumbo v0, "10451"
+    const-string/jumbo v0, "10452"
+    const-string/jumbo v0, "10453"
+    const-string/jumbo v0, "10454"
+    const-string/jumbo v0, "10455"
+    const-string/jumbo v0, "10456"
+    const-string/jumbo v0, "10457"
+    const-string/jumbo v0, "10458"
+    const-string/jumbo v0, "10459"
+    const-string/jumbo v0, "10460"
+    const-string/jumbo v0, "10461"
+    const-string/jumbo v0, "10462"
+    const-string/jumbo v0, "10463"
+    const-string/jumbo v0, "10464"
+    const-string/jumbo v0, "10465"
+    const-string/jumbo v0, "10466"
+    const-string/jumbo v0, "10467"
+    const-string/jumbo v0, "10468"
+    const-string/jumbo v0, "10469"
+    const-string/jumbo v0, "10470"
+    const-string/jumbo v0, "10471"
+    const-string/jumbo v0, "10472"
+    const-string/jumbo v0, "10473"
+    const-string/jumbo v0, "10474"
+    const-string/jumbo v0, "10475"
+    const-string/jumbo v0, "10476"
+    const-string/jumbo v0, "10477"
+    const-string/jumbo v0, "10478"
+    const-string/jumbo v0, "10479"
+    const-string/jumbo v0, "10480"
+    const-string/jumbo v0, "10481"
+    const-string/jumbo v0, "10482"
+    const-string/jumbo v0, "10483"
+    const-string/jumbo v0, "10484"
+    const-string/jumbo v0, "10485"
+    const-string/jumbo v0, "10486"
+    const-string/jumbo v0, "10487"
+    const-string/jumbo v0, "10488"
+    const-string/jumbo v0, "10489"
+    const-string/jumbo v0, "10490"
+    const-string/jumbo v0, "10491"
+    const-string/jumbo v0, "10492"
+    const-string/jumbo v0, "10493"
+    const-string/jumbo v0, "10494"
+    const-string/jumbo v0, "10495"
+    const-string/jumbo v0, "10496"
+    const-string/jumbo v0, "10497"
+    const-string/jumbo v0, "10498"
+    const-string/jumbo v0, "10499"
+    const-string/jumbo v0, "10500"
+    const-string/jumbo v0, "10501"
+    const-string/jumbo v0, "10502"
+    const-string/jumbo v0, "10503"
+    const-string/jumbo v0, "10504"
+    const-string/jumbo v0, "10505"
+    const-string/jumbo v0, "10506"
+    const-string/jumbo v0, "10507"
+    const-string/jumbo v0, "10508"
+    const-string/jumbo v0, "10509"
+    const-string/jumbo v0, "10510"
+    const-string/jumbo v0, "10511"
+    const-string/jumbo v0, "10512"
+    const-string/jumbo v0, "10513"
+    const-string/jumbo v0, "10514"
+    const-string/jumbo v0, "10515"
+    const-string/jumbo v0, "10516"
+    const-string/jumbo v0, "10517"
+    const-string/jumbo v0, "10518"
+    const-string/jumbo v0, "10519"
+    const-string/jumbo v0, "10520"
+    const-string/jumbo v0, "10521"
+    const-string/jumbo v0, "10522"
+    const-string/jumbo v0, "10523"
+    const-string/jumbo v0, "10524"
+    const-string/jumbo v0, "10525"
+    const-string/jumbo v0, "10526"
+    const-string/jumbo v0, "10527"
+    const-string/jumbo v0, "10528"
+    const-string/jumbo v0, "10529"
+    const-string/jumbo v0, "10530"
+    const-string/jumbo v0, "10531"
+    const-string/jumbo v0, "10532"
+    const-string/jumbo v0, "10533"
+    const-string/jumbo v0, "10534"
+    const-string/jumbo v0, "10535"
+    const-string/jumbo v0, "10536"
+    const-string/jumbo v0, "10537"
+    const-string/jumbo v0, "10538"
+    const-string/jumbo v0, "10539"
+    const-string/jumbo v0, "10540"
+    const-string/jumbo v0, "10541"
+    const-string/jumbo v0, "10542"
+    const-string/jumbo v0, "10543"
+    const-string/jumbo v0, "10544"
+    const-string/jumbo v0, "10545"
+    const-string/jumbo v0, "10546"
+    const-string/jumbo v0, "10547"
+    const-string/jumbo v0, "10548"
+    const-string/jumbo v0, "10549"
+    const-string/jumbo v0, "10550"
+    const-string/jumbo v0, "10551"
+    const-string/jumbo v0, "10552"
+    const-string/jumbo v0, "10553"
+    const-string/jumbo v0, "10554"
+    const-string/jumbo v0, "10555"
+    const-string/jumbo v0, "10556"
+    const-string/jumbo v0, "10557"
+    const-string/jumbo v0, "10558"
+    const-string/jumbo v0, "10559"
+    const-string/jumbo v0, "10560"
+    const-string/jumbo v0, "10561"
+    const-string/jumbo v0, "10562"
+    const-string/jumbo v0, "10563"
+    const-string/jumbo v0, "10564"
+    const-string/jumbo v0, "10565"
+    const-string/jumbo v0, "10566"
+    const-string/jumbo v0, "10567"
+    const-string/jumbo v0, "10568"
+    const-string/jumbo v0, "10569"
+    const-string/jumbo v0, "10570"
+    const-string/jumbo v0, "10571"
+    const-string/jumbo v0, "10572"
+    const-string/jumbo v0, "10573"
+    const-string/jumbo v0, "10574"
+    const-string/jumbo v0, "10575"
+    const-string/jumbo v0, "10576"
+    const-string/jumbo v0, "10577"
+    const-string/jumbo v0, "10578"
+    const-string/jumbo v0, "10579"
+    const-string/jumbo v0, "10580"
+    const-string/jumbo v0, "10581"
+    const-string/jumbo v0, "10582"
+    const-string/jumbo v0, "10583"
+    const-string/jumbo v0, "10584"
+    const-string/jumbo v0, "10585"
+    const-string/jumbo v0, "10586"
+    const-string/jumbo v0, "10587"
+    const-string/jumbo v0, "10588"
+    const-string/jumbo v0, "10589"
+    const-string/jumbo v0, "10590"
+    const-string/jumbo v0, "10591"
+    const-string/jumbo v0, "10592"
+    const-string/jumbo v0, "10593"
+    const-string/jumbo v0, "10594"
+    const-string/jumbo v0, "10595"
+    const-string/jumbo v0, "10596"
+    const-string/jumbo v0, "10597"
+    const-string/jumbo v0, "10598"
+    const-string/jumbo v0, "10599"
+    const-string/jumbo v0, "10600"
+    const-string/jumbo v0, "10601"
+    const-string/jumbo v0, "10602"
+    const-string/jumbo v0, "10603"
+    const-string/jumbo v0, "10604"
+    const-string/jumbo v0, "10605"
+    const-string/jumbo v0, "10606"
+    const-string/jumbo v0, "10607"
+    const-string/jumbo v0, "10608"
+    const-string/jumbo v0, "10609"
+    const-string/jumbo v0, "10610"
+    const-string/jumbo v0, "10611"
+    const-string/jumbo v0, "10612"
+    const-string/jumbo v0, "10613"
+    const-string/jumbo v0, "10614"
+    const-string/jumbo v0, "10615"
+    const-string/jumbo v0, "10616"
+    const-string/jumbo v0, "10617"
+    const-string/jumbo v0, "10618"
+    const-string/jumbo v0, "10619"
+    const-string/jumbo v0, "10620"
+    const-string/jumbo v0, "10621"
+    const-string/jumbo v0, "10622"
+    const-string/jumbo v0, "10623"
+    const-string/jumbo v0, "10624"
+    const-string/jumbo v0, "10625"
+    const-string/jumbo v0, "10626"
+    const-string/jumbo v0, "10627"
+    const-string/jumbo v0, "10628"
+    const-string/jumbo v0, "10629"
+    const-string/jumbo v0, "10630"
+    const-string/jumbo v0, "10631"
+    const-string/jumbo v0, "10632"
+    const-string/jumbo v0, "10633"
+    const-string/jumbo v0, "10634"
+    const-string/jumbo v0, "10635"
+    const-string/jumbo v0, "10636"
+    const-string/jumbo v0, "10637"
+    const-string/jumbo v0, "10638"
+    const-string/jumbo v0, "10639"
+    const-string/jumbo v0, "10640"
+    const-string/jumbo v0, "10641"
+    const-string/jumbo v0, "10642"
+    const-string/jumbo v0, "10643"
+    const-string/jumbo v0, "10644"
+    const-string/jumbo v0, "10645"
+    const-string/jumbo v0, "10646"
+    const-string/jumbo v0, "10647"
+    const-string/jumbo v0, "10648"
+    const-string/jumbo v0, "10649"
+    const-string/jumbo v0, "10650"
+    const-string/jumbo v0, "10651"
+    const-string/jumbo v0, "10652"
+    const-string/jumbo v0, "10653"
+    const-string/jumbo v0, "10654"
+    const-string/jumbo v0, "10655"
+    const-string/jumbo v0, "10656"
+    const-string/jumbo v0, "10657"
+    const-string/jumbo v0, "10658"
+    const-string/jumbo v0, "10659"
+    const-string/jumbo v0, "10660"
+    const-string/jumbo v0, "10661"
+    const-string/jumbo v0, "10662"
+    const-string/jumbo v0, "10663"
+    const-string/jumbo v0, "10664"
+    const-string/jumbo v0, "10665"
+    const-string/jumbo v0, "10666"
+    const-string/jumbo v0, "10667"
+    const-string/jumbo v0, "10668"
+    const-string/jumbo v0, "10669"
+    const-string/jumbo v0, "10670"
+    const-string/jumbo v0, "10671"
+    const-string/jumbo v0, "10672"
+    const-string/jumbo v0, "10673"
+    const-string/jumbo v0, "10674"
+    const-string/jumbo v0, "10675"
+    const-string/jumbo v0, "10676"
+    const-string/jumbo v0, "10677"
+    const-string/jumbo v0, "10678"
+    const-string/jumbo v0, "10679"
+    const-string/jumbo v0, "10680"
+    const-string/jumbo v0, "10681"
+    const-string/jumbo v0, "10682"
+    const-string/jumbo v0, "10683"
+    const-string/jumbo v0, "10684"
+    const-string/jumbo v0, "10685"
+    const-string/jumbo v0, "10686"
+    const-string/jumbo v0, "10687"
+    const-string/jumbo v0, "10688"
+    const-string/jumbo v0, "10689"
+    const-string/jumbo v0, "10690"
+    const-string/jumbo v0, "10691"
+    const-string/jumbo v0, "10692"
+    const-string/jumbo v0, "10693"
+    const-string/jumbo v0, "10694"
+    const-string/jumbo v0, "10695"
+    const-string/jumbo v0, "10696"
+    const-string/jumbo v0, "10697"
+    const-string/jumbo v0, "10698"
+    const-string/jumbo v0, "10699"
+    const-string/jumbo v0, "10700"
+    const-string/jumbo v0, "10701"
+    const-string/jumbo v0, "10702"
+    const-string/jumbo v0, "10703"
+    const-string/jumbo v0, "10704"
+    const-string/jumbo v0, "10705"
+    const-string/jumbo v0, "10706"
+    const-string/jumbo v0, "10707"
+    const-string/jumbo v0, "10708"
+    const-string/jumbo v0, "10709"
+    const-string/jumbo v0, "10710"
+    const-string/jumbo v0, "10711"
+    const-string/jumbo v0, "10712"
+    const-string/jumbo v0, "10713"
+    const-string/jumbo v0, "10714"
+    const-string/jumbo v0, "10715"
+    const-string/jumbo v0, "10716"
+    const-string/jumbo v0, "10717"
+    const-string/jumbo v0, "10718"
+    const-string/jumbo v0, "10719"
+    const-string/jumbo v0, "10720"
+    const-string/jumbo v0, "10721"
+    const-string/jumbo v0, "10722"
+    const-string/jumbo v0, "10723"
+    const-string/jumbo v0, "10724"
+    const-string/jumbo v0, "10725"
+    const-string/jumbo v0, "10726"
+    const-string/jumbo v0, "10727"
+    const-string/jumbo v0, "10728"
+    const-string/jumbo v0, "10729"
+    const-string/jumbo v0, "10730"
+    const-string/jumbo v0, "10731"
+    const-string/jumbo v0, "10732"
+    const-string/jumbo v0, "10733"
+    const-string/jumbo v0, "10734"
+    const-string/jumbo v0, "10735"
+    const-string/jumbo v0, "10736"
+    const-string/jumbo v0, "10737"
+    const-string/jumbo v0, "10738"
+    const-string/jumbo v0, "10739"
+    const-string/jumbo v0, "10740"
+    const-string/jumbo v0, "10741"
+    const-string/jumbo v0, "10742"
+    const-string/jumbo v0, "10743"
+    const-string/jumbo v0, "10744"
+    const-string/jumbo v0, "10745"
+    const-string/jumbo v0, "10746"
+    const-string/jumbo v0, "10747"
+    const-string/jumbo v0, "10748"
+    const-string/jumbo v0, "10749"
+    const-string/jumbo v0, "10750"
+    const-string/jumbo v0, "10751"
+    const-string/jumbo v0, "10752"
+    const-string/jumbo v0, "10753"
+    const-string/jumbo v0, "10754"
+    const-string/jumbo v0, "10755"
+    const-string/jumbo v0, "10756"
+    const-string/jumbo v0, "10757"
+    const-string/jumbo v0, "10758"
+    const-string/jumbo v0, "10759"
+    const-string/jumbo v0, "10760"
+    const-string/jumbo v0, "10761"
+    const-string/jumbo v0, "10762"
+    const-string/jumbo v0, "10763"
+    const-string/jumbo v0, "10764"
+    const-string/jumbo v0, "10765"
+    const-string/jumbo v0, "10766"
+    const-string/jumbo v0, "10767"
+    const-string/jumbo v0, "10768"
+    const-string/jumbo v0, "10769"
+    const-string/jumbo v0, "10770"
+    const-string/jumbo v0, "10771"
+    const-string/jumbo v0, "10772"
+    const-string/jumbo v0, "10773"
+    const-string/jumbo v0, "10774"
+    const-string/jumbo v0, "10775"
+    const-string/jumbo v0, "10776"
+    const-string/jumbo v0, "10777"
+    const-string/jumbo v0, "10778"
+    const-string/jumbo v0, "10779"
+    const-string/jumbo v0, "10780"
+    const-string/jumbo v0, "10781"
+    const-string/jumbo v0, "10782"
+    const-string/jumbo v0, "10783"
+    const-string/jumbo v0, "10784"
+    const-string/jumbo v0, "10785"
+    const-string/jumbo v0, "10786"
+    const-string/jumbo v0, "10787"
+    const-string/jumbo v0, "10788"
+    const-string/jumbo v0, "10789"
+    const-string/jumbo v0, "10790"
+    const-string/jumbo v0, "10791"
+    const-string/jumbo v0, "10792"
+    const-string/jumbo v0, "10793"
+    const-string/jumbo v0, "10794"
+    const-string/jumbo v0, "10795"
+    const-string/jumbo v0, "10796"
+    const-string/jumbo v0, "10797"
+    const-string/jumbo v0, "10798"
+    const-string/jumbo v0, "10799"
+    const-string/jumbo v0, "10800"
+    const-string/jumbo v0, "10801"
+    const-string/jumbo v0, "10802"
+    const-string/jumbo v0, "10803"
+    const-string/jumbo v0, "10804"
+    const-string/jumbo v0, "10805"
+    const-string/jumbo v0, "10806"
+    const-string/jumbo v0, "10807"
+    const-string/jumbo v0, "10808"
+    const-string/jumbo v0, "10809"
+    const-string/jumbo v0, "10810"
+    const-string/jumbo v0, "10811"
+    const-string/jumbo v0, "10812"
+    const-string/jumbo v0, "10813"
+    const-string/jumbo v0, "10814"
+    const-string/jumbo v0, "10815"
+    const-string/jumbo v0, "10816"
+    const-string/jumbo v0, "10817"
+    const-string/jumbo v0, "10818"
+    const-string/jumbo v0, "10819"
+    const-string/jumbo v0, "10820"
+    const-string/jumbo v0, "10821"
+    const-string/jumbo v0, "10822"
+    const-string/jumbo v0, "10823"
+    const-string/jumbo v0, "10824"
+    const-string/jumbo v0, "10825"
+    const-string/jumbo v0, "10826"
+    const-string/jumbo v0, "10827"
+    const-string/jumbo v0, "10828"
+    const-string/jumbo v0, "10829"
+    const-string/jumbo v0, "10830"
+    const-string/jumbo v0, "10831"
+    const-string/jumbo v0, "10832"
+    const-string/jumbo v0, "10833"
+    const-string/jumbo v0, "10834"
+    const-string/jumbo v0, "10835"
+    const-string/jumbo v0, "10836"
+    const-string/jumbo v0, "10837"
+    const-string/jumbo v0, "10838"
+    const-string/jumbo v0, "10839"
+    const-string/jumbo v0, "10840"
+    const-string/jumbo v0, "10841"
+    const-string/jumbo v0, "10842"
+    const-string/jumbo v0, "10843"
+    const-string/jumbo v0, "10844"
+    const-string/jumbo v0, "10845"
+    const-string/jumbo v0, "10846"
+    const-string/jumbo v0, "10847"
+    const-string/jumbo v0, "10848"
+    const-string/jumbo v0, "10849"
+    const-string/jumbo v0, "10850"
+    const-string/jumbo v0, "10851"
+    const-string/jumbo v0, "10852"
+    const-string/jumbo v0, "10853"
+    const-string/jumbo v0, "10854"
+    const-string/jumbo v0, "10855"
+    const-string/jumbo v0, "10856"
+    const-string/jumbo v0, "10857"
+    const-string/jumbo v0, "10858"
+    const-string/jumbo v0, "10859"
+    const-string/jumbo v0, "10860"
+    const-string/jumbo v0, "10861"
+    const-string/jumbo v0, "10862"
+    const-string/jumbo v0, "10863"
+    const-string/jumbo v0, "10864"
+    const-string/jumbo v0, "10865"
+    const-string/jumbo v0, "10866"
+    const-string/jumbo v0, "10867"
+    const-string/jumbo v0, "10868"
+    const-string/jumbo v0, "10869"
+    const-string/jumbo v0, "10870"
+    const-string/jumbo v0, "10871"
+    const-string/jumbo v0, "10872"
+    const-string/jumbo v0, "10873"
+    const-string/jumbo v0, "10874"
+    const-string/jumbo v0, "10875"
+    const-string/jumbo v0, "10876"
+    const-string/jumbo v0, "10877"
+    const-string/jumbo v0, "10878"
+    const-string/jumbo v0, "10879"
+    const-string/jumbo v0, "10880"
+    const-string/jumbo v0, "10881"
+    const-string/jumbo v0, "10882"
+    const-string/jumbo v0, "10883"
+    const-string/jumbo v0, "10884"
+    const-string/jumbo v0, "10885"
+    const-string/jumbo v0, "10886"
+    const-string/jumbo v0, "10887"
+    const-string/jumbo v0, "10888"
+    const-string/jumbo v0, "10889"
+    const-string/jumbo v0, "10890"
+    const-string/jumbo v0, "10891"
+    const-string/jumbo v0, "10892"
+    const-string/jumbo v0, "10893"
+    const-string/jumbo v0, "10894"
+    const-string/jumbo v0, "10895"
+    const-string/jumbo v0, "10896"
+    const-string/jumbo v0, "10897"
+    const-string/jumbo v0, "10898"
+    const-string/jumbo v0, "10899"
+    const-string/jumbo v0, "10900"
+    const-string/jumbo v0, "10901"
+    const-string/jumbo v0, "10902"
+    const-string/jumbo v0, "10903"
+    const-string/jumbo v0, "10904"
+    const-string/jumbo v0, "10905"
+    const-string/jumbo v0, "10906"
+    const-string/jumbo v0, "10907"
+    const-string/jumbo v0, "10908"
+    const-string/jumbo v0, "10909"
+    const-string/jumbo v0, "10910"
+    const-string/jumbo v0, "10911"
+    const-string/jumbo v0, "10912"
+    const-string/jumbo v0, "10913"
+    const-string/jumbo v0, "10914"
+    const-string/jumbo v0, "10915"
+    const-string/jumbo v0, "10916"
+    const-string/jumbo v0, "10917"
+    const-string/jumbo v0, "10918"
+    const-string/jumbo v0, "10919"
+    const-string/jumbo v0, "10920"
+    const-string/jumbo v0, "10921"
+    const-string/jumbo v0, "10922"
+    const-string/jumbo v0, "10923"
+    const-string/jumbo v0, "10924"
+    const-string/jumbo v0, "10925"
+    const-string/jumbo v0, "10926"
+    const-string/jumbo v0, "10927"
+    const-string/jumbo v0, "10928"
+    const-string/jumbo v0, "10929"
+    const-string/jumbo v0, "10930"
+    const-string/jumbo v0, "10931"
+    const-string/jumbo v0, "10932"
+    const-string/jumbo v0, "10933"
+    const-string/jumbo v0, "10934"
+    const-string/jumbo v0, "10935"
+    const-string/jumbo v0, "10936"
+    const-string/jumbo v0, "10937"
+    const-string/jumbo v0, "10938"
+    const-string/jumbo v0, "10939"
+    const-string/jumbo v0, "10940"
+    const-string/jumbo v0, "10941"
+    const-string/jumbo v0, "10942"
+    const-string/jumbo v0, "10943"
+    const-string/jumbo v0, "10944"
+    const-string/jumbo v0, "10945"
+    const-string/jumbo v0, "10946"
+    const-string/jumbo v0, "10947"
+    const-string/jumbo v0, "10948"
+    const-string/jumbo v0, "10949"
+    const-string/jumbo v0, "10950"
+    const-string/jumbo v0, "10951"
+    const-string/jumbo v0, "10952"
+    const-string/jumbo v0, "10953"
+    const-string/jumbo v0, "10954"
+    const-string/jumbo v0, "10955"
+    const-string/jumbo v0, "10956"
+    const-string/jumbo v0, "10957"
+    const-string/jumbo v0, "10958"
+    const-string/jumbo v0, "10959"
+    const-string/jumbo v0, "10960"
+    const-string/jumbo v0, "10961"
+    const-string/jumbo v0, "10962"
+    const-string/jumbo v0, "10963"
+    const-string/jumbo v0, "10964"
+    const-string/jumbo v0, "10965"
+    const-string/jumbo v0, "10966"
+    const-string/jumbo v0, "10967"
+    const-string/jumbo v0, "10968"
+    const-string/jumbo v0, "10969"
+    const-string/jumbo v0, "10970"
+    const-string/jumbo v0, "10971"
+    const-string/jumbo v0, "10972"
+    const-string/jumbo v0, "10973"
+    const-string/jumbo v0, "10974"
+    const-string/jumbo v0, "10975"
+    const-string/jumbo v0, "10976"
+    const-string/jumbo v0, "10977"
+    const-string/jumbo v0, "10978"
+    const-string/jumbo v0, "10979"
+    const-string/jumbo v0, "10980"
+    const-string/jumbo v0, "10981"
+    const-string/jumbo v0, "10982"
+    const-string/jumbo v0, "10983"
+    const-string/jumbo v0, "10984"
+    const-string/jumbo v0, "10985"
+    const-string/jumbo v0, "10986"
+    const-string/jumbo v0, "10987"
+    const-string/jumbo v0, "10988"
+    const-string/jumbo v0, "10989"
+    const-string/jumbo v0, "10990"
+    const-string/jumbo v0, "10991"
+    const-string/jumbo v0, "10992"
+    const-string/jumbo v0, "10993"
+    const-string/jumbo v0, "10994"
+    const-string/jumbo v0, "10995"
+    const-string/jumbo v0, "10996"
+    const-string/jumbo v0, "10997"
+    const-string/jumbo v0, "10998"
+    const-string/jumbo v0, "10999"
+    const-string/jumbo v0, "11000"
+    const-string/jumbo v0, "11001"
+    const-string/jumbo v0, "11002"
+    const-string/jumbo v0, "11003"
+    const-string/jumbo v0, "11004"
+    const-string/jumbo v0, "11005"
+    const-string/jumbo v0, "11006"
+    const-string/jumbo v0, "11007"
+    const-string/jumbo v0, "11008"
+    const-string/jumbo v0, "11009"
+    const-string/jumbo v0, "11010"
+    const-string/jumbo v0, "11011"
+    const-string/jumbo v0, "11012"
+    const-string/jumbo v0, "11013"
+    const-string/jumbo v0, "11014"
+    const-string/jumbo v0, "11015"
+    const-string/jumbo v0, "11016"
+    const-string/jumbo v0, "11017"
+    const-string/jumbo v0, "11018"
+    const-string/jumbo v0, "11019"
+    const-string/jumbo v0, "11020"
+    const-string/jumbo v0, "11021"
+    const-string/jumbo v0, "11022"
+    const-string/jumbo v0, "11023"
+    const-string/jumbo v0, "11024"
+    const-string/jumbo v0, "11025"
+    const-string/jumbo v0, "11026"
+    const-string/jumbo v0, "11027"
+    const-string/jumbo v0, "11028"
+    const-string/jumbo v0, "11029"
+    const-string/jumbo v0, "11030"
+    const-string/jumbo v0, "11031"
+    const-string/jumbo v0, "11032"
+    const-string/jumbo v0, "11033"
+    const-string/jumbo v0, "11034"
+    const-string/jumbo v0, "11035"
+    const-string/jumbo v0, "11036"
+    const-string/jumbo v0, "11037"
+    const-string/jumbo v0, "11038"
+    const-string/jumbo v0, "11039"
+    const-string/jumbo v0, "11040"
+    const-string/jumbo v0, "11041"
+    const-string/jumbo v0, "11042"
+    const-string/jumbo v0, "11043"
+    const-string/jumbo v0, "11044"
+    const-string/jumbo v0, "11045"
+    const-string/jumbo v0, "11046"
+    const-string/jumbo v0, "11047"
+    const-string/jumbo v0, "11048"
+    const-string/jumbo v0, "11049"
+    const-string/jumbo v0, "11050"
+    const-string/jumbo v0, "11051"
+    const-string/jumbo v0, "11052"
+    const-string/jumbo v0, "11053"
+    const-string/jumbo v0, "11054"
+    const-string/jumbo v0, "11055"
+    const-string/jumbo v0, "11056"
+    const-string/jumbo v0, "11057"
+    const-string/jumbo v0, "11058"
+    const-string/jumbo v0, "11059"
+    const-string/jumbo v0, "11060"
+    const-string/jumbo v0, "11061"
+    const-string/jumbo v0, "11062"
+    const-string/jumbo v0, "11063"
+    const-string/jumbo v0, "11064"
+    const-string/jumbo v0, "11065"
+    const-string/jumbo v0, "11066"
+    const-string/jumbo v0, "11067"
+    const-string/jumbo v0, "11068"
+    const-string/jumbo v0, "11069"
+    const-string/jumbo v0, "11070"
+    const-string/jumbo v0, "11071"
+    const-string/jumbo v0, "11072"
+    const-string/jumbo v0, "11073"
+    const-string/jumbo v0, "11074"
+    const-string/jumbo v0, "11075"
+    const-string/jumbo v0, "11076"
+    const-string/jumbo v0, "11077"
+    const-string/jumbo v0, "11078"
+    const-string/jumbo v0, "11079"
+    const-string/jumbo v0, "11080"
+    const-string/jumbo v0, "11081"
+    const-string/jumbo v0, "11082"
+    const-string/jumbo v0, "11083"
+    const-string/jumbo v0, "11084"
+    const-string/jumbo v0, "11085"
+    const-string/jumbo v0, "11086"
+    const-string/jumbo v0, "11087"
+    const-string/jumbo v0, "11088"
+    const-string/jumbo v0, "11089"
+    const-string/jumbo v0, "11090"
+    const-string/jumbo v0, "11091"
+    const-string/jumbo v0, "11092"
+    const-string/jumbo v0, "11093"
+    const-string/jumbo v0, "11094"
+    const-string/jumbo v0, "11095"
+    const-string/jumbo v0, "11096"
+    const-string/jumbo v0, "11097"
+    const-string/jumbo v0, "11098"
+    const-string/jumbo v0, "11099"
+    const-string/jumbo v0, "11100"
+    const-string/jumbo v0, "11101"
+    const-string/jumbo v0, "11102"
+    const-string/jumbo v0, "11103"
+    const-string/jumbo v0, "11104"
+    const-string/jumbo v0, "11105"
+    const-string/jumbo v0, "11106"
+    const-string/jumbo v0, "11107"
+    const-string/jumbo v0, "11108"
+    const-string/jumbo v0, "11109"
+    const-string/jumbo v0, "11110"
+    const-string/jumbo v0, "11111"
+    const-string/jumbo v0, "11112"
+    const-string/jumbo v0, "11113"
+    const-string/jumbo v0, "11114"
+    const-string/jumbo v0, "11115"
+    const-string/jumbo v0, "11116"
+    const-string/jumbo v0, "11117"
+    const-string/jumbo v0, "11118"
+    const-string/jumbo v0, "11119"
+    const-string/jumbo v0, "11120"
+    const-string/jumbo v0, "11121"
+    const-string/jumbo v0, "11122"
+    const-string/jumbo v0, "11123"
+    const-string/jumbo v0, "11124"
+    const-string/jumbo v0, "11125"
+    const-string/jumbo v0, "11126"
+    const-string/jumbo v0, "11127"
+    const-string/jumbo v0, "11128"
+    const-string/jumbo v0, "11129"
+    const-string/jumbo v0, "11130"
+    const-string/jumbo v0, "11131"
+    const-string/jumbo v0, "11132"
+    const-string/jumbo v0, "11133"
+    const-string/jumbo v0, "11134"
+    const-string/jumbo v0, "11135"
+    const-string/jumbo v0, "11136"
+    const-string/jumbo v0, "11137"
+    const-string/jumbo v0, "11138"
+    const-string/jumbo v0, "11139"
+    const-string/jumbo v0, "11140"
+    const-string/jumbo v0, "11141"
+    const-string/jumbo v0, "11142"
+    const-string/jumbo v0, "11143"
+    const-string/jumbo v0, "11144"
+    const-string/jumbo v0, "11145"
+    const-string/jumbo v0, "11146"
+    const-string/jumbo v0, "11147"
+    const-string/jumbo v0, "11148"
+    const-string/jumbo v0, "11149"
+    const-string/jumbo v0, "11150"
+    const-string/jumbo v0, "11151"
+    const-string/jumbo v0, "11152"
+    const-string/jumbo v0, "11153"
+    const-string/jumbo v0, "11154"
+    const-string/jumbo v0, "11155"
+    const-string/jumbo v0, "11156"
+    const-string/jumbo v0, "11157"
+    const-string/jumbo v0, "11158"
+    const-string/jumbo v0, "11159"
+    const-string/jumbo v0, "11160"
+    const-string/jumbo v0, "11161"
+    const-string/jumbo v0, "11162"
+    const-string/jumbo v0, "11163"
+    const-string/jumbo v0, "11164"
+    const-string/jumbo v0, "11165"
+    const-string/jumbo v0, "11166"
+    const-string/jumbo v0, "11167"
+    const-string/jumbo v0, "11168"
+    const-string/jumbo v0, "11169"
+    const-string/jumbo v0, "11170"
+    const-string/jumbo v0, "11171"
+    const-string/jumbo v0, "11172"
+    const-string/jumbo v0, "11173"
+    const-string/jumbo v0, "11174"
+    const-string/jumbo v0, "11175"
+    const-string/jumbo v0, "11176"
+    const-string/jumbo v0, "11177"
+    const-string/jumbo v0, "11178"
+    const-string/jumbo v0, "11179"
+    const-string/jumbo v0, "11180"
+    const-string/jumbo v0, "11181"
+    const-string/jumbo v0, "11182"
+    const-string/jumbo v0, "11183"
+    const-string/jumbo v0, "11184"
+    const-string/jumbo v0, "11185"
+    const-string/jumbo v0, "11186"
+    const-string/jumbo v0, "11187"
+    const-string/jumbo v0, "11188"
+    const-string/jumbo v0, "11189"
+    const-string/jumbo v0, "11190"
+    const-string/jumbo v0, "11191"
+    const-string/jumbo v0, "11192"
+    const-string/jumbo v0, "11193"
+    const-string/jumbo v0, "11194"
+    const-string/jumbo v0, "11195"
+    const-string/jumbo v0, "11196"
+    const-string/jumbo v0, "11197"
+    const-string/jumbo v0, "11198"
+    const-string/jumbo v0, "11199"
+    const-string/jumbo v0, "11200"
+    const-string/jumbo v0, "11201"
+    const-string/jumbo v0, "11202"
+    const-string/jumbo v0, "11203"
+    const-string/jumbo v0, "11204"
+    const-string/jumbo v0, "11205"
+    const-string/jumbo v0, "11206"
+    const-string/jumbo v0, "11207"
+    const-string/jumbo v0, "11208"
+    const-string/jumbo v0, "11209"
+    const-string/jumbo v0, "11210"
+    const-string/jumbo v0, "11211"
+    const-string/jumbo v0, "11212"
+    const-string/jumbo v0, "11213"
+    const-string/jumbo v0, "11214"
+    const-string/jumbo v0, "11215"
+    const-string/jumbo v0, "11216"
+    const-string/jumbo v0, "11217"
+    const-string/jumbo v0, "11218"
+    const-string/jumbo v0, "11219"
+    const-string/jumbo v0, "11220"
+    const-string/jumbo v0, "11221"
+    const-string/jumbo v0, "11222"
+    const-string/jumbo v0, "11223"
+    const-string/jumbo v0, "11224"
+    const-string/jumbo v0, "11225"
+    const-string/jumbo v0, "11226"
+    const-string/jumbo v0, "11227"
+    const-string/jumbo v0, "11228"
+    const-string/jumbo v0, "11229"
+    const-string/jumbo v0, "11230"
+    const-string/jumbo v0, "11231"
+    const-string/jumbo v0, "11232"
+    const-string/jumbo v0, "11233"
+    const-string/jumbo v0, "11234"
+    const-string/jumbo v0, "11235"
+    const-string/jumbo v0, "11236"
+    const-string/jumbo v0, "11237"
+    const-string/jumbo v0, "11238"
+    const-string/jumbo v0, "11239"
+    const-string/jumbo v0, "11240"
+    const-string/jumbo v0, "11241"
+    const-string/jumbo v0, "11242"
+    const-string/jumbo v0, "11243"
+    const-string/jumbo v0, "11244"
+    const-string/jumbo v0, "11245"
+    const-string/jumbo v0, "11246"
+    const-string/jumbo v0, "11247"
+    const-string/jumbo v0, "11248"
+    const-string/jumbo v0, "11249"
+    const-string/jumbo v0, "11250"
+    const-string/jumbo v0, "11251"
+    const-string/jumbo v0, "11252"
+    const-string/jumbo v0, "11253"
+    const-string/jumbo v0, "11254"
+    const-string/jumbo v0, "11255"
+    const-string/jumbo v0, "11256"
+    const-string/jumbo v0, "11257"
+    const-string/jumbo v0, "11258"
+    const-string/jumbo v0, "11259"
+    const-string/jumbo v0, "11260"
+    const-string/jumbo v0, "11261"
+    const-string/jumbo v0, "11262"
+    const-string/jumbo v0, "11263"
+    const-string/jumbo v0, "11264"
+    const-string/jumbo v0, "11265"
+    const-string/jumbo v0, "11266"
+    const-string/jumbo v0, "11267"
+    const-string/jumbo v0, "11268"
+    const-string/jumbo v0, "11269"
+    const-string/jumbo v0, "11270"
+    const-string/jumbo v0, "11271"
+    const-string/jumbo v0, "11272"
+    const-string/jumbo v0, "11273"
+    const-string/jumbo v0, "11274"
+    const-string/jumbo v0, "11275"
+    const-string/jumbo v0, "11276"
+    const-string/jumbo v0, "11277"
+    const-string/jumbo v0, "11278"
+    const-string/jumbo v0, "11279"
+    const-string/jumbo v0, "11280"
+    const-string/jumbo v0, "11281"
+    const-string/jumbo v0, "11282"
+    const-string/jumbo v0, "11283"
+    const-string/jumbo v0, "11284"
+    const-string/jumbo v0, "11285"
+    const-string/jumbo v0, "11286"
+    const-string/jumbo v0, "11287"
+    const-string/jumbo v0, "11288"
+    const-string/jumbo v0, "11289"
+    const-string/jumbo v0, "11290"
+    const-string/jumbo v0, "11291"
+    const-string/jumbo v0, "11292"
+    const-string/jumbo v0, "11293"
+    const-string/jumbo v0, "11294"
+    const-string/jumbo v0, "11295"
+    const-string/jumbo v0, "11296"
+    const-string/jumbo v0, "11297"
+    const-string/jumbo v0, "11298"
+    const-string/jumbo v0, "11299"
+    const-string/jumbo v0, "11300"
+    const-string/jumbo v0, "11301"
+    const-string/jumbo v0, "11302"
+    const-string/jumbo v0, "11303"
+    const-string/jumbo v0, "11304"
+    const-string/jumbo v0, "11305"
+    const-string/jumbo v0, "11306"
+    const-string/jumbo v0, "11307"
+    const-string/jumbo v0, "11308"
+    const-string/jumbo v0, "11309"
+    const-string/jumbo v0, "11310"
+    const-string/jumbo v0, "11311"
+    const-string/jumbo v0, "11312"
+    const-string/jumbo v0, "11313"
+    const-string/jumbo v0, "11314"
+    const-string/jumbo v0, "11315"
+    const-string/jumbo v0, "11316"
+    const-string/jumbo v0, "11317"
+    const-string/jumbo v0, "11318"
+    const-string/jumbo v0, "11319"
+    const-string/jumbo v0, "11320"
+    const-string/jumbo v0, "11321"
+    const-string/jumbo v0, "11322"
+    const-string/jumbo v0, "11323"
+    const-string/jumbo v0, "11324"
+    const-string/jumbo v0, "11325"
+    const-string/jumbo v0, "11326"
+    const-string/jumbo v0, "11327"
+    const-string/jumbo v0, "11328"
+    const-string/jumbo v0, "11329"
+    const-string/jumbo v0, "11330"
+    const-string/jumbo v0, "11331"
+    const-string/jumbo v0, "11332"
+    const-string/jumbo v0, "11333"
+    const-string/jumbo v0, "11334"
+    const-string/jumbo v0, "11335"
+    const-string/jumbo v0, "11336"
+    const-string/jumbo v0, "11337"
+    const-string/jumbo v0, "11338"
+    const-string/jumbo v0, "11339"
+    const-string/jumbo v0, "11340"
+    const-string/jumbo v0, "11341"
+    const-string/jumbo v0, "11342"
+    const-string/jumbo v0, "11343"
+    const-string/jumbo v0, "11344"
+    const-string/jumbo v0, "11345"
+    const-string/jumbo v0, "11346"
+    const-string/jumbo v0, "11347"
+    const-string/jumbo v0, "11348"
+    const-string/jumbo v0, "11349"
+    const-string/jumbo v0, "11350"
+    const-string/jumbo v0, "11351"
+    const-string/jumbo v0, "11352"
+    const-string/jumbo v0, "11353"
+    const-string/jumbo v0, "11354"
+    const-string/jumbo v0, "11355"
+    const-string/jumbo v0, "11356"
+    const-string/jumbo v0, "11357"
+    const-string/jumbo v0, "11358"
+    const-string/jumbo v0, "11359"
+    const-string/jumbo v0, "11360"
+    const-string/jumbo v0, "11361"
+    const-string/jumbo v0, "11362"
+    const-string/jumbo v0, "11363"
+    const-string/jumbo v0, "11364"
+    const-string/jumbo v0, "11365"
+    const-string/jumbo v0, "11366"
+    const-string/jumbo v0, "11367"
+    const-string/jumbo v0, "11368"
+    const-string/jumbo v0, "11369"
+    const-string/jumbo v0, "11370"
+    const-string/jumbo v0, "11371"
+    const-string/jumbo v0, "11372"
+    const-string/jumbo v0, "11373"
+    const-string/jumbo v0, "11374"
+    const-string/jumbo v0, "11375"
+    const-string/jumbo v0, "11376"
+    const-string/jumbo v0, "11377"
+    const-string/jumbo v0, "11378"
+    const-string/jumbo v0, "11379"
+    const-string/jumbo v0, "11380"
+    const-string/jumbo v0, "11381"
+    const-string/jumbo v0, "11382"
+    const-string/jumbo v0, "11383"
+    const-string/jumbo v0, "11384"
+    const-string/jumbo v0, "11385"
+    const-string/jumbo v0, "11386"
+    const-string/jumbo v0, "11387"
+    const-string/jumbo v0, "11388"
+    const-string/jumbo v0, "11389"
+    const-string/jumbo v0, "11390"
+    const-string/jumbo v0, "11391"
+    const-string/jumbo v0, "11392"
+    const-string/jumbo v0, "11393"
+    const-string/jumbo v0, "11394"
+    const-string/jumbo v0, "11395"
+    const-string/jumbo v0, "11396"
+    const-string/jumbo v0, "11397"
+    const-string/jumbo v0, "11398"
+    const-string/jumbo v0, "11399"
+    const-string/jumbo v0, "11400"
+    const-string/jumbo v0, "11401"
+    const-string/jumbo v0, "11402"
+    const-string/jumbo v0, "11403"
+    const-string/jumbo v0, "11404"
+    const-string/jumbo v0, "11405"
+    const-string/jumbo v0, "11406"
+    const-string/jumbo v0, "11407"
+    const-string/jumbo v0, "11408"
+    const-string/jumbo v0, "11409"
+    const-string/jumbo v0, "11410"
+    const-string/jumbo v0, "11411"
+    const-string/jumbo v0, "11412"
+    const-string/jumbo v0, "11413"
+    const-string/jumbo v0, "11414"
+    const-string/jumbo v0, "11415"
+    const-string/jumbo v0, "11416"
+    const-string/jumbo v0, "11417"
+    const-string/jumbo v0, "11418"
+    const-string/jumbo v0, "11419"
+    const-string/jumbo v0, "11420"
+    const-string/jumbo v0, "11421"
+    const-string/jumbo v0, "11422"
+    const-string/jumbo v0, "11423"
+    const-string/jumbo v0, "11424"
+    const-string/jumbo v0, "11425"
+    const-string/jumbo v0, "11426"
+    const-string/jumbo v0, "11427"
+    const-string/jumbo v0, "11428"
+    const-string/jumbo v0, "11429"
+    const-string/jumbo v0, "11430"
+    const-string/jumbo v0, "11431"
+    const-string/jumbo v0, "11432"
+    const-string/jumbo v0, "11433"
+    const-string/jumbo v0, "11434"
+    const-string/jumbo v0, "11435"
+    const-string/jumbo v0, "11436"
+    const-string/jumbo v0, "11437"
+    const-string/jumbo v0, "11438"
+    const-string/jumbo v0, "11439"
+    const-string/jumbo v0, "11440"
+    const-string/jumbo v0, "11441"
+    const-string/jumbo v0, "11442"
+    const-string/jumbo v0, "11443"
+    const-string/jumbo v0, "11444"
+    const-string/jumbo v0, "11445"
+    const-string/jumbo v0, "11446"
+    const-string/jumbo v0, "11447"
+    const-string/jumbo v0, "11448"
+    const-string/jumbo v0, "11449"
+    const-string/jumbo v0, "11450"
+    const-string/jumbo v0, "11451"
+    const-string/jumbo v0, "11452"
+    const-string/jumbo v0, "11453"
+    const-string/jumbo v0, "11454"
+    const-string/jumbo v0, "11455"
+    const-string/jumbo v0, "11456"
+    const-string/jumbo v0, "11457"
+    const-string/jumbo v0, "11458"
+    const-string/jumbo v0, "11459"
+    const-string/jumbo v0, "11460"
+    const-string/jumbo v0, "11461"
+    const-string/jumbo v0, "11462"
+    const-string/jumbo v0, "11463"
+    const-string/jumbo v0, "11464"
+    const-string/jumbo v0, "11465"
+    const-string/jumbo v0, "11466"
+    const-string/jumbo v0, "11467"
+    const-string/jumbo v0, "11468"
+    const-string/jumbo v0, "11469"
+    const-string/jumbo v0, "11470"
+    const-string/jumbo v0, "11471"
+    const-string/jumbo v0, "11472"
+    const-string/jumbo v0, "11473"
+    const-string/jumbo v0, "11474"
+    const-string/jumbo v0, "11475"
+    const-string/jumbo v0, "11476"
+    const-string/jumbo v0, "11477"
+    const-string/jumbo v0, "11478"
+    const-string/jumbo v0, "11479"
+    const-string/jumbo v0, "11480"
+    const-string/jumbo v0, "11481"
+    const-string/jumbo v0, "11482"
+    const-string/jumbo v0, "11483"
+    const-string/jumbo v0, "11484"
+    const-string/jumbo v0, "11485"
+    const-string/jumbo v0, "11486"
+    const-string/jumbo v0, "11487"
+    const-string/jumbo v0, "11488"
+    const-string/jumbo v0, "11489"
+    const-string/jumbo v0, "11490"
+    const-string/jumbo v0, "11491"
+    const-string/jumbo v0, "11492"
+    const-string/jumbo v0, "11493"
+    const-string/jumbo v0, "11494"
+    const-string/jumbo v0, "11495"
+    const-string/jumbo v0, "11496"
+    const-string/jumbo v0, "11497"
+    const-string/jumbo v0, "11498"
+    const-string/jumbo v0, "11499"
+    const-string/jumbo v0, "11500"
+    const-string/jumbo v0, "11501"
+    const-string/jumbo v0, "11502"
+    const-string/jumbo v0, "11503"
+    const-string/jumbo v0, "11504"
+    const-string/jumbo v0, "11505"
+    const-string/jumbo v0, "11506"
+    const-string/jumbo v0, "11507"
+    const-string/jumbo v0, "11508"
+    const-string/jumbo v0, "11509"
+    const-string/jumbo v0, "11510"
+    const-string/jumbo v0, "11511"
+    const-string/jumbo v0, "11512"
+    const-string/jumbo v0, "11513"
+    const-string/jumbo v0, "11514"
+    const-string/jumbo v0, "11515"
+    const-string/jumbo v0, "11516"
+    const-string/jumbo v0, "11517"
+    const-string/jumbo v0, "11518"
+    const-string/jumbo v0, "11519"
+    const-string/jumbo v0, "11520"
+    const-string/jumbo v0, "11521"
+    const-string/jumbo v0, "11522"
+    const-string/jumbo v0, "11523"
+    const-string/jumbo v0, "11524"
+    const-string/jumbo v0, "11525"
+    const-string/jumbo v0, "11526"
+    const-string/jumbo v0, "11527"
+    const-string/jumbo v0, "11528"
+    const-string/jumbo v0, "11529"
+    const-string/jumbo v0, "11530"
+    const-string/jumbo v0, "11531"
+    const-string/jumbo v0, "11532"
+    const-string/jumbo v0, "11533"
+    const-string/jumbo v0, "11534"
+    const-string/jumbo v0, "11535"
+    const-string/jumbo v0, "11536"
+    const-string/jumbo v0, "11537"
+    const-string/jumbo v0, "11538"
+    const-string/jumbo v0, "11539"
+    const-string/jumbo v0, "11540"
+    const-string/jumbo v0, "11541"
+    const-string/jumbo v0, "11542"
+    const-string/jumbo v0, "11543"
+    const-string/jumbo v0, "11544"
+    const-string/jumbo v0, "11545"
+    const-string/jumbo v0, "11546"
+    const-string/jumbo v0, "11547"
+    const-string/jumbo v0, "11548"
+    const-string/jumbo v0, "11549"
+    const-string/jumbo v0, "11550"
+    const-string/jumbo v0, "11551"
+    const-string/jumbo v0, "11552"
+    const-string/jumbo v0, "11553"
+    const-string/jumbo v0, "11554"
+    const-string/jumbo v0, "11555"
+    const-string/jumbo v0, "11556"
+    const-string/jumbo v0, "11557"
+    const-string/jumbo v0, "11558"
+    const-string/jumbo v0, "11559"
+    const-string/jumbo v0, "11560"
+    const-string/jumbo v0, "11561"
+    const-string/jumbo v0, "11562"
+    const-string/jumbo v0, "11563"
+    const-string/jumbo v0, "11564"
+    const-string/jumbo v0, "11565"
+    const-string/jumbo v0, "11566"
+    const-string/jumbo v0, "11567"
+    const-string/jumbo v0, "11568"
+    const-string/jumbo v0, "11569"
+    const-string/jumbo v0, "11570"
+    const-string/jumbo v0, "11571"
+    const-string/jumbo v0, "11572"
+    const-string/jumbo v0, "11573"
+    const-string/jumbo v0, "11574"
+    const-string/jumbo v0, "11575"
+    const-string/jumbo v0, "11576"
+    const-string/jumbo v0, "11577"
+    const-string/jumbo v0, "11578"
+    const-string/jumbo v0, "11579"
+    const-string/jumbo v0, "11580"
+    const-string/jumbo v0, "11581"
+    const-string/jumbo v0, "11582"
+    const-string/jumbo v0, "11583"
+    const-string/jumbo v0, "11584"
+    const-string/jumbo v0, "11585"
+    const-string/jumbo v0, "11586"
+    const-string/jumbo v0, "11587"
+    const-string/jumbo v0, "11588"
+    const-string/jumbo v0, "11589"
+    const-string/jumbo v0, "11590"
+    const-string/jumbo v0, "11591"
+    const-string/jumbo v0, "11592"
+    const-string/jumbo v0, "11593"
+    const-string/jumbo v0, "11594"
+    const-string/jumbo v0, "11595"
+    const-string/jumbo v0, "11596"
+    const-string/jumbo v0, "11597"
+    const-string/jumbo v0, "11598"
+    const-string/jumbo v0, "11599"
+    const-string/jumbo v0, "11600"
+    const-string/jumbo v0, "11601"
+    const-string/jumbo v0, "11602"
+    const-string/jumbo v0, "11603"
+    const-string/jumbo v0, "11604"
+    const-string/jumbo v0, "11605"
+    const-string/jumbo v0, "11606"
+    const-string/jumbo v0, "11607"
+    const-string/jumbo v0, "11608"
+    const-string/jumbo v0, "11609"
+    const-string/jumbo v0, "11610"
+    const-string/jumbo v0, "11611"
+    const-string/jumbo v0, "11612"
+    const-string/jumbo v0, "11613"
+    const-string/jumbo v0, "11614"
+    const-string/jumbo v0, "11615"
+    const-string/jumbo v0, "11616"
+    const-string/jumbo v0, "11617"
+    const-string/jumbo v0, "11618"
+    const-string/jumbo v0, "11619"
+    const-string/jumbo v0, "11620"
+    const-string/jumbo v0, "11621"
+    const-string/jumbo v0, "11622"
+    const-string/jumbo v0, "11623"
+    const-string/jumbo v0, "11624"
+    const-string/jumbo v0, "11625"
+    const-string/jumbo v0, "11626"
+    const-string/jumbo v0, "11627"
+    const-string/jumbo v0, "11628"
+    const-string/jumbo v0, "11629"
+    const-string/jumbo v0, "11630"
+    const-string/jumbo v0, "11631"
+    const-string/jumbo v0, "11632"
+    const-string/jumbo v0, "11633"
+    const-string/jumbo v0, "11634"
+    const-string/jumbo v0, "11635"
+    const-string/jumbo v0, "11636"
+    const-string/jumbo v0, "11637"
+    const-string/jumbo v0, "11638"
+    const-string/jumbo v0, "11639"
+    const-string/jumbo v0, "11640"
+    const-string/jumbo v0, "11641"
+    const-string/jumbo v0, "11642"
+    const-string/jumbo v0, "11643"
+    const-string/jumbo v0, "11644"
+    const-string/jumbo v0, "11645"
+    const-string/jumbo v0, "11646"
+    const-string/jumbo v0, "11647"
+    const-string/jumbo v0, "11648"
+    const-string/jumbo v0, "11649"
+    const-string/jumbo v0, "11650"
+    const-string/jumbo v0, "11651"
+    const-string/jumbo v0, "11652"
+    const-string/jumbo v0, "11653"
+    const-string/jumbo v0, "11654"
+    const-string/jumbo v0, "11655"
+    const-string/jumbo v0, "11656"
+    const-string/jumbo v0, "11657"
+    const-string/jumbo v0, "11658"
+    const-string/jumbo v0, "11659"
+    const-string/jumbo v0, "11660"
+    const-string/jumbo v0, "11661"
+    const-string/jumbo v0, "11662"
+    const-string/jumbo v0, "11663"
+    const-string/jumbo v0, "11664"
+    const-string/jumbo v0, "11665"
+    const-string/jumbo v0, "11666"
+    const-string/jumbo v0, "11667"
+    const-string/jumbo v0, "11668"
+    const-string/jumbo v0, "11669"
+    const-string/jumbo v0, "11670"
+    const-string/jumbo v0, "11671"
+    const-string/jumbo v0, "11672"
+    const-string/jumbo v0, "11673"
+    const-string/jumbo v0, "11674"
+    const-string/jumbo v0, "11675"
+    const-string/jumbo v0, "11676"
+    const-string/jumbo v0, "11677"
+    const-string/jumbo v0, "11678"
+    const-string/jumbo v0, "11679"
+    const-string/jumbo v0, "11680"
+    const-string/jumbo v0, "11681"
+    const-string/jumbo v0, "11682"
+    const-string/jumbo v0, "11683"
+    const-string/jumbo v0, "11684"
+    const-string/jumbo v0, "11685"
+    const-string/jumbo v0, "11686"
+    const-string/jumbo v0, "11687"
+    const-string/jumbo v0, "11688"
+    const-string/jumbo v0, "11689"
+    const-string/jumbo v0, "11690"
+    const-string/jumbo v0, "11691"
+    const-string/jumbo v0, "11692"
+    const-string/jumbo v0, "11693"
+    const-string/jumbo v0, "11694"
+    const-string/jumbo v0, "11695"
+    const-string/jumbo v0, "11696"
+    const-string/jumbo v0, "11697"
+    const-string/jumbo v0, "11698"
+    const-string/jumbo v0, "11699"
+    const-string/jumbo v0, "11700"
+    const-string/jumbo v0, "11701"
+    const-string/jumbo v0, "11702"
+    const-string/jumbo v0, "11703"
+    const-string/jumbo v0, "11704"
+    const-string/jumbo v0, "11705"
+    const-string/jumbo v0, "11706"
+    const-string/jumbo v0, "11707"
+    const-string/jumbo v0, "11708"
+    const-string/jumbo v0, "11709"
+    const-string/jumbo v0, "11710"
+    const-string/jumbo v0, "11711"
+    const-string/jumbo v0, "11712"
+    const-string/jumbo v0, "11713"
+    const-string/jumbo v0, "11714"
+    const-string/jumbo v0, "11715"
+    const-string/jumbo v0, "11716"
+    const-string/jumbo v0, "11717"
+    const-string/jumbo v0, "11718"
+    const-string/jumbo v0, "11719"
+    const-string/jumbo v0, "11720"
+    const-string/jumbo v0, "11721"
+    const-string/jumbo v0, "11722"
+    const-string/jumbo v0, "11723"
+    const-string/jumbo v0, "11724"
+    const-string/jumbo v0, "11725"
+    const-string/jumbo v0, "11726"
+    const-string/jumbo v0, "11727"
+    const-string/jumbo v0, "11728"
+    const-string/jumbo v0, "11729"
+    const-string/jumbo v0, "11730"
+    const-string/jumbo v0, "11731"
+    const-string/jumbo v0, "11732"
+    const-string/jumbo v0, "11733"
+    const-string/jumbo v0, "11734"
+    const-string/jumbo v0, "11735"
+    const-string/jumbo v0, "11736"
+    const-string/jumbo v0, "11737"
+    const-string/jumbo v0, "11738"
+    const-string/jumbo v0, "11739"
+    const-string/jumbo v0, "11740"
+    const-string/jumbo v0, "11741"
+    const-string/jumbo v0, "11742"
+    const-string/jumbo v0, "11743"
+    const-string/jumbo v0, "11744"
+    const-string/jumbo v0, "11745"
+    const-string/jumbo v0, "11746"
+    const-string/jumbo v0, "11747"
+    const-string/jumbo v0, "11748"
+    const-string/jumbo v0, "11749"
+    const-string/jumbo v0, "11750"
+    const-string/jumbo v0, "11751"
+    const-string/jumbo v0, "11752"
+    const-string/jumbo v0, "11753"
+    const-string/jumbo v0, "11754"
+    const-string/jumbo v0, "11755"
+    const-string/jumbo v0, "11756"
+    const-string/jumbo v0, "11757"
+    const-string/jumbo v0, "11758"
+    const-string/jumbo v0, "11759"
+    const-string/jumbo v0, "11760"
+    const-string/jumbo v0, "11761"
+    const-string/jumbo v0, "11762"
+    const-string/jumbo v0, "11763"
+    const-string/jumbo v0, "11764"
+    const-string/jumbo v0, "11765"
+    const-string/jumbo v0, "11766"
+    const-string/jumbo v0, "11767"
+    const-string/jumbo v0, "11768"
+    const-string/jumbo v0, "11769"
+    const-string/jumbo v0, "11770"
+    const-string/jumbo v0, "11771"
+    const-string/jumbo v0, "11772"
+    const-string/jumbo v0, "11773"
+    const-string/jumbo v0, "11774"
+    const-string/jumbo v0, "11775"
+    const-string/jumbo v0, "11776"
+    const-string/jumbo v0, "11777"
+    const-string/jumbo v0, "11778"
+    const-string/jumbo v0, "11779"
+    const-string/jumbo v0, "11780"
+    const-string/jumbo v0, "11781"
+    const-string/jumbo v0, "11782"
+    const-string/jumbo v0, "11783"
+    const-string/jumbo v0, "11784"
+    const-string/jumbo v0, "11785"
+    const-string/jumbo v0, "11786"
+    const-string/jumbo v0, "11787"
+    const-string/jumbo v0, "11788"
+    const-string/jumbo v0, "11789"
+    const-string/jumbo v0, "11790"
+    const-string/jumbo v0, "11791"
+    const-string/jumbo v0, "11792"
+    const-string/jumbo v0, "11793"
+    const-string/jumbo v0, "11794"
+    const-string/jumbo v0, "11795"
+    const-string/jumbo v0, "11796"
+    const-string/jumbo v0, "11797"
+    const-string/jumbo v0, "11798"
+    const-string/jumbo v0, "11799"
+    const-string/jumbo v0, "11800"
+    const-string/jumbo v0, "11801"
+    const-string/jumbo v0, "11802"
+    const-string/jumbo v0, "11803"
+    const-string/jumbo v0, "11804"
+    const-string/jumbo v0, "11805"
+    const-string/jumbo v0, "11806"
+    const-string/jumbo v0, "11807"
+    const-string/jumbo v0, "11808"
+    const-string/jumbo v0, "11809"
+    const-string/jumbo v0, "11810"
+    const-string/jumbo v0, "11811"
+    const-string/jumbo v0, "11812"
+    const-string/jumbo v0, "11813"
+    const-string/jumbo v0, "11814"
+    const-string/jumbo v0, "11815"
+    const-string/jumbo v0, "11816"
+    const-string/jumbo v0, "11817"
+    const-string/jumbo v0, "11818"
+    const-string/jumbo v0, "11819"
+    const-string/jumbo v0, "11820"
+    const-string/jumbo v0, "11821"
+    const-string/jumbo v0, "11822"
+    const-string/jumbo v0, "11823"
+    const-string/jumbo v0, "11824"
+    const-string/jumbo v0, "11825"
+    const-string/jumbo v0, "11826"
+    const-string/jumbo v0, "11827"
+    const-string/jumbo v0, "11828"
+    const-string/jumbo v0, "11829"
+    const-string/jumbo v0, "11830"
+    const-string/jumbo v0, "11831"
+    const-string/jumbo v0, "11832"
+    const-string/jumbo v0, "11833"
+    const-string/jumbo v0, "11834"
+    const-string/jumbo v0, "11835"
+    const-string/jumbo v0, "11836"
+    const-string/jumbo v0, "11837"
+    const-string/jumbo v0, "11838"
+    const-string/jumbo v0, "11839"
+    const-string/jumbo v0, "11840"
+    const-string/jumbo v0, "11841"
+    const-string/jumbo v0, "11842"
+    const-string/jumbo v0, "11843"
+    const-string/jumbo v0, "11844"
+    const-string/jumbo v0, "11845"
+    const-string/jumbo v0, "11846"
+    const-string/jumbo v0, "11847"
+    const-string/jumbo v0, "11848"
+    const-string/jumbo v0, "11849"
+    const-string/jumbo v0, "11850"
+    const-string/jumbo v0, "11851"
+    const-string/jumbo v0, "11852"
+    const-string/jumbo v0, "11853"
+    const-string/jumbo v0, "11854"
+    const-string/jumbo v0, "11855"
+    const-string/jumbo v0, "11856"
+    const-string/jumbo v0, "11857"
+    const-string/jumbo v0, "11858"
+    const-string/jumbo v0, "11859"
+    const-string/jumbo v0, "11860"
+    const-string/jumbo v0, "11861"
+    const-string/jumbo v0, "11862"
+    const-string/jumbo v0, "11863"
+    const-string/jumbo v0, "11864"
+    const-string/jumbo v0, "11865"
+    const-string/jumbo v0, "11866"
+    const-string/jumbo v0, "11867"
+    const-string/jumbo v0, "11868"
+    const-string/jumbo v0, "11869"
+    const-string/jumbo v0, "11870"
+    const-string/jumbo v0, "11871"
+    const-string/jumbo v0, "11872"
+    const-string/jumbo v0, "11873"
+    const-string/jumbo v0, "11874"
+    const-string/jumbo v0, "11875"
+    const-string/jumbo v0, "11876"
+    const-string/jumbo v0, "11877"
+    const-string/jumbo v0, "11878"
+    const-string/jumbo v0, "11879"
+    const-string/jumbo v0, "11880"
+    const-string/jumbo v0, "11881"
+    const-string/jumbo v0, "11882"
+    const-string/jumbo v0, "11883"
+    const-string/jumbo v0, "11884"
+    const-string/jumbo v0, "11885"
+    const-string/jumbo v0, "11886"
+    const-string/jumbo v0, "11887"
+    const-string/jumbo v0, "11888"
+    const-string/jumbo v0, "11889"
+    const-string/jumbo v0, "11890"
+    const-string/jumbo v0, "11891"
+    const-string/jumbo v0, "11892"
+    const-string/jumbo v0, "11893"
+    const-string/jumbo v0, "11894"
+    const-string/jumbo v0, "11895"
+    const-string/jumbo v0, "11896"
+    const-string/jumbo v0, "11897"
+    const-string/jumbo v0, "11898"
+    const-string/jumbo v0, "11899"
+    const-string/jumbo v0, "11900"
+    const-string/jumbo v0, "11901"
+    const-string/jumbo v0, "11902"
+    const-string/jumbo v0, "11903"
+    const-string/jumbo v0, "11904"
+    const-string/jumbo v0, "11905"
+    const-string/jumbo v0, "11906"
+    const-string/jumbo v0, "11907"
+    const-string/jumbo v0, "11908"
+    const-string/jumbo v0, "11909"
+    const-string/jumbo v0, "11910"
+    const-string/jumbo v0, "11911"
+    const-string/jumbo v0, "11912"
+    const-string/jumbo v0, "11913"
+    const-string/jumbo v0, "11914"
+    const-string/jumbo v0, "11915"
+    const-string/jumbo v0, "11916"
+    const-string/jumbo v0, "11917"
+    const-string/jumbo v0, "11918"
+    const-string/jumbo v0, "11919"
+    const-string/jumbo v0, "11920"
+    const-string/jumbo v0, "11921"
+    const-string/jumbo v0, "11922"
+    const-string/jumbo v0, "11923"
+    const-string/jumbo v0, "11924"
+    const-string/jumbo v0, "11925"
+    const-string/jumbo v0, "11926"
+    const-string/jumbo v0, "11927"
+    const-string/jumbo v0, "11928"
+    const-string/jumbo v0, "11929"
+    const-string/jumbo v0, "11930"
+    const-string/jumbo v0, "11931"
+    const-string/jumbo v0, "11932"
+    const-string/jumbo v0, "11933"
+    const-string/jumbo v0, "11934"
+    const-string/jumbo v0, "11935"
+    const-string/jumbo v0, "11936"
+    const-string/jumbo v0, "11937"
+    const-string/jumbo v0, "11938"
+    const-string/jumbo v0, "11939"
+    const-string/jumbo v0, "11940"
+    const-string/jumbo v0, "11941"
+    const-string/jumbo v0, "11942"
+    const-string/jumbo v0, "11943"
+    const-string/jumbo v0, "11944"
+    const-string/jumbo v0, "11945"
+    const-string/jumbo v0, "11946"
+    const-string/jumbo v0, "11947"
+    const-string/jumbo v0, "11948"
+    const-string/jumbo v0, "11949"
+    const-string/jumbo v0, "11950"
+    const-string/jumbo v0, "11951"
+    const-string/jumbo v0, "11952"
+    const-string/jumbo v0, "11953"
+    const-string/jumbo v0, "11954"
+    const-string/jumbo v0, "11955"
+    const-string/jumbo v0, "11956"
+    const-string/jumbo v0, "11957"
+    const-string/jumbo v0, "11958"
+    const-string/jumbo v0, "11959"
+    const-string/jumbo v0, "11960"
+    const-string/jumbo v0, "11961"
+    const-string/jumbo v0, "11962"
+    const-string/jumbo v0, "11963"
+    const-string/jumbo v0, "11964"
+    const-string/jumbo v0, "11965"
+    const-string/jumbo v0, "11966"
+    const-string/jumbo v0, "11967"
+    const-string/jumbo v0, "11968"
+    const-string/jumbo v0, "11969"
+    const-string/jumbo v0, "11970"
+    const-string/jumbo v0, "11971"
+    const-string/jumbo v0, "11972"
+    const-string/jumbo v0, "11973"
+    const-string/jumbo v0, "11974"
+    const-string/jumbo v0, "11975"
+    const-string/jumbo v0, "11976"
+    const-string/jumbo v0, "11977"
+    const-string/jumbo v0, "11978"
+    const-string/jumbo v0, "11979"
+    const-string/jumbo v0, "11980"
+    const-string/jumbo v0, "11981"
+    const-string/jumbo v0, "11982"
+    const-string/jumbo v0, "11983"
+    const-string/jumbo v0, "11984"
+    const-string/jumbo v0, "11985"
+    const-string/jumbo v0, "11986"
+    const-string/jumbo v0, "11987"
+    const-string/jumbo v0, "11988"
+    const-string/jumbo v0, "11989"
+    const-string/jumbo v0, "11990"
+    const-string/jumbo v0, "11991"
+    const-string/jumbo v0, "11992"
+    const-string/jumbo v0, "11993"
+    const-string/jumbo v0, "11994"
+    const-string/jumbo v0, "11995"
+    const-string/jumbo v0, "11996"
+    const-string/jumbo v0, "11997"
+    const-string/jumbo v0, "11998"
+    const-string/jumbo v0, "11999"
+    const-string/jumbo v0, "12000"
+    const-string/jumbo v0, "12001"
+    const-string/jumbo v0, "12002"
+    const-string/jumbo v0, "12003"
+    const-string/jumbo v0, "12004"
+    const-string/jumbo v0, "12005"
+    const-string/jumbo v0, "12006"
+    const-string/jumbo v0, "12007"
+    const-string/jumbo v0, "12008"
+    const-string/jumbo v0, "12009"
+    const-string/jumbo v0, "12010"
+    const-string/jumbo v0, "12011"
+    const-string/jumbo v0, "12012"
+    const-string/jumbo v0, "12013"
+    const-string/jumbo v0, "12014"
+    const-string/jumbo v0, "12015"
+    const-string/jumbo v0, "12016"
+    const-string/jumbo v0, "12017"
+    const-string/jumbo v0, "12018"
+    const-string/jumbo v0, "12019"
+    const-string/jumbo v0, "12020"
+    const-string/jumbo v0, "12021"
+    const-string/jumbo v0, "12022"
+    const-string/jumbo v0, "12023"
+    const-string/jumbo v0, "12024"
+    const-string/jumbo v0, "12025"
+    const-string/jumbo v0, "12026"
+    const-string/jumbo v0, "12027"
+    const-string/jumbo v0, "12028"
+    const-string/jumbo v0, "12029"
+    const-string/jumbo v0, "12030"
+    const-string/jumbo v0, "12031"
+    const-string/jumbo v0, "12032"
+    const-string/jumbo v0, "12033"
+    const-string/jumbo v0, "12034"
+    const-string/jumbo v0, "12035"
+    const-string/jumbo v0, "12036"
+    const-string/jumbo v0, "12037"
+    const-string/jumbo v0, "12038"
+    const-string/jumbo v0, "12039"
+    const-string/jumbo v0, "12040"
+    const-string/jumbo v0, "12041"
+    const-string/jumbo v0, "12042"
+    const-string/jumbo v0, "12043"
+    const-string/jumbo v0, "12044"
+    const-string/jumbo v0, "12045"
+    const-string/jumbo v0, "12046"
+    const-string/jumbo v0, "12047"
+    const-string/jumbo v0, "12048"
+    const-string/jumbo v0, "12049"
+    const-string/jumbo v0, "12050"
+    const-string/jumbo v0, "12051"
+    const-string/jumbo v0, "12052"
+    const-string/jumbo v0, "12053"
+    const-string/jumbo v0, "12054"
+    const-string/jumbo v0, "12055"
+    const-string/jumbo v0, "12056"
+    const-string/jumbo v0, "12057"
+    const-string/jumbo v0, "12058"
+    const-string/jumbo v0, "12059"
+    const-string/jumbo v0, "12060"
+    const-string/jumbo v0, "12061"
+    const-string/jumbo v0, "12062"
+    const-string/jumbo v0, "12063"
+    const-string/jumbo v0, "12064"
+    const-string/jumbo v0, "12065"
+    const-string/jumbo v0, "12066"
+    const-string/jumbo v0, "12067"
+    const-string/jumbo v0, "12068"
+    const-string/jumbo v0, "12069"
+    const-string/jumbo v0, "12070"
+    const-string/jumbo v0, "12071"
+    const-string/jumbo v0, "12072"
+    const-string/jumbo v0, "12073"
+    const-string/jumbo v0, "12074"
+    const-string/jumbo v0, "12075"
+    const-string/jumbo v0, "12076"
+    const-string/jumbo v0, "12077"
+    const-string/jumbo v0, "12078"
+    const-string/jumbo v0, "12079"
+    const-string/jumbo v0, "12080"
+    const-string/jumbo v0, "12081"
+    const-string/jumbo v0, "12082"
+    const-string/jumbo v0, "12083"
+    const-string/jumbo v0, "12084"
+    const-string/jumbo v0, "12085"
+    const-string/jumbo v0, "12086"
+    const-string/jumbo v0, "12087"
+    const-string/jumbo v0, "12088"
+    const-string/jumbo v0, "12089"
+    const-string/jumbo v0, "12090"
+    const-string/jumbo v0, "12091"
+    const-string/jumbo v0, "12092"
+    const-string/jumbo v0, "12093"
+    const-string/jumbo v0, "12094"
+    const-string/jumbo v0, "12095"
+    const-string/jumbo v0, "12096"
+    const-string/jumbo v0, "12097"
+    const-string/jumbo v0, "12098"
+    const-string/jumbo v0, "12099"
+    const-string/jumbo v0, "12100"
+    const-string/jumbo v0, "12101"
+    const-string/jumbo v0, "12102"
+    const-string/jumbo v0, "12103"
+    const-string/jumbo v0, "12104"
+    const-string/jumbo v0, "12105"
+    const-string/jumbo v0, "12106"
+    const-string/jumbo v0, "12107"
+    const-string/jumbo v0, "12108"
+    const-string/jumbo v0, "12109"
+    const-string/jumbo v0, "12110"
+    const-string/jumbo v0, "12111"
+    const-string/jumbo v0, "12112"
+    const-string/jumbo v0, "12113"
+    const-string/jumbo v0, "12114"
+    const-string/jumbo v0, "12115"
+    const-string/jumbo v0, "12116"
+    const-string/jumbo v0, "12117"
+    const-string/jumbo v0, "12118"
+    const-string/jumbo v0, "12119"
+    const-string/jumbo v0, "12120"
+    const-string/jumbo v0, "12121"
+    const-string/jumbo v0, "12122"
+    const-string/jumbo v0, "12123"
+    const-string/jumbo v0, "12124"
+    const-string/jumbo v0, "12125"
+    const-string/jumbo v0, "12126"
+    const-string/jumbo v0, "12127"
+    const-string/jumbo v0, "12128"
+    const-string/jumbo v0, "12129"
+    const-string/jumbo v0, "12130"
+    const-string/jumbo v0, "12131"
+    const-string/jumbo v0, "12132"
+    const-string/jumbo v0, "12133"
+    const-string/jumbo v0, "12134"
+    const-string/jumbo v0, "12135"
+    const-string/jumbo v0, "12136"
+    const-string/jumbo v0, "12137"
+    const-string/jumbo v0, "12138"
+    const-string/jumbo v0, "12139"
+    const-string/jumbo v0, "12140"
+    const-string/jumbo v0, "12141"
+    const-string/jumbo v0, "12142"
+    const-string/jumbo v0, "12143"
+    const-string/jumbo v0, "12144"
+    const-string/jumbo v0, "12145"
+    const-string/jumbo v0, "12146"
+    const-string/jumbo v0, "12147"
+    const-string/jumbo v0, "12148"
+    const-string/jumbo v0, "12149"
+    const-string/jumbo v0, "12150"
+    const-string/jumbo v0, "12151"
+    const-string/jumbo v0, "12152"
+    const-string/jumbo v0, "12153"
+    const-string/jumbo v0, "12154"
+    const-string/jumbo v0, "12155"
+    const-string/jumbo v0, "12156"
+    const-string/jumbo v0, "12157"
+    const-string/jumbo v0, "12158"
+    const-string/jumbo v0, "12159"
+    const-string/jumbo v0, "12160"
+    const-string/jumbo v0, "12161"
+    const-string/jumbo v0, "12162"
+    const-string/jumbo v0, "12163"
+    const-string/jumbo v0, "12164"
+    const-string/jumbo v0, "12165"
+    const-string/jumbo v0, "12166"
+    const-string/jumbo v0, "12167"
+    const-string/jumbo v0, "12168"
+    const-string/jumbo v0, "12169"
+    const-string/jumbo v0, "12170"
+    const-string/jumbo v0, "12171"
+    const-string/jumbo v0, "12172"
+    const-string/jumbo v0, "12173"
+    const-string/jumbo v0, "12174"
+    const-string/jumbo v0, "12175"
+    const-string/jumbo v0, "12176"
+    const-string/jumbo v0, "12177"
+    const-string/jumbo v0, "12178"
+    const-string/jumbo v0, "12179"
+    const-string/jumbo v0, "12180"
+    const-string/jumbo v0, "12181"
+    const-string/jumbo v0, "12182"
+    const-string/jumbo v0, "12183"
+    const-string/jumbo v0, "12184"
+    const-string/jumbo v0, "12185"
+    const-string/jumbo v0, "12186"
+    const-string/jumbo v0, "12187"
+    const-string/jumbo v0, "12188"
+    const-string/jumbo v0, "12189"
+    const-string/jumbo v0, "12190"
+    const-string/jumbo v0, "12191"
+    const-string/jumbo v0, "12192"
+    const-string/jumbo v0, "12193"
+    const-string/jumbo v0, "12194"
+    const-string/jumbo v0, "12195"
+    const-string/jumbo v0, "12196"
+    const-string/jumbo v0, "12197"
+    const-string/jumbo v0, "12198"
+    const-string/jumbo v0, "12199"
+    const-string/jumbo v0, "12200"
+    const-string/jumbo v0, "12201"
+    const-string/jumbo v0, "12202"
+    const-string/jumbo v0, "12203"
+    const-string/jumbo v0, "12204"
+    const-string/jumbo v0, "12205"
+    const-string/jumbo v0, "12206"
+    const-string/jumbo v0, "12207"
+    const-string/jumbo v0, "12208"
+    const-string/jumbo v0, "12209"
+    const-string/jumbo v0, "12210"
+    const-string/jumbo v0, "12211"
+    const-string/jumbo v0, "12212"
+    const-string/jumbo v0, "12213"
+    const-string/jumbo v0, "12214"
+    const-string/jumbo v0, "12215"
+    const-string/jumbo v0, "12216"
+    const-string/jumbo v0, "12217"
+    const-string/jumbo v0, "12218"
+    const-string/jumbo v0, "12219"
+    const-string/jumbo v0, "12220"
+    const-string/jumbo v0, "12221"
+    const-string/jumbo v0, "12222"
+    const-string/jumbo v0, "12223"
+    const-string/jumbo v0, "12224"
+    const-string/jumbo v0, "12225"
+    const-string/jumbo v0, "12226"
+    const-string/jumbo v0, "12227"
+    const-string/jumbo v0, "12228"
+    const-string/jumbo v0, "12229"
+    const-string/jumbo v0, "12230"
+    const-string/jumbo v0, "12231"
+    const-string/jumbo v0, "12232"
+    const-string/jumbo v0, "12233"
+    const-string/jumbo v0, "12234"
+    const-string/jumbo v0, "12235"
+    const-string/jumbo v0, "12236"
+    const-string/jumbo v0, "12237"
+    const-string/jumbo v0, "12238"
+    const-string/jumbo v0, "12239"
+    const-string/jumbo v0, "12240"
+    const-string/jumbo v0, "12241"
+    const-string/jumbo v0, "12242"
+    const-string/jumbo v0, "12243"
+    const-string/jumbo v0, "12244"
+    const-string/jumbo v0, "12245"
+    const-string/jumbo v0, "12246"
+    const-string/jumbo v0, "12247"
+    const-string/jumbo v0, "12248"
+    const-string/jumbo v0, "12249"
+    const-string/jumbo v0, "12250"
+    const-string/jumbo v0, "12251"
+    const-string/jumbo v0, "12252"
+    const-string/jumbo v0, "12253"
+    const-string/jumbo v0, "12254"
+    const-string/jumbo v0, "12255"
+    const-string/jumbo v0, "12256"
+    const-string/jumbo v0, "12257"
+    const-string/jumbo v0, "12258"
+    const-string/jumbo v0, "12259"
+    const-string/jumbo v0, "12260"
+    const-string/jumbo v0, "12261"
+    const-string/jumbo v0, "12262"
+    const-string/jumbo v0, "12263"
+    const-string/jumbo v0, "12264"
+    const-string/jumbo v0, "12265"
+    const-string/jumbo v0, "12266"
+    const-string/jumbo v0, "12267"
+    const-string/jumbo v0, "12268"
+    const-string/jumbo v0, "12269"
+    const-string/jumbo v0, "12270"
+    const-string/jumbo v0, "12271"
+    const-string/jumbo v0, "12272"
+    const-string/jumbo v0, "12273"
+    const-string/jumbo v0, "12274"
+    const-string/jumbo v0, "12275"
+    const-string/jumbo v0, "12276"
+    const-string/jumbo v0, "12277"
+    const-string/jumbo v0, "12278"
+    const-string/jumbo v0, "12279"
+    const-string/jumbo v0, "12280"
+    const-string/jumbo v0, "12281"
+    const-string/jumbo v0, "12282"
+    const-string/jumbo v0, "12283"
+    const-string/jumbo v0, "12284"
+    const-string/jumbo v0, "12285"
+    const-string/jumbo v0, "12286"
+    const-string/jumbo v0, "12287"
+    const-string/jumbo v0, "12288"
+    const-string/jumbo v0, "12289"
+    const-string/jumbo v0, "12290"
+    const-string/jumbo v0, "12291"
+    const-string/jumbo v0, "12292"
+    const-string/jumbo v0, "12293"
+    const-string/jumbo v0, "12294"
+    const-string/jumbo v0, "12295"
+    const-string/jumbo v0, "12296"
+    const-string/jumbo v0, "12297"
+    const-string/jumbo v0, "12298"
+    const-string/jumbo v0, "12299"
+    const-string/jumbo v0, "12300"
+    const-string/jumbo v0, "12301"
+    const-string/jumbo v0, "12302"
+    const-string/jumbo v0, "12303"
+    const-string/jumbo v0, "12304"
+    const-string/jumbo v0, "12305"
+    const-string/jumbo v0, "12306"
+    const-string/jumbo v0, "12307"
+    const-string/jumbo v0, "12308"
+    const-string/jumbo v0, "12309"
+    const-string/jumbo v0, "12310"
+    const-string/jumbo v0, "12311"
+    const-string/jumbo v0, "12312"
+    const-string/jumbo v0, "12313"
+    const-string/jumbo v0, "12314"
+    const-string/jumbo v0, "12315"
+    const-string/jumbo v0, "12316"
+    const-string/jumbo v0, "12317"
+    const-string/jumbo v0, "12318"
+    const-string/jumbo v0, "12319"
+    const-string/jumbo v0, "12320"
+    const-string/jumbo v0, "12321"
+    const-string/jumbo v0, "12322"
+    const-string/jumbo v0, "12323"
+    const-string/jumbo v0, "12324"
+    const-string/jumbo v0, "12325"
+    const-string/jumbo v0, "12326"
+    const-string/jumbo v0, "12327"
+    const-string/jumbo v0, "12328"
+    const-string/jumbo v0, "12329"
+    const-string/jumbo v0, "12330"
+    const-string/jumbo v0, "12331"
+    const-string/jumbo v0, "12332"
+    const-string/jumbo v0, "12333"
+    const-string/jumbo v0, "12334"
+    const-string/jumbo v0, "12335"
+    const-string/jumbo v0, "12336"
+    const-string/jumbo v0, "12337"
+    const-string/jumbo v0, "12338"
+    const-string/jumbo v0, "12339"
+    const-string/jumbo v0, "12340"
+    const-string/jumbo v0, "12341"
+    const-string/jumbo v0, "12342"
+    const-string/jumbo v0, "12343"
+    const-string/jumbo v0, "12344"
+    const-string/jumbo v0, "12345"
+    const-string/jumbo v0, "12346"
+    const-string/jumbo v0, "12347"
+    const-string/jumbo v0, "12348"
+    const-string/jumbo v0, "12349"
+    const-string/jumbo v0, "12350"
+    const-string/jumbo v0, "12351"
+    const-string/jumbo v0, "12352"
+    const-string/jumbo v0, "12353"
+    const-string/jumbo v0, "12354"
+    const-string/jumbo v0, "12355"
+    const-string/jumbo v0, "12356"
+    const-string/jumbo v0, "12357"
+    const-string/jumbo v0, "12358"
+    const-string/jumbo v0, "12359"
+    const-string/jumbo v0, "12360"
+    const-string/jumbo v0, "12361"
+    const-string/jumbo v0, "12362"
+    const-string/jumbo v0, "12363"
+    const-string/jumbo v0, "12364"
+    const-string/jumbo v0, "12365"
+    const-string/jumbo v0, "12366"
+    const-string/jumbo v0, "12367"
+    const-string/jumbo v0, "12368"
+    const-string/jumbo v0, "12369"
+    const-string/jumbo v0, "12370"
+    const-string/jumbo v0, "12371"
+    const-string/jumbo v0, "12372"
+    const-string/jumbo v0, "12373"
+    const-string/jumbo v0, "12374"
+    const-string/jumbo v0, "12375"
+    const-string/jumbo v0, "12376"
+    const-string/jumbo v0, "12377"
+    const-string/jumbo v0, "12378"
+    const-string/jumbo v0, "12379"
+    const-string/jumbo v0, "12380"
+    const-string/jumbo v0, "12381"
+    const-string/jumbo v0, "12382"
+    const-string/jumbo v0, "12383"
+    const-string/jumbo v0, "12384"
+    const-string/jumbo v0, "12385"
+    const-string/jumbo v0, "12386"
+    const-string/jumbo v0, "12387"
+    const-string/jumbo v0, "12388"
+    const-string/jumbo v0, "12389"
+    const-string/jumbo v0, "12390"
+    const-string/jumbo v0, "12391"
+    const-string/jumbo v0, "12392"
+    const-string/jumbo v0, "12393"
+    const-string/jumbo v0, "12394"
+    const-string/jumbo v0, "12395"
+    const-string/jumbo v0, "12396"
+    const-string/jumbo v0, "12397"
+    const-string/jumbo v0, "12398"
+    const-string/jumbo v0, "12399"
+    const-string/jumbo v0, "12400"
+    const-string/jumbo v0, "12401"
+    const-string/jumbo v0, "12402"
+    const-string/jumbo v0, "12403"
+    const-string/jumbo v0, "12404"
+    const-string/jumbo v0, "12405"
+    const-string/jumbo v0, "12406"
+    const-string/jumbo v0, "12407"
+    const-string/jumbo v0, "12408"
+    const-string/jumbo v0, "12409"
+    const-string/jumbo v0, "12410"
+    const-string/jumbo v0, "12411"
+    const-string/jumbo v0, "12412"
+    const-string/jumbo v0, "12413"
+    const-string/jumbo v0, "12414"
+    const-string/jumbo v0, "12415"
+    const-string/jumbo v0, "12416"
+    const-string/jumbo v0, "12417"
+    const-string/jumbo v0, "12418"
+    const-string/jumbo v0, "12419"
+    const-string/jumbo v0, "12420"
+    const-string/jumbo v0, "12421"
+    const-string/jumbo v0, "12422"
+    const-string/jumbo v0, "12423"
+    const-string/jumbo v0, "12424"
+    const-string/jumbo v0, "12425"
+    const-string/jumbo v0, "12426"
+    const-string/jumbo v0, "12427"
+    const-string/jumbo v0, "12428"
+    const-string/jumbo v0, "12429"
+    const-string/jumbo v0, "12430"
+    const-string/jumbo v0, "12431"
+    const-string/jumbo v0, "12432"
+    const-string/jumbo v0, "12433"
+    const-string/jumbo v0, "12434"
+    const-string/jumbo v0, "12435"
+    const-string/jumbo v0, "12436"
+    const-string/jumbo v0, "12437"
+    const-string/jumbo v0, "12438"
+    const-string/jumbo v0, "12439"
+    const-string/jumbo v0, "12440"
+    const-string/jumbo v0, "12441"
+    const-string/jumbo v0, "12442"
+    const-string/jumbo v0, "12443"
+    const-string/jumbo v0, "12444"
+    const-string/jumbo v0, "12445"
+    const-string/jumbo v0, "12446"
+    const-string/jumbo v0, "12447"
+    const-string/jumbo v0, "12448"
+    const-string/jumbo v0, "12449"
+    const-string/jumbo v0, "12450"
+    const-string/jumbo v0, "12451"
+    const-string/jumbo v0, "12452"
+    const-string/jumbo v0, "12453"
+    const-string/jumbo v0, "12454"
+    const-string/jumbo v0, "12455"
+    const-string/jumbo v0, "12456"
+    const-string/jumbo v0, "12457"
+    const-string/jumbo v0, "12458"
+    const-string/jumbo v0, "12459"
+    const-string/jumbo v0, "12460"
+    const-string/jumbo v0, "12461"
+    const-string/jumbo v0, "12462"
+    const-string/jumbo v0, "12463"
+    const-string/jumbo v0, "12464"
+    const-string/jumbo v0, "12465"
+    const-string/jumbo v0, "12466"
+    const-string/jumbo v0, "12467"
+    const-string/jumbo v0, "12468"
+    const-string/jumbo v0, "12469"
+    const-string/jumbo v0, "12470"
+    const-string/jumbo v0, "12471"
+    const-string/jumbo v0, "12472"
+    const-string/jumbo v0, "12473"
+    const-string/jumbo v0, "12474"
+    const-string/jumbo v0, "12475"
+    const-string/jumbo v0, "12476"
+    const-string/jumbo v0, "12477"
+    const-string/jumbo v0, "12478"
+    const-string/jumbo v0, "12479"
+    const-string/jumbo v0, "12480"
+    const-string/jumbo v0, "12481"
+    const-string/jumbo v0, "12482"
+    const-string/jumbo v0, "12483"
+    const-string/jumbo v0, "12484"
+    const-string/jumbo v0, "12485"
+    const-string/jumbo v0, "12486"
+    const-string/jumbo v0, "12487"
+    const-string/jumbo v0, "12488"
+    const-string/jumbo v0, "12489"
+    const-string/jumbo v0, "12490"
+    const-string/jumbo v0, "12491"
+    const-string/jumbo v0, "12492"
+    const-string/jumbo v0, "12493"
+    const-string/jumbo v0, "12494"
+    const-string/jumbo v0, "12495"
+    const-string/jumbo v0, "12496"
+    const-string/jumbo v0, "12497"
+    const-string/jumbo v0, "12498"
+    const-string/jumbo v0, "12499"
+    const-string/jumbo v0, "12500"
+    const-string/jumbo v0, "12501"
+    const-string/jumbo v0, "12502"
+    const-string/jumbo v0, "12503"
+    const-string/jumbo v0, "12504"
+    const-string/jumbo v0, "12505"
+    const-string/jumbo v0, "12506"
+    const-string/jumbo v0, "12507"
+    const-string/jumbo v0, "12508"
+    const-string/jumbo v0, "12509"
+    const-string/jumbo v0, "12510"
+    const-string/jumbo v0, "12511"
+    const-string/jumbo v0, "12512"
+    const-string/jumbo v0, "12513"
+    const-string/jumbo v0, "12514"
+    const-string/jumbo v0, "12515"
+    const-string/jumbo v0, "12516"
+    const-string/jumbo v0, "12517"
+    const-string/jumbo v0, "12518"
+    const-string/jumbo v0, "12519"
+    const-string/jumbo v0, "12520"
+    const-string/jumbo v0, "12521"
+    const-string/jumbo v0, "12522"
+    const-string/jumbo v0, "12523"
+    const-string/jumbo v0, "12524"
+    const-string/jumbo v0, "12525"
+    const-string/jumbo v0, "12526"
+    const-string/jumbo v0, "12527"
+    const-string/jumbo v0, "12528"
+    const-string/jumbo v0, "12529"
+    const-string/jumbo v0, "12530"
+    const-string/jumbo v0, "12531"
+    const-string/jumbo v0, "12532"
+    const-string/jumbo v0, "12533"
+    const-string/jumbo v0, "12534"
+    const-string/jumbo v0, "12535"
+    const-string/jumbo v0, "12536"
+    const-string/jumbo v0, "12537"
+    const-string/jumbo v0, "12538"
+    const-string/jumbo v0, "12539"
+    const-string/jumbo v0, "12540"
+    const-string/jumbo v0, "12541"
+    const-string/jumbo v0, "12542"
+    const-string/jumbo v0, "12543"
+    const-string/jumbo v0, "12544"
+    const-string/jumbo v0, "12545"
+    const-string/jumbo v0, "12546"
+    const-string/jumbo v0, "12547"
+    const-string/jumbo v0, "12548"
+    const-string/jumbo v0, "12549"
+    const-string/jumbo v0, "12550"
+    const-string/jumbo v0, "12551"
+    const-string/jumbo v0, "12552"
+    const-string/jumbo v0, "12553"
+    const-string/jumbo v0, "12554"
+    const-string/jumbo v0, "12555"
+    const-string/jumbo v0, "12556"
+    const-string/jumbo v0, "12557"
+    const-string/jumbo v0, "12558"
+    const-string/jumbo v0, "12559"
+    const-string/jumbo v0, "12560"
+    const-string/jumbo v0, "12561"
+    const-string/jumbo v0, "12562"
+    const-string/jumbo v0, "12563"
+    const-string/jumbo v0, "12564"
+    const-string/jumbo v0, "12565"
+    const-string/jumbo v0, "12566"
+    const-string/jumbo v0, "12567"
+    const-string/jumbo v0, "12568"
+    const-string/jumbo v0, "12569"
+    const-string/jumbo v0, "12570"
+    const-string/jumbo v0, "12571"
+    const-string/jumbo v0, "12572"
+    const-string/jumbo v0, "12573"
+    const-string/jumbo v0, "12574"
+    const-string/jumbo v0, "12575"
+    const-string/jumbo v0, "12576"
+    const-string/jumbo v0, "12577"
+    const-string/jumbo v0, "12578"
+    const-string/jumbo v0, "12579"
+    const-string/jumbo v0, "12580"
+    const-string/jumbo v0, "12581"
+    const-string/jumbo v0, "12582"
+    const-string/jumbo v0, "12583"
+    const-string/jumbo v0, "12584"
+    const-string/jumbo v0, "12585"
+    const-string/jumbo v0, "12586"
+    const-string/jumbo v0, "12587"
+    const-string/jumbo v0, "12588"
+    const-string/jumbo v0, "12589"
+    const-string/jumbo v0, "12590"
+    const-string/jumbo v0, "12591"
+    const-string/jumbo v0, "12592"
+    const-string/jumbo v0, "12593"
+    const-string/jumbo v0, "12594"
+    const-string/jumbo v0, "12595"
+    const-string/jumbo v0, "12596"
+    const-string/jumbo v0, "12597"
+    const-string/jumbo v0, "12598"
+    const-string/jumbo v0, "12599"
+    const-string/jumbo v0, "12600"
+    const-string/jumbo v0, "12601"
+    const-string/jumbo v0, "12602"
+    const-string/jumbo v0, "12603"
+    const-string/jumbo v0, "12604"
+    const-string/jumbo v0, "12605"
+    const-string/jumbo v0, "12606"
+    const-string/jumbo v0, "12607"
+    const-string/jumbo v0, "12608"
+    const-string/jumbo v0, "12609"
+    const-string/jumbo v0, "12610"
+    const-string/jumbo v0, "12611"
+    const-string/jumbo v0, "12612"
+    const-string/jumbo v0, "12613"
+    const-string/jumbo v0, "12614"
+    const-string/jumbo v0, "12615"
+    const-string/jumbo v0, "12616"
+    const-string/jumbo v0, "12617"
+    const-string/jumbo v0, "12618"
+    const-string/jumbo v0, "12619"
+    const-string/jumbo v0, "12620"
+    const-string/jumbo v0, "12621"
+    const-string/jumbo v0, "12622"
+    const-string/jumbo v0, "12623"
+    const-string/jumbo v0, "12624"
+    const-string/jumbo v0, "12625"
+    const-string/jumbo v0, "12626"
+    const-string/jumbo v0, "12627"
+    const-string/jumbo v0, "12628"
+    const-string/jumbo v0, "12629"
+    const-string/jumbo v0, "12630"
+    const-string/jumbo v0, "12631"
+    const-string/jumbo v0, "12632"
+    const-string/jumbo v0, "12633"
+    const-string/jumbo v0, "12634"
+    const-string/jumbo v0, "12635"
+    const-string/jumbo v0, "12636"
+    const-string/jumbo v0, "12637"
+    const-string/jumbo v0, "12638"
+    const-string/jumbo v0, "12639"
+    const-string/jumbo v0, "12640"
+    const-string/jumbo v0, "12641"
+    const-string/jumbo v0, "12642"
+    const-string/jumbo v0, "12643"
+    const-string/jumbo v0, "12644"
+    const-string/jumbo v0, "12645"
+    const-string/jumbo v0, "12646"
+    const-string/jumbo v0, "12647"
+    const-string/jumbo v0, "12648"
+    const-string/jumbo v0, "12649"
+    const-string/jumbo v0, "12650"
+    const-string/jumbo v0, "12651"
+    const-string/jumbo v0, "12652"
+    const-string/jumbo v0, "12653"
+    const-string/jumbo v0, "12654"
+    const-string/jumbo v0, "12655"
+    const-string/jumbo v0, "12656"
+    const-string/jumbo v0, "12657"
+    const-string/jumbo v0, "12658"
+    const-string/jumbo v0, "12659"
+    const-string/jumbo v0, "12660"
+    const-string/jumbo v0, "12661"
+    const-string/jumbo v0, "12662"
+    const-string/jumbo v0, "12663"
+    const-string/jumbo v0, "12664"
+    const-string/jumbo v0, "12665"
+    const-string/jumbo v0, "12666"
+    const-string/jumbo v0, "12667"
+    const-string/jumbo v0, "12668"
+    const-string/jumbo v0, "12669"
+    const-string/jumbo v0, "12670"
+    const-string/jumbo v0, "12671"
+    const-string/jumbo v0, "12672"
+    const-string/jumbo v0, "12673"
+    const-string/jumbo v0, "12674"
+    const-string/jumbo v0, "12675"
+    const-string/jumbo v0, "12676"
+    const-string/jumbo v0, "12677"
+    const-string/jumbo v0, "12678"
+    const-string/jumbo v0, "12679"
+    const-string/jumbo v0, "12680"
+    const-string/jumbo v0, "12681"
+    const-string/jumbo v0, "12682"
+    const-string/jumbo v0, "12683"
+    const-string/jumbo v0, "12684"
+    const-string/jumbo v0, "12685"
+    const-string/jumbo v0, "12686"
+    const-string/jumbo v0, "12687"
+    const-string/jumbo v0, "12688"
+    const-string/jumbo v0, "12689"
+    const-string/jumbo v0, "12690"
+    const-string/jumbo v0, "12691"
+    const-string/jumbo v0, "12692"
+    const-string/jumbo v0, "12693"
+    const-string/jumbo v0, "12694"
+    const-string/jumbo v0, "12695"
+    const-string/jumbo v0, "12696"
+    const-string/jumbo v0, "12697"
+    const-string/jumbo v0, "12698"
+    const-string/jumbo v0, "12699"
+    const-string/jumbo v0, "12700"
+    const-string/jumbo v0, "12701"
+    const-string/jumbo v0, "12702"
+    const-string/jumbo v0, "12703"
+    const-string/jumbo v0, "12704"
+    const-string/jumbo v0, "12705"
+    const-string/jumbo v0, "12706"
+    const-string/jumbo v0, "12707"
+    const-string/jumbo v0, "12708"
+    const-string/jumbo v0, "12709"
+    const-string/jumbo v0, "12710"
+    const-string/jumbo v0, "12711"
+    const-string/jumbo v0, "12712"
+    const-string/jumbo v0, "12713"
+    const-string/jumbo v0, "12714"
+    const-string/jumbo v0, "12715"
+    const-string/jumbo v0, "12716"
+    const-string/jumbo v0, "12717"
+    const-string/jumbo v0, "12718"
+    const-string/jumbo v0, "12719"
+    const-string/jumbo v0, "12720"
+    const-string/jumbo v0, "12721"
+    const-string/jumbo v0, "12722"
+    const-string/jumbo v0, "12723"
+    const-string/jumbo v0, "12724"
+    const-string/jumbo v0, "12725"
+    const-string/jumbo v0, "12726"
+    const-string/jumbo v0, "12727"
+    const-string/jumbo v0, "12728"
+    const-string/jumbo v0, "12729"
+    const-string/jumbo v0, "12730"
+    const-string/jumbo v0, "12731"
+    const-string/jumbo v0, "12732"
+    const-string/jumbo v0, "12733"
+    const-string/jumbo v0, "12734"
+    const-string/jumbo v0, "12735"
+    const-string/jumbo v0, "12736"
+    const-string/jumbo v0, "12737"
+    const-string/jumbo v0, "12738"
+    const-string/jumbo v0, "12739"
+    const-string/jumbo v0, "12740"
+    const-string/jumbo v0, "12741"
+    const-string/jumbo v0, "12742"
+    const-string/jumbo v0, "12743"
+    const-string/jumbo v0, "12744"
+    const-string/jumbo v0, "12745"
+    const-string/jumbo v0, "12746"
+    const-string/jumbo v0, "12747"
+    const-string/jumbo v0, "12748"
+    const-string/jumbo v0, "12749"
+    const-string/jumbo v0, "12750"
+    const-string/jumbo v0, "12751"
+    const-string/jumbo v0, "12752"
+    const-string/jumbo v0, "12753"
+    const-string/jumbo v0, "12754"
+    const-string/jumbo v0, "12755"
+    const-string/jumbo v0, "12756"
+    const-string/jumbo v0, "12757"
+    const-string/jumbo v0, "12758"
+    const-string/jumbo v0, "12759"
+    const-string/jumbo v0, "12760"
+    const-string/jumbo v0, "12761"
+    const-string/jumbo v0, "12762"
+    const-string/jumbo v0, "12763"
+    const-string/jumbo v0, "12764"
+    const-string/jumbo v0, "12765"
+    const-string/jumbo v0, "12766"
+    const-string/jumbo v0, "12767"
+    const-string/jumbo v0, "12768"
+    const-string/jumbo v0, "12769"
+    const-string/jumbo v0, "12770"
+    const-string/jumbo v0, "12771"
+    const-string/jumbo v0, "12772"
+    const-string/jumbo v0, "12773"
+    const-string/jumbo v0, "12774"
+    const-string/jumbo v0, "12775"
+    const-string/jumbo v0, "12776"
+    const-string/jumbo v0, "12777"
+    const-string/jumbo v0, "12778"
+    const-string/jumbo v0, "12779"
+    const-string/jumbo v0, "12780"
+    const-string/jumbo v0, "12781"
+    const-string/jumbo v0, "12782"
+    const-string/jumbo v0, "12783"
+    const-string/jumbo v0, "12784"
+    const-string/jumbo v0, "12785"
+    const-string/jumbo v0, "12786"
+    const-string/jumbo v0, "12787"
+    const-string/jumbo v0, "12788"
+    const-string/jumbo v0, "12789"
+    const-string/jumbo v0, "12790"
+    const-string/jumbo v0, "12791"
+    const-string/jumbo v0, "12792"
+    const-string/jumbo v0, "12793"
+    const-string/jumbo v0, "12794"
+    const-string/jumbo v0, "12795"
+    const-string/jumbo v0, "12796"
+    const-string/jumbo v0, "12797"
+    const-string/jumbo v0, "12798"
+    const-string/jumbo v0, "12799"
+    const-string/jumbo v0, "12800"
+    const-string/jumbo v0, "12801"
+    const-string/jumbo v0, "12802"
+    const-string/jumbo v0, "12803"
+    const-string/jumbo v0, "12804"
+    const-string/jumbo v0, "12805"
+    const-string/jumbo v0, "12806"
+    const-string/jumbo v0, "12807"
+    const-string/jumbo v0, "12808"
+    const-string/jumbo v0, "12809"
+    const-string/jumbo v0, "12810"
+    const-string/jumbo v0, "12811"
+    const-string/jumbo v0, "12812"
+    const-string/jumbo v0, "12813"
+    const-string/jumbo v0, "12814"
+    const-string/jumbo v0, "12815"
+    const-string/jumbo v0, "12816"
+    const-string/jumbo v0, "12817"
+    const-string/jumbo v0, "12818"
+    const-string/jumbo v0, "12819"
+    const-string/jumbo v0, "12820"
+    const-string/jumbo v0, "12821"
+    const-string/jumbo v0, "12822"
+    const-string/jumbo v0, "12823"
+    const-string/jumbo v0, "12824"
+    const-string/jumbo v0, "12825"
+    const-string/jumbo v0, "12826"
+    const-string/jumbo v0, "12827"
+    const-string/jumbo v0, "12828"
+    const-string/jumbo v0, "12829"
+    const-string/jumbo v0, "12830"
+    const-string/jumbo v0, "12831"
+    const-string/jumbo v0, "12832"
+    const-string/jumbo v0, "12833"
+    const-string/jumbo v0, "12834"
+    const-string/jumbo v0, "12835"
+    const-string/jumbo v0, "12836"
+    const-string/jumbo v0, "12837"
+    const-string/jumbo v0, "12838"
+    const-string/jumbo v0, "12839"
+    const-string/jumbo v0, "12840"
+    const-string/jumbo v0, "12841"
+    const-string/jumbo v0, "12842"
+    const-string/jumbo v0, "12843"
+    const-string/jumbo v0, "12844"
+    const-string/jumbo v0, "12845"
+    const-string/jumbo v0, "12846"
+    const-string/jumbo v0, "12847"
+    const-string/jumbo v0, "12848"
+    const-string/jumbo v0, "12849"
+    const-string/jumbo v0, "12850"
+    const-string/jumbo v0, "12851"
+    const-string/jumbo v0, "12852"
+    const-string/jumbo v0, "12853"
+    const-string/jumbo v0, "12854"
+    const-string/jumbo v0, "12855"
+    const-string/jumbo v0, "12856"
+    const-string/jumbo v0, "12857"
+    const-string/jumbo v0, "12858"
+    const-string/jumbo v0, "12859"
+    const-string/jumbo v0, "12860"
+    const-string/jumbo v0, "12861"
+    const-string/jumbo v0, "12862"
+    const-string/jumbo v0, "12863"
+    const-string/jumbo v0, "12864"
+    const-string/jumbo v0, "12865"
+    const-string/jumbo v0, "12866"
+    const-string/jumbo v0, "12867"
+    const-string/jumbo v0, "12868"
+    const-string/jumbo v0, "12869"
+    const-string/jumbo v0, "12870"
+    const-string/jumbo v0, "12871"
+    const-string/jumbo v0, "12872"
+    const-string/jumbo v0, "12873"
+    const-string/jumbo v0, "12874"
+    const-string/jumbo v0, "12875"
+    const-string/jumbo v0, "12876"
+    const-string/jumbo v0, "12877"
+    const-string/jumbo v0, "12878"
+    const-string/jumbo v0, "12879"
+    const-string/jumbo v0, "12880"
+    const-string/jumbo v0, "12881"
+    const-string/jumbo v0, "12882"
+    const-string/jumbo v0, "12883"
+    const-string/jumbo v0, "12884"
+    const-string/jumbo v0, "12885"
+    const-string/jumbo v0, "12886"
+    const-string/jumbo v0, "12887"
+    const-string/jumbo v0, "12888"
+    const-string/jumbo v0, "12889"
+    const-string/jumbo v0, "12890"
+    const-string/jumbo v0, "12891"
+    const-string/jumbo v0, "12892"
+    const-string/jumbo v0, "12893"
+    const-string/jumbo v0, "12894"
+    const-string/jumbo v0, "12895"
+    const-string/jumbo v0, "12896"
+    const-string/jumbo v0, "12897"
+    const-string/jumbo v0, "12898"
+    const-string/jumbo v0, "12899"
+    const-string/jumbo v0, "12900"
+    const-string/jumbo v0, "12901"
+    const-string/jumbo v0, "12902"
+    const-string/jumbo v0, "12903"
+    const-string/jumbo v0, "12904"
+    const-string/jumbo v0, "12905"
+    const-string/jumbo v0, "12906"
+    const-string/jumbo v0, "12907"
+    const-string/jumbo v0, "12908"
+    const-string/jumbo v0, "12909"
+    const-string/jumbo v0, "12910"
+    const-string/jumbo v0, "12911"
+    const-string/jumbo v0, "12912"
+    const-string/jumbo v0, "12913"
+    const-string/jumbo v0, "12914"
+    const-string/jumbo v0, "12915"
+    const-string/jumbo v0, "12916"
+    const-string/jumbo v0, "12917"
+    const-string/jumbo v0, "12918"
+    const-string/jumbo v0, "12919"
+    const-string/jumbo v0, "12920"
+    const-string/jumbo v0, "12921"
+    const-string/jumbo v0, "12922"
+    const-string/jumbo v0, "12923"
+    const-string/jumbo v0, "12924"
+    const-string/jumbo v0, "12925"
+    const-string/jumbo v0, "12926"
+    const-string/jumbo v0, "12927"
+    const-string/jumbo v0, "12928"
+    const-string/jumbo v0, "12929"
+    const-string/jumbo v0, "12930"
+    const-string/jumbo v0, "12931"
+    const-string/jumbo v0, "12932"
+    const-string/jumbo v0, "12933"
+    const-string/jumbo v0, "12934"
+    const-string/jumbo v0, "12935"
+    const-string/jumbo v0, "12936"
+    const-string/jumbo v0, "12937"
+    const-string/jumbo v0, "12938"
+    const-string/jumbo v0, "12939"
+    const-string/jumbo v0, "12940"
+    const-string/jumbo v0, "12941"
+    const-string/jumbo v0, "12942"
+    const-string/jumbo v0, "12943"
+    const-string/jumbo v0, "12944"
+    const-string/jumbo v0, "12945"
+    const-string/jumbo v0, "12946"
+    const-string/jumbo v0, "12947"
+    const-string/jumbo v0, "12948"
+    const-string/jumbo v0, "12949"
+    const-string/jumbo v0, "12950"
+    const-string/jumbo v0, "12951"
+    const-string/jumbo v0, "12952"
+    const-string/jumbo v0, "12953"
+    const-string/jumbo v0, "12954"
+    const-string/jumbo v0, "12955"
+    const-string/jumbo v0, "12956"
+    const-string/jumbo v0, "12957"
+    const-string/jumbo v0, "12958"
+    const-string/jumbo v0, "12959"
+    const-string/jumbo v0, "12960"
+    const-string/jumbo v0, "12961"
+    const-string/jumbo v0, "12962"
+    const-string/jumbo v0, "12963"
+    const-string/jumbo v0, "12964"
+    const-string/jumbo v0, "12965"
+    const-string/jumbo v0, "12966"
+    const-string/jumbo v0, "12967"
+    const-string/jumbo v0, "12968"
+    const-string/jumbo v0, "12969"
+    const-string/jumbo v0, "12970"
+    const-string/jumbo v0, "12971"
+    const-string/jumbo v0, "12972"
+    const-string/jumbo v0, "12973"
+    const-string/jumbo v0, "12974"
+    const-string/jumbo v0, "12975"
+    const-string/jumbo v0, "12976"
+    const-string/jumbo v0, "12977"
+    const-string/jumbo v0, "12978"
+    const-string/jumbo v0, "12979"
+    const-string/jumbo v0, "12980"
+    const-string/jumbo v0, "12981"
+    const-string/jumbo v0, "12982"
+    const-string/jumbo v0, "12983"
+    const-string/jumbo v0, "12984"
+    const-string/jumbo v0, "12985"
+    const-string/jumbo v0, "12986"
+    const-string/jumbo v0, "12987"
+    const-string/jumbo v0, "12988"
+    const-string/jumbo v0, "12989"
+    const-string/jumbo v0, "12990"
+    const-string/jumbo v0, "12991"
+    const-string/jumbo v0, "12992"
+    const-string/jumbo v0, "12993"
+    const-string/jumbo v0, "12994"
+    const-string/jumbo v0, "12995"
+    const-string/jumbo v0, "12996"
+    const-string/jumbo v0, "12997"
+    const-string/jumbo v0, "12998"
+    const-string/jumbo v0, "12999"
+    const-string/jumbo v0, "13000"
+    const-string/jumbo v0, "13001"
+    const-string/jumbo v0, "13002"
+    const-string/jumbo v0, "13003"
+    const-string/jumbo v0, "13004"
+    const-string/jumbo v0, "13005"
+    const-string/jumbo v0, "13006"
+    const-string/jumbo v0, "13007"
+    const-string/jumbo v0, "13008"
+    const-string/jumbo v0, "13009"
+    const-string/jumbo v0, "13010"
+    const-string/jumbo v0, "13011"
+    const-string/jumbo v0, "13012"
+    const-string/jumbo v0, "13013"
+    const-string/jumbo v0, "13014"
+    const-string/jumbo v0, "13015"
+    const-string/jumbo v0, "13016"
+    const-string/jumbo v0, "13017"
+    const-string/jumbo v0, "13018"
+    const-string/jumbo v0, "13019"
+    const-string/jumbo v0, "13020"
+    const-string/jumbo v0, "13021"
+    const-string/jumbo v0, "13022"
+    const-string/jumbo v0, "13023"
+    const-string/jumbo v0, "13024"
+    const-string/jumbo v0, "13025"
+    const-string/jumbo v0, "13026"
+    const-string/jumbo v0, "13027"
+    const-string/jumbo v0, "13028"
+    const-string/jumbo v0, "13029"
+    const-string/jumbo v0, "13030"
+    const-string/jumbo v0, "13031"
+    const-string/jumbo v0, "13032"
+    const-string/jumbo v0, "13033"
+    const-string/jumbo v0, "13034"
+    const-string/jumbo v0, "13035"
+    const-string/jumbo v0, "13036"
+    const-string/jumbo v0, "13037"
+    const-string/jumbo v0, "13038"
+    const-string/jumbo v0, "13039"
+    const-string/jumbo v0, "13040"
+    const-string/jumbo v0, "13041"
+    const-string/jumbo v0, "13042"
+    const-string/jumbo v0, "13043"
+    const-string/jumbo v0, "13044"
+    const-string/jumbo v0, "13045"
+    const-string/jumbo v0, "13046"
+    const-string/jumbo v0, "13047"
+    const-string/jumbo v0, "13048"
+    const-string/jumbo v0, "13049"
+    const-string/jumbo v0, "13050"
+    const-string/jumbo v0, "13051"
+    const-string/jumbo v0, "13052"
+    const-string/jumbo v0, "13053"
+    const-string/jumbo v0, "13054"
+    const-string/jumbo v0, "13055"
+    const-string/jumbo v0, "13056"
+    const-string/jumbo v0, "13057"
+    const-string/jumbo v0, "13058"
+    const-string/jumbo v0, "13059"
+    const-string/jumbo v0, "13060"
+    const-string/jumbo v0, "13061"
+    const-string/jumbo v0, "13062"
+    const-string/jumbo v0, "13063"
+    const-string/jumbo v0, "13064"
+    const-string/jumbo v0, "13065"
+    const-string/jumbo v0, "13066"
+    const-string/jumbo v0, "13067"
+    const-string/jumbo v0, "13068"
+    const-string/jumbo v0, "13069"
+    const-string/jumbo v0, "13070"
+    const-string/jumbo v0, "13071"
+    const-string/jumbo v0, "13072"
+    const-string/jumbo v0, "13073"
+    const-string/jumbo v0, "13074"
+    const-string/jumbo v0, "13075"
+    const-string/jumbo v0, "13076"
+    const-string/jumbo v0, "13077"
+    const-string/jumbo v0, "13078"
+    const-string/jumbo v0, "13079"
+    const-string/jumbo v0, "13080"
+    const-string/jumbo v0, "13081"
+    const-string/jumbo v0, "13082"
+    const-string/jumbo v0, "13083"
+    const-string/jumbo v0, "13084"
+    const-string/jumbo v0, "13085"
+    const-string/jumbo v0, "13086"
+    const-string/jumbo v0, "13087"
+    const-string/jumbo v0, "13088"
+    const-string/jumbo v0, "13089"
+    const-string/jumbo v0, "13090"
+    const-string/jumbo v0, "13091"
+    const-string/jumbo v0, "13092"
+    const-string/jumbo v0, "13093"
+    const-string/jumbo v0, "13094"
+    const-string/jumbo v0, "13095"
+    const-string/jumbo v0, "13096"
+    const-string/jumbo v0, "13097"
+    const-string/jumbo v0, "13098"
+    const-string/jumbo v0, "13099"
+    const-string/jumbo v0, "13100"
+    const-string/jumbo v0, "13101"
+    const-string/jumbo v0, "13102"
+    const-string/jumbo v0, "13103"
+    const-string/jumbo v0, "13104"
+    const-string/jumbo v0, "13105"
+    const-string/jumbo v0, "13106"
+    const-string/jumbo v0, "13107"
+    const-string/jumbo v0, "13108"
+    const-string/jumbo v0, "13109"
+    const-string/jumbo v0, "13110"
+    const-string/jumbo v0, "13111"
+    const-string/jumbo v0, "13112"
+    const-string/jumbo v0, "13113"
+    const-string/jumbo v0, "13114"
+    const-string/jumbo v0, "13115"
+    const-string/jumbo v0, "13116"
+    const-string/jumbo v0, "13117"
+    const-string/jumbo v0, "13118"
+    const-string/jumbo v0, "13119"
+    const-string/jumbo v0, "13120"
+    const-string/jumbo v0, "13121"
+    const-string/jumbo v0, "13122"
+    const-string/jumbo v0, "13123"
+    const-string/jumbo v0, "13124"
+    const-string/jumbo v0, "13125"
+    const-string/jumbo v0, "13126"
+    const-string/jumbo v0, "13127"
+    const-string/jumbo v0, "13128"
+    const-string/jumbo v0, "13129"
+    const-string/jumbo v0, "13130"
+    const-string/jumbo v0, "13131"
+    const-string/jumbo v0, "13132"
+    const-string/jumbo v0, "13133"
+    const-string/jumbo v0, "13134"
+    const-string/jumbo v0, "13135"
+    const-string/jumbo v0, "13136"
+    const-string/jumbo v0, "13137"
+    const-string/jumbo v0, "13138"
+    const-string/jumbo v0, "13139"
+    const-string/jumbo v0, "13140"
+    const-string/jumbo v0, "13141"
+    const-string/jumbo v0, "13142"
+    const-string/jumbo v0, "13143"
+    const-string/jumbo v0, "13144"
+    const-string/jumbo v0, "13145"
+    const-string/jumbo v0, "13146"
+    const-string/jumbo v0, "13147"
+    const-string/jumbo v0, "13148"
+    const-string/jumbo v0, "13149"
+    const-string/jumbo v0, "13150"
+    const-string/jumbo v0, "13151"
+    const-string/jumbo v0, "13152"
+    const-string/jumbo v0, "13153"
+    const-string/jumbo v0, "13154"
+    const-string/jumbo v0, "13155"
+    const-string/jumbo v0, "13156"
+    const-string/jumbo v0, "13157"
+    const-string/jumbo v0, "13158"
+    const-string/jumbo v0, "13159"
+    const-string/jumbo v0, "13160"
+    const-string/jumbo v0, "13161"
+    const-string/jumbo v0, "13162"
+    const-string/jumbo v0, "13163"
+    const-string/jumbo v0, "13164"
+    const-string/jumbo v0, "13165"
+    const-string/jumbo v0, "13166"
+    const-string/jumbo v0, "13167"
+    const-string/jumbo v0, "13168"
+    const-string/jumbo v0, "13169"
+    const-string/jumbo v0, "13170"
+    const-string/jumbo v0, "13171"
+    const-string/jumbo v0, "13172"
+    const-string/jumbo v0, "13173"
+    const-string/jumbo v0, "13174"
+    const-string/jumbo v0, "13175"
+    const-string/jumbo v0, "13176"
+    const-string/jumbo v0, "13177"
+    const-string/jumbo v0, "13178"
+    const-string/jumbo v0, "13179"
+    const-string/jumbo v0, "13180"
+    const-string/jumbo v0, "13181"
+    const-string/jumbo v0, "13182"
+    const-string/jumbo v0, "13183"
+    const-string/jumbo v0, "13184"
+    const-string/jumbo v0, "13185"
+    const-string/jumbo v0, "13186"
+    const-string/jumbo v0, "13187"
+    const-string/jumbo v0, "13188"
+    const-string/jumbo v0, "13189"
+    const-string/jumbo v0, "13190"
+    const-string/jumbo v0, "13191"
+    const-string/jumbo v0, "13192"
+    const-string/jumbo v0, "13193"
+    const-string/jumbo v0, "13194"
+    const-string/jumbo v0, "13195"
+    const-string/jumbo v0, "13196"
+    const-string/jumbo v0, "13197"
+    const-string/jumbo v0, "13198"
+    const-string/jumbo v0, "13199"
+    const-string/jumbo v0, "13200"
+    const-string/jumbo v0, "13201"
+    const-string/jumbo v0, "13202"
+    const-string/jumbo v0, "13203"
+    const-string/jumbo v0, "13204"
+    const-string/jumbo v0, "13205"
+    const-string/jumbo v0, "13206"
+    const-string/jumbo v0, "13207"
+    const-string/jumbo v0, "13208"
+    const-string/jumbo v0, "13209"
+    const-string/jumbo v0, "13210"
+    const-string/jumbo v0, "13211"
+    const-string/jumbo v0, "13212"
+    const-string/jumbo v0, "13213"
+    const-string/jumbo v0, "13214"
+    const-string/jumbo v0, "13215"
+    const-string/jumbo v0, "13216"
+    const-string/jumbo v0, "13217"
+    const-string/jumbo v0, "13218"
+    const-string/jumbo v0, "13219"
+    const-string/jumbo v0, "13220"
+    const-string/jumbo v0, "13221"
+    const-string/jumbo v0, "13222"
+    const-string/jumbo v0, "13223"
+    const-string/jumbo v0, "13224"
+    const-string/jumbo v0, "13225"
+    const-string/jumbo v0, "13226"
+    const-string/jumbo v0, "13227"
+    const-string/jumbo v0, "13228"
+    const-string/jumbo v0, "13229"
+    const-string/jumbo v0, "13230"
+    const-string/jumbo v0, "13231"
+    const-string/jumbo v0, "13232"
+    const-string/jumbo v0, "13233"
+    const-string/jumbo v0, "13234"
+    const-string/jumbo v0, "13235"
+    const-string/jumbo v0, "13236"
+    const-string/jumbo v0, "13237"
+    const-string/jumbo v0, "13238"
+    const-string/jumbo v0, "13239"
+    const-string/jumbo v0, "13240"
+    const-string/jumbo v0, "13241"
+    const-string/jumbo v0, "13242"
+    const-string/jumbo v0, "13243"
+    const-string/jumbo v0, "13244"
+    const-string/jumbo v0, "13245"
+    const-string/jumbo v0, "13246"
+    const-string/jumbo v0, "13247"
+    const-string/jumbo v0, "13248"
+    const-string/jumbo v0, "13249"
+    const-string/jumbo v0, "13250"
+    const-string/jumbo v0, "13251"
+    const-string/jumbo v0, "13252"
+    const-string/jumbo v0, "13253"
+    const-string/jumbo v0, "13254"
+    const-string/jumbo v0, "13255"
+    const-string/jumbo v0, "13256"
+    const-string/jumbo v0, "13257"
+    const-string/jumbo v0, "13258"
+    const-string/jumbo v0, "13259"
+    const-string/jumbo v0, "13260"
+    const-string/jumbo v0, "13261"
+    const-string/jumbo v0, "13262"
+    const-string/jumbo v0, "13263"
+    const-string/jumbo v0, "13264"
+    const-string/jumbo v0, "13265"
+    const-string/jumbo v0, "13266"
+    const-string/jumbo v0, "13267"
+    const-string/jumbo v0, "13268"
+    const-string/jumbo v0, "13269"
+    const-string/jumbo v0, "13270"
+    const-string/jumbo v0, "13271"
+    const-string/jumbo v0, "13272"
+    const-string/jumbo v0, "13273"
+    const-string/jumbo v0, "13274"
+    const-string/jumbo v0, "13275"
+    const-string/jumbo v0, "13276"
+    const-string/jumbo v0, "13277"
+    const-string/jumbo v0, "13278"
+    const-string/jumbo v0, "13279"
+    const-string/jumbo v0, "13280"
+    const-string/jumbo v0, "13281"
+    const-string/jumbo v0, "13282"
+    const-string/jumbo v0, "13283"
+    const-string/jumbo v0, "13284"
+    const-string/jumbo v0, "13285"
+    const-string/jumbo v0, "13286"
+    const-string/jumbo v0, "13287"
+    const-string/jumbo v0, "13288"
+    const-string/jumbo v0, "13289"
+    const-string/jumbo v0, "13290"
+    const-string/jumbo v0, "13291"
+    const-string/jumbo v0, "13292"
+    const-string/jumbo v0, "13293"
+    const-string/jumbo v0, "13294"
+    const-string/jumbo v0, "13295"
+    const-string/jumbo v0, "13296"
+    const-string/jumbo v0, "13297"
+    const-string/jumbo v0, "13298"
+    const-string/jumbo v0, "13299"
+    const-string/jumbo v0, "13300"
+    const-string/jumbo v0, "13301"
+    const-string/jumbo v0, "13302"
+    const-string/jumbo v0, "13303"
+    const-string/jumbo v0, "13304"
+    const-string/jumbo v0, "13305"
+    const-string/jumbo v0, "13306"
+    const-string/jumbo v0, "13307"
+    const-string/jumbo v0, "13308"
+    const-string/jumbo v0, "13309"
+    const-string/jumbo v0, "13310"
+    const-string/jumbo v0, "13311"
+    const-string/jumbo v0, "13312"
+    const-string/jumbo v0, "13313"
+    const-string/jumbo v0, "13314"
+    const-string/jumbo v0, "13315"
+    const-string/jumbo v0, "13316"
+    const-string/jumbo v0, "13317"
+    const-string/jumbo v0, "13318"
+    const-string/jumbo v0, "13319"
+    const-string/jumbo v0, "13320"
+    const-string/jumbo v0, "13321"
+    const-string/jumbo v0, "13322"
+    const-string/jumbo v0, "13323"
+    const-string/jumbo v0, "13324"
+    const-string/jumbo v0, "13325"
+    const-string/jumbo v0, "13326"
+    const-string/jumbo v0, "13327"
+    const-string/jumbo v0, "13328"
+    const-string/jumbo v0, "13329"
+    const-string/jumbo v0, "13330"
+    const-string/jumbo v0, "13331"
+    const-string/jumbo v0, "13332"
+    const-string/jumbo v0, "13333"
+    const-string/jumbo v0, "13334"
+    const-string/jumbo v0, "13335"
+    const-string/jumbo v0, "13336"
+    const-string/jumbo v0, "13337"
+    const-string/jumbo v0, "13338"
+    const-string/jumbo v0, "13339"
+    const-string/jumbo v0, "13340"
+    const-string/jumbo v0, "13341"
+    const-string/jumbo v0, "13342"
+    const-string/jumbo v0, "13343"
+    const-string/jumbo v0, "13344"
+    const-string/jumbo v0, "13345"
+    const-string/jumbo v0, "13346"
+    const-string/jumbo v0, "13347"
+    const-string/jumbo v0, "13348"
+    const-string/jumbo v0, "13349"
+    const-string/jumbo v0, "13350"
+    const-string/jumbo v0, "13351"
+    const-string/jumbo v0, "13352"
+    const-string/jumbo v0, "13353"
+    const-string/jumbo v0, "13354"
+    const-string/jumbo v0, "13355"
+    const-string/jumbo v0, "13356"
+    const-string/jumbo v0, "13357"
+    const-string/jumbo v0, "13358"
+    const-string/jumbo v0, "13359"
+    const-string/jumbo v0, "13360"
+    const-string/jumbo v0, "13361"
+    const-string/jumbo v0, "13362"
+    const-string/jumbo v0, "13363"
+    const-string/jumbo v0, "13364"
+    const-string/jumbo v0, "13365"
+    const-string/jumbo v0, "13366"
+    const-string/jumbo v0, "13367"
+    const-string/jumbo v0, "13368"
+    const-string/jumbo v0, "13369"
+    const-string/jumbo v0, "13370"
+    const-string/jumbo v0, "13371"
+    const-string/jumbo v0, "13372"
+    const-string/jumbo v0, "13373"
+    const-string/jumbo v0, "13374"
+    const-string/jumbo v0, "13375"
+    const-string/jumbo v0, "13376"
+    const-string/jumbo v0, "13377"
+    const-string/jumbo v0, "13378"
+    const-string/jumbo v0, "13379"
+    const-string/jumbo v0, "13380"
+    const-string/jumbo v0, "13381"
+    const-string/jumbo v0, "13382"
+    const-string/jumbo v0, "13383"
+    const-string/jumbo v0, "13384"
+    const-string/jumbo v0, "13385"
+    const-string/jumbo v0, "13386"
+    const-string/jumbo v0, "13387"
+    const-string/jumbo v0, "13388"
+    const-string/jumbo v0, "13389"
+    const-string/jumbo v0, "13390"
+    const-string/jumbo v0, "13391"
+    const-string/jumbo v0, "13392"
+    const-string/jumbo v0, "13393"
+    const-string/jumbo v0, "13394"
+    const-string/jumbo v0, "13395"
+    const-string/jumbo v0, "13396"
+    const-string/jumbo v0, "13397"
+    const-string/jumbo v0, "13398"
+    const-string/jumbo v0, "13399"
+    const-string/jumbo v0, "13400"
+    const-string/jumbo v0, "13401"
+    const-string/jumbo v0, "13402"
+    const-string/jumbo v0, "13403"
+    const-string/jumbo v0, "13404"
+    const-string/jumbo v0, "13405"
+    const-string/jumbo v0, "13406"
+    const-string/jumbo v0, "13407"
+    const-string/jumbo v0, "13408"
+    const-string/jumbo v0, "13409"
+    const-string/jumbo v0, "13410"
+    const-string/jumbo v0, "13411"
+    const-string/jumbo v0, "13412"
+    const-string/jumbo v0, "13413"
+    const-string/jumbo v0, "13414"
+    const-string/jumbo v0, "13415"
+    const-string/jumbo v0, "13416"
+    const-string/jumbo v0, "13417"
+    const-string/jumbo v0, "13418"
+    const-string/jumbo v0, "13419"
+    const-string/jumbo v0, "13420"
+    const-string/jumbo v0, "13421"
+    const-string/jumbo v0, "13422"
+    const-string/jumbo v0, "13423"
+    const-string/jumbo v0, "13424"
+    const-string/jumbo v0, "13425"
+    const-string/jumbo v0, "13426"
+    const-string/jumbo v0, "13427"
+    const-string/jumbo v0, "13428"
+    const-string/jumbo v0, "13429"
+    const-string/jumbo v0, "13430"
+    const-string/jumbo v0, "13431"
+    const-string/jumbo v0, "13432"
+    const-string/jumbo v0, "13433"
+    const-string/jumbo v0, "13434"
+    const-string/jumbo v0, "13435"
+    const-string/jumbo v0, "13436"
+    const-string/jumbo v0, "13437"
+    const-string/jumbo v0, "13438"
+    const-string/jumbo v0, "13439"
+    const-string/jumbo v0, "13440"
+    const-string/jumbo v0, "13441"
+    const-string/jumbo v0, "13442"
+    const-string/jumbo v0, "13443"
+    const-string/jumbo v0, "13444"
+    const-string/jumbo v0, "13445"
+    const-string/jumbo v0, "13446"
+    const-string/jumbo v0, "13447"
+    const-string/jumbo v0, "13448"
+    const-string/jumbo v0, "13449"
+    const-string/jumbo v0, "13450"
+    const-string/jumbo v0, "13451"
+    const-string/jumbo v0, "13452"
+    const-string/jumbo v0, "13453"
+    const-string/jumbo v0, "13454"
+    const-string/jumbo v0, "13455"
+    const-string/jumbo v0, "13456"
+    const-string/jumbo v0, "13457"
+    const-string/jumbo v0, "13458"
+    const-string/jumbo v0, "13459"
+    const-string/jumbo v0, "13460"
+    const-string/jumbo v0, "13461"
+    const-string/jumbo v0, "13462"
+    const-string/jumbo v0, "13463"
+    const-string/jumbo v0, "13464"
+    const-string/jumbo v0, "13465"
+    const-string/jumbo v0, "13466"
+    const-string/jumbo v0, "13467"
+    const-string/jumbo v0, "13468"
+    const-string/jumbo v0, "13469"
+    const-string/jumbo v0, "13470"
+    const-string/jumbo v0, "13471"
+    const-string/jumbo v0, "13472"
+    const-string/jumbo v0, "13473"
+    const-string/jumbo v0, "13474"
+    const-string/jumbo v0, "13475"
+    const-string/jumbo v0, "13476"
+    const-string/jumbo v0, "13477"
+    const-string/jumbo v0, "13478"
+    const-string/jumbo v0, "13479"
+    const-string/jumbo v0, "13480"
+    const-string/jumbo v0, "13481"
+    const-string/jumbo v0, "13482"
+    const-string/jumbo v0, "13483"
+    const-string/jumbo v0, "13484"
+    const-string/jumbo v0, "13485"
+    const-string/jumbo v0, "13486"
+    const-string/jumbo v0, "13487"
+    const-string/jumbo v0, "13488"
+    const-string/jumbo v0, "13489"
+    const-string/jumbo v0, "13490"
+    const-string/jumbo v0, "13491"
+    const-string/jumbo v0, "13492"
+    const-string/jumbo v0, "13493"
+    const-string/jumbo v0, "13494"
+    const-string/jumbo v0, "13495"
+    const-string/jumbo v0, "13496"
+    const-string/jumbo v0, "13497"
+    const-string/jumbo v0, "13498"
+    const-string/jumbo v0, "13499"
+    const-string/jumbo v0, "13500"
+    const-string/jumbo v0, "13501"
+    const-string/jumbo v0, "13502"
+    const-string/jumbo v0, "13503"
+    const-string/jumbo v0, "13504"
+    const-string/jumbo v0, "13505"
+    const-string/jumbo v0, "13506"
+    const-string/jumbo v0, "13507"
+    const-string/jumbo v0, "13508"
+    const-string/jumbo v0, "13509"
+    const-string/jumbo v0, "13510"
+    const-string/jumbo v0, "13511"
+    const-string/jumbo v0, "13512"
+    const-string/jumbo v0, "13513"
+    const-string/jumbo v0, "13514"
+    const-string/jumbo v0, "13515"
+    const-string/jumbo v0, "13516"
+    const-string/jumbo v0, "13517"
+    const-string/jumbo v0, "13518"
+    const-string/jumbo v0, "13519"
+    const-string/jumbo v0, "13520"
+    const-string/jumbo v0, "13521"
+    const-string/jumbo v0, "13522"
+    const-string/jumbo v0, "13523"
+    const-string/jumbo v0, "13524"
+    const-string/jumbo v0, "13525"
+    const-string/jumbo v0, "13526"
+    const-string/jumbo v0, "13527"
+    const-string/jumbo v0, "13528"
+    const-string/jumbo v0, "13529"
+    const-string/jumbo v0, "13530"
+    const-string/jumbo v0, "13531"
+    const-string/jumbo v0, "13532"
+    const-string/jumbo v0, "13533"
+    const-string/jumbo v0, "13534"
+    const-string/jumbo v0, "13535"
+    const-string/jumbo v0, "13536"
+    const-string/jumbo v0, "13537"
+    const-string/jumbo v0, "13538"
+    const-string/jumbo v0, "13539"
+    const-string/jumbo v0, "13540"
+    const-string/jumbo v0, "13541"
+    const-string/jumbo v0, "13542"
+    const-string/jumbo v0, "13543"
+    const-string/jumbo v0, "13544"
+    const-string/jumbo v0, "13545"
+    const-string/jumbo v0, "13546"
+    const-string/jumbo v0, "13547"
+    const-string/jumbo v0, "13548"
+    const-string/jumbo v0, "13549"
+    const-string/jumbo v0, "13550"
+    const-string/jumbo v0, "13551"
+    const-string/jumbo v0, "13552"
+    const-string/jumbo v0, "13553"
+    const-string/jumbo v0, "13554"
+    const-string/jumbo v0, "13555"
+    const-string/jumbo v0, "13556"
+    const-string/jumbo v0, "13557"
+    const-string/jumbo v0, "13558"
+    const-string/jumbo v0, "13559"
+    const-string/jumbo v0, "13560"
+    const-string/jumbo v0, "13561"
+    const-string/jumbo v0, "13562"
+    const-string/jumbo v0, "13563"
+    const-string/jumbo v0, "13564"
+    const-string/jumbo v0, "13565"
+    const-string/jumbo v0, "13566"
+    const-string/jumbo v0, "13567"
+    const-string/jumbo v0, "13568"
+    const-string/jumbo v0, "13569"
+    const-string/jumbo v0, "13570"
+    const-string/jumbo v0, "13571"
+    const-string/jumbo v0, "13572"
+    const-string/jumbo v0, "13573"
+    const-string/jumbo v0, "13574"
+    const-string/jumbo v0, "13575"
+    const-string/jumbo v0, "13576"
+    const-string/jumbo v0, "13577"
+    const-string/jumbo v0, "13578"
+    const-string/jumbo v0, "13579"
+    const-string/jumbo v0, "13580"
+    const-string/jumbo v0, "13581"
+    const-string/jumbo v0, "13582"
+    const-string/jumbo v0, "13583"
+    const-string/jumbo v0, "13584"
+    const-string/jumbo v0, "13585"
+    const-string/jumbo v0, "13586"
+    const-string/jumbo v0, "13587"
+    const-string/jumbo v0, "13588"
+    const-string/jumbo v0, "13589"
+    const-string/jumbo v0, "13590"
+    const-string/jumbo v0, "13591"
+    const-string/jumbo v0, "13592"
+    const-string/jumbo v0, "13593"
+    const-string/jumbo v0, "13594"
+    const-string/jumbo v0, "13595"
+    const-string/jumbo v0, "13596"
+    const-string/jumbo v0, "13597"
+    const-string/jumbo v0, "13598"
+    const-string/jumbo v0, "13599"
+    const-string/jumbo v0, "13600"
+    const-string/jumbo v0, "13601"
+    const-string/jumbo v0, "13602"
+    const-string/jumbo v0, "13603"
+    const-string/jumbo v0, "13604"
+    const-string/jumbo v0, "13605"
+    const-string/jumbo v0, "13606"
+    const-string/jumbo v0, "13607"
+    const-string/jumbo v0, "13608"
+    const-string/jumbo v0, "13609"
+    const-string/jumbo v0, "13610"
+    const-string/jumbo v0, "13611"
+    const-string/jumbo v0, "13612"
+    const-string/jumbo v0, "13613"
+    const-string/jumbo v0, "13614"
+    const-string/jumbo v0, "13615"
+    const-string/jumbo v0, "13616"
+    const-string/jumbo v0, "13617"
+    const-string/jumbo v0, "13618"
+    const-string/jumbo v0, "13619"
+    const-string/jumbo v0, "13620"
+    const-string/jumbo v0, "13621"
+    const-string/jumbo v0, "13622"
+    const-string/jumbo v0, "13623"
+    const-string/jumbo v0, "13624"
+    const-string/jumbo v0, "13625"
+    const-string/jumbo v0, "13626"
+    const-string/jumbo v0, "13627"
+    const-string/jumbo v0, "13628"
+    const-string/jumbo v0, "13629"
+    const-string/jumbo v0, "13630"
+    const-string/jumbo v0, "13631"
+    const-string/jumbo v0, "13632"
+    const-string/jumbo v0, "13633"
+    const-string/jumbo v0, "13634"
+    const-string/jumbo v0, "13635"
+    const-string/jumbo v0, "13636"
+    const-string/jumbo v0, "13637"
+    const-string/jumbo v0, "13638"
+    const-string/jumbo v0, "13639"
+    const-string/jumbo v0, "13640"
+    const-string/jumbo v0, "13641"
+    const-string/jumbo v0, "13642"
+    const-string/jumbo v0, "13643"
+    const-string/jumbo v0, "13644"
+    const-string/jumbo v0, "13645"
+    const-string/jumbo v0, "13646"
+    const-string/jumbo v0, "13647"
+    const-string/jumbo v0, "13648"
+    const-string/jumbo v0, "13649"
+    const-string/jumbo v0, "13650"
+    const-string/jumbo v0, "13651"
+    const-string/jumbo v0, "13652"
+    const-string/jumbo v0, "13653"
+    const-string/jumbo v0, "13654"
+    const-string/jumbo v0, "13655"
+    const-string/jumbo v0, "13656"
+    const-string/jumbo v0, "13657"
+    const-string/jumbo v0, "13658"
+    const-string/jumbo v0, "13659"
+    const-string/jumbo v0, "13660"
+    const-string/jumbo v0, "13661"
+    const-string/jumbo v0, "13662"
+    const-string/jumbo v0, "13663"
+    const-string/jumbo v0, "13664"
+    const-string/jumbo v0, "13665"
+    const-string/jumbo v0, "13666"
+    const-string/jumbo v0, "13667"
+    const-string/jumbo v0, "13668"
+    const-string/jumbo v0, "13669"
+    const-string/jumbo v0, "13670"
+    const-string/jumbo v0, "13671"
+    const-string/jumbo v0, "13672"
+    const-string/jumbo v0, "13673"
+    const-string/jumbo v0, "13674"
+    const-string/jumbo v0, "13675"
+    const-string/jumbo v0, "13676"
+    const-string/jumbo v0, "13677"
+    const-string/jumbo v0, "13678"
+    const-string/jumbo v0, "13679"
+    const-string/jumbo v0, "13680"
+    const-string/jumbo v0, "13681"
+    const-string/jumbo v0, "13682"
+    const-string/jumbo v0, "13683"
+    const-string/jumbo v0, "13684"
+    const-string/jumbo v0, "13685"
+    const-string/jumbo v0, "13686"
+    const-string/jumbo v0, "13687"
+    const-string/jumbo v0, "13688"
+    const-string/jumbo v0, "13689"
+    const-string/jumbo v0, "13690"
+    const-string/jumbo v0, "13691"
+    const-string/jumbo v0, "13692"
+    const-string/jumbo v0, "13693"
+    const-string/jumbo v0, "13694"
+    const-string/jumbo v0, "13695"
+    const-string/jumbo v0, "13696"
+    const-string/jumbo v0, "13697"
+    const-string/jumbo v0, "13698"
+    const-string/jumbo v0, "13699"
+    const-string/jumbo v0, "13700"
+    const-string/jumbo v0, "13701"
+    const-string/jumbo v0, "13702"
+    const-string/jumbo v0, "13703"
+    const-string/jumbo v0, "13704"
+    const-string/jumbo v0, "13705"
+    const-string/jumbo v0, "13706"
+    const-string/jumbo v0, "13707"
+    const-string/jumbo v0, "13708"
+    const-string/jumbo v0, "13709"
+    const-string/jumbo v0, "13710"
+    const-string/jumbo v0, "13711"
+    const-string/jumbo v0, "13712"
+    const-string/jumbo v0, "13713"
+    const-string/jumbo v0, "13714"
+    const-string/jumbo v0, "13715"
+    const-string/jumbo v0, "13716"
+    const-string/jumbo v0, "13717"
+    const-string/jumbo v0, "13718"
+    const-string/jumbo v0, "13719"
+    const-string/jumbo v0, "13720"
+    const-string/jumbo v0, "13721"
+    const-string/jumbo v0, "13722"
+    const-string/jumbo v0, "13723"
+    const-string/jumbo v0, "13724"
+    const-string/jumbo v0, "13725"
+    const-string/jumbo v0, "13726"
+    const-string/jumbo v0, "13727"
+    const-string/jumbo v0, "13728"
+    const-string/jumbo v0, "13729"
+    const-string/jumbo v0, "13730"
+    const-string/jumbo v0, "13731"
+    const-string/jumbo v0, "13732"
+    const-string/jumbo v0, "13733"
+    const-string/jumbo v0, "13734"
+    const-string/jumbo v0, "13735"
+    const-string/jumbo v0, "13736"
+    const-string/jumbo v0, "13737"
+    const-string/jumbo v0, "13738"
+    const-string/jumbo v0, "13739"
+    const-string/jumbo v0, "13740"
+    const-string/jumbo v0, "13741"
+    const-string/jumbo v0, "13742"
+    const-string/jumbo v0, "13743"
+    const-string/jumbo v0, "13744"
+    const-string/jumbo v0, "13745"
+    const-string/jumbo v0, "13746"
+    const-string/jumbo v0, "13747"
+    const-string/jumbo v0, "13748"
+    const-string/jumbo v0, "13749"
+    const-string/jumbo v0, "13750"
+    const-string/jumbo v0, "13751"
+    const-string/jumbo v0, "13752"
+    const-string/jumbo v0, "13753"
+    const-string/jumbo v0, "13754"
+    const-string/jumbo v0, "13755"
+    const-string/jumbo v0, "13756"
+    const-string/jumbo v0, "13757"
+    const-string/jumbo v0, "13758"
+    const-string/jumbo v0, "13759"
+    const-string/jumbo v0, "13760"
+    const-string/jumbo v0, "13761"
+    const-string/jumbo v0, "13762"
+    const-string/jumbo v0, "13763"
+    const-string/jumbo v0, "13764"
+    const-string/jumbo v0, "13765"
+    const-string/jumbo v0, "13766"
+    const-string/jumbo v0, "13767"
+    const-string/jumbo v0, "13768"
+    const-string/jumbo v0, "13769"
+    const-string/jumbo v0, "13770"
+    const-string/jumbo v0, "13771"
+    const-string/jumbo v0, "13772"
+    const-string/jumbo v0, "13773"
+    const-string/jumbo v0, "13774"
+    const-string/jumbo v0, "13775"
+    const-string/jumbo v0, "13776"
+    const-string/jumbo v0, "13777"
+    const-string/jumbo v0, "13778"
+    const-string/jumbo v0, "13779"
+    const-string/jumbo v0, "13780"
+    const-string/jumbo v0, "13781"
+    const-string/jumbo v0, "13782"
+    const-string/jumbo v0, "13783"
+    const-string/jumbo v0, "13784"
+    const-string/jumbo v0, "13785"
+    const-string/jumbo v0, "13786"
+    const-string/jumbo v0, "13787"
+    const-string/jumbo v0, "13788"
+    const-string/jumbo v0, "13789"
+    const-string/jumbo v0, "13790"
+    const-string/jumbo v0, "13791"
+    const-string/jumbo v0, "13792"
+    const-string/jumbo v0, "13793"
+    const-string/jumbo v0, "13794"
+    const-string/jumbo v0, "13795"
+    const-string/jumbo v0, "13796"
+    const-string/jumbo v0, "13797"
+    const-string/jumbo v0, "13798"
+    const-string/jumbo v0, "13799"
+    const-string/jumbo v0, "13800"
+    const-string/jumbo v0, "13801"
+    const-string/jumbo v0, "13802"
+    const-string/jumbo v0, "13803"
+    const-string/jumbo v0, "13804"
+    const-string/jumbo v0, "13805"
+    const-string/jumbo v0, "13806"
+    const-string/jumbo v0, "13807"
+    const-string/jumbo v0, "13808"
+    const-string/jumbo v0, "13809"
+    const-string/jumbo v0, "13810"
+    const-string/jumbo v0, "13811"
+    const-string/jumbo v0, "13812"
+    const-string/jumbo v0, "13813"
+    const-string/jumbo v0, "13814"
+    const-string/jumbo v0, "13815"
+    const-string/jumbo v0, "13816"
+    const-string/jumbo v0, "13817"
+    const-string/jumbo v0, "13818"
+    const-string/jumbo v0, "13819"
+    const-string/jumbo v0, "13820"
+    const-string/jumbo v0, "13821"
+    const-string/jumbo v0, "13822"
+    const-string/jumbo v0, "13823"
+    const-string/jumbo v0, "13824"
+    const-string/jumbo v0, "13825"
+    const-string/jumbo v0, "13826"
+    const-string/jumbo v0, "13827"
+    const-string/jumbo v0, "13828"
+    const-string/jumbo v0, "13829"
+    const-string/jumbo v0, "13830"
+    const-string/jumbo v0, "13831"
+    const-string/jumbo v0, "13832"
+    const-string/jumbo v0, "13833"
+    const-string/jumbo v0, "13834"
+    const-string/jumbo v0, "13835"
+    const-string/jumbo v0, "13836"
+    const-string/jumbo v0, "13837"
+    const-string/jumbo v0, "13838"
+    const-string/jumbo v0, "13839"
+    const-string/jumbo v0, "13840"
+    const-string/jumbo v0, "13841"
+    const-string/jumbo v0, "13842"
+    const-string/jumbo v0, "13843"
+    const-string/jumbo v0, "13844"
+    const-string/jumbo v0, "13845"
+    const-string/jumbo v0, "13846"
+    const-string/jumbo v0, "13847"
+    const-string/jumbo v0, "13848"
+    const-string/jumbo v0, "13849"
+    const-string/jumbo v0, "13850"
+    const-string/jumbo v0, "13851"
+    const-string/jumbo v0, "13852"
+    const-string/jumbo v0, "13853"
+    const-string/jumbo v0, "13854"
+    const-string/jumbo v0, "13855"
+    const-string/jumbo v0, "13856"
+    const-string/jumbo v0, "13857"
+    const-string/jumbo v0, "13858"
+    const-string/jumbo v0, "13859"
+    const-string/jumbo v0, "13860"
+    const-string/jumbo v0, "13861"
+    const-string/jumbo v0, "13862"
+    const-string/jumbo v0, "13863"
+    const-string/jumbo v0, "13864"
+    const-string/jumbo v0, "13865"
+    const-string/jumbo v0, "13866"
+    const-string/jumbo v0, "13867"
+    const-string/jumbo v0, "13868"
+    const-string/jumbo v0, "13869"
+    const-string/jumbo v0, "13870"
+    const-string/jumbo v0, "13871"
+    const-string/jumbo v0, "13872"
+    const-string/jumbo v0, "13873"
+    const-string/jumbo v0, "13874"
+    const-string/jumbo v0, "13875"
+    const-string/jumbo v0, "13876"
+    const-string/jumbo v0, "13877"
+    const-string/jumbo v0, "13878"
+    const-string/jumbo v0, "13879"
+    const-string/jumbo v0, "13880"
+    const-string/jumbo v0, "13881"
+    const-string/jumbo v0, "13882"
+    const-string/jumbo v0, "13883"
+    const-string/jumbo v0, "13884"
+    const-string/jumbo v0, "13885"
+    const-string/jumbo v0, "13886"
+    const-string/jumbo v0, "13887"
+    const-string/jumbo v0, "13888"
+    const-string/jumbo v0, "13889"
+    const-string/jumbo v0, "13890"
+    const-string/jumbo v0, "13891"
+    const-string/jumbo v0, "13892"
+    const-string/jumbo v0, "13893"
+    const-string/jumbo v0, "13894"
+    const-string/jumbo v0, "13895"
+    const-string/jumbo v0, "13896"
+    const-string/jumbo v0, "13897"
+    const-string/jumbo v0, "13898"
+    const-string/jumbo v0, "13899"
+    const-string/jumbo v0, "13900"
+    const-string/jumbo v0, "13901"
+    const-string/jumbo v0, "13902"
+    const-string/jumbo v0, "13903"
+    const-string/jumbo v0, "13904"
+    const-string/jumbo v0, "13905"
+    const-string/jumbo v0, "13906"
+    const-string/jumbo v0, "13907"
+    const-string/jumbo v0, "13908"
+    const-string/jumbo v0, "13909"
+    const-string/jumbo v0, "13910"
+    const-string/jumbo v0, "13911"
+    const-string/jumbo v0, "13912"
+    const-string/jumbo v0, "13913"
+    const-string/jumbo v0, "13914"
+    const-string/jumbo v0, "13915"
+    const-string/jumbo v0, "13916"
+    const-string/jumbo v0, "13917"
+    const-string/jumbo v0, "13918"
+    const-string/jumbo v0, "13919"
+    const-string/jumbo v0, "13920"
+    const-string/jumbo v0, "13921"
+    const-string/jumbo v0, "13922"
+    const-string/jumbo v0, "13923"
+    const-string/jumbo v0, "13924"
+    const-string/jumbo v0, "13925"
+    const-string/jumbo v0, "13926"
+    const-string/jumbo v0, "13927"
+    const-string/jumbo v0, "13928"
+    const-string/jumbo v0, "13929"
+    const-string/jumbo v0, "13930"
+    const-string/jumbo v0, "13931"
+    const-string/jumbo v0, "13932"
+    const-string/jumbo v0, "13933"
+    const-string/jumbo v0, "13934"
+    const-string/jumbo v0, "13935"
+    const-string/jumbo v0, "13936"
+    const-string/jumbo v0, "13937"
+    const-string/jumbo v0, "13938"
+    const-string/jumbo v0, "13939"
+    const-string/jumbo v0, "13940"
+    const-string/jumbo v0, "13941"
+    const-string/jumbo v0, "13942"
+    const-string/jumbo v0, "13943"
+    const-string/jumbo v0, "13944"
+    const-string/jumbo v0, "13945"
+    const-string/jumbo v0, "13946"
+    const-string/jumbo v0, "13947"
+    const-string/jumbo v0, "13948"
+    const-string/jumbo v0, "13949"
+    const-string/jumbo v0, "13950"
+    const-string/jumbo v0, "13951"
+    const-string/jumbo v0, "13952"
+    const-string/jumbo v0, "13953"
+    const-string/jumbo v0, "13954"
+    const-string/jumbo v0, "13955"
+    const-string/jumbo v0, "13956"
+    const-string/jumbo v0, "13957"
+    const-string/jumbo v0, "13958"
+    const-string/jumbo v0, "13959"
+    const-string/jumbo v0, "13960"
+    const-string/jumbo v0, "13961"
+    const-string/jumbo v0, "13962"
+    const-string/jumbo v0, "13963"
+    const-string/jumbo v0, "13964"
+    const-string/jumbo v0, "13965"
+    const-string/jumbo v0, "13966"
+    const-string/jumbo v0, "13967"
+    const-string/jumbo v0, "13968"
+    const-string/jumbo v0, "13969"
+    const-string/jumbo v0, "13970"
+    const-string/jumbo v0, "13971"
+    const-string/jumbo v0, "13972"
+    const-string/jumbo v0, "13973"
+    const-string/jumbo v0, "13974"
+    const-string/jumbo v0, "13975"
+    const-string/jumbo v0, "13976"
+    const-string/jumbo v0, "13977"
+    const-string/jumbo v0, "13978"
+    const-string/jumbo v0, "13979"
+    const-string/jumbo v0, "13980"
+    const-string/jumbo v0, "13981"
+    const-string/jumbo v0, "13982"
+    const-string/jumbo v0, "13983"
+    const-string/jumbo v0, "13984"
+    const-string/jumbo v0, "13985"
+    const-string/jumbo v0, "13986"
+    const-string/jumbo v0, "13987"
+    const-string/jumbo v0, "13988"
+    const-string/jumbo v0, "13989"
+    const-string/jumbo v0, "13990"
+    const-string/jumbo v0, "13991"
+    const-string/jumbo v0, "13992"
+    const-string/jumbo v0, "13993"
+    const-string/jumbo v0, "13994"
+    const-string/jumbo v0, "13995"
+    const-string/jumbo v0, "13996"
+    const-string/jumbo v0, "13997"
+    const-string/jumbo v0, "13998"
+    const-string/jumbo v0, "13999"
+    const-string/jumbo v0, "14000"
+    const-string/jumbo v0, "14001"
+    const-string/jumbo v0, "14002"
+    const-string/jumbo v0, "14003"
+    const-string/jumbo v0, "14004"
+    const-string/jumbo v0, "14005"
+    const-string/jumbo v0, "14006"
+    const-string/jumbo v0, "14007"
+    const-string/jumbo v0, "14008"
+    const-string/jumbo v0, "14009"
+    const-string/jumbo v0, "14010"
+    const-string/jumbo v0, "14011"
+    const-string/jumbo v0, "14012"
+    const-string/jumbo v0, "14013"
+    const-string/jumbo v0, "14014"
+    const-string/jumbo v0, "14015"
+    const-string/jumbo v0, "14016"
+    const-string/jumbo v0, "14017"
+    const-string/jumbo v0, "14018"
+    const-string/jumbo v0, "14019"
+    const-string/jumbo v0, "14020"
+    const-string/jumbo v0, "14021"
+    const-string/jumbo v0, "14022"
+    const-string/jumbo v0, "14023"
+    const-string/jumbo v0, "14024"
+    const-string/jumbo v0, "14025"
+    const-string/jumbo v0, "14026"
+    const-string/jumbo v0, "14027"
+    const-string/jumbo v0, "14028"
+    const-string/jumbo v0, "14029"
+    const-string/jumbo v0, "14030"
+    const-string/jumbo v0, "14031"
+    const-string/jumbo v0, "14032"
+    const-string/jumbo v0, "14033"
+    const-string/jumbo v0, "14034"
+    const-string/jumbo v0, "14035"
+    const-string/jumbo v0, "14036"
+    const-string/jumbo v0, "14037"
+    const-string/jumbo v0, "14038"
+    const-string/jumbo v0, "14039"
+    const-string/jumbo v0, "14040"
+    const-string/jumbo v0, "14041"
+    const-string/jumbo v0, "14042"
+    const-string/jumbo v0, "14043"
+    const-string/jumbo v0, "14044"
+    const-string/jumbo v0, "14045"
+    const-string/jumbo v0, "14046"
+    const-string/jumbo v0, "14047"
+    const-string/jumbo v0, "14048"
+    const-string/jumbo v0, "14049"
+    const-string/jumbo v0, "14050"
+    const-string/jumbo v0, "14051"
+    const-string/jumbo v0, "14052"
+    const-string/jumbo v0, "14053"
+    const-string/jumbo v0, "14054"
+    const-string/jumbo v0, "14055"
+    const-string/jumbo v0, "14056"
+    const-string/jumbo v0, "14057"
+    const-string/jumbo v0, "14058"
+    const-string/jumbo v0, "14059"
+    const-string/jumbo v0, "14060"
+    const-string/jumbo v0, "14061"
+    const-string/jumbo v0, "14062"
+    const-string/jumbo v0, "14063"
+    const-string/jumbo v0, "14064"
+    const-string/jumbo v0, "14065"
+    const-string/jumbo v0, "14066"
+    const-string/jumbo v0, "14067"
+    const-string/jumbo v0, "14068"
+    const-string/jumbo v0, "14069"
+    const-string/jumbo v0, "14070"
+    const-string/jumbo v0, "14071"
+    const-string/jumbo v0, "14072"
+    const-string/jumbo v0, "14073"
+    const-string/jumbo v0, "14074"
+    const-string/jumbo v0, "14075"
+    const-string/jumbo v0, "14076"
+    const-string/jumbo v0, "14077"
+    const-string/jumbo v0, "14078"
+    const-string/jumbo v0, "14079"
+    const-string/jumbo v0, "14080"
+    const-string/jumbo v0, "14081"
+    const-string/jumbo v0, "14082"
+    const-string/jumbo v0, "14083"
+    const-string/jumbo v0, "14084"
+    const-string/jumbo v0, "14085"
+    const-string/jumbo v0, "14086"
+    const-string/jumbo v0, "14087"
+    const-string/jumbo v0, "14088"
+    const-string/jumbo v0, "14089"
+    const-string/jumbo v0, "14090"
+    const-string/jumbo v0, "14091"
+    const-string/jumbo v0, "14092"
+    const-string/jumbo v0, "14093"
+    const-string/jumbo v0, "14094"
+    const-string/jumbo v0, "14095"
+    const-string/jumbo v0, "14096"
+    const-string/jumbo v0, "14097"
+    const-string/jumbo v0, "14098"
+    const-string/jumbo v0, "14099"
+    const-string/jumbo v0, "14100"
+    const-string/jumbo v0, "14101"
+    const-string/jumbo v0, "14102"
+    const-string/jumbo v0, "14103"
+    const-string/jumbo v0, "14104"
+    const-string/jumbo v0, "14105"
+    const-string/jumbo v0, "14106"
+    const-string/jumbo v0, "14107"
+    const-string/jumbo v0, "14108"
+    const-string/jumbo v0, "14109"
+    const-string/jumbo v0, "14110"
+    const-string/jumbo v0, "14111"
+    const-string/jumbo v0, "14112"
+    const-string/jumbo v0, "14113"
+    const-string/jumbo v0, "14114"
+    const-string/jumbo v0, "14115"
+    const-string/jumbo v0, "14116"
+    const-string/jumbo v0, "14117"
+    const-string/jumbo v0, "14118"
+    const-string/jumbo v0, "14119"
+    const-string/jumbo v0, "14120"
+    const-string/jumbo v0, "14121"
+    const-string/jumbo v0, "14122"
+    const-string/jumbo v0, "14123"
+    const-string/jumbo v0, "14124"
+    const-string/jumbo v0, "14125"
+    const-string/jumbo v0, "14126"
+    const-string/jumbo v0, "14127"
+    const-string/jumbo v0, "14128"
+    const-string/jumbo v0, "14129"
+    const-string/jumbo v0, "14130"
+    const-string/jumbo v0, "14131"
+    const-string/jumbo v0, "14132"
+    const-string/jumbo v0, "14133"
+    const-string/jumbo v0, "14134"
+    const-string/jumbo v0, "14135"
+    const-string/jumbo v0, "14136"
+    const-string/jumbo v0, "14137"
+    const-string/jumbo v0, "14138"
+    const-string/jumbo v0, "14139"
+    const-string/jumbo v0, "14140"
+    const-string/jumbo v0, "14141"
+    const-string/jumbo v0, "14142"
+    const-string/jumbo v0, "14143"
+    const-string/jumbo v0, "14144"
+    const-string/jumbo v0, "14145"
+    const-string/jumbo v0, "14146"
+    const-string/jumbo v0, "14147"
+    const-string/jumbo v0, "14148"
+    const-string/jumbo v0, "14149"
+    const-string/jumbo v0, "14150"
+    const-string/jumbo v0, "14151"
+    const-string/jumbo v0, "14152"
+    const-string/jumbo v0, "14153"
+    const-string/jumbo v0, "14154"
+    const-string/jumbo v0, "14155"
+    const-string/jumbo v0, "14156"
+    const-string/jumbo v0, "14157"
+    const-string/jumbo v0, "14158"
+    const-string/jumbo v0, "14159"
+    const-string/jumbo v0, "14160"
+    const-string/jumbo v0, "14161"
+    const-string/jumbo v0, "14162"
+    const-string/jumbo v0, "14163"
+    const-string/jumbo v0, "14164"
+    const-string/jumbo v0, "14165"
+    const-string/jumbo v0, "14166"
+    const-string/jumbo v0, "14167"
+    const-string/jumbo v0, "14168"
+    const-string/jumbo v0, "14169"
+    const-string/jumbo v0, "14170"
+    const-string/jumbo v0, "14171"
+    const-string/jumbo v0, "14172"
+    const-string/jumbo v0, "14173"
+    const-string/jumbo v0, "14174"
+    const-string/jumbo v0, "14175"
+    const-string/jumbo v0, "14176"
+    const-string/jumbo v0, "14177"
+    const-string/jumbo v0, "14178"
+    const-string/jumbo v0, "14179"
+    const-string/jumbo v0, "14180"
+    const-string/jumbo v0, "14181"
+    const-string/jumbo v0, "14182"
+    const-string/jumbo v0, "14183"
+    const-string/jumbo v0, "14184"
+    const-string/jumbo v0, "14185"
+    const-string/jumbo v0, "14186"
+    const-string/jumbo v0, "14187"
+    const-string/jumbo v0, "14188"
+    const-string/jumbo v0, "14189"
+    const-string/jumbo v0, "14190"
+    const-string/jumbo v0, "14191"
+    const-string/jumbo v0, "14192"
+    const-string/jumbo v0, "14193"
+    const-string/jumbo v0, "14194"
+    const-string/jumbo v0, "14195"
+    const-string/jumbo v0, "14196"
+    const-string/jumbo v0, "14197"
+    const-string/jumbo v0, "14198"
+    const-string/jumbo v0, "14199"
+    const-string/jumbo v0, "14200"
+    const-string/jumbo v0, "14201"
+    const-string/jumbo v0, "14202"
+    const-string/jumbo v0, "14203"
+    const-string/jumbo v0, "14204"
+    const-string/jumbo v0, "14205"
+    const-string/jumbo v0, "14206"
+    const-string/jumbo v0, "14207"
+    const-string/jumbo v0, "14208"
+    const-string/jumbo v0, "14209"
+    const-string/jumbo v0, "14210"
+    const-string/jumbo v0, "14211"
+    const-string/jumbo v0, "14212"
+    const-string/jumbo v0, "14213"
+    const-string/jumbo v0, "14214"
+    const-string/jumbo v0, "14215"
+    const-string/jumbo v0, "14216"
+    const-string/jumbo v0, "14217"
+    const-string/jumbo v0, "14218"
+    const-string/jumbo v0, "14219"
+    const-string/jumbo v0, "14220"
+    const-string/jumbo v0, "14221"
+    const-string/jumbo v0, "14222"
+    const-string/jumbo v0, "14223"
+    const-string/jumbo v0, "14224"
+    const-string/jumbo v0, "14225"
+    const-string/jumbo v0, "14226"
+    const-string/jumbo v0, "14227"
+    const-string/jumbo v0, "14228"
+    const-string/jumbo v0, "14229"
+    const-string/jumbo v0, "14230"
+    const-string/jumbo v0, "14231"
+    const-string/jumbo v0, "14232"
+    const-string/jumbo v0, "14233"
+    const-string/jumbo v0, "14234"
+    const-string/jumbo v0, "14235"
+    const-string/jumbo v0, "14236"
+    const-string/jumbo v0, "14237"
+    const-string/jumbo v0, "14238"
+    const-string/jumbo v0, "14239"
+    const-string/jumbo v0, "14240"
+    const-string/jumbo v0, "14241"
+    const-string/jumbo v0, "14242"
+    const-string/jumbo v0, "14243"
+    const-string/jumbo v0, "14244"
+    const-string/jumbo v0, "14245"
+    const-string/jumbo v0, "14246"
+    const-string/jumbo v0, "14247"
+    const-string/jumbo v0, "14248"
+    const-string/jumbo v0, "14249"
+    const-string/jumbo v0, "14250"
+    const-string/jumbo v0, "14251"
+    const-string/jumbo v0, "14252"
+    const-string/jumbo v0, "14253"
+    const-string/jumbo v0, "14254"
+    const-string/jumbo v0, "14255"
+    const-string/jumbo v0, "14256"
+    const-string/jumbo v0, "14257"
+    const-string/jumbo v0, "14258"
+    const-string/jumbo v0, "14259"
+    const-string/jumbo v0, "14260"
+    const-string/jumbo v0, "14261"
+    const-string/jumbo v0, "14262"
+    const-string/jumbo v0, "14263"
+    const-string/jumbo v0, "14264"
+    const-string/jumbo v0, "14265"
+    const-string/jumbo v0, "14266"
+    const-string/jumbo v0, "14267"
+    const-string/jumbo v0, "14268"
+    const-string/jumbo v0, "14269"
+    const-string/jumbo v0, "14270"
+    const-string/jumbo v0, "14271"
+    const-string/jumbo v0, "14272"
+    const-string/jumbo v0, "14273"
+    const-string/jumbo v0, "14274"
+    const-string/jumbo v0, "14275"
+    const-string/jumbo v0, "14276"
+    const-string/jumbo v0, "14277"
+    const-string/jumbo v0, "14278"
+    const-string/jumbo v0, "14279"
+    const-string/jumbo v0, "14280"
+    const-string/jumbo v0, "14281"
+    const-string/jumbo v0, "14282"
+    const-string/jumbo v0, "14283"
+    const-string/jumbo v0, "14284"
+    const-string/jumbo v0, "14285"
+    const-string/jumbo v0, "14286"
+    const-string/jumbo v0, "14287"
+    const-string/jumbo v0, "14288"
+    const-string/jumbo v0, "14289"
+    const-string/jumbo v0, "14290"
+    const-string/jumbo v0, "14291"
+    const-string/jumbo v0, "14292"
+    const-string/jumbo v0, "14293"
+    const-string/jumbo v0, "14294"
+    const-string/jumbo v0, "14295"
+    const-string/jumbo v0, "14296"
+    const-string/jumbo v0, "14297"
+    const-string/jumbo v0, "14298"
+    const-string/jumbo v0, "14299"
+    const-string/jumbo v0, "14300"
+    const-string/jumbo v0, "14301"
+    const-string/jumbo v0, "14302"
+    const-string/jumbo v0, "14303"
+    const-string/jumbo v0, "14304"
+    const-string/jumbo v0, "14305"
+    const-string/jumbo v0, "14306"
+    const-string/jumbo v0, "14307"
+    const-string/jumbo v0, "14308"
+    const-string/jumbo v0, "14309"
+    const-string/jumbo v0, "14310"
+    const-string/jumbo v0, "14311"
+    const-string/jumbo v0, "14312"
+    const-string/jumbo v0, "14313"
+    const-string/jumbo v0, "14314"
+    const-string/jumbo v0, "14315"
+    const-string/jumbo v0, "14316"
+    const-string/jumbo v0, "14317"
+    const-string/jumbo v0, "14318"
+    const-string/jumbo v0, "14319"
+    const-string/jumbo v0, "14320"
+    const-string/jumbo v0, "14321"
+    const-string/jumbo v0, "14322"
+    const-string/jumbo v0, "14323"
+    const-string/jumbo v0, "14324"
+    const-string/jumbo v0, "14325"
+    const-string/jumbo v0, "14326"
+    const-string/jumbo v0, "14327"
+    const-string/jumbo v0, "14328"
+    const-string/jumbo v0, "14329"
+    const-string/jumbo v0, "14330"
+    const-string/jumbo v0, "14331"
+    const-string/jumbo v0, "14332"
+    const-string/jumbo v0, "14333"
+    const-string/jumbo v0, "14334"
+    const-string/jumbo v0, "14335"
+    const-string/jumbo v0, "14336"
+    const-string/jumbo v0, "14337"
+    const-string/jumbo v0, "14338"
+    const-string/jumbo v0, "14339"
+    const-string/jumbo v0, "14340"
+    const-string/jumbo v0, "14341"
+    const-string/jumbo v0, "14342"
+    const-string/jumbo v0, "14343"
+    const-string/jumbo v0, "14344"
+    const-string/jumbo v0, "14345"
+    const-string/jumbo v0, "14346"
+    const-string/jumbo v0, "14347"
+    const-string/jumbo v0, "14348"
+    const-string/jumbo v0, "14349"
+    const-string/jumbo v0, "14350"
+    const-string/jumbo v0, "14351"
+    const-string/jumbo v0, "14352"
+    const-string/jumbo v0, "14353"
+    const-string/jumbo v0, "14354"
+    const-string/jumbo v0, "14355"
+    const-string/jumbo v0, "14356"
+    const-string/jumbo v0, "14357"
+    const-string/jumbo v0, "14358"
+    const-string/jumbo v0, "14359"
+    const-string/jumbo v0, "14360"
+    const-string/jumbo v0, "14361"
+    const-string/jumbo v0, "14362"
+    const-string/jumbo v0, "14363"
+    const-string/jumbo v0, "14364"
+    const-string/jumbo v0, "14365"
+    const-string/jumbo v0, "14366"
+    const-string/jumbo v0, "14367"
+    const-string/jumbo v0, "14368"
+    const-string/jumbo v0, "14369"
+    const-string/jumbo v0, "14370"
+    const-string/jumbo v0, "14371"
+    const-string/jumbo v0, "14372"
+    const-string/jumbo v0, "14373"
+    const-string/jumbo v0, "14374"
+    const-string/jumbo v0, "14375"
+    const-string/jumbo v0, "14376"
+    const-string/jumbo v0, "14377"
+    const-string/jumbo v0, "14378"
+    const-string/jumbo v0, "14379"
+    const-string/jumbo v0, "14380"
+    const-string/jumbo v0, "14381"
+    const-string/jumbo v0, "14382"
+    const-string/jumbo v0, "14383"
+    const-string/jumbo v0, "14384"
+    const-string/jumbo v0, "14385"
+    const-string/jumbo v0, "14386"
+    const-string/jumbo v0, "14387"
+    const-string/jumbo v0, "14388"
+    const-string/jumbo v0, "14389"
+    const-string/jumbo v0, "14390"
+    const-string/jumbo v0, "14391"
+    const-string/jumbo v0, "14392"
+    const-string/jumbo v0, "14393"
+    const-string/jumbo v0, "14394"
+    const-string/jumbo v0, "14395"
+    const-string/jumbo v0, "14396"
+    const-string/jumbo v0, "14397"
+    const-string/jumbo v0, "14398"
+    const-string/jumbo v0, "14399"
+    const-string/jumbo v0, "14400"
+    const-string/jumbo v0, "14401"
+    const-string/jumbo v0, "14402"
+    const-string/jumbo v0, "14403"
+    const-string/jumbo v0, "14404"
+    const-string/jumbo v0, "14405"
+    const-string/jumbo v0, "14406"
+    const-string/jumbo v0, "14407"
+    const-string/jumbo v0, "14408"
+    const-string/jumbo v0, "14409"
+    const-string/jumbo v0, "14410"
+    const-string/jumbo v0, "14411"
+    const-string/jumbo v0, "14412"
+    const-string/jumbo v0, "14413"
+    const-string/jumbo v0, "14414"
+    const-string/jumbo v0, "14415"
+    const-string/jumbo v0, "14416"
+    const-string/jumbo v0, "14417"
+    const-string/jumbo v0, "14418"
+    const-string/jumbo v0, "14419"
+    const-string/jumbo v0, "14420"
+    const-string/jumbo v0, "14421"
+    const-string/jumbo v0, "14422"
+    const-string/jumbo v0, "14423"
+    const-string/jumbo v0, "14424"
+    const-string/jumbo v0, "14425"
+    const-string/jumbo v0, "14426"
+    const-string/jumbo v0, "14427"
+    const-string/jumbo v0, "14428"
+    const-string/jumbo v0, "14429"
+    const-string/jumbo v0, "14430"
+    const-string/jumbo v0, "14431"
+    const-string/jumbo v0, "14432"
+    const-string/jumbo v0, "14433"
+    const-string/jumbo v0, "14434"
+    const-string/jumbo v0, "14435"
+    const-string/jumbo v0, "14436"
+    const-string/jumbo v0, "14437"
+    const-string/jumbo v0, "14438"
+    const-string/jumbo v0, "14439"
+    const-string/jumbo v0, "14440"
+    const-string/jumbo v0, "14441"
+    const-string/jumbo v0, "14442"
+    const-string/jumbo v0, "14443"
+    const-string/jumbo v0, "14444"
+    const-string/jumbo v0, "14445"
+    const-string/jumbo v0, "14446"
+    const-string/jumbo v0, "14447"
+    const-string/jumbo v0, "14448"
+    const-string/jumbo v0, "14449"
+    const-string/jumbo v0, "14450"
+    const-string/jumbo v0, "14451"
+    const-string/jumbo v0, "14452"
+    const-string/jumbo v0, "14453"
+    const-string/jumbo v0, "14454"
+    const-string/jumbo v0, "14455"
+    const-string/jumbo v0, "14456"
+    const-string/jumbo v0, "14457"
+    const-string/jumbo v0, "14458"
+    const-string/jumbo v0, "14459"
+    const-string/jumbo v0, "14460"
+    const-string/jumbo v0, "14461"
+    const-string/jumbo v0, "14462"
+    const-string/jumbo v0, "14463"
+    const-string/jumbo v0, "14464"
+    const-string/jumbo v0, "14465"
+    const-string/jumbo v0, "14466"
+    const-string/jumbo v0, "14467"
+    const-string/jumbo v0, "14468"
+    const-string/jumbo v0, "14469"
+    const-string/jumbo v0, "14470"
+    const-string/jumbo v0, "14471"
+    const-string/jumbo v0, "14472"
+    const-string/jumbo v0, "14473"
+    const-string/jumbo v0, "14474"
+    const-string/jumbo v0, "14475"
+    const-string/jumbo v0, "14476"
+    const-string/jumbo v0, "14477"
+    const-string/jumbo v0, "14478"
+    const-string/jumbo v0, "14479"
+    const-string/jumbo v0, "14480"
+    const-string/jumbo v0, "14481"
+    const-string/jumbo v0, "14482"
+    const-string/jumbo v0, "14483"
+    const-string/jumbo v0, "14484"
+    const-string/jumbo v0, "14485"
+    const-string/jumbo v0, "14486"
+    const-string/jumbo v0, "14487"
+    const-string/jumbo v0, "14488"
+    const-string/jumbo v0, "14489"
+    const-string/jumbo v0, "14490"
+    const-string/jumbo v0, "14491"
+    const-string/jumbo v0, "14492"
+    const-string/jumbo v0, "14493"
+    const-string/jumbo v0, "14494"
+    const-string/jumbo v0, "14495"
+    const-string/jumbo v0, "14496"
+    const-string/jumbo v0, "14497"
+    const-string/jumbo v0, "14498"
+    const-string/jumbo v0, "14499"
+    const-string/jumbo v0, "14500"
+    const-string/jumbo v0, "14501"
+    const-string/jumbo v0, "14502"
+    const-string/jumbo v0, "14503"
+    const-string/jumbo v0, "14504"
+    const-string/jumbo v0, "14505"
+    const-string/jumbo v0, "14506"
+    const-string/jumbo v0, "14507"
+    const-string/jumbo v0, "14508"
+    const-string/jumbo v0, "14509"
+    const-string/jumbo v0, "14510"
+    const-string/jumbo v0, "14511"
+    const-string/jumbo v0, "14512"
+    const-string/jumbo v0, "14513"
+    const-string/jumbo v0, "14514"
+    const-string/jumbo v0, "14515"
+    const-string/jumbo v0, "14516"
+    const-string/jumbo v0, "14517"
+    const-string/jumbo v0, "14518"
+    const-string/jumbo v0, "14519"
+    const-string/jumbo v0, "14520"
+    const-string/jumbo v0, "14521"
+    const-string/jumbo v0, "14522"
+    const-string/jumbo v0, "14523"
+    const-string/jumbo v0, "14524"
+    const-string/jumbo v0, "14525"
+    const-string/jumbo v0, "14526"
+    const-string/jumbo v0, "14527"
+    const-string/jumbo v0, "14528"
+    const-string/jumbo v0, "14529"
+    const-string/jumbo v0, "14530"
+    const-string/jumbo v0, "14531"
+    const-string/jumbo v0, "14532"
+    const-string/jumbo v0, "14533"
+    const-string/jumbo v0, "14534"
+    const-string/jumbo v0, "14535"
+    const-string/jumbo v0, "14536"
+    const-string/jumbo v0, "14537"
+    const-string/jumbo v0, "14538"
+    const-string/jumbo v0, "14539"
+    const-string/jumbo v0, "14540"
+    const-string/jumbo v0, "14541"
+    const-string/jumbo v0, "14542"
+    const-string/jumbo v0, "14543"
+    const-string/jumbo v0, "14544"
+    const-string/jumbo v0, "14545"
+    const-string/jumbo v0, "14546"
+    const-string/jumbo v0, "14547"
+    const-string/jumbo v0, "14548"
+    const-string/jumbo v0, "14549"
+    const-string/jumbo v0, "14550"
+    const-string/jumbo v0, "14551"
+    const-string/jumbo v0, "14552"
+    const-string/jumbo v0, "14553"
+    const-string/jumbo v0, "14554"
+    const-string/jumbo v0, "14555"
+    const-string/jumbo v0, "14556"
+    const-string/jumbo v0, "14557"
+    const-string/jumbo v0, "14558"
+    const-string/jumbo v0, "14559"
+    const-string/jumbo v0, "14560"
+    const-string/jumbo v0, "14561"
+    const-string/jumbo v0, "14562"
+    const-string/jumbo v0, "14563"
+    const-string/jumbo v0, "14564"
+    const-string/jumbo v0, "14565"
+    const-string/jumbo v0, "14566"
+    const-string/jumbo v0, "14567"
+    const-string/jumbo v0, "14568"
+    const-string/jumbo v0, "14569"
+    const-string/jumbo v0, "14570"
+    const-string/jumbo v0, "14571"
+    const-string/jumbo v0, "14572"
+    const-string/jumbo v0, "14573"
+    const-string/jumbo v0, "14574"
+    const-string/jumbo v0, "14575"
+    const-string/jumbo v0, "14576"
+    const-string/jumbo v0, "14577"
+    const-string/jumbo v0, "14578"
+    const-string/jumbo v0, "14579"
+    const-string/jumbo v0, "14580"
+    const-string/jumbo v0, "14581"
+    const-string/jumbo v0, "14582"
+    const-string/jumbo v0, "14583"
+    const-string/jumbo v0, "14584"
+    const-string/jumbo v0, "14585"
+    const-string/jumbo v0, "14586"
+    const-string/jumbo v0, "14587"
+    const-string/jumbo v0, "14588"
+    const-string/jumbo v0, "14589"
+    const-string/jumbo v0, "14590"
+    const-string/jumbo v0, "14591"
+    const-string/jumbo v0, "14592"
+    const-string/jumbo v0, "14593"
+    const-string/jumbo v0, "14594"
+    const-string/jumbo v0, "14595"
+    const-string/jumbo v0, "14596"
+    const-string/jumbo v0, "14597"
+    const-string/jumbo v0, "14598"
+    const-string/jumbo v0, "14599"
+    const-string/jumbo v0, "14600"
+    const-string/jumbo v0, "14601"
+    const-string/jumbo v0, "14602"
+    const-string/jumbo v0, "14603"
+    const-string/jumbo v0, "14604"
+    const-string/jumbo v0, "14605"
+    const-string/jumbo v0, "14606"
+    const-string/jumbo v0, "14607"
+    const-string/jumbo v0, "14608"
+    const-string/jumbo v0, "14609"
+    const-string/jumbo v0, "14610"
+    const-string/jumbo v0, "14611"
+    const-string/jumbo v0, "14612"
+    const-string/jumbo v0, "14613"
+    const-string/jumbo v0, "14614"
+    const-string/jumbo v0, "14615"
+    const-string/jumbo v0, "14616"
+    const-string/jumbo v0, "14617"
+    const-string/jumbo v0, "14618"
+    const-string/jumbo v0, "14619"
+    const-string/jumbo v0, "14620"
+    const-string/jumbo v0, "14621"
+    const-string/jumbo v0, "14622"
+    const-string/jumbo v0, "14623"
+    const-string/jumbo v0, "14624"
+    const-string/jumbo v0, "14625"
+    const-string/jumbo v0, "14626"
+    const-string/jumbo v0, "14627"
+    const-string/jumbo v0, "14628"
+    const-string/jumbo v0, "14629"
+    const-string/jumbo v0, "14630"
+    const-string/jumbo v0, "14631"
+    const-string/jumbo v0, "14632"
+    const-string/jumbo v0, "14633"
+    const-string/jumbo v0, "14634"
+    const-string/jumbo v0, "14635"
+    const-string/jumbo v0, "14636"
+    const-string/jumbo v0, "14637"
+    const-string/jumbo v0, "14638"
+    const-string/jumbo v0, "14639"
+    const-string/jumbo v0, "14640"
+    const-string/jumbo v0, "14641"
+    const-string/jumbo v0, "14642"
+    const-string/jumbo v0, "14643"
+    const-string/jumbo v0, "14644"
+    const-string/jumbo v0, "14645"
+    const-string/jumbo v0, "14646"
+    const-string/jumbo v0, "14647"
+    const-string/jumbo v0, "14648"
+    const-string/jumbo v0, "14649"
+    const-string/jumbo v0, "14650"
+    const-string/jumbo v0, "14651"
+    const-string/jumbo v0, "14652"
+    const-string/jumbo v0, "14653"
+    const-string/jumbo v0, "14654"
+    const-string/jumbo v0, "14655"
+    const-string/jumbo v0, "14656"
+    const-string/jumbo v0, "14657"
+    const-string/jumbo v0, "14658"
+    const-string/jumbo v0, "14659"
+    const-string/jumbo v0, "14660"
+    const-string/jumbo v0, "14661"
+    const-string/jumbo v0, "14662"
+    const-string/jumbo v0, "14663"
+    const-string/jumbo v0, "14664"
+    const-string/jumbo v0, "14665"
+    const-string/jumbo v0, "14666"
+    const-string/jumbo v0, "14667"
+    const-string/jumbo v0, "14668"
+    const-string/jumbo v0, "14669"
+    const-string/jumbo v0, "14670"
+    const-string/jumbo v0, "14671"
+    const-string/jumbo v0, "14672"
+    const-string/jumbo v0, "14673"
+    const-string/jumbo v0, "14674"
+    const-string/jumbo v0, "14675"
+    const-string/jumbo v0, "14676"
+    const-string/jumbo v0, "14677"
+    const-string/jumbo v0, "14678"
+    const-string/jumbo v0, "14679"
+    const-string/jumbo v0, "14680"
+    const-string/jumbo v0, "14681"
+    const-string/jumbo v0, "14682"
+    const-string/jumbo v0, "14683"
+    const-string/jumbo v0, "14684"
+    const-string/jumbo v0, "14685"
+    const-string/jumbo v0, "14686"
+    const-string/jumbo v0, "14687"
+    const-string/jumbo v0, "14688"
+    const-string/jumbo v0, "14689"
+    const-string/jumbo v0, "14690"
+    const-string/jumbo v0, "14691"
+    const-string/jumbo v0, "14692"
+    const-string/jumbo v0, "14693"
+    const-string/jumbo v0, "14694"
+    const-string/jumbo v0, "14695"
+    const-string/jumbo v0, "14696"
+    const-string/jumbo v0, "14697"
+    const-string/jumbo v0, "14698"
+    const-string/jumbo v0, "14699"
+    const-string/jumbo v0, "14700"
+    const-string/jumbo v0, "14701"
+    const-string/jumbo v0, "14702"
+    const-string/jumbo v0, "14703"
+    const-string/jumbo v0, "14704"
+    const-string/jumbo v0, "14705"
+    const-string/jumbo v0, "14706"
+    const-string/jumbo v0, "14707"
+    const-string/jumbo v0, "14708"
+    const-string/jumbo v0, "14709"
+    const-string/jumbo v0, "14710"
+    const-string/jumbo v0, "14711"
+    const-string/jumbo v0, "14712"
+    const-string/jumbo v0, "14713"
+    const-string/jumbo v0, "14714"
+    const-string/jumbo v0, "14715"
+    const-string/jumbo v0, "14716"
+    const-string/jumbo v0, "14717"
+    const-string/jumbo v0, "14718"
+    const-string/jumbo v0, "14719"
+    const-string/jumbo v0, "14720"
+    const-string/jumbo v0, "14721"
+    const-string/jumbo v0, "14722"
+    const-string/jumbo v0, "14723"
+    const-string/jumbo v0, "14724"
+    const-string/jumbo v0, "14725"
+    const-string/jumbo v0, "14726"
+    const-string/jumbo v0, "14727"
+    const-string/jumbo v0, "14728"
+    const-string/jumbo v0, "14729"
+    const-string/jumbo v0, "14730"
+    const-string/jumbo v0, "14731"
+    const-string/jumbo v0, "14732"
+    const-string/jumbo v0, "14733"
+    const-string/jumbo v0, "14734"
+    const-string/jumbo v0, "14735"
+    const-string/jumbo v0, "14736"
+    const-string/jumbo v0, "14737"
+    const-string/jumbo v0, "14738"
+    const-string/jumbo v0, "14739"
+    const-string/jumbo v0, "14740"
+    const-string/jumbo v0, "14741"
+    const-string/jumbo v0, "14742"
+    const-string/jumbo v0, "14743"
+    const-string/jumbo v0, "14744"
+    const-string/jumbo v0, "14745"
+    const-string/jumbo v0, "14746"
+    const-string/jumbo v0, "14747"
+    const-string/jumbo v0, "14748"
+    const-string/jumbo v0, "14749"
+    const-string/jumbo v0, "14750"
+    const-string/jumbo v0, "14751"
+    const-string/jumbo v0, "14752"
+    const-string/jumbo v0, "14753"
+    const-string/jumbo v0, "14754"
+    const-string/jumbo v0, "14755"
+    const-string/jumbo v0, "14756"
+    const-string/jumbo v0, "14757"
+    const-string/jumbo v0, "14758"
+    const-string/jumbo v0, "14759"
+    const-string/jumbo v0, "14760"
+    const-string/jumbo v0, "14761"
+    const-string/jumbo v0, "14762"
+    const-string/jumbo v0, "14763"
+    const-string/jumbo v0, "14764"
+    const-string/jumbo v0, "14765"
+    const-string/jumbo v0, "14766"
+    const-string/jumbo v0, "14767"
+    const-string/jumbo v0, "14768"
+    const-string/jumbo v0, "14769"
+    const-string/jumbo v0, "14770"
+    const-string/jumbo v0, "14771"
+    const-string/jumbo v0, "14772"
+    const-string/jumbo v0, "14773"
+    const-string/jumbo v0, "14774"
+    const-string/jumbo v0, "14775"
+    const-string/jumbo v0, "14776"
+    const-string/jumbo v0, "14777"
+    const-string/jumbo v0, "14778"
+    const-string/jumbo v0, "14779"
+    const-string/jumbo v0, "14780"
+    const-string/jumbo v0, "14781"
+    const-string/jumbo v0, "14782"
+    const-string/jumbo v0, "14783"
+    const-string/jumbo v0, "14784"
+    const-string/jumbo v0, "14785"
+    const-string/jumbo v0, "14786"
+    const-string/jumbo v0, "14787"
+    const-string/jumbo v0, "14788"
+    const-string/jumbo v0, "14789"
+    const-string/jumbo v0, "14790"
+    const-string/jumbo v0, "14791"
+    const-string/jumbo v0, "14792"
+    const-string/jumbo v0, "14793"
+    const-string/jumbo v0, "14794"
+    const-string/jumbo v0, "14795"
+    const-string/jumbo v0, "14796"
+    const-string/jumbo v0, "14797"
+    const-string/jumbo v0, "14798"
+    const-string/jumbo v0, "14799"
+    const-string/jumbo v0, "14800"
+    const-string/jumbo v0, "14801"
+    const-string/jumbo v0, "14802"
+    const-string/jumbo v0, "14803"
+    const-string/jumbo v0, "14804"
+    const-string/jumbo v0, "14805"
+    const-string/jumbo v0, "14806"
+    const-string/jumbo v0, "14807"
+    const-string/jumbo v0, "14808"
+    const-string/jumbo v0, "14809"
+    const-string/jumbo v0, "14810"
+    const-string/jumbo v0, "14811"
+    const-string/jumbo v0, "14812"
+    const-string/jumbo v0, "14813"
+    const-string/jumbo v0, "14814"
+    const-string/jumbo v0, "14815"
+    const-string/jumbo v0, "14816"
+    const-string/jumbo v0, "14817"
+    const-string/jumbo v0, "14818"
+    const-string/jumbo v0, "14819"
+    const-string/jumbo v0, "14820"
+    const-string/jumbo v0, "14821"
+    const-string/jumbo v0, "14822"
+    const-string/jumbo v0, "14823"
+    const-string/jumbo v0, "14824"
+    const-string/jumbo v0, "14825"
+    const-string/jumbo v0, "14826"
+    const-string/jumbo v0, "14827"
+    const-string/jumbo v0, "14828"
+    const-string/jumbo v0, "14829"
+    const-string/jumbo v0, "14830"
+    const-string/jumbo v0, "14831"
+    const-string/jumbo v0, "14832"
+    const-string/jumbo v0, "14833"
+    const-string/jumbo v0, "14834"
+    const-string/jumbo v0, "14835"
+    const-string/jumbo v0, "14836"
+    const-string/jumbo v0, "14837"
+    const-string/jumbo v0, "14838"
+    const-string/jumbo v0, "14839"
+    const-string/jumbo v0, "14840"
+    const-string/jumbo v0, "14841"
+    const-string/jumbo v0, "14842"
+    const-string/jumbo v0, "14843"
+    const-string/jumbo v0, "14844"
+    const-string/jumbo v0, "14845"
+    const-string/jumbo v0, "14846"
+    const-string/jumbo v0, "14847"
+    const-string/jumbo v0, "14848"
+    const-string/jumbo v0, "14849"
+    const-string/jumbo v0, "14850"
+    const-string/jumbo v0, "14851"
+    const-string/jumbo v0, "14852"
+    const-string/jumbo v0, "14853"
+    const-string/jumbo v0, "14854"
+    const-string/jumbo v0, "14855"
+    const-string/jumbo v0, "14856"
+    const-string/jumbo v0, "14857"
+    const-string/jumbo v0, "14858"
+    const-string/jumbo v0, "14859"
+    const-string/jumbo v0, "14860"
+    const-string/jumbo v0, "14861"
+    const-string/jumbo v0, "14862"
+    const-string/jumbo v0, "14863"
+    const-string/jumbo v0, "14864"
+    const-string/jumbo v0, "14865"
+    const-string/jumbo v0, "14866"
+    const-string/jumbo v0, "14867"
+    const-string/jumbo v0, "14868"
+    const-string/jumbo v0, "14869"
+    const-string/jumbo v0, "14870"
+    const-string/jumbo v0, "14871"
+    const-string/jumbo v0, "14872"
+    const-string/jumbo v0, "14873"
+    const-string/jumbo v0, "14874"
+    const-string/jumbo v0, "14875"
+    const-string/jumbo v0, "14876"
+    const-string/jumbo v0, "14877"
+    const-string/jumbo v0, "14878"
+    const-string/jumbo v0, "14879"
+    const-string/jumbo v0, "14880"
+    const-string/jumbo v0, "14881"
+    const-string/jumbo v0, "14882"
+    const-string/jumbo v0, "14883"
+    const-string/jumbo v0, "14884"
+    const-string/jumbo v0, "14885"
+    const-string/jumbo v0, "14886"
+    const-string/jumbo v0, "14887"
+    const-string/jumbo v0, "14888"
+    const-string/jumbo v0, "14889"
+    const-string/jumbo v0, "14890"
+    const-string/jumbo v0, "14891"
+    const-string/jumbo v0, "14892"
+    const-string/jumbo v0, "14893"
+    const-string/jumbo v0, "14894"
+    const-string/jumbo v0, "14895"
+    const-string/jumbo v0, "14896"
+    const-string/jumbo v0, "14897"
+    const-string/jumbo v0, "14898"
+    const-string/jumbo v0, "14899"
+    const-string/jumbo v0, "14900"
+    const-string/jumbo v0, "14901"
+    const-string/jumbo v0, "14902"
+    const-string/jumbo v0, "14903"
+    const-string/jumbo v0, "14904"
+    const-string/jumbo v0, "14905"
+    const-string/jumbo v0, "14906"
+    const-string/jumbo v0, "14907"
+    const-string/jumbo v0, "14908"
+    const-string/jumbo v0, "14909"
+    const-string/jumbo v0, "14910"
+    const-string/jumbo v0, "14911"
+    const-string/jumbo v0, "14912"
+    const-string/jumbo v0, "14913"
+    const-string/jumbo v0, "14914"
+    const-string/jumbo v0, "14915"
+    const-string/jumbo v0, "14916"
+    const-string/jumbo v0, "14917"
+    const-string/jumbo v0, "14918"
+    const-string/jumbo v0, "14919"
+    const-string/jumbo v0, "14920"
+    const-string/jumbo v0, "14921"
+    const-string/jumbo v0, "14922"
+    const-string/jumbo v0, "14923"
+    const-string/jumbo v0, "14924"
+    const-string/jumbo v0, "14925"
+    const-string/jumbo v0, "14926"
+    const-string/jumbo v0, "14927"
+    const-string/jumbo v0, "14928"
+    const-string/jumbo v0, "14929"
+    const-string/jumbo v0, "14930"
+    const-string/jumbo v0, "14931"
+    const-string/jumbo v0, "14932"
+    const-string/jumbo v0, "14933"
+    const-string/jumbo v0, "14934"
+    const-string/jumbo v0, "14935"
+    const-string/jumbo v0, "14936"
+    const-string/jumbo v0, "14937"
+    const-string/jumbo v0, "14938"
+    const-string/jumbo v0, "14939"
+    const-string/jumbo v0, "14940"
+    const-string/jumbo v0, "14941"
+    const-string/jumbo v0, "14942"
+    const-string/jumbo v0, "14943"
+    const-string/jumbo v0, "14944"
+    const-string/jumbo v0, "14945"
+    const-string/jumbo v0, "14946"
+    const-string/jumbo v0, "14947"
+    const-string/jumbo v0, "14948"
+    const-string/jumbo v0, "14949"
+    const-string/jumbo v0, "14950"
+    const-string/jumbo v0, "14951"
+    const-string/jumbo v0, "14952"
+    const-string/jumbo v0, "14953"
+    const-string/jumbo v0, "14954"
+    const-string/jumbo v0, "14955"
+    const-string/jumbo v0, "14956"
+    const-string/jumbo v0, "14957"
+    const-string/jumbo v0, "14958"
+    const-string/jumbo v0, "14959"
+    const-string/jumbo v0, "14960"
+    const-string/jumbo v0, "14961"
+    const-string/jumbo v0, "14962"
+    const-string/jumbo v0, "14963"
+    const-string/jumbo v0, "14964"
+    const-string/jumbo v0, "14965"
+    const-string/jumbo v0, "14966"
+    const-string/jumbo v0, "14967"
+    const-string/jumbo v0, "14968"
+    const-string/jumbo v0, "14969"
+    const-string/jumbo v0, "14970"
+    const-string/jumbo v0, "14971"
+    const-string/jumbo v0, "14972"
+    const-string/jumbo v0, "14973"
+    const-string/jumbo v0, "14974"
+    const-string/jumbo v0, "14975"
+    const-string/jumbo v0, "14976"
+    const-string/jumbo v0, "14977"
+    const-string/jumbo v0, "14978"
+    const-string/jumbo v0, "14979"
+    const-string/jumbo v0, "14980"
+    const-string/jumbo v0, "14981"
+    const-string/jumbo v0, "14982"
+    const-string/jumbo v0, "14983"
+    const-string/jumbo v0, "14984"
+    const-string/jumbo v0, "14985"
+    const-string/jumbo v0, "14986"
+    const-string/jumbo v0, "14987"
+    const-string/jumbo v0, "14988"
+    const-string/jumbo v0, "14989"
+    const-string/jumbo v0, "14990"
+    const-string/jumbo v0, "14991"
+    const-string/jumbo v0, "14992"
+    const-string/jumbo v0, "14993"
+    const-string/jumbo v0, "14994"
+    const-string/jumbo v0, "14995"
+    const-string/jumbo v0, "14996"
+    const-string/jumbo v0, "14997"
+    const-string/jumbo v0, "14998"
+    const-string/jumbo v0, "14999"
+    const-string/jumbo v0, "15000"
+    const-string/jumbo v0, "15001"
+    const-string/jumbo v0, "15002"
+    const-string/jumbo v0, "15003"
+    const-string/jumbo v0, "15004"
+    const-string/jumbo v0, "15005"
+    const-string/jumbo v0, "15006"
+    const-string/jumbo v0, "15007"
+    const-string/jumbo v0, "15008"
+    const-string/jumbo v0, "15009"
+    const-string/jumbo v0, "15010"
+    const-string/jumbo v0, "15011"
+    const-string/jumbo v0, "15012"
+    const-string/jumbo v0, "15013"
+    const-string/jumbo v0, "15014"
+    const-string/jumbo v0, "15015"
+    const-string/jumbo v0, "15016"
+    const-string/jumbo v0, "15017"
+    const-string/jumbo v0, "15018"
+    const-string/jumbo v0, "15019"
+    const-string/jumbo v0, "15020"
+    const-string/jumbo v0, "15021"
+    const-string/jumbo v0, "15022"
+    const-string/jumbo v0, "15023"
+    const-string/jumbo v0, "15024"
+    const-string/jumbo v0, "15025"
+    const-string/jumbo v0, "15026"
+    const-string/jumbo v0, "15027"
+    const-string/jumbo v0, "15028"
+    const-string/jumbo v0, "15029"
+    const-string/jumbo v0, "15030"
+    const-string/jumbo v0, "15031"
+    const-string/jumbo v0, "15032"
+    const-string/jumbo v0, "15033"
+    const-string/jumbo v0, "15034"
+    const-string/jumbo v0, "15035"
+    const-string/jumbo v0, "15036"
+    const-string/jumbo v0, "15037"
+    const-string/jumbo v0, "15038"
+    const-string/jumbo v0, "15039"
+    const-string/jumbo v0, "15040"
+    const-string/jumbo v0, "15041"
+    const-string/jumbo v0, "15042"
+    const-string/jumbo v0, "15043"
+    const-string/jumbo v0, "15044"
+    const-string/jumbo v0, "15045"
+    const-string/jumbo v0, "15046"
+    const-string/jumbo v0, "15047"
+    const-string/jumbo v0, "15048"
+    const-string/jumbo v0, "15049"
+    const-string/jumbo v0, "15050"
+    const-string/jumbo v0, "15051"
+    const-string/jumbo v0, "15052"
+    const-string/jumbo v0, "15053"
+    const-string/jumbo v0, "15054"
+    const-string/jumbo v0, "15055"
+    const-string/jumbo v0, "15056"
+    const-string/jumbo v0, "15057"
+    const-string/jumbo v0, "15058"
+    const-string/jumbo v0, "15059"
+    const-string/jumbo v0, "15060"
+    const-string/jumbo v0, "15061"
+    const-string/jumbo v0, "15062"
+    const-string/jumbo v0, "15063"
+    const-string/jumbo v0, "15064"
+    const-string/jumbo v0, "15065"
+    const-string/jumbo v0, "15066"
+    const-string/jumbo v0, "15067"
+    const-string/jumbo v0, "15068"
+    const-string/jumbo v0, "15069"
+    const-string/jumbo v0, "15070"
+    const-string/jumbo v0, "15071"
+    const-string/jumbo v0, "15072"
+    const-string/jumbo v0, "15073"
+    const-string/jumbo v0, "15074"
+    const-string/jumbo v0, "15075"
+    const-string/jumbo v0, "15076"
+    const-string/jumbo v0, "15077"
+    const-string/jumbo v0, "15078"
+    const-string/jumbo v0, "15079"
+    const-string/jumbo v0, "15080"
+    const-string/jumbo v0, "15081"
+    const-string/jumbo v0, "15082"
+    const-string/jumbo v0, "15083"
+    const-string/jumbo v0, "15084"
+    const-string/jumbo v0, "15085"
+    const-string/jumbo v0, "15086"
+    const-string/jumbo v0, "15087"
+    const-string/jumbo v0, "15088"
+    const-string/jumbo v0, "15089"
+    const-string/jumbo v0, "15090"
+    const-string/jumbo v0, "15091"
+    const-string/jumbo v0, "15092"
+    const-string/jumbo v0, "15093"
+    const-string/jumbo v0, "15094"
+    const-string/jumbo v0, "15095"
+    const-string/jumbo v0, "15096"
+    const-string/jumbo v0, "15097"
+    const-string/jumbo v0, "15098"
+    const-string/jumbo v0, "15099"
+    const-string/jumbo v0, "15100"
+    const-string/jumbo v0, "15101"
+    const-string/jumbo v0, "15102"
+    const-string/jumbo v0, "15103"
+    const-string/jumbo v0, "15104"
+    const-string/jumbo v0, "15105"
+    const-string/jumbo v0, "15106"
+    const-string/jumbo v0, "15107"
+    const-string/jumbo v0, "15108"
+    const-string/jumbo v0, "15109"
+    const-string/jumbo v0, "15110"
+    const-string/jumbo v0, "15111"
+    const-string/jumbo v0, "15112"
+    const-string/jumbo v0, "15113"
+    const-string/jumbo v0, "15114"
+    const-string/jumbo v0, "15115"
+    const-string/jumbo v0, "15116"
+    const-string/jumbo v0, "15117"
+    const-string/jumbo v0, "15118"
+    const-string/jumbo v0, "15119"
+    const-string/jumbo v0, "15120"
+    const-string/jumbo v0, "15121"
+    const-string/jumbo v0, "15122"
+    const-string/jumbo v0, "15123"
+    const-string/jumbo v0, "15124"
+    const-string/jumbo v0, "15125"
+    const-string/jumbo v0, "15126"
+    const-string/jumbo v0, "15127"
+    const-string/jumbo v0, "15128"
+    const-string/jumbo v0, "15129"
+    const-string/jumbo v0, "15130"
+    const-string/jumbo v0, "15131"
+    const-string/jumbo v0, "15132"
+    const-string/jumbo v0, "15133"
+    const-string/jumbo v0, "15134"
+    const-string/jumbo v0, "15135"
+    const-string/jumbo v0, "15136"
+    const-string/jumbo v0, "15137"
+    const-string/jumbo v0, "15138"
+    const-string/jumbo v0, "15139"
+    const-string/jumbo v0, "15140"
+    const-string/jumbo v0, "15141"
+    const-string/jumbo v0, "15142"
+    const-string/jumbo v0, "15143"
+    const-string/jumbo v0, "15144"
+    const-string/jumbo v0, "15145"
+    const-string/jumbo v0, "15146"
+    const-string/jumbo v0, "15147"
+    const-string/jumbo v0, "15148"
+    const-string/jumbo v0, "15149"
+    const-string/jumbo v0, "15150"
+    const-string/jumbo v0, "15151"
+    const-string/jumbo v0, "15152"
+    const-string/jumbo v0, "15153"
+    const-string/jumbo v0, "15154"
+    const-string/jumbo v0, "15155"
+    const-string/jumbo v0, "15156"
+    const-string/jumbo v0, "15157"
+    const-string/jumbo v0, "15158"
+    const-string/jumbo v0, "15159"
+    const-string/jumbo v0, "15160"
+    const-string/jumbo v0, "15161"
+    const-string/jumbo v0, "15162"
+    const-string/jumbo v0, "15163"
+    const-string/jumbo v0, "15164"
+    const-string/jumbo v0, "15165"
+    const-string/jumbo v0, "15166"
+    const-string/jumbo v0, "15167"
+    const-string/jumbo v0, "15168"
+    const-string/jumbo v0, "15169"
+    const-string/jumbo v0, "15170"
+    const-string/jumbo v0, "15171"
+    const-string/jumbo v0, "15172"
+    const-string/jumbo v0, "15173"
+    const-string/jumbo v0, "15174"
+    const-string/jumbo v0, "15175"
+    const-string/jumbo v0, "15176"
+    const-string/jumbo v0, "15177"
+    const-string/jumbo v0, "15178"
+    const-string/jumbo v0, "15179"
+    const-string/jumbo v0, "15180"
+    const-string/jumbo v0, "15181"
+    const-string/jumbo v0, "15182"
+    const-string/jumbo v0, "15183"
+    const-string/jumbo v0, "15184"
+    const-string/jumbo v0, "15185"
+    const-string/jumbo v0, "15186"
+    const-string/jumbo v0, "15187"
+    const-string/jumbo v0, "15188"
+    const-string/jumbo v0, "15189"
+    const-string/jumbo v0, "15190"
+    const-string/jumbo v0, "15191"
+    const-string/jumbo v0, "15192"
+    const-string/jumbo v0, "15193"
+    const-string/jumbo v0, "15194"
+    const-string/jumbo v0, "15195"
+    const-string/jumbo v0, "15196"
+    const-string/jumbo v0, "15197"
+    const-string/jumbo v0, "15198"
+    const-string/jumbo v0, "15199"
+    const-string/jumbo v0, "15200"
+    const-string/jumbo v0, "15201"
+    const-string/jumbo v0, "15202"
+    const-string/jumbo v0, "15203"
+    const-string/jumbo v0, "15204"
+    const-string/jumbo v0, "15205"
+    const-string/jumbo v0, "15206"
+    const-string/jumbo v0, "15207"
+    const-string/jumbo v0, "15208"
+    const-string/jumbo v0, "15209"
+    const-string/jumbo v0, "15210"
+    const-string/jumbo v0, "15211"
+    const-string/jumbo v0, "15212"
+    const-string/jumbo v0, "15213"
+    const-string/jumbo v0, "15214"
+    const-string/jumbo v0, "15215"
+    const-string/jumbo v0, "15216"
+    const-string/jumbo v0, "15217"
+    const-string/jumbo v0, "15218"
+    const-string/jumbo v0, "15219"
+    const-string/jumbo v0, "15220"
+    const-string/jumbo v0, "15221"
+    const-string/jumbo v0, "15222"
+    const-string/jumbo v0, "15223"
+    const-string/jumbo v0, "15224"
+    const-string/jumbo v0, "15225"
+    const-string/jumbo v0, "15226"
+    const-string/jumbo v0, "15227"
+    const-string/jumbo v0, "15228"
+    const-string/jumbo v0, "15229"
+    const-string/jumbo v0, "15230"
+    const-string/jumbo v0, "15231"
+    const-string/jumbo v0, "15232"
+    const-string/jumbo v0, "15233"
+    const-string/jumbo v0, "15234"
+    const-string/jumbo v0, "15235"
+    const-string/jumbo v0, "15236"
+    const-string/jumbo v0, "15237"
+    const-string/jumbo v0, "15238"
+    const-string/jumbo v0, "15239"
+    const-string/jumbo v0, "15240"
+    const-string/jumbo v0, "15241"
+    const-string/jumbo v0, "15242"
+    const-string/jumbo v0, "15243"
+    const-string/jumbo v0, "15244"
+    const-string/jumbo v0, "15245"
+    const-string/jumbo v0, "15246"
+    const-string/jumbo v0, "15247"
+    const-string/jumbo v0, "15248"
+    const-string/jumbo v0, "15249"
+    const-string/jumbo v0, "15250"
+    const-string/jumbo v0, "15251"
+    const-string/jumbo v0, "15252"
+    const-string/jumbo v0, "15253"
+    const-string/jumbo v0, "15254"
+    const-string/jumbo v0, "15255"
+    const-string/jumbo v0, "15256"
+    const-string/jumbo v0, "15257"
+    const-string/jumbo v0, "15258"
+    const-string/jumbo v0, "15259"
+    const-string/jumbo v0, "15260"
+    const-string/jumbo v0, "15261"
+    const-string/jumbo v0, "15262"
+    const-string/jumbo v0, "15263"
+    const-string/jumbo v0, "15264"
+    const-string/jumbo v0, "15265"
+    const-string/jumbo v0, "15266"
+    const-string/jumbo v0, "15267"
+    const-string/jumbo v0, "15268"
+    const-string/jumbo v0, "15269"
+    const-string/jumbo v0, "15270"
+    const-string/jumbo v0, "15271"
+    const-string/jumbo v0, "15272"
+    const-string/jumbo v0, "15273"
+    const-string/jumbo v0, "15274"
+    const-string/jumbo v0, "15275"
+    const-string/jumbo v0, "15276"
+    const-string/jumbo v0, "15277"
+    const-string/jumbo v0, "15278"
+    const-string/jumbo v0, "15279"
+    const-string/jumbo v0, "15280"
+    const-string/jumbo v0, "15281"
+    const-string/jumbo v0, "15282"
+    const-string/jumbo v0, "15283"
+    const-string/jumbo v0, "15284"
+    const-string/jumbo v0, "15285"
+    const-string/jumbo v0, "15286"
+    const-string/jumbo v0, "15287"
+    const-string/jumbo v0, "15288"
+    const-string/jumbo v0, "15289"
+    const-string/jumbo v0, "15290"
+    const-string/jumbo v0, "15291"
+    const-string/jumbo v0, "15292"
+    const-string/jumbo v0, "15293"
+    const-string/jumbo v0, "15294"
+    const-string/jumbo v0, "15295"
+    const-string/jumbo v0, "15296"
+    const-string/jumbo v0, "15297"
+    const-string/jumbo v0, "15298"
+    const-string/jumbo v0, "15299"
+    const-string/jumbo v0, "15300"
+    const-string/jumbo v0, "15301"
+    const-string/jumbo v0, "15302"
+    const-string/jumbo v0, "15303"
+    const-string/jumbo v0, "15304"
+    const-string/jumbo v0, "15305"
+    const-string/jumbo v0, "15306"
+    const-string/jumbo v0, "15307"
+    const-string/jumbo v0, "15308"
+    const-string/jumbo v0, "15309"
+    const-string/jumbo v0, "15310"
+    const-string/jumbo v0, "15311"
+    const-string/jumbo v0, "15312"
+    const-string/jumbo v0, "15313"
+    const-string/jumbo v0, "15314"
+    const-string/jumbo v0, "15315"
+    const-string/jumbo v0, "15316"
+    const-string/jumbo v0, "15317"
+    const-string/jumbo v0, "15318"
+    const-string/jumbo v0, "15319"
+    const-string/jumbo v0, "15320"
+    const-string/jumbo v0, "15321"
+    const-string/jumbo v0, "15322"
+    const-string/jumbo v0, "15323"
+    const-string/jumbo v0, "15324"
+    const-string/jumbo v0, "15325"
+    const-string/jumbo v0, "15326"
+    const-string/jumbo v0, "15327"
+    const-string/jumbo v0, "15328"
+    const-string/jumbo v0, "15329"
+    const-string/jumbo v0, "15330"
+    const-string/jumbo v0, "15331"
+    const-string/jumbo v0, "15332"
+    const-string/jumbo v0, "15333"
+    const-string/jumbo v0, "15334"
+    const-string/jumbo v0, "15335"
+    const-string/jumbo v0, "15336"
+    const-string/jumbo v0, "15337"
+    const-string/jumbo v0, "15338"
+    const-string/jumbo v0, "15339"
+    const-string/jumbo v0, "15340"
+    const-string/jumbo v0, "15341"
+    const-string/jumbo v0, "15342"
+    const-string/jumbo v0, "15343"
+    const-string/jumbo v0, "15344"
+    const-string/jumbo v0, "15345"
+    const-string/jumbo v0, "15346"
+    const-string/jumbo v0, "15347"
+    const-string/jumbo v0, "15348"
+    const-string/jumbo v0, "15349"
+    const-string/jumbo v0, "15350"
+    const-string/jumbo v0, "15351"
+    const-string/jumbo v0, "15352"
+    const-string/jumbo v0, "15353"
+    const-string/jumbo v0, "15354"
+    const-string/jumbo v0, "15355"
+    const-string/jumbo v0, "15356"
+    const-string/jumbo v0, "15357"
+    const-string/jumbo v0, "15358"
+    const-string/jumbo v0, "15359"
+    const-string/jumbo v0, "15360"
+    const-string/jumbo v0, "15361"
+    const-string/jumbo v0, "15362"
+    const-string/jumbo v0, "15363"
+    const-string/jumbo v0, "15364"
+    const-string/jumbo v0, "15365"
+    const-string/jumbo v0, "15366"
+    const-string/jumbo v0, "15367"
+    const-string/jumbo v0, "15368"
+    const-string/jumbo v0, "15369"
+    const-string/jumbo v0, "15370"
+    const-string/jumbo v0, "15371"
+    const-string/jumbo v0, "15372"
+    const-string/jumbo v0, "15373"
+    const-string/jumbo v0, "15374"
+    const-string/jumbo v0, "15375"
+    const-string/jumbo v0, "15376"
+    const-string/jumbo v0, "15377"
+    const-string/jumbo v0, "15378"
+    const-string/jumbo v0, "15379"
+    const-string/jumbo v0, "15380"
+    const-string/jumbo v0, "15381"
+    const-string/jumbo v0, "15382"
+    const-string/jumbo v0, "15383"
+    const-string/jumbo v0, "15384"
+    const-string/jumbo v0, "15385"
+    const-string/jumbo v0, "15386"
+    const-string/jumbo v0, "15387"
+    const-string/jumbo v0, "15388"
+    const-string/jumbo v0, "15389"
+    const-string/jumbo v0, "15390"
+    const-string/jumbo v0, "15391"
+    const-string/jumbo v0, "15392"
+    const-string/jumbo v0, "15393"
+    const-string/jumbo v0, "15394"
+    const-string/jumbo v0, "15395"
+    const-string/jumbo v0, "15396"
+    const-string/jumbo v0, "15397"
+    const-string/jumbo v0, "15398"
+    const-string/jumbo v0, "15399"
+    const-string/jumbo v0, "15400"
+    const-string/jumbo v0, "15401"
+    const-string/jumbo v0, "15402"
+    const-string/jumbo v0, "15403"
+    const-string/jumbo v0, "15404"
+    const-string/jumbo v0, "15405"
+    const-string/jumbo v0, "15406"
+    const-string/jumbo v0, "15407"
+    const-string/jumbo v0, "15408"
+    const-string/jumbo v0, "15409"
+    const-string/jumbo v0, "15410"
+    const-string/jumbo v0, "15411"
+    const-string/jumbo v0, "15412"
+    const-string/jumbo v0, "15413"
+    const-string/jumbo v0, "15414"
+    const-string/jumbo v0, "15415"
+    const-string/jumbo v0, "15416"
+    const-string/jumbo v0, "15417"
+    const-string/jumbo v0, "15418"
+    const-string/jumbo v0, "15419"
+    const-string/jumbo v0, "15420"
+    const-string/jumbo v0, "15421"
+    const-string/jumbo v0, "15422"
+    const-string/jumbo v0, "15423"
+    const-string/jumbo v0, "15424"
+    const-string/jumbo v0, "15425"
+    const-string/jumbo v0, "15426"
+    const-string/jumbo v0, "15427"
+    const-string/jumbo v0, "15428"
+    const-string/jumbo v0, "15429"
+    const-string/jumbo v0, "15430"
+    const-string/jumbo v0, "15431"
+    const-string/jumbo v0, "15432"
+    const-string/jumbo v0, "15433"
+    const-string/jumbo v0, "15434"
+    const-string/jumbo v0, "15435"
+    const-string/jumbo v0, "15436"
+    const-string/jumbo v0, "15437"
+    const-string/jumbo v0, "15438"
+    const-string/jumbo v0, "15439"
+    const-string/jumbo v0, "15440"
+    const-string/jumbo v0, "15441"
+    const-string/jumbo v0, "15442"
+    const-string/jumbo v0, "15443"
+    const-string/jumbo v0, "15444"
+    const-string/jumbo v0, "15445"
+    const-string/jumbo v0, "15446"
+    const-string/jumbo v0, "15447"
+    const-string/jumbo v0, "15448"
+    const-string/jumbo v0, "15449"
+    const-string/jumbo v0, "15450"
+    const-string/jumbo v0, "15451"
+    const-string/jumbo v0, "15452"
+    const-string/jumbo v0, "15453"
+    const-string/jumbo v0, "15454"
+    const-string/jumbo v0, "15455"
+    const-string/jumbo v0, "15456"
+    const-string/jumbo v0, "15457"
+    const-string/jumbo v0, "15458"
+    const-string/jumbo v0, "15459"
+    const-string/jumbo v0, "15460"
+    const-string/jumbo v0, "15461"
+    const-string/jumbo v0, "15462"
+    const-string/jumbo v0, "15463"
+    const-string/jumbo v0, "15464"
+    const-string/jumbo v0, "15465"
+    const-string/jumbo v0, "15466"
+    const-string/jumbo v0, "15467"
+    const-string/jumbo v0, "15468"
+    const-string/jumbo v0, "15469"
+    const-string/jumbo v0, "15470"
+    const-string/jumbo v0, "15471"
+    const-string/jumbo v0, "15472"
+    const-string/jumbo v0, "15473"
+    const-string/jumbo v0, "15474"
+    const-string/jumbo v0, "15475"
+    const-string/jumbo v0, "15476"
+    const-string/jumbo v0, "15477"
+    const-string/jumbo v0, "15478"
+    const-string/jumbo v0, "15479"
+    const-string/jumbo v0, "15480"
+    const-string/jumbo v0, "15481"
+    const-string/jumbo v0, "15482"
+    const-string/jumbo v0, "15483"
+    const-string/jumbo v0, "15484"
+    const-string/jumbo v0, "15485"
+    const-string/jumbo v0, "15486"
+    const-string/jumbo v0, "15487"
+    const-string/jumbo v0, "15488"
+    const-string/jumbo v0, "15489"
+    const-string/jumbo v0, "15490"
+    const-string/jumbo v0, "15491"
+    const-string/jumbo v0, "15492"
+    const-string/jumbo v0, "15493"
+    const-string/jumbo v0, "15494"
+    const-string/jumbo v0, "15495"
+    const-string/jumbo v0, "15496"
+    const-string/jumbo v0, "15497"
+    const-string/jumbo v0, "15498"
+    const-string/jumbo v0, "15499"
+    const-string/jumbo v0, "15500"
+    const-string/jumbo v0, "15501"
+    const-string/jumbo v0, "15502"
+    const-string/jumbo v0, "15503"
+    const-string/jumbo v0, "15504"
+    const-string/jumbo v0, "15505"
+    const-string/jumbo v0, "15506"
+    const-string/jumbo v0, "15507"
+    const-string/jumbo v0, "15508"
+    const-string/jumbo v0, "15509"
+    const-string/jumbo v0, "15510"
+    const-string/jumbo v0, "15511"
+    const-string/jumbo v0, "15512"
+    const-string/jumbo v0, "15513"
+    const-string/jumbo v0, "15514"
+    const-string/jumbo v0, "15515"
+    const-string/jumbo v0, "15516"
+    const-string/jumbo v0, "15517"
+    const-string/jumbo v0, "15518"
+    const-string/jumbo v0, "15519"
+    const-string/jumbo v0, "15520"
+    const-string/jumbo v0, "15521"
+    const-string/jumbo v0, "15522"
+    const-string/jumbo v0, "15523"
+    const-string/jumbo v0, "15524"
+    const-string/jumbo v0, "15525"
+    const-string/jumbo v0, "15526"
+    const-string/jumbo v0, "15527"
+    const-string/jumbo v0, "15528"
+    const-string/jumbo v0, "15529"
+    const-string/jumbo v0, "15530"
+    const-string/jumbo v0, "15531"
+    const-string/jumbo v0, "15532"
+    const-string/jumbo v0, "15533"
+    const-string/jumbo v0, "15534"
+    const-string/jumbo v0, "15535"
+    const-string/jumbo v0, "15536"
+    const-string/jumbo v0, "15537"
+    const-string/jumbo v0, "15538"
+    const-string/jumbo v0, "15539"
+    const-string/jumbo v0, "15540"
+    const-string/jumbo v0, "15541"
+    const-string/jumbo v0, "15542"
+    const-string/jumbo v0, "15543"
+    const-string/jumbo v0, "15544"
+    const-string/jumbo v0, "15545"
+    const-string/jumbo v0, "15546"
+    const-string/jumbo v0, "15547"
+    const-string/jumbo v0, "15548"
+    const-string/jumbo v0, "15549"
+    const-string/jumbo v0, "15550"
+    const-string/jumbo v0, "15551"
+    const-string/jumbo v0, "15552"
+    const-string/jumbo v0, "15553"
+    const-string/jumbo v0, "15554"
+    const-string/jumbo v0, "15555"
+    const-string/jumbo v0, "15556"
+    const-string/jumbo v0, "15557"
+    const-string/jumbo v0, "15558"
+    const-string/jumbo v0, "15559"
+    const-string/jumbo v0, "15560"
+    const-string/jumbo v0, "15561"
+    const-string/jumbo v0, "15562"
+    const-string/jumbo v0, "15563"
+    const-string/jumbo v0, "15564"
+    const-string/jumbo v0, "15565"
+    const-string/jumbo v0, "15566"
+    const-string/jumbo v0, "15567"
+    const-string/jumbo v0, "15568"
+    const-string/jumbo v0, "15569"
+    const-string/jumbo v0, "15570"
+    const-string/jumbo v0, "15571"
+    const-string/jumbo v0, "15572"
+    const-string/jumbo v0, "15573"
+    const-string/jumbo v0, "15574"
+    const-string/jumbo v0, "15575"
+    const-string/jumbo v0, "15576"
+    const-string/jumbo v0, "15577"
+    const-string/jumbo v0, "15578"
+    const-string/jumbo v0, "15579"
+    const-string/jumbo v0, "15580"
+    const-string/jumbo v0, "15581"
+    const-string/jumbo v0, "15582"
+    const-string/jumbo v0, "15583"
+    const-string/jumbo v0, "15584"
+    const-string/jumbo v0, "15585"
+    const-string/jumbo v0, "15586"
+    const-string/jumbo v0, "15587"
+    const-string/jumbo v0, "15588"
+    const-string/jumbo v0, "15589"
+    const-string/jumbo v0, "15590"
+    const-string/jumbo v0, "15591"
+    const-string/jumbo v0, "15592"
+    const-string/jumbo v0, "15593"
+    const-string/jumbo v0, "15594"
+    const-string/jumbo v0, "15595"
+    const-string/jumbo v0, "15596"
+    const-string/jumbo v0, "15597"
+    const-string/jumbo v0, "15598"
+    const-string/jumbo v0, "15599"
+    const-string/jumbo v0, "15600"
+    const-string/jumbo v0, "15601"
+    const-string/jumbo v0, "15602"
+    const-string/jumbo v0, "15603"
+    const-string/jumbo v0, "15604"
+    const-string/jumbo v0, "15605"
+    const-string/jumbo v0, "15606"
+    const-string/jumbo v0, "15607"
+    const-string/jumbo v0, "15608"
+    const-string/jumbo v0, "15609"
+    const-string/jumbo v0, "15610"
+    const-string/jumbo v0, "15611"
+    const-string/jumbo v0, "15612"
+    const-string/jumbo v0, "15613"
+    const-string/jumbo v0, "15614"
+    const-string/jumbo v0, "15615"
+    const-string/jumbo v0, "15616"
+    const-string/jumbo v0, "15617"
+    const-string/jumbo v0, "15618"
+    const-string/jumbo v0, "15619"
+    const-string/jumbo v0, "15620"
+    const-string/jumbo v0, "15621"
+    const-string/jumbo v0, "15622"
+    const-string/jumbo v0, "15623"
+    const-string/jumbo v0, "15624"
+    const-string/jumbo v0, "15625"
+    const-string/jumbo v0, "15626"
+    const-string/jumbo v0, "15627"
+    const-string/jumbo v0, "15628"
+    const-string/jumbo v0, "15629"
+    const-string/jumbo v0, "15630"
+    const-string/jumbo v0, "15631"
+    const-string/jumbo v0, "15632"
+    const-string/jumbo v0, "15633"
+    const-string/jumbo v0, "15634"
+    const-string/jumbo v0, "15635"
+    const-string/jumbo v0, "15636"
+    const-string/jumbo v0, "15637"
+    const-string/jumbo v0, "15638"
+    const-string/jumbo v0, "15639"
+    const-string/jumbo v0, "15640"
+    const-string/jumbo v0, "15641"
+    const-string/jumbo v0, "15642"
+    const-string/jumbo v0, "15643"
+    const-string/jumbo v0, "15644"
+    const-string/jumbo v0, "15645"
+    const-string/jumbo v0, "15646"
+    const-string/jumbo v0, "15647"
+    const-string/jumbo v0, "15648"
+    const-string/jumbo v0, "15649"
+    const-string/jumbo v0, "15650"
+    const-string/jumbo v0, "15651"
+    const-string/jumbo v0, "15652"
+    const-string/jumbo v0, "15653"
+    const-string/jumbo v0, "15654"
+    const-string/jumbo v0, "15655"
+    const-string/jumbo v0, "15656"
+    const-string/jumbo v0, "15657"
+    const-string/jumbo v0, "15658"
+    const-string/jumbo v0, "15659"
+    const-string/jumbo v0, "15660"
+    const-string/jumbo v0, "15661"
+    const-string/jumbo v0, "15662"
+    const-string/jumbo v0, "15663"
+    const-string/jumbo v0, "15664"
+    const-string/jumbo v0, "15665"
+    const-string/jumbo v0, "15666"
+    const-string/jumbo v0, "15667"
+    const-string/jumbo v0, "15668"
+    const-string/jumbo v0, "15669"
+    const-string/jumbo v0, "15670"
+    const-string/jumbo v0, "15671"
+    const-string/jumbo v0, "15672"
+    const-string/jumbo v0, "15673"
+    const-string/jumbo v0, "15674"
+    const-string/jumbo v0, "15675"
+    const-string/jumbo v0, "15676"
+    const-string/jumbo v0, "15677"
+    const-string/jumbo v0, "15678"
+    const-string/jumbo v0, "15679"
+    const-string/jumbo v0, "15680"
+    const-string/jumbo v0, "15681"
+    const-string/jumbo v0, "15682"
+    const-string/jumbo v0, "15683"
+    const-string/jumbo v0, "15684"
+    const-string/jumbo v0, "15685"
+    const-string/jumbo v0, "15686"
+    const-string/jumbo v0, "15687"
+    const-string/jumbo v0, "15688"
+    const-string/jumbo v0, "15689"
+    const-string/jumbo v0, "15690"
+    const-string/jumbo v0, "15691"
+    const-string/jumbo v0, "15692"
+    const-string/jumbo v0, "15693"
+    const-string/jumbo v0, "15694"
+    const-string/jumbo v0, "15695"
+    const-string/jumbo v0, "15696"
+    const-string/jumbo v0, "15697"
+    const-string/jumbo v0, "15698"
+    const-string/jumbo v0, "15699"
+    const-string/jumbo v0, "15700"
+    const-string/jumbo v0, "15701"
+    const-string/jumbo v0, "15702"
+    const-string/jumbo v0, "15703"
+    const-string/jumbo v0, "15704"
+    const-string/jumbo v0, "15705"
+    const-string/jumbo v0, "15706"
+    const-string/jumbo v0, "15707"
+    const-string/jumbo v0, "15708"
+    const-string/jumbo v0, "15709"
+    const-string/jumbo v0, "15710"
+    const-string/jumbo v0, "15711"
+    const-string/jumbo v0, "15712"
+    const-string/jumbo v0, "15713"
+    const-string/jumbo v0, "15714"
+    const-string/jumbo v0, "15715"
+    const-string/jumbo v0, "15716"
+    const-string/jumbo v0, "15717"
+    const-string/jumbo v0, "15718"
+    const-string/jumbo v0, "15719"
+    const-string/jumbo v0, "15720"
+    const-string/jumbo v0, "15721"
+    const-string/jumbo v0, "15722"
+    const-string/jumbo v0, "15723"
+    const-string/jumbo v0, "15724"
+    const-string/jumbo v0, "15725"
+    const-string/jumbo v0, "15726"
+    const-string/jumbo v0, "15727"
+    const-string/jumbo v0, "15728"
+    const-string/jumbo v0, "15729"
+    const-string/jumbo v0, "15730"
+    const-string/jumbo v0, "15731"
+    const-string/jumbo v0, "15732"
+    const-string/jumbo v0, "15733"
+    const-string/jumbo v0, "15734"
+    const-string/jumbo v0, "15735"
+    const-string/jumbo v0, "15736"
+    const-string/jumbo v0, "15737"
+    const-string/jumbo v0, "15738"
+    const-string/jumbo v0, "15739"
+    const-string/jumbo v0, "15740"
+    const-string/jumbo v0, "15741"
+    const-string/jumbo v0, "15742"
+    const-string/jumbo v0, "15743"
+    const-string/jumbo v0, "15744"
+    const-string/jumbo v0, "15745"
+    const-string/jumbo v0, "15746"
+    const-string/jumbo v0, "15747"
+    const-string/jumbo v0, "15748"
+    const-string/jumbo v0, "15749"
+    const-string/jumbo v0, "15750"
+    const-string/jumbo v0, "15751"
+    const-string/jumbo v0, "15752"
+    const-string/jumbo v0, "15753"
+    const-string/jumbo v0, "15754"
+    const-string/jumbo v0, "15755"
+    const-string/jumbo v0, "15756"
+    const-string/jumbo v0, "15757"
+    const-string/jumbo v0, "15758"
+    const-string/jumbo v0, "15759"
+    const-string/jumbo v0, "15760"
+    const-string/jumbo v0, "15761"
+    const-string/jumbo v0, "15762"
+    const-string/jumbo v0, "15763"
+    const-string/jumbo v0, "15764"
+    const-string/jumbo v0, "15765"
+    const-string/jumbo v0, "15766"
+    const-string/jumbo v0, "15767"
+    const-string/jumbo v0, "15768"
+    const-string/jumbo v0, "15769"
+    const-string/jumbo v0, "15770"
+    const-string/jumbo v0, "15771"
+    const-string/jumbo v0, "15772"
+    const-string/jumbo v0, "15773"
+    const-string/jumbo v0, "15774"
+    const-string/jumbo v0, "15775"
+    const-string/jumbo v0, "15776"
+    const-string/jumbo v0, "15777"
+    const-string/jumbo v0, "15778"
+    const-string/jumbo v0, "15779"
+    const-string/jumbo v0, "15780"
+    const-string/jumbo v0, "15781"
+    const-string/jumbo v0, "15782"
+    const-string/jumbo v0, "15783"
+    const-string/jumbo v0, "15784"
+    const-string/jumbo v0, "15785"
+    const-string/jumbo v0, "15786"
+    const-string/jumbo v0, "15787"
+    const-string/jumbo v0, "15788"
+    const-string/jumbo v0, "15789"
+    const-string/jumbo v0, "15790"
+    const-string/jumbo v0, "15791"
+    const-string/jumbo v0, "15792"
+    const-string/jumbo v0, "15793"
+    const-string/jumbo v0, "15794"
+    const-string/jumbo v0, "15795"
+    const-string/jumbo v0, "15796"
+    const-string/jumbo v0, "15797"
+    const-string/jumbo v0, "15798"
+    const-string/jumbo v0, "15799"
+    const-string/jumbo v0, "15800"
+    const-string/jumbo v0, "15801"
+    const-string/jumbo v0, "15802"
+    const-string/jumbo v0, "15803"
+    const-string/jumbo v0, "15804"
+    const-string/jumbo v0, "15805"
+    const-string/jumbo v0, "15806"
+    const-string/jumbo v0, "15807"
+    const-string/jumbo v0, "15808"
+    const-string/jumbo v0, "15809"
+    const-string/jumbo v0, "15810"
+    const-string/jumbo v0, "15811"
+    const-string/jumbo v0, "15812"
+    const-string/jumbo v0, "15813"
+    const-string/jumbo v0, "15814"
+    const-string/jumbo v0, "15815"
+    const-string/jumbo v0, "15816"
+    const-string/jumbo v0, "15817"
+    const-string/jumbo v0, "15818"
+    const-string/jumbo v0, "15819"
+    const-string/jumbo v0, "15820"
+    const-string/jumbo v0, "15821"
+    const-string/jumbo v0, "15822"
+    const-string/jumbo v0, "15823"
+    const-string/jumbo v0, "15824"
+    const-string/jumbo v0, "15825"
+    const-string/jumbo v0, "15826"
+    const-string/jumbo v0, "15827"
+    const-string/jumbo v0, "15828"
+    const-string/jumbo v0, "15829"
+    const-string/jumbo v0, "15830"
+    const-string/jumbo v0, "15831"
+    const-string/jumbo v0, "15832"
+    const-string/jumbo v0, "15833"
+    const-string/jumbo v0, "15834"
+    const-string/jumbo v0, "15835"
+    const-string/jumbo v0, "15836"
+    const-string/jumbo v0, "15837"
+    const-string/jumbo v0, "15838"
+    const-string/jumbo v0, "15839"
+    const-string/jumbo v0, "15840"
+    const-string/jumbo v0, "15841"
+    const-string/jumbo v0, "15842"
+    const-string/jumbo v0, "15843"
+    const-string/jumbo v0, "15844"
+    const-string/jumbo v0, "15845"
+    const-string/jumbo v0, "15846"
+    const-string/jumbo v0, "15847"
+    const-string/jumbo v0, "15848"
+    const-string/jumbo v0, "15849"
+    const-string/jumbo v0, "15850"
+    const-string/jumbo v0, "15851"
+    const-string/jumbo v0, "15852"
+    const-string/jumbo v0, "15853"
+    const-string/jumbo v0, "15854"
+    const-string/jumbo v0, "15855"
+    const-string/jumbo v0, "15856"
+    const-string/jumbo v0, "15857"
+    const-string/jumbo v0, "15858"
+    const-string/jumbo v0, "15859"
+    const-string/jumbo v0, "15860"
+    const-string/jumbo v0, "15861"
+    const-string/jumbo v0, "15862"
+    const-string/jumbo v0, "15863"
+    const-string/jumbo v0, "15864"
+    const-string/jumbo v0, "15865"
+    const-string/jumbo v0, "15866"
+    const-string/jumbo v0, "15867"
+    const-string/jumbo v0, "15868"
+    const-string/jumbo v0, "15869"
+    const-string/jumbo v0, "15870"
+    const-string/jumbo v0, "15871"
+    const-string/jumbo v0, "15872"
+    const-string/jumbo v0, "15873"
+    const-string/jumbo v0, "15874"
+    const-string/jumbo v0, "15875"
+    const-string/jumbo v0, "15876"
+    const-string/jumbo v0, "15877"
+    const-string/jumbo v0, "15878"
+    const-string/jumbo v0, "15879"
+    const-string/jumbo v0, "15880"
+    const-string/jumbo v0, "15881"
+    const-string/jumbo v0, "15882"
+    const-string/jumbo v0, "15883"
+    const-string/jumbo v0, "15884"
+    const-string/jumbo v0, "15885"
+    const-string/jumbo v0, "15886"
+    const-string/jumbo v0, "15887"
+    const-string/jumbo v0, "15888"
+    const-string/jumbo v0, "15889"
+    const-string/jumbo v0, "15890"
+    const-string/jumbo v0, "15891"
+    const-string/jumbo v0, "15892"
+    const-string/jumbo v0, "15893"
+    const-string/jumbo v0, "15894"
+    const-string/jumbo v0, "15895"
+    const-string/jumbo v0, "15896"
+    const-string/jumbo v0, "15897"
+    const-string/jumbo v0, "15898"
+    const-string/jumbo v0, "15899"
+    const-string/jumbo v0, "15900"
+    const-string/jumbo v0, "15901"
+    const-string/jumbo v0, "15902"
+    const-string/jumbo v0, "15903"
+    const-string/jumbo v0, "15904"
+    const-string/jumbo v0, "15905"
+    const-string/jumbo v0, "15906"
+    const-string/jumbo v0, "15907"
+    const-string/jumbo v0, "15908"
+    const-string/jumbo v0, "15909"
+    const-string/jumbo v0, "15910"
+    const-string/jumbo v0, "15911"
+    const-string/jumbo v0, "15912"
+    const-string/jumbo v0, "15913"
+    const-string/jumbo v0, "15914"
+    const-string/jumbo v0, "15915"
+    const-string/jumbo v0, "15916"
+    const-string/jumbo v0, "15917"
+    const-string/jumbo v0, "15918"
+    const-string/jumbo v0, "15919"
+    const-string/jumbo v0, "15920"
+    const-string/jumbo v0, "15921"
+    const-string/jumbo v0, "15922"
+    const-string/jumbo v0, "15923"
+    const-string/jumbo v0, "15924"
+    const-string/jumbo v0, "15925"
+    const-string/jumbo v0, "15926"
+    const-string/jumbo v0, "15927"
+    const-string/jumbo v0, "15928"
+    const-string/jumbo v0, "15929"
+    const-string/jumbo v0, "15930"
+    const-string/jumbo v0, "15931"
+    const-string/jumbo v0, "15932"
+    const-string/jumbo v0, "15933"
+    const-string/jumbo v0, "15934"
+    const-string/jumbo v0, "15935"
+    const-string/jumbo v0, "15936"
+    const-string/jumbo v0, "15937"
+    const-string/jumbo v0, "15938"
+    const-string/jumbo v0, "15939"
+    const-string/jumbo v0, "15940"
+    const-string/jumbo v0, "15941"
+    const-string/jumbo v0, "15942"
+    const-string/jumbo v0, "15943"
+    const-string/jumbo v0, "15944"
+    const-string/jumbo v0, "15945"
+    const-string/jumbo v0, "15946"
+    const-string/jumbo v0, "15947"
+    const-string/jumbo v0, "15948"
+    const-string/jumbo v0, "15949"
+    const-string/jumbo v0, "15950"
+    const-string/jumbo v0, "15951"
+    const-string/jumbo v0, "15952"
+    const-string/jumbo v0, "15953"
+    const-string/jumbo v0, "15954"
+    const-string/jumbo v0, "15955"
+    const-string/jumbo v0, "15956"
+    const-string/jumbo v0, "15957"
+    const-string/jumbo v0, "15958"
+    const-string/jumbo v0, "15959"
+    const-string/jumbo v0, "15960"
+    const-string/jumbo v0, "15961"
+    const-string/jumbo v0, "15962"
+    const-string/jumbo v0, "15963"
+    const-string/jumbo v0, "15964"
+    const-string/jumbo v0, "15965"
+    const-string/jumbo v0, "15966"
+    const-string/jumbo v0, "15967"
+    const-string/jumbo v0, "15968"
+    const-string/jumbo v0, "15969"
+    const-string/jumbo v0, "15970"
+    const-string/jumbo v0, "15971"
+    const-string/jumbo v0, "15972"
+    const-string/jumbo v0, "15973"
+    const-string/jumbo v0, "15974"
+    const-string/jumbo v0, "15975"
+    const-string/jumbo v0, "15976"
+    const-string/jumbo v0, "15977"
+    const-string/jumbo v0, "15978"
+    const-string/jumbo v0, "15979"
+    const-string/jumbo v0, "15980"
+    const-string/jumbo v0, "15981"
+    const-string/jumbo v0, "15982"
+    const-string/jumbo v0, "15983"
+    const-string/jumbo v0, "15984"
+    const-string/jumbo v0, "15985"
+    const-string/jumbo v0, "15986"
+    const-string/jumbo v0, "15987"
+    const-string/jumbo v0, "15988"
+    const-string/jumbo v0, "15989"
+    const-string/jumbo v0, "15990"
+    const-string/jumbo v0, "15991"
+    const-string/jumbo v0, "15992"
+    const-string/jumbo v0, "15993"
+    const-string/jumbo v0, "15994"
+    const-string/jumbo v0, "15995"
+    const-string/jumbo v0, "15996"
+    const-string/jumbo v0, "15997"
+    const-string/jumbo v0, "15998"
+    const-string/jumbo v0, "15999"
+    const-string/jumbo v0, "16000"
+    const-string/jumbo v0, "16001"
+    const-string/jumbo v0, "16002"
+    const-string/jumbo v0, "16003"
+    const-string/jumbo v0, "16004"
+    const-string/jumbo v0, "16005"
+    const-string/jumbo v0, "16006"
+    const-string/jumbo v0, "16007"
+    const-string/jumbo v0, "16008"
+    const-string/jumbo v0, "16009"
+    const-string/jumbo v0, "16010"
+    const-string/jumbo v0, "16011"
+    const-string/jumbo v0, "16012"
+    const-string/jumbo v0, "16013"
+    const-string/jumbo v0, "16014"
+    const-string/jumbo v0, "16015"
+    const-string/jumbo v0, "16016"
+    const-string/jumbo v0, "16017"
+    const-string/jumbo v0, "16018"
+    const-string/jumbo v0, "16019"
+    const-string/jumbo v0, "16020"
+    const-string/jumbo v0, "16021"
+    const-string/jumbo v0, "16022"
+    const-string/jumbo v0, "16023"
+    const-string/jumbo v0, "16024"
+    const-string/jumbo v0, "16025"
+    const-string/jumbo v0, "16026"
+    const-string/jumbo v0, "16027"
+    const-string/jumbo v0, "16028"
+    const-string/jumbo v0, "16029"
+    const-string/jumbo v0, "16030"
+    const-string/jumbo v0, "16031"
+    const-string/jumbo v0, "16032"
+    const-string/jumbo v0, "16033"
+    const-string/jumbo v0, "16034"
+    const-string/jumbo v0, "16035"
+    const-string/jumbo v0, "16036"
+    const-string/jumbo v0, "16037"
+    const-string/jumbo v0, "16038"
+    const-string/jumbo v0, "16039"
+    const-string/jumbo v0, "16040"
+    const-string/jumbo v0, "16041"
+    const-string/jumbo v0, "16042"
+    const-string/jumbo v0, "16043"
+    const-string/jumbo v0, "16044"
+    const-string/jumbo v0, "16045"
+    const-string/jumbo v0, "16046"
+    const-string/jumbo v0, "16047"
+    const-string/jumbo v0, "16048"
+    const-string/jumbo v0, "16049"
+    const-string/jumbo v0, "16050"
+    const-string/jumbo v0, "16051"
+    const-string/jumbo v0, "16052"
+    const-string/jumbo v0, "16053"
+    const-string/jumbo v0, "16054"
+    const-string/jumbo v0, "16055"
+    const-string/jumbo v0, "16056"
+    const-string/jumbo v0, "16057"
+    const-string/jumbo v0, "16058"
+    const-string/jumbo v0, "16059"
+    const-string/jumbo v0, "16060"
+    const-string/jumbo v0, "16061"
+    const-string/jumbo v0, "16062"
+    const-string/jumbo v0, "16063"
+    const-string/jumbo v0, "16064"
+    const-string/jumbo v0, "16065"
+    const-string/jumbo v0, "16066"
+    const-string/jumbo v0, "16067"
+    const-string/jumbo v0, "16068"
+    const-string/jumbo v0, "16069"
+    const-string/jumbo v0, "16070"
+    const-string/jumbo v0, "16071"
+    const-string/jumbo v0, "16072"
+    const-string/jumbo v0, "16073"
+    const-string/jumbo v0, "16074"
+    const-string/jumbo v0, "16075"
+    const-string/jumbo v0, "16076"
+    const-string/jumbo v0, "16077"
+    const-string/jumbo v0, "16078"
+    const-string/jumbo v0, "16079"
+    const-string/jumbo v0, "16080"
+    const-string/jumbo v0, "16081"
+    const-string/jumbo v0, "16082"
+    const-string/jumbo v0, "16083"
+    const-string/jumbo v0, "16084"
+    const-string/jumbo v0, "16085"
+    const-string/jumbo v0, "16086"
+    const-string/jumbo v0, "16087"
+    const-string/jumbo v0, "16088"
+    const-string/jumbo v0, "16089"
+    const-string/jumbo v0, "16090"
+    const-string/jumbo v0, "16091"
+    const-string/jumbo v0, "16092"
+    const-string/jumbo v0, "16093"
+    const-string/jumbo v0, "16094"
+    const-string/jumbo v0, "16095"
+    const-string/jumbo v0, "16096"
+    const-string/jumbo v0, "16097"
+    const-string/jumbo v0, "16098"
+    const-string/jumbo v0, "16099"
+    const-string/jumbo v0, "16100"
+    const-string/jumbo v0, "16101"
+    const-string/jumbo v0, "16102"
+    const-string/jumbo v0, "16103"
+    const-string/jumbo v0, "16104"
+    const-string/jumbo v0, "16105"
+    const-string/jumbo v0, "16106"
+    const-string/jumbo v0, "16107"
+    const-string/jumbo v0, "16108"
+    const-string/jumbo v0, "16109"
+    const-string/jumbo v0, "16110"
+    const-string/jumbo v0, "16111"
+    const-string/jumbo v0, "16112"
+    const-string/jumbo v0, "16113"
+    const-string/jumbo v0, "16114"
+    const-string/jumbo v0, "16115"
+    const-string/jumbo v0, "16116"
+    const-string/jumbo v0, "16117"
+    const-string/jumbo v0, "16118"
+    const-string/jumbo v0, "16119"
+    const-string/jumbo v0, "16120"
+    const-string/jumbo v0, "16121"
+    const-string/jumbo v0, "16122"
+    const-string/jumbo v0, "16123"
+    const-string/jumbo v0, "16124"
+    const-string/jumbo v0, "16125"
+    const-string/jumbo v0, "16126"
+    const-string/jumbo v0, "16127"
+    const-string/jumbo v0, "16128"
+    const-string/jumbo v0, "16129"
+    const-string/jumbo v0, "16130"
+    const-string/jumbo v0, "16131"
+    const-string/jumbo v0, "16132"
+    const-string/jumbo v0, "16133"
+    const-string/jumbo v0, "16134"
+    const-string/jumbo v0, "16135"
+    const-string/jumbo v0, "16136"
+    const-string/jumbo v0, "16137"
+    const-string/jumbo v0, "16138"
+    const-string/jumbo v0, "16139"
+    const-string/jumbo v0, "16140"
+    const-string/jumbo v0, "16141"
+    const-string/jumbo v0, "16142"
+    const-string/jumbo v0, "16143"
+    const-string/jumbo v0, "16144"
+    const-string/jumbo v0, "16145"
+    const-string/jumbo v0, "16146"
+    const-string/jumbo v0, "16147"
+    const-string/jumbo v0, "16148"
+    const-string/jumbo v0, "16149"
+    const-string/jumbo v0, "16150"
+    const-string/jumbo v0, "16151"
+    const-string/jumbo v0, "16152"
+    const-string/jumbo v0, "16153"
+    const-string/jumbo v0, "16154"
+    const-string/jumbo v0, "16155"
+    const-string/jumbo v0, "16156"
+    const-string/jumbo v0, "16157"
+    const-string/jumbo v0, "16158"
+    const-string/jumbo v0, "16159"
+    const-string/jumbo v0, "16160"
+    const-string/jumbo v0, "16161"
+    const-string/jumbo v0, "16162"
+    const-string/jumbo v0, "16163"
+    const-string/jumbo v0, "16164"
+    const-string/jumbo v0, "16165"
+    const-string/jumbo v0, "16166"
+    const-string/jumbo v0, "16167"
+    const-string/jumbo v0, "16168"
+    const-string/jumbo v0, "16169"
+    const-string/jumbo v0, "16170"
+    const-string/jumbo v0, "16171"
+    const-string/jumbo v0, "16172"
+    const-string/jumbo v0, "16173"
+    const-string/jumbo v0, "16174"
+    const-string/jumbo v0, "16175"
+    const-string/jumbo v0, "16176"
+    const-string/jumbo v0, "16177"
+    const-string/jumbo v0, "16178"
+    const-string/jumbo v0, "16179"
+    const-string/jumbo v0, "16180"
+    const-string/jumbo v0, "16181"
+    const-string/jumbo v0, "16182"
+    const-string/jumbo v0, "16183"
+    const-string/jumbo v0, "16184"
+    const-string/jumbo v0, "16185"
+    const-string/jumbo v0, "16186"
+    const-string/jumbo v0, "16187"
+    const-string/jumbo v0, "16188"
+    const-string/jumbo v0, "16189"
+    const-string/jumbo v0, "16190"
+    const-string/jumbo v0, "16191"
+    const-string/jumbo v0, "16192"
+    const-string/jumbo v0, "16193"
+    const-string/jumbo v0, "16194"
+    const-string/jumbo v0, "16195"
+    const-string/jumbo v0, "16196"
+    const-string/jumbo v0, "16197"
+    const-string/jumbo v0, "16198"
+    const-string/jumbo v0, "16199"
+    const-string/jumbo v0, "16200"
+    const-string/jumbo v0, "16201"
+    const-string/jumbo v0, "16202"
+    const-string/jumbo v0, "16203"
+    const-string/jumbo v0, "16204"
+    const-string/jumbo v0, "16205"
+    const-string/jumbo v0, "16206"
+    const-string/jumbo v0, "16207"
+    const-string/jumbo v0, "16208"
+    const-string/jumbo v0, "16209"
+    const-string/jumbo v0, "16210"
+    const-string/jumbo v0, "16211"
+    const-string/jumbo v0, "16212"
+    const-string/jumbo v0, "16213"
+    const-string/jumbo v0, "16214"
+    const-string/jumbo v0, "16215"
+    const-string/jumbo v0, "16216"
+    const-string/jumbo v0, "16217"
+    const-string/jumbo v0, "16218"
+    const-string/jumbo v0, "16219"
+    const-string/jumbo v0, "16220"
+    const-string/jumbo v0, "16221"
+    const-string/jumbo v0, "16222"
+    const-string/jumbo v0, "16223"
+    const-string/jumbo v0, "16224"
+    const-string/jumbo v0, "16225"
+    const-string/jumbo v0, "16226"
+    const-string/jumbo v0, "16227"
+    const-string/jumbo v0, "16228"
+    const-string/jumbo v0, "16229"
+    const-string/jumbo v0, "16230"
+    const-string/jumbo v0, "16231"
+    const-string/jumbo v0, "16232"
+    const-string/jumbo v0, "16233"
+    const-string/jumbo v0, "16234"
+    const-string/jumbo v0, "16235"
+    const-string/jumbo v0, "16236"
+    const-string/jumbo v0, "16237"
+    const-string/jumbo v0, "16238"
+    const-string/jumbo v0, "16239"
+    const-string/jumbo v0, "16240"
+    const-string/jumbo v0, "16241"
+    const-string/jumbo v0, "16242"
+    const-string/jumbo v0, "16243"
+    const-string/jumbo v0, "16244"
+    const-string/jumbo v0, "16245"
+    const-string/jumbo v0, "16246"
+    const-string/jumbo v0, "16247"
+    const-string/jumbo v0, "16248"
+    const-string/jumbo v0, "16249"
+    const-string/jumbo v0, "16250"
+    const-string/jumbo v0, "16251"
+    const-string/jumbo v0, "16252"
+    const-string/jumbo v0, "16253"
+    const-string/jumbo v0, "16254"
+    const-string/jumbo v0, "16255"
+    const-string/jumbo v0, "16256"
+    const-string/jumbo v0, "16257"
+    const-string/jumbo v0, "16258"
+    const-string/jumbo v0, "16259"
+    const-string/jumbo v0, "16260"
+    const-string/jumbo v0, "16261"
+    const-string/jumbo v0, "16262"
+    const-string/jumbo v0, "16263"
+    const-string/jumbo v0, "16264"
+    const-string/jumbo v0, "16265"
+    const-string/jumbo v0, "16266"
+    const-string/jumbo v0, "16267"
+    const-string/jumbo v0, "16268"
+    const-string/jumbo v0, "16269"
+    const-string/jumbo v0, "16270"
+    const-string/jumbo v0, "16271"
+    const-string/jumbo v0, "16272"
+    const-string/jumbo v0, "16273"
+    const-string/jumbo v0, "16274"
+    const-string/jumbo v0, "16275"
+    const-string/jumbo v0, "16276"
+    const-string/jumbo v0, "16277"
+    const-string/jumbo v0, "16278"
+    const-string/jumbo v0, "16279"
+    const-string/jumbo v0, "16280"
+    const-string/jumbo v0, "16281"
+    const-string/jumbo v0, "16282"
+    const-string/jumbo v0, "16283"
+    const-string/jumbo v0, "16284"
+    const-string/jumbo v0, "16285"
+    const-string/jumbo v0, "16286"
+    const-string/jumbo v0, "16287"
+    const-string/jumbo v0, "16288"
+    const-string/jumbo v0, "16289"
+    const-string/jumbo v0, "16290"
+    const-string/jumbo v0, "16291"
+    const-string/jumbo v0, "16292"
+    const-string/jumbo v0, "16293"
+    const-string/jumbo v0, "16294"
+    const-string/jumbo v0, "16295"
+    const-string/jumbo v0, "16296"
+    const-string/jumbo v0, "16297"
+    const-string/jumbo v0, "16298"
+    const-string/jumbo v0, "16299"
+    const-string/jumbo v0, "16300"
+    const-string/jumbo v0, "16301"
+    const-string/jumbo v0, "16302"
+    const-string/jumbo v0, "16303"
+    const-string/jumbo v0, "16304"
+    const-string/jumbo v0, "16305"
+    const-string/jumbo v0, "16306"
+    const-string/jumbo v0, "16307"
+    const-string/jumbo v0, "16308"
+    const-string/jumbo v0, "16309"
+    const-string/jumbo v0, "16310"
+    const-string/jumbo v0, "16311"
+    const-string/jumbo v0, "16312"
+    const-string/jumbo v0, "16313"
+    const-string/jumbo v0, "16314"
+    const-string/jumbo v0, "16315"
+    const-string/jumbo v0, "16316"
+    const-string/jumbo v0, "16317"
+    const-string/jumbo v0, "16318"
+    const-string/jumbo v0, "16319"
+    const-string/jumbo v0, "16320"
+    const-string/jumbo v0, "16321"
+    const-string/jumbo v0, "16322"
+    const-string/jumbo v0, "16323"
+    const-string/jumbo v0, "16324"
+    const-string/jumbo v0, "16325"
+    const-string/jumbo v0, "16326"
+    const-string/jumbo v0, "16327"
+    const-string/jumbo v0, "16328"
+    const-string/jumbo v0, "16329"
+    const-string/jumbo v0, "16330"
+    const-string/jumbo v0, "16331"
+    const-string/jumbo v0, "16332"
+    const-string/jumbo v0, "16333"
+    const-string/jumbo v0, "16334"
+    const-string/jumbo v0, "16335"
+    const-string/jumbo v0, "16336"
+    const-string/jumbo v0, "16337"
+    const-string/jumbo v0, "16338"
+    const-string/jumbo v0, "16339"
+    const-string/jumbo v0, "16340"
+    const-string/jumbo v0, "16341"
+    const-string/jumbo v0, "16342"
+    const-string/jumbo v0, "16343"
+    const-string/jumbo v0, "16344"
+    const-string/jumbo v0, "16345"
+    const-string/jumbo v0, "16346"
+    const-string/jumbo v0, "16347"
+    const-string/jumbo v0, "16348"
+    const-string/jumbo v0, "16349"
+    const-string/jumbo v0, "16350"
+    const-string/jumbo v0, "16351"
+    const-string/jumbo v0, "16352"
+    const-string/jumbo v0, "16353"
+    const-string/jumbo v0, "16354"
+    const-string/jumbo v0, "16355"
+    const-string/jumbo v0, "16356"
+    const-string/jumbo v0, "16357"
+    const-string/jumbo v0, "16358"
+    const-string/jumbo v0, "16359"
+    const-string/jumbo v0, "16360"
+    const-string/jumbo v0, "16361"
+    const-string/jumbo v0, "16362"
+    const-string/jumbo v0, "16363"
+    const-string/jumbo v0, "16364"
+    const-string/jumbo v0, "16365"
+    const-string/jumbo v0, "16366"
+    const-string/jumbo v0, "16367"
+    const-string/jumbo v0, "16368"
+    const-string/jumbo v0, "16369"
+    const-string/jumbo v0, "16370"
+    const-string/jumbo v0, "16371"
+    const-string/jumbo v0, "16372"
+    const-string/jumbo v0, "16373"
+    const-string/jumbo v0, "16374"
+    const-string/jumbo v0, "16375"
+    const-string/jumbo v0, "16376"
+    const-string/jumbo v0, "16377"
+    const-string/jumbo v0, "16378"
+    const-string/jumbo v0, "16379"
+    const-string/jumbo v0, "16380"
+    const-string/jumbo v0, "16381"
+    const-string/jumbo v0, "16382"
+    const-string/jumbo v0, "16383"
+    const-string/jumbo v0, "16384"
+    const-string/jumbo v0, "16385"
+    const-string/jumbo v0, "16386"
+    const-string/jumbo v0, "16387"
+    const-string/jumbo v0, "16388"
+    const-string/jumbo v0, "16389"
+    const-string/jumbo v0, "16390"
+    const-string/jumbo v0, "16391"
+    const-string/jumbo v0, "16392"
+    const-string/jumbo v0, "16393"
+    const-string/jumbo v0, "16394"
+    const-string/jumbo v0, "16395"
+    const-string/jumbo v0, "16396"
+    const-string/jumbo v0, "16397"
+    const-string/jumbo v0, "16398"
+    const-string/jumbo v0, "16399"
+    const-string/jumbo v0, "16400"
+    const-string/jumbo v0, "16401"
+    const-string/jumbo v0, "16402"
+    const-string/jumbo v0, "16403"
+    const-string/jumbo v0, "16404"
+    const-string/jumbo v0, "16405"
+    const-string/jumbo v0, "16406"
+    const-string/jumbo v0, "16407"
+    const-string/jumbo v0, "16408"
+    const-string/jumbo v0, "16409"
+    const-string/jumbo v0, "16410"
+    const-string/jumbo v0, "16411"
+    const-string/jumbo v0, "16412"
+    const-string/jumbo v0, "16413"
+    const-string/jumbo v0, "16414"
+    const-string/jumbo v0, "16415"
+    const-string/jumbo v0, "16416"
+    const-string/jumbo v0, "16417"
+    const-string/jumbo v0, "16418"
+    const-string/jumbo v0, "16419"
+    const-string/jumbo v0, "16420"
+    const-string/jumbo v0, "16421"
+    const-string/jumbo v0, "16422"
+    const-string/jumbo v0, "16423"
+    const-string/jumbo v0, "16424"
+    const-string/jumbo v0, "16425"
+    const-string/jumbo v0, "16426"
+    const-string/jumbo v0, "16427"
+    const-string/jumbo v0, "16428"
+    const-string/jumbo v0, "16429"
+    const-string/jumbo v0, "16430"
+    const-string/jumbo v0, "16431"
+    const-string/jumbo v0, "16432"
+    const-string/jumbo v0, "16433"
+    const-string/jumbo v0, "16434"
+    const-string/jumbo v0, "16435"
+    const-string/jumbo v0, "16436"
+    const-string/jumbo v0, "16437"
+    const-string/jumbo v0, "16438"
+    const-string/jumbo v0, "16439"
+    const-string/jumbo v0, "16440"
+    const-string/jumbo v0, "16441"
+    const-string/jumbo v0, "16442"
+    const-string/jumbo v0, "16443"
+    const-string/jumbo v0, "16444"
+    const-string/jumbo v0, "16445"
+    const-string/jumbo v0, "16446"
+    const-string/jumbo v0, "16447"
+    const-string/jumbo v0, "16448"
+    const-string/jumbo v0, "16449"
+    const-string/jumbo v0, "16450"
+    const-string/jumbo v0, "16451"
+    const-string/jumbo v0, "16452"
+    const-string/jumbo v0, "16453"
+    const-string/jumbo v0, "16454"
+    const-string/jumbo v0, "16455"
+    const-string/jumbo v0, "16456"
+    const-string/jumbo v0, "16457"
+    const-string/jumbo v0, "16458"
+    const-string/jumbo v0, "16459"
+    const-string/jumbo v0, "16460"
+    const-string/jumbo v0, "16461"
+    const-string/jumbo v0, "16462"
+    const-string/jumbo v0, "16463"
+    const-string/jumbo v0, "16464"
+    const-string/jumbo v0, "16465"
+    const-string/jumbo v0, "16466"
+    const-string/jumbo v0, "16467"
+    const-string/jumbo v0, "16468"
+    const-string/jumbo v0, "16469"
+    const-string/jumbo v0, "16470"
+    const-string/jumbo v0, "16471"
+    const-string/jumbo v0, "16472"
+    const-string/jumbo v0, "16473"
+    const-string/jumbo v0, "16474"
+    const-string/jumbo v0, "16475"
+    const-string/jumbo v0, "16476"
+    const-string/jumbo v0, "16477"
+    const-string/jumbo v0, "16478"
+    const-string/jumbo v0, "16479"
+    const-string/jumbo v0, "16480"
+    const-string/jumbo v0, "16481"
+    const-string/jumbo v0, "16482"
+    const-string/jumbo v0, "16483"
+    const-string/jumbo v0, "16484"
+    const-string/jumbo v0, "16485"
+    const-string/jumbo v0, "16486"
+    const-string/jumbo v0, "16487"
+    const-string/jumbo v0, "16488"
+    const-string/jumbo v0, "16489"
+    const-string/jumbo v0, "16490"
+    const-string/jumbo v0, "16491"
+    const-string/jumbo v0, "16492"
+    const-string/jumbo v0, "16493"
+    const-string/jumbo v0, "16494"
+    const-string/jumbo v0, "16495"
+    const-string/jumbo v0, "16496"
+    const-string/jumbo v0, "16497"
+    const-string/jumbo v0, "16498"
+    const-string/jumbo v0, "16499"
+    const-string/jumbo v0, "16500"
+    const-string/jumbo v0, "16501"
+    const-string/jumbo v0, "16502"
+    const-string/jumbo v0, "16503"
+    const-string/jumbo v0, "16504"
+    const-string/jumbo v0, "16505"
+    const-string/jumbo v0, "16506"
+    const-string/jumbo v0, "16507"
+    const-string/jumbo v0, "16508"
+    const-string/jumbo v0, "16509"
+    const-string/jumbo v0, "16510"
+    const-string/jumbo v0, "16511"
+    const-string/jumbo v0, "16512"
+    const-string/jumbo v0, "16513"
+    const-string/jumbo v0, "16514"
+    const-string/jumbo v0, "16515"
+    const-string/jumbo v0, "16516"
+    const-string/jumbo v0, "16517"
+    const-string/jumbo v0, "16518"
+    const-string/jumbo v0, "16519"
+    const-string/jumbo v0, "16520"
+    const-string/jumbo v0, "16521"
+    const-string/jumbo v0, "16522"
+    const-string/jumbo v0, "16523"
+    const-string/jumbo v0, "16524"
+    const-string/jumbo v0, "16525"
+    const-string/jumbo v0, "16526"
+    const-string/jumbo v0, "16527"
+    const-string/jumbo v0, "16528"
+    const-string/jumbo v0, "16529"
+    const-string/jumbo v0, "16530"
+    const-string/jumbo v0, "16531"
+    const-string/jumbo v0, "16532"
+    const-string/jumbo v0, "16533"
+    const-string/jumbo v0, "16534"
+    const-string/jumbo v0, "16535"
+    const-string/jumbo v0, "16536"
+    const-string/jumbo v0, "16537"
+    const-string/jumbo v0, "16538"
+    const-string/jumbo v0, "16539"
+    const-string/jumbo v0, "16540"
+    const-string/jumbo v0, "16541"
+    const-string/jumbo v0, "16542"
+    const-string/jumbo v0, "16543"
+    const-string/jumbo v0, "16544"
+    const-string/jumbo v0, "16545"
+    const-string/jumbo v0, "16546"
+    const-string/jumbo v0, "16547"
+    const-string/jumbo v0, "16548"
+    const-string/jumbo v0, "16549"
+    const-string/jumbo v0, "16550"
+    const-string/jumbo v0, "16551"
+    const-string/jumbo v0, "16552"
+    const-string/jumbo v0, "16553"
+    const-string/jumbo v0, "16554"
+    const-string/jumbo v0, "16555"
+    const-string/jumbo v0, "16556"
+    const-string/jumbo v0, "16557"
+    const-string/jumbo v0, "16558"
+    const-string/jumbo v0, "16559"
+    const-string/jumbo v0, "16560"
+    const-string/jumbo v0, "16561"
+    const-string/jumbo v0, "16562"
+    const-string/jumbo v0, "16563"
+    const-string/jumbo v0, "16564"
+    const-string/jumbo v0, "16565"
+    const-string/jumbo v0, "16566"
+    const-string/jumbo v0, "16567"
+    const-string/jumbo v0, "16568"
+    const-string/jumbo v0, "16569"
+    const-string/jumbo v0, "16570"
+    const-string/jumbo v0, "16571"
+    const-string/jumbo v0, "16572"
+    const-string/jumbo v0, "16573"
+    const-string/jumbo v0, "16574"
+    const-string/jumbo v0, "16575"
+    const-string/jumbo v0, "16576"
+    const-string/jumbo v0, "16577"
+    const-string/jumbo v0, "16578"
+    const-string/jumbo v0, "16579"
+    const-string/jumbo v0, "16580"
+    const-string/jumbo v0, "16581"
+    const-string/jumbo v0, "16582"
+    const-string/jumbo v0, "16583"
+    const-string/jumbo v0, "16584"
+    const-string/jumbo v0, "16585"
+    const-string/jumbo v0, "16586"
+    const-string/jumbo v0, "16587"
+    const-string/jumbo v0, "16588"
+    const-string/jumbo v0, "16589"
+    const-string/jumbo v0, "16590"
+    const-string/jumbo v0, "16591"
+    const-string/jumbo v0, "16592"
+    const-string/jumbo v0, "16593"
+    const-string/jumbo v0, "16594"
+    const-string/jumbo v0, "16595"
+    const-string/jumbo v0, "16596"
+    const-string/jumbo v0, "16597"
+    const-string/jumbo v0, "16598"
+    const-string/jumbo v0, "16599"
+    const-string/jumbo v0, "16600"
+    const-string/jumbo v0, "16601"
+    const-string/jumbo v0, "16602"
+    const-string/jumbo v0, "16603"
+    const-string/jumbo v0, "16604"
+    const-string/jumbo v0, "16605"
+    const-string/jumbo v0, "16606"
+    const-string/jumbo v0, "16607"
+    const-string/jumbo v0, "16608"
+    const-string/jumbo v0, "16609"
+    const-string/jumbo v0, "16610"
+    const-string/jumbo v0, "16611"
+    const-string/jumbo v0, "16612"
+    const-string/jumbo v0, "16613"
+    const-string/jumbo v0, "16614"
+    const-string/jumbo v0, "16615"
+    const-string/jumbo v0, "16616"
+    const-string/jumbo v0, "16617"
+    const-string/jumbo v0, "16618"
+    const-string/jumbo v0, "16619"
+    const-string/jumbo v0, "16620"
+    const-string/jumbo v0, "16621"
+    const-string/jumbo v0, "16622"
+    const-string/jumbo v0, "16623"
+    const-string/jumbo v0, "16624"
+    const-string/jumbo v0, "16625"
+    const-string/jumbo v0, "16626"
+    const-string/jumbo v0, "16627"
+    const-string/jumbo v0, "16628"
+    const-string/jumbo v0, "16629"
+    const-string/jumbo v0, "16630"
+    const-string/jumbo v0, "16631"
+    const-string/jumbo v0, "16632"
+    const-string/jumbo v0, "16633"
+    const-string/jumbo v0, "16634"
+    const-string/jumbo v0, "16635"
+    const-string/jumbo v0, "16636"
+    const-string/jumbo v0, "16637"
+    const-string/jumbo v0, "16638"
+    const-string/jumbo v0, "16639"
+    const-string/jumbo v0, "16640"
+    const-string/jumbo v0, "16641"
+    const-string/jumbo v0, "16642"
+    const-string/jumbo v0, "16643"
+    const-string/jumbo v0, "16644"
+    const-string/jumbo v0, "16645"
+    const-string/jumbo v0, "16646"
+    const-string/jumbo v0, "16647"
+    const-string/jumbo v0, "16648"
+    const-string/jumbo v0, "16649"
+    const-string/jumbo v0, "16650"
+    const-string/jumbo v0, "16651"
+    const-string/jumbo v0, "16652"
+    const-string/jumbo v0, "16653"
+    const-string/jumbo v0, "16654"
+    const-string/jumbo v0, "16655"
+    const-string/jumbo v0, "16656"
+    const-string/jumbo v0, "16657"
+    const-string/jumbo v0, "16658"
+    const-string/jumbo v0, "16659"
+    const-string/jumbo v0, "16660"
+    const-string/jumbo v0, "16661"
+    const-string/jumbo v0, "16662"
+    const-string/jumbo v0, "16663"
+    const-string/jumbo v0, "16664"
+    const-string/jumbo v0, "16665"
+    const-string/jumbo v0, "16666"
+    const-string/jumbo v0, "16667"
+    const-string/jumbo v0, "16668"
+    const-string/jumbo v0, "16669"
+    const-string/jumbo v0, "16670"
+    const-string/jumbo v0, "16671"
+    const-string/jumbo v0, "16672"
+    const-string/jumbo v0, "16673"
+    const-string/jumbo v0, "16674"
+    const-string/jumbo v0, "16675"
+    const-string/jumbo v0, "16676"
+    const-string/jumbo v0, "16677"
+    const-string/jumbo v0, "16678"
+    const-string/jumbo v0, "16679"
+    const-string/jumbo v0, "16680"
+    const-string/jumbo v0, "16681"
+    const-string/jumbo v0, "16682"
+    const-string/jumbo v0, "16683"
+    const-string/jumbo v0, "16684"
+    const-string/jumbo v0, "16685"
+    const-string/jumbo v0, "16686"
+    const-string/jumbo v0, "16687"
+    const-string/jumbo v0, "16688"
+    const-string/jumbo v0, "16689"
+    const-string/jumbo v0, "16690"
+    const-string/jumbo v0, "16691"
+    const-string/jumbo v0, "16692"
+    const-string/jumbo v0, "16693"
+    const-string/jumbo v0, "16694"
+    const-string/jumbo v0, "16695"
+    const-string/jumbo v0, "16696"
+    const-string/jumbo v0, "16697"
+    const-string/jumbo v0, "16698"
+    const-string/jumbo v0, "16699"
+    const-string/jumbo v0, "16700"
+    const-string/jumbo v0, "16701"
+    const-string/jumbo v0, "16702"
+    const-string/jumbo v0, "16703"
+    const-string/jumbo v0, "16704"
+    const-string/jumbo v0, "16705"
+    const-string/jumbo v0, "16706"
+    const-string/jumbo v0, "16707"
+    const-string/jumbo v0, "16708"
+    const-string/jumbo v0, "16709"
+    const-string/jumbo v0, "16710"
+    const-string/jumbo v0, "16711"
+    const-string/jumbo v0, "16712"
+    const-string/jumbo v0, "16713"
+    const-string/jumbo v0, "16714"
+    const-string/jumbo v0, "16715"
+    const-string/jumbo v0, "16716"
+    const-string/jumbo v0, "16717"
+    const-string/jumbo v0, "16718"
+    const-string/jumbo v0, "16719"
+    const-string/jumbo v0, "16720"
+    const-string/jumbo v0, "16721"
+    const-string/jumbo v0, "16722"
+    const-string/jumbo v0, "16723"
+    const-string/jumbo v0, "16724"
+    const-string/jumbo v0, "16725"
+    const-string/jumbo v0, "16726"
+    const-string/jumbo v0, "16727"
+    const-string/jumbo v0, "16728"
+    const-string/jumbo v0, "16729"
+    const-string/jumbo v0, "16730"
+    const-string/jumbo v0, "16731"
+    const-string/jumbo v0, "16732"
+    const-string/jumbo v0, "16733"
+    const-string/jumbo v0, "16734"
+    const-string/jumbo v0, "16735"
+    const-string/jumbo v0, "16736"
+    const-string/jumbo v0, "16737"
+    const-string/jumbo v0, "16738"
+    const-string/jumbo v0, "16739"
+    const-string/jumbo v0, "16740"
+    const-string/jumbo v0, "16741"
+    const-string/jumbo v0, "16742"
+    const-string/jumbo v0, "16743"
+    const-string/jumbo v0, "16744"
+    const-string/jumbo v0, "16745"
+    const-string/jumbo v0, "16746"
+    const-string/jumbo v0, "16747"
+    const-string/jumbo v0, "16748"
+    const-string/jumbo v0, "16749"
+    const-string/jumbo v0, "16750"
+    const-string/jumbo v0, "16751"
+    const-string/jumbo v0, "16752"
+    const-string/jumbo v0, "16753"
+    const-string/jumbo v0, "16754"
+    const-string/jumbo v0, "16755"
+    const-string/jumbo v0, "16756"
+    const-string/jumbo v0, "16757"
+    const-string/jumbo v0, "16758"
+    const-string/jumbo v0, "16759"
+    const-string/jumbo v0, "16760"
+    const-string/jumbo v0, "16761"
+    const-string/jumbo v0, "16762"
+    const-string/jumbo v0, "16763"
+    const-string/jumbo v0, "16764"
+    const-string/jumbo v0, "16765"
+    const-string/jumbo v0, "16766"
+    const-string/jumbo v0, "16767"
+    const-string/jumbo v0, "16768"
+    const-string/jumbo v0, "16769"
+    const-string/jumbo v0, "16770"
+    const-string/jumbo v0, "16771"
+    const-string/jumbo v0, "16772"
+    const-string/jumbo v0, "16773"
+    const-string/jumbo v0, "16774"
+    const-string/jumbo v0, "16775"
+    const-string/jumbo v0, "16776"
+    const-string/jumbo v0, "16777"
+    const-string/jumbo v0, "16778"
+    const-string/jumbo v0, "16779"
+    const-string/jumbo v0, "16780"
+    const-string/jumbo v0, "16781"
+    const-string/jumbo v0, "16782"
+    const-string/jumbo v0, "16783"
+    const-string/jumbo v0, "16784"
+    const-string/jumbo v0, "16785"
+    const-string/jumbo v0, "16786"
+    const-string/jumbo v0, "16787"
+    const-string/jumbo v0, "16788"
+    const-string/jumbo v0, "16789"
+    const-string/jumbo v0, "16790"
+    const-string/jumbo v0, "16791"
+    const-string/jumbo v0, "16792"
+    const-string/jumbo v0, "16793"
+    const-string/jumbo v0, "16794"
+    const-string/jumbo v0, "16795"
+    const-string/jumbo v0, "16796"
+    const-string/jumbo v0, "16797"
+    const-string/jumbo v0, "16798"
+    const-string/jumbo v0, "16799"
+    const-string/jumbo v0, "16800"
+    const-string/jumbo v0, "16801"
+    const-string/jumbo v0, "16802"
+    const-string/jumbo v0, "16803"
+    const-string/jumbo v0, "16804"
+    const-string/jumbo v0, "16805"
+    const-string/jumbo v0, "16806"
+    const-string/jumbo v0, "16807"
+    const-string/jumbo v0, "16808"
+    const-string/jumbo v0, "16809"
+    const-string/jumbo v0, "16810"
+    const-string/jumbo v0, "16811"
+    const-string/jumbo v0, "16812"
+    const-string/jumbo v0, "16813"
+    const-string/jumbo v0, "16814"
+    const-string/jumbo v0, "16815"
+    const-string/jumbo v0, "16816"
+    const-string/jumbo v0, "16817"
+    const-string/jumbo v0, "16818"
+    const-string/jumbo v0, "16819"
+    const-string/jumbo v0, "16820"
+    const-string/jumbo v0, "16821"
+    const-string/jumbo v0, "16822"
+    const-string/jumbo v0, "16823"
+    const-string/jumbo v0, "16824"
+    const-string/jumbo v0, "16825"
+    const-string/jumbo v0, "16826"
+    const-string/jumbo v0, "16827"
+    const-string/jumbo v0, "16828"
+    const-string/jumbo v0, "16829"
+    const-string/jumbo v0, "16830"
+    const-string/jumbo v0, "16831"
+    const-string/jumbo v0, "16832"
+    const-string/jumbo v0, "16833"
+    const-string/jumbo v0, "16834"
+    const-string/jumbo v0, "16835"
+    const-string/jumbo v0, "16836"
+    const-string/jumbo v0, "16837"
+    const-string/jumbo v0, "16838"
+    const-string/jumbo v0, "16839"
+    const-string/jumbo v0, "16840"
+    const-string/jumbo v0, "16841"
+    const-string/jumbo v0, "16842"
+    const-string/jumbo v0, "16843"
+    const-string/jumbo v0, "16844"
+    const-string/jumbo v0, "16845"
+    const-string/jumbo v0, "16846"
+    const-string/jumbo v0, "16847"
+    const-string/jumbo v0, "16848"
+    const-string/jumbo v0, "16849"
+    const-string/jumbo v0, "16850"
+    const-string/jumbo v0, "16851"
+    const-string/jumbo v0, "16852"
+    const-string/jumbo v0, "16853"
+    const-string/jumbo v0, "16854"
+    const-string/jumbo v0, "16855"
+    const-string/jumbo v0, "16856"
+    const-string/jumbo v0, "16857"
+    const-string/jumbo v0, "16858"
+    const-string/jumbo v0, "16859"
+    const-string/jumbo v0, "16860"
+    const-string/jumbo v0, "16861"
+    const-string/jumbo v0, "16862"
+    const-string/jumbo v0, "16863"
+    const-string/jumbo v0, "16864"
+    const-string/jumbo v0, "16865"
+    const-string/jumbo v0, "16866"
+    const-string/jumbo v0, "16867"
+    const-string/jumbo v0, "16868"
+    const-string/jumbo v0, "16869"
+    const-string/jumbo v0, "16870"
+    const-string/jumbo v0, "16871"
+    const-string/jumbo v0, "16872"
+    const-string/jumbo v0, "16873"
+    const-string/jumbo v0, "16874"
+    const-string/jumbo v0, "16875"
+    const-string/jumbo v0, "16876"
+    const-string/jumbo v0, "16877"
+    const-string/jumbo v0, "16878"
+    const-string/jumbo v0, "16879"
+    const-string/jumbo v0, "16880"
+    const-string/jumbo v0, "16881"
+    const-string/jumbo v0, "16882"
+    const-string/jumbo v0, "16883"
+    const-string/jumbo v0, "16884"
+    const-string/jumbo v0, "16885"
+    const-string/jumbo v0, "16886"
+    const-string/jumbo v0, "16887"
+    const-string/jumbo v0, "16888"
+    const-string/jumbo v0, "16889"
+    const-string/jumbo v0, "16890"
+    const-string/jumbo v0, "16891"
+    const-string/jumbo v0, "16892"
+    const-string/jumbo v0, "16893"
+    const-string/jumbo v0, "16894"
+    const-string/jumbo v0, "16895"
+    const-string/jumbo v0, "16896"
+    const-string/jumbo v0, "16897"
+    const-string/jumbo v0, "16898"
+    const-string/jumbo v0, "16899"
+    const-string/jumbo v0, "16900"
+    const-string/jumbo v0, "16901"
+    const-string/jumbo v0, "16902"
+    const-string/jumbo v0, "16903"
+    const-string/jumbo v0, "16904"
+    const-string/jumbo v0, "16905"
+    const-string/jumbo v0, "16906"
+    const-string/jumbo v0, "16907"
+    const-string/jumbo v0, "16908"
+    const-string/jumbo v0, "16909"
+    const-string/jumbo v0, "16910"
+    const-string/jumbo v0, "16911"
+    const-string/jumbo v0, "16912"
+    const-string/jumbo v0, "16913"
+    const-string/jumbo v0, "16914"
+    const-string/jumbo v0, "16915"
+    const-string/jumbo v0, "16916"
+    const-string/jumbo v0, "16917"
+    const-string/jumbo v0, "16918"
+    const-string/jumbo v0, "16919"
+    const-string/jumbo v0, "16920"
+    const-string/jumbo v0, "16921"
+    const-string/jumbo v0, "16922"
+    const-string/jumbo v0, "16923"
+    const-string/jumbo v0, "16924"
+    const-string/jumbo v0, "16925"
+    const-string/jumbo v0, "16926"
+    const-string/jumbo v0, "16927"
+    const-string/jumbo v0, "16928"
+    const-string/jumbo v0, "16929"
+    const-string/jumbo v0, "16930"
+    const-string/jumbo v0, "16931"
+    const-string/jumbo v0, "16932"
+    const-string/jumbo v0, "16933"
+    const-string/jumbo v0, "16934"
+    const-string/jumbo v0, "16935"
+    const-string/jumbo v0, "16936"
+    const-string/jumbo v0, "16937"
+    const-string/jumbo v0, "16938"
+    const-string/jumbo v0, "16939"
+    const-string/jumbo v0, "16940"
+    const-string/jumbo v0, "16941"
+    const-string/jumbo v0, "16942"
+    const-string/jumbo v0, "16943"
+    const-string/jumbo v0, "16944"
+    const-string/jumbo v0, "16945"
+    const-string/jumbo v0, "16946"
+    const-string/jumbo v0, "16947"
+    const-string/jumbo v0, "16948"
+    const-string/jumbo v0, "16949"
+    const-string/jumbo v0, "16950"
+    const-string/jumbo v0, "16951"
+    const-string/jumbo v0, "16952"
+    const-string/jumbo v0, "16953"
+    const-string/jumbo v0, "16954"
+    const-string/jumbo v0, "16955"
+    const-string/jumbo v0, "16956"
+    const-string/jumbo v0, "16957"
+    const-string/jumbo v0, "16958"
+    const-string/jumbo v0, "16959"
+    const-string/jumbo v0, "16960"
+    const-string/jumbo v0, "16961"
+    const-string/jumbo v0, "16962"
+    const-string/jumbo v0, "16963"
+    const-string/jumbo v0, "16964"
+    const-string/jumbo v0, "16965"
+    const-string/jumbo v0, "16966"
+    const-string/jumbo v0, "16967"
+    const-string/jumbo v0, "16968"
+    const-string/jumbo v0, "16969"
+    const-string/jumbo v0, "16970"
+    const-string/jumbo v0, "16971"
+    const-string/jumbo v0, "16972"
+    const-string/jumbo v0, "16973"
+    const-string/jumbo v0, "16974"
+    const-string/jumbo v0, "16975"
+    const-string/jumbo v0, "16976"
+    const-string/jumbo v0, "16977"
+    const-string/jumbo v0, "16978"
+    const-string/jumbo v0, "16979"
+    const-string/jumbo v0, "16980"
+    const-string/jumbo v0, "16981"
+    const-string/jumbo v0, "16982"
+    const-string/jumbo v0, "16983"
+    const-string/jumbo v0, "16984"
+    const-string/jumbo v0, "16985"
+    const-string/jumbo v0, "16986"
+    const-string/jumbo v0, "16987"
+    const-string/jumbo v0, "16988"
+    const-string/jumbo v0, "16989"
+    const-string/jumbo v0, "16990"
+    const-string/jumbo v0, "16991"
+    const-string/jumbo v0, "16992"
+    const-string/jumbo v0, "16993"
+    const-string/jumbo v0, "16994"
+    const-string/jumbo v0, "16995"
+    const-string/jumbo v0, "16996"
+    const-string/jumbo v0, "16997"
+    const-string/jumbo v0, "16998"
+    const-string/jumbo v0, "16999"
+    const-string/jumbo v0, "17000"
+    const-string/jumbo v0, "17001"
+    const-string/jumbo v0, "17002"
+    const-string/jumbo v0, "17003"
+    const-string/jumbo v0, "17004"
+    const-string/jumbo v0, "17005"
+    const-string/jumbo v0, "17006"
+    const-string/jumbo v0, "17007"
+    const-string/jumbo v0, "17008"
+    const-string/jumbo v0, "17009"
+    const-string/jumbo v0, "17010"
+    const-string/jumbo v0, "17011"
+    const-string/jumbo v0, "17012"
+    const-string/jumbo v0, "17013"
+    const-string/jumbo v0, "17014"
+    const-string/jumbo v0, "17015"
+    const-string/jumbo v0, "17016"
+    const-string/jumbo v0, "17017"
+    const-string/jumbo v0, "17018"
+    const-string/jumbo v0, "17019"
+    const-string/jumbo v0, "17020"
+    const-string/jumbo v0, "17021"
+    const-string/jumbo v0, "17022"
+    const-string/jumbo v0, "17023"
+    const-string/jumbo v0, "17024"
+    const-string/jumbo v0, "17025"
+    const-string/jumbo v0, "17026"
+    const-string/jumbo v0, "17027"
+    const-string/jumbo v0, "17028"
+    const-string/jumbo v0, "17029"
+    const-string/jumbo v0, "17030"
+    const-string/jumbo v0, "17031"
+    const-string/jumbo v0, "17032"
+    const-string/jumbo v0, "17033"
+    const-string/jumbo v0, "17034"
+    const-string/jumbo v0, "17035"
+    const-string/jumbo v0, "17036"
+    const-string/jumbo v0, "17037"
+    const-string/jumbo v0, "17038"
+    const-string/jumbo v0, "17039"
+    const-string/jumbo v0, "17040"
+    const-string/jumbo v0, "17041"
+    const-string/jumbo v0, "17042"
+    const-string/jumbo v0, "17043"
+    const-string/jumbo v0, "17044"
+    const-string/jumbo v0, "17045"
+    const-string/jumbo v0, "17046"
+    const-string/jumbo v0, "17047"
+    const-string/jumbo v0, "17048"
+    const-string/jumbo v0, "17049"
+    const-string/jumbo v0, "17050"
+    const-string/jumbo v0, "17051"
+    const-string/jumbo v0, "17052"
+    const-string/jumbo v0, "17053"
+    const-string/jumbo v0, "17054"
+    const-string/jumbo v0, "17055"
+    const-string/jumbo v0, "17056"
+    const-string/jumbo v0, "17057"
+    const-string/jumbo v0, "17058"
+    const-string/jumbo v0, "17059"
+    const-string/jumbo v0, "17060"
+    const-string/jumbo v0, "17061"
+    const-string/jumbo v0, "17062"
+    const-string/jumbo v0, "17063"
+    const-string/jumbo v0, "17064"
+    const-string/jumbo v0, "17065"
+    const-string/jumbo v0, "17066"
+    const-string/jumbo v0, "17067"
+    const-string/jumbo v0, "17068"
+    const-string/jumbo v0, "17069"
+    const-string/jumbo v0, "17070"
+    const-string/jumbo v0, "17071"
+    const-string/jumbo v0, "17072"
+    const-string/jumbo v0, "17073"
+    const-string/jumbo v0, "17074"
+    const-string/jumbo v0, "17075"
+    const-string/jumbo v0, "17076"
+    const-string/jumbo v0, "17077"
+    const-string/jumbo v0, "17078"
+    const-string/jumbo v0, "17079"
+    const-string/jumbo v0, "17080"
+    const-string/jumbo v0, "17081"
+    const-string/jumbo v0, "17082"
+    const-string/jumbo v0, "17083"
+    const-string/jumbo v0, "17084"
+    const-string/jumbo v0, "17085"
+    const-string/jumbo v0, "17086"
+    const-string/jumbo v0, "17087"
+    const-string/jumbo v0, "17088"
+    const-string/jumbo v0, "17089"
+    const-string/jumbo v0, "17090"
+    const-string/jumbo v0, "17091"
+    const-string/jumbo v0, "17092"
+    const-string/jumbo v0, "17093"
+    const-string/jumbo v0, "17094"
+    const-string/jumbo v0, "17095"
+    const-string/jumbo v0, "17096"
+    const-string/jumbo v0, "17097"
+    const-string/jumbo v0, "17098"
+    const-string/jumbo v0, "17099"
+    const-string/jumbo v0, "17100"
+    const-string/jumbo v0, "17101"
+    const-string/jumbo v0, "17102"
+    const-string/jumbo v0, "17103"
+    const-string/jumbo v0, "17104"
+    const-string/jumbo v0, "17105"
+    const-string/jumbo v0, "17106"
+    const-string/jumbo v0, "17107"
+    const-string/jumbo v0, "17108"
+    const-string/jumbo v0, "17109"
+    const-string/jumbo v0, "17110"
+    const-string/jumbo v0, "17111"
+    const-string/jumbo v0, "17112"
+    const-string/jumbo v0, "17113"
+    const-string/jumbo v0, "17114"
+    const-string/jumbo v0, "17115"
+    const-string/jumbo v0, "17116"
+    const-string/jumbo v0, "17117"
+    const-string/jumbo v0, "17118"
+    const-string/jumbo v0, "17119"
+    const-string/jumbo v0, "17120"
+    const-string/jumbo v0, "17121"
+    const-string/jumbo v0, "17122"
+    const-string/jumbo v0, "17123"
+    const-string/jumbo v0, "17124"
+    const-string/jumbo v0, "17125"
+    const-string/jumbo v0, "17126"
+    const-string/jumbo v0, "17127"
+    const-string/jumbo v0, "17128"
+    const-string/jumbo v0, "17129"
+    const-string/jumbo v0, "17130"
+    const-string/jumbo v0, "17131"
+    const-string/jumbo v0, "17132"
+    const-string/jumbo v0, "17133"
+    const-string/jumbo v0, "17134"
+    const-string/jumbo v0, "17135"
+    const-string/jumbo v0, "17136"
+    const-string/jumbo v0, "17137"
+    const-string/jumbo v0, "17138"
+    const-string/jumbo v0, "17139"
+    const-string/jumbo v0, "17140"
+    const-string/jumbo v0, "17141"
+    const-string/jumbo v0, "17142"
+    const-string/jumbo v0, "17143"
+    const-string/jumbo v0, "17144"
+    const-string/jumbo v0, "17145"
+    const-string/jumbo v0, "17146"
+    const-string/jumbo v0, "17147"
+    const-string/jumbo v0, "17148"
+    const-string/jumbo v0, "17149"
+    const-string/jumbo v0, "17150"
+    const-string/jumbo v0, "17151"
+    const-string/jumbo v0, "17152"
+    const-string/jumbo v0, "17153"
+    const-string/jumbo v0, "17154"
+    const-string/jumbo v0, "17155"
+    const-string/jumbo v0, "17156"
+    const-string/jumbo v0, "17157"
+    const-string/jumbo v0, "17158"
+    const-string/jumbo v0, "17159"
+    const-string/jumbo v0, "17160"
+    const-string/jumbo v0, "17161"
+    const-string/jumbo v0, "17162"
+    const-string/jumbo v0, "17163"
+    const-string/jumbo v0, "17164"
+    const-string/jumbo v0, "17165"
+    const-string/jumbo v0, "17166"
+    const-string/jumbo v0, "17167"
+    const-string/jumbo v0, "17168"
+    const-string/jumbo v0, "17169"
+    const-string/jumbo v0, "17170"
+    const-string/jumbo v0, "17171"
+    const-string/jumbo v0, "17172"
+    const-string/jumbo v0, "17173"
+    const-string/jumbo v0, "17174"
+    const-string/jumbo v0, "17175"
+    const-string/jumbo v0, "17176"
+    const-string/jumbo v0, "17177"
+    const-string/jumbo v0, "17178"
+    const-string/jumbo v0, "17179"
+    const-string/jumbo v0, "17180"
+    const-string/jumbo v0, "17181"
+    const-string/jumbo v0, "17182"
+    const-string/jumbo v0, "17183"
+    const-string/jumbo v0, "17184"
+    const-string/jumbo v0, "17185"
+    const-string/jumbo v0, "17186"
+    const-string/jumbo v0, "17187"
+    const-string/jumbo v0, "17188"
+    const-string/jumbo v0, "17189"
+    const-string/jumbo v0, "17190"
+    const-string/jumbo v0, "17191"
+    const-string/jumbo v0, "17192"
+    const-string/jumbo v0, "17193"
+    const-string/jumbo v0, "17194"
+    const-string/jumbo v0, "17195"
+    const-string/jumbo v0, "17196"
+    const-string/jumbo v0, "17197"
+    const-string/jumbo v0, "17198"
+    const-string/jumbo v0, "17199"
+    const-string/jumbo v0, "17200"
+    const-string/jumbo v0, "17201"
+    const-string/jumbo v0, "17202"
+    const-string/jumbo v0, "17203"
+    const-string/jumbo v0, "17204"
+    const-string/jumbo v0, "17205"
+    const-string/jumbo v0, "17206"
+    const-string/jumbo v0, "17207"
+    const-string/jumbo v0, "17208"
+    const-string/jumbo v0, "17209"
+    const-string/jumbo v0, "17210"
+    const-string/jumbo v0, "17211"
+    const-string/jumbo v0, "17212"
+    const-string/jumbo v0, "17213"
+    const-string/jumbo v0, "17214"
+    const-string/jumbo v0, "17215"
+    const-string/jumbo v0, "17216"
+    const-string/jumbo v0, "17217"
+    const-string/jumbo v0, "17218"
+    const-string/jumbo v0, "17219"
+    const-string/jumbo v0, "17220"
+    const-string/jumbo v0, "17221"
+    const-string/jumbo v0, "17222"
+    const-string/jumbo v0, "17223"
+    const-string/jumbo v0, "17224"
+    const-string/jumbo v0, "17225"
+    const-string/jumbo v0, "17226"
+    const-string/jumbo v0, "17227"
+    const-string/jumbo v0, "17228"
+    const-string/jumbo v0, "17229"
+    const-string/jumbo v0, "17230"
+    const-string/jumbo v0, "17231"
+    const-string/jumbo v0, "17232"
+    const-string/jumbo v0, "17233"
+    const-string/jumbo v0, "17234"
+    const-string/jumbo v0, "17235"
+    const-string/jumbo v0, "17236"
+    const-string/jumbo v0, "17237"
+    const-string/jumbo v0, "17238"
+    const-string/jumbo v0, "17239"
+    const-string/jumbo v0, "17240"
+    const-string/jumbo v0, "17241"
+    const-string/jumbo v0, "17242"
+    const-string/jumbo v0, "17243"
+    const-string/jumbo v0, "17244"
+    const-string/jumbo v0, "17245"
+    const-string/jumbo v0, "17246"
+    const-string/jumbo v0, "17247"
+    const-string/jumbo v0, "17248"
+    const-string/jumbo v0, "17249"
+    const-string/jumbo v0, "17250"
+    const-string/jumbo v0, "17251"
+    const-string/jumbo v0, "17252"
+    const-string/jumbo v0, "17253"
+    const-string/jumbo v0, "17254"
+    const-string/jumbo v0, "17255"
+    const-string/jumbo v0, "17256"
+    const-string/jumbo v0, "17257"
+    const-string/jumbo v0, "17258"
+    const-string/jumbo v0, "17259"
+    const-string/jumbo v0, "17260"
+    const-string/jumbo v0, "17261"
+    const-string/jumbo v0, "17262"
+    const-string/jumbo v0, "17263"
+    const-string/jumbo v0, "17264"
+    const-string/jumbo v0, "17265"
+    const-string/jumbo v0, "17266"
+    const-string/jumbo v0, "17267"
+    const-string/jumbo v0, "17268"
+    const-string/jumbo v0, "17269"
+    const-string/jumbo v0, "17270"
+    const-string/jumbo v0, "17271"
+    const-string/jumbo v0, "17272"
+    const-string/jumbo v0, "17273"
+    const-string/jumbo v0, "17274"
+    const-string/jumbo v0, "17275"
+    const-string/jumbo v0, "17276"
+    const-string/jumbo v0, "17277"
+    const-string/jumbo v0, "17278"
+    const-string/jumbo v0, "17279"
+    const-string/jumbo v0, "17280"
+    const-string/jumbo v0, "17281"
+    const-string/jumbo v0, "17282"
+    const-string/jumbo v0, "17283"
+    const-string/jumbo v0, "17284"
+    const-string/jumbo v0, "17285"
+    const-string/jumbo v0, "17286"
+    const-string/jumbo v0, "17287"
+    const-string/jumbo v0, "17288"
+    const-string/jumbo v0, "17289"
+    const-string/jumbo v0, "17290"
+    const-string/jumbo v0, "17291"
+    const-string/jumbo v0, "17292"
+    const-string/jumbo v0, "17293"
+    const-string/jumbo v0, "17294"
+    const-string/jumbo v0, "17295"
+    const-string/jumbo v0, "17296"
+    const-string/jumbo v0, "17297"
+    const-string/jumbo v0, "17298"
+    const-string/jumbo v0, "17299"
+    const-string/jumbo v0, "17300"
+    const-string/jumbo v0, "17301"
+    const-string/jumbo v0, "17302"
+    const-string/jumbo v0, "17303"
+    const-string/jumbo v0, "17304"
+    const-string/jumbo v0, "17305"
+    const-string/jumbo v0, "17306"
+    const-string/jumbo v0, "17307"
+    const-string/jumbo v0, "17308"
+    const-string/jumbo v0, "17309"
+    const-string/jumbo v0, "17310"
+    const-string/jumbo v0, "17311"
+    const-string/jumbo v0, "17312"
+    const-string/jumbo v0, "17313"
+    const-string/jumbo v0, "17314"
+    const-string/jumbo v0, "17315"
+    const-string/jumbo v0, "17316"
+    const-string/jumbo v0, "17317"
+    const-string/jumbo v0, "17318"
+    const-string/jumbo v0, "17319"
+    const-string/jumbo v0, "17320"
+    const-string/jumbo v0, "17321"
+    const-string/jumbo v0, "17322"
+    const-string/jumbo v0, "17323"
+    const-string/jumbo v0, "17324"
+    const-string/jumbo v0, "17325"
+    const-string/jumbo v0, "17326"
+    const-string/jumbo v0, "17327"
+    const-string/jumbo v0, "17328"
+    const-string/jumbo v0, "17329"
+    const-string/jumbo v0, "17330"
+    const-string/jumbo v0, "17331"
+    const-string/jumbo v0, "17332"
+    const-string/jumbo v0, "17333"
+    const-string/jumbo v0, "17334"
+    const-string/jumbo v0, "17335"
+    const-string/jumbo v0, "17336"
+    const-string/jumbo v0, "17337"
+    const-string/jumbo v0, "17338"
+    const-string/jumbo v0, "17339"
+    const-string/jumbo v0, "17340"
+    const-string/jumbo v0, "17341"
+    const-string/jumbo v0, "17342"
+    const-string/jumbo v0, "17343"
+    const-string/jumbo v0, "17344"
+    const-string/jumbo v0, "17345"
+    const-string/jumbo v0, "17346"
+    const-string/jumbo v0, "17347"
+    const-string/jumbo v0, "17348"
+    const-string/jumbo v0, "17349"
+    const-string/jumbo v0, "17350"
+    const-string/jumbo v0, "17351"
+    const-string/jumbo v0, "17352"
+    const-string/jumbo v0, "17353"
+    const-string/jumbo v0, "17354"
+    const-string/jumbo v0, "17355"
+    const-string/jumbo v0, "17356"
+    const-string/jumbo v0, "17357"
+    const-string/jumbo v0, "17358"
+    const-string/jumbo v0, "17359"
+    const-string/jumbo v0, "17360"
+    const-string/jumbo v0, "17361"
+    const-string/jumbo v0, "17362"
+    const-string/jumbo v0, "17363"
+    const-string/jumbo v0, "17364"
+    const-string/jumbo v0, "17365"
+    const-string/jumbo v0, "17366"
+    const-string/jumbo v0, "17367"
+    const-string/jumbo v0, "17368"
+    const-string/jumbo v0, "17369"
+    const-string/jumbo v0, "17370"
+    const-string/jumbo v0, "17371"
+    const-string/jumbo v0, "17372"
+    const-string/jumbo v0, "17373"
+    const-string/jumbo v0, "17374"
+    const-string/jumbo v0, "17375"
+    const-string/jumbo v0, "17376"
+    const-string/jumbo v0, "17377"
+    const-string/jumbo v0, "17378"
+    const-string/jumbo v0, "17379"
+    const-string/jumbo v0, "17380"
+    const-string/jumbo v0, "17381"
+    const-string/jumbo v0, "17382"
+    const-string/jumbo v0, "17383"
+    const-string/jumbo v0, "17384"
+    const-string/jumbo v0, "17385"
+    const-string/jumbo v0, "17386"
+    const-string/jumbo v0, "17387"
+    const-string/jumbo v0, "17388"
+    const-string/jumbo v0, "17389"
+    const-string/jumbo v0, "17390"
+    const-string/jumbo v0, "17391"
+    const-string/jumbo v0, "17392"
+    const-string/jumbo v0, "17393"
+    const-string/jumbo v0, "17394"
+    const-string/jumbo v0, "17395"
+    const-string/jumbo v0, "17396"
+    const-string/jumbo v0, "17397"
+    const-string/jumbo v0, "17398"
+    const-string/jumbo v0, "17399"
+    const-string/jumbo v0, "17400"
+    const-string/jumbo v0, "17401"
+    const-string/jumbo v0, "17402"
+    const-string/jumbo v0, "17403"
+    const-string/jumbo v0, "17404"
+    const-string/jumbo v0, "17405"
+    const-string/jumbo v0, "17406"
+    const-string/jumbo v0, "17407"
+    const-string/jumbo v0, "17408"
+    const-string/jumbo v0, "17409"
+    const-string/jumbo v0, "17410"
+    const-string/jumbo v0, "17411"
+    const-string/jumbo v0, "17412"
+    const-string/jumbo v0, "17413"
+    const-string/jumbo v0, "17414"
+    const-string/jumbo v0, "17415"
+    const-string/jumbo v0, "17416"
+    const-string/jumbo v0, "17417"
+    const-string/jumbo v0, "17418"
+    const-string/jumbo v0, "17419"
+    const-string/jumbo v0, "17420"
+    const-string/jumbo v0, "17421"
+    const-string/jumbo v0, "17422"
+    const-string/jumbo v0, "17423"
+    const-string/jumbo v0, "17424"
+    const-string/jumbo v0, "17425"
+    const-string/jumbo v0, "17426"
+    const-string/jumbo v0, "17427"
+    const-string/jumbo v0, "17428"
+    const-string/jumbo v0, "17429"
+    const-string/jumbo v0, "17430"
+    const-string/jumbo v0, "17431"
+    const-string/jumbo v0, "17432"
+    const-string/jumbo v0, "17433"
+    const-string/jumbo v0, "17434"
+    const-string/jumbo v0, "17435"
+    const-string/jumbo v0, "17436"
+    const-string/jumbo v0, "17437"
+    const-string/jumbo v0, "17438"
+    const-string/jumbo v0, "17439"
+    const-string/jumbo v0, "17440"
+    const-string/jumbo v0, "17441"
+    const-string/jumbo v0, "17442"
+    const-string/jumbo v0, "17443"
+    const-string/jumbo v0, "17444"
+    const-string/jumbo v0, "17445"
+    const-string/jumbo v0, "17446"
+    const-string/jumbo v0, "17447"
+    const-string/jumbo v0, "17448"
+    const-string/jumbo v0, "17449"
+    const-string/jumbo v0, "17450"
+    const-string/jumbo v0, "17451"
+    const-string/jumbo v0, "17452"
+    const-string/jumbo v0, "17453"
+    const-string/jumbo v0, "17454"
+    const-string/jumbo v0, "17455"
+    const-string/jumbo v0, "17456"
+    const-string/jumbo v0, "17457"
+    const-string/jumbo v0, "17458"
+    const-string/jumbo v0, "17459"
+    const-string/jumbo v0, "17460"
+    const-string/jumbo v0, "17461"
+    const-string/jumbo v0, "17462"
+    const-string/jumbo v0, "17463"
+    const-string/jumbo v0, "17464"
+    const-string/jumbo v0, "17465"
+    const-string/jumbo v0, "17466"
+    const-string/jumbo v0, "17467"
+    const-string/jumbo v0, "17468"
+    const-string/jumbo v0, "17469"
+    const-string/jumbo v0, "17470"
+    const-string/jumbo v0, "17471"
+    const-string/jumbo v0, "17472"
+    const-string/jumbo v0, "17473"
+    const-string/jumbo v0, "17474"
+    const-string/jumbo v0, "17475"
+    const-string/jumbo v0, "17476"
+    const-string/jumbo v0, "17477"
+    const-string/jumbo v0, "17478"
+    const-string/jumbo v0, "17479"
+    const-string/jumbo v0, "17480"
+    const-string/jumbo v0, "17481"
+    const-string/jumbo v0, "17482"
+    const-string/jumbo v0, "17483"
+    const-string/jumbo v0, "17484"
+    const-string/jumbo v0, "17485"
+    const-string/jumbo v0, "17486"
+    const-string/jumbo v0, "17487"
+    const-string/jumbo v0, "17488"
+    const-string/jumbo v0, "17489"
+    const-string/jumbo v0, "17490"
+    const-string/jumbo v0, "17491"
+    const-string/jumbo v0, "17492"
+    const-string/jumbo v0, "17493"
+    const-string/jumbo v0, "17494"
+    const-string/jumbo v0, "17495"
+    const-string/jumbo v0, "17496"
+    const-string/jumbo v0, "17497"
+    const-string/jumbo v0, "17498"
+    const-string/jumbo v0, "17499"
+    const-string/jumbo v0, "17500"
+    const-string/jumbo v0, "17501"
+    const-string/jumbo v0, "17502"
+    const-string/jumbo v0, "17503"
+    const-string/jumbo v0, "17504"
+    const-string/jumbo v0, "17505"
+    const-string/jumbo v0, "17506"
+    const-string/jumbo v0, "17507"
+    const-string/jumbo v0, "17508"
+    const-string/jumbo v0, "17509"
+    const-string/jumbo v0, "17510"
+    const-string/jumbo v0, "17511"
+    const-string/jumbo v0, "17512"
+    const-string/jumbo v0, "17513"
+    const-string/jumbo v0, "17514"
+    const-string/jumbo v0, "17515"
+    const-string/jumbo v0, "17516"
+    const-string/jumbo v0, "17517"
+    const-string/jumbo v0, "17518"
+    const-string/jumbo v0, "17519"
+    const-string/jumbo v0, "17520"
+    const-string/jumbo v0, "17521"
+    const-string/jumbo v0, "17522"
+    const-string/jumbo v0, "17523"
+    const-string/jumbo v0, "17524"
+    const-string/jumbo v0, "17525"
+    const-string/jumbo v0, "17526"
+    const-string/jumbo v0, "17527"
+    const-string/jumbo v0, "17528"
+    const-string/jumbo v0, "17529"
+    const-string/jumbo v0, "17530"
+    const-string/jumbo v0, "17531"
+    const-string/jumbo v0, "17532"
+    const-string/jumbo v0, "17533"
+    const-string/jumbo v0, "17534"
+    const-string/jumbo v0, "17535"
+    const-string/jumbo v0, "17536"
+    const-string/jumbo v0, "17537"
+    const-string/jumbo v0, "17538"
+    const-string/jumbo v0, "17539"
+    const-string/jumbo v0, "17540"
+    const-string/jumbo v0, "17541"
+    const-string/jumbo v0, "17542"
+    const-string/jumbo v0, "17543"
+    const-string/jumbo v0, "17544"
+    const-string/jumbo v0, "17545"
+    const-string/jumbo v0, "17546"
+    const-string/jumbo v0, "17547"
+    const-string/jumbo v0, "17548"
+    const-string/jumbo v0, "17549"
+    const-string/jumbo v0, "17550"
+    const-string/jumbo v0, "17551"
+    const-string/jumbo v0, "17552"
+    const-string/jumbo v0, "17553"
+    const-string/jumbo v0, "17554"
+    const-string/jumbo v0, "17555"
+    const-string/jumbo v0, "17556"
+    const-string/jumbo v0, "17557"
+    const-string/jumbo v0, "17558"
+    const-string/jumbo v0, "17559"
+    const-string/jumbo v0, "17560"
+    const-string/jumbo v0, "17561"
+    const-string/jumbo v0, "17562"
+    const-string/jumbo v0, "17563"
+    const-string/jumbo v0, "17564"
+    const-string/jumbo v0, "17565"
+    const-string/jumbo v0, "17566"
+    const-string/jumbo v0, "17567"
+    const-string/jumbo v0, "17568"
+    const-string/jumbo v0, "17569"
+    const-string/jumbo v0, "17570"
+    const-string/jumbo v0, "17571"
+    const-string/jumbo v0, "17572"
+    const-string/jumbo v0, "17573"
+    const-string/jumbo v0, "17574"
+    const-string/jumbo v0, "17575"
+    const-string/jumbo v0, "17576"
+    const-string/jumbo v0, "17577"
+    const-string/jumbo v0, "17578"
+    const-string/jumbo v0, "17579"
+    const-string/jumbo v0, "17580"
+    const-string/jumbo v0, "17581"
+    const-string/jumbo v0, "17582"
+    const-string/jumbo v0, "17583"
+    const-string/jumbo v0, "17584"
+    const-string/jumbo v0, "17585"
+    const-string/jumbo v0, "17586"
+    const-string/jumbo v0, "17587"
+    const-string/jumbo v0, "17588"
+    const-string/jumbo v0, "17589"
+    const-string/jumbo v0, "17590"
+    const-string/jumbo v0, "17591"
+    const-string/jumbo v0, "17592"
+    const-string/jumbo v0, "17593"
+    const-string/jumbo v0, "17594"
+    const-string/jumbo v0, "17595"
+    const-string/jumbo v0, "17596"
+    const-string/jumbo v0, "17597"
+    const-string/jumbo v0, "17598"
+    const-string/jumbo v0, "17599"
+    const-string/jumbo v0, "17600"
+    const-string/jumbo v0, "17601"
+    const-string/jumbo v0, "17602"
+    const-string/jumbo v0, "17603"
+    const-string/jumbo v0, "17604"
+    const-string/jumbo v0, "17605"
+    const-string/jumbo v0, "17606"
+    const-string/jumbo v0, "17607"
+    const-string/jumbo v0, "17608"
+    const-string/jumbo v0, "17609"
+    const-string/jumbo v0, "17610"
+    const-string/jumbo v0, "17611"
+    const-string/jumbo v0, "17612"
+    const-string/jumbo v0, "17613"
+    const-string/jumbo v0, "17614"
+    const-string/jumbo v0, "17615"
+    const-string/jumbo v0, "17616"
+    const-string/jumbo v0, "17617"
+    const-string/jumbo v0, "17618"
+    const-string/jumbo v0, "17619"
+    const-string/jumbo v0, "17620"
+    const-string/jumbo v0, "17621"
+    const-string/jumbo v0, "17622"
+    const-string/jumbo v0, "17623"
+    const-string/jumbo v0, "17624"
+    const-string/jumbo v0, "17625"
+    const-string/jumbo v0, "17626"
+    const-string/jumbo v0, "17627"
+    const-string/jumbo v0, "17628"
+    const-string/jumbo v0, "17629"
+    const-string/jumbo v0, "17630"
+    const-string/jumbo v0, "17631"
+    const-string/jumbo v0, "17632"
+    const-string/jumbo v0, "17633"
+    const-string/jumbo v0, "17634"
+    const-string/jumbo v0, "17635"
+    const-string/jumbo v0, "17636"
+    const-string/jumbo v0, "17637"
+    const-string/jumbo v0, "17638"
+    const-string/jumbo v0, "17639"
+    const-string/jumbo v0, "17640"
+    const-string/jumbo v0, "17641"
+    const-string/jumbo v0, "17642"
+    const-string/jumbo v0, "17643"
+    const-string/jumbo v0, "17644"
+    const-string/jumbo v0, "17645"
+    const-string/jumbo v0, "17646"
+    const-string/jumbo v0, "17647"
+    const-string/jumbo v0, "17648"
+    const-string/jumbo v0, "17649"
+    const-string/jumbo v0, "17650"
+    const-string/jumbo v0, "17651"
+    const-string/jumbo v0, "17652"
+    const-string/jumbo v0, "17653"
+    const-string/jumbo v0, "17654"
+    const-string/jumbo v0, "17655"
+    const-string/jumbo v0, "17656"
+    const-string/jumbo v0, "17657"
+    const-string/jumbo v0, "17658"
+    const-string/jumbo v0, "17659"
+    const-string/jumbo v0, "17660"
+    const-string/jumbo v0, "17661"
+    const-string/jumbo v0, "17662"
+    const-string/jumbo v0, "17663"
+    const-string/jumbo v0, "17664"
+    const-string/jumbo v0, "17665"
+    const-string/jumbo v0, "17666"
+    const-string/jumbo v0, "17667"
+    const-string/jumbo v0, "17668"
+    const-string/jumbo v0, "17669"
+    const-string/jumbo v0, "17670"
+    const-string/jumbo v0, "17671"
+    const-string/jumbo v0, "17672"
+    const-string/jumbo v0, "17673"
+    const-string/jumbo v0, "17674"
+    const-string/jumbo v0, "17675"
+    const-string/jumbo v0, "17676"
+    const-string/jumbo v0, "17677"
+    const-string/jumbo v0, "17678"
+    const-string/jumbo v0, "17679"
+    const-string/jumbo v0, "17680"
+    const-string/jumbo v0, "17681"
+    const-string/jumbo v0, "17682"
+    const-string/jumbo v0, "17683"
+    const-string/jumbo v0, "17684"
+    const-string/jumbo v0, "17685"
+    const-string/jumbo v0, "17686"
+    const-string/jumbo v0, "17687"
+    const-string/jumbo v0, "17688"
+    const-string/jumbo v0, "17689"
+    const-string/jumbo v0, "17690"
+    const-string/jumbo v0, "17691"
+    const-string/jumbo v0, "17692"
+    const-string/jumbo v0, "17693"
+    const-string/jumbo v0, "17694"
+    const-string/jumbo v0, "17695"
+    const-string/jumbo v0, "17696"
+    const-string/jumbo v0, "17697"
+    const-string/jumbo v0, "17698"
+    const-string/jumbo v0, "17699"
+    const-string/jumbo v0, "17700"
+    const-string/jumbo v0, "17701"
+    const-string/jumbo v0, "17702"
+    const-string/jumbo v0, "17703"
+    const-string/jumbo v0, "17704"
+    const-string/jumbo v0, "17705"
+    const-string/jumbo v0, "17706"
+    const-string/jumbo v0, "17707"
+    const-string/jumbo v0, "17708"
+    const-string/jumbo v0, "17709"
+    const-string/jumbo v0, "17710"
+    const-string/jumbo v0, "17711"
+    const-string/jumbo v0, "17712"
+    const-string/jumbo v0, "17713"
+    const-string/jumbo v0, "17714"
+    const-string/jumbo v0, "17715"
+    const-string/jumbo v0, "17716"
+    const-string/jumbo v0, "17717"
+    const-string/jumbo v0, "17718"
+    const-string/jumbo v0, "17719"
+    const-string/jumbo v0, "17720"
+    const-string/jumbo v0, "17721"
+    const-string/jumbo v0, "17722"
+    const-string/jumbo v0, "17723"
+    const-string/jumbo v0, "17724"
+    const-string/jumbo v0, "17725"
+    const-string/jumbo v0, "17726"
+    const-string/jumbo v0, "17727"
+    const-string/jumbo v0, "17728"
+    const-string/jumbo v0, "17729"
+    const-string/jumbo v0, "17730"
+    const-string/jumbo v0, "17731"
+    const-string/jumbo v0, "17732"
+    const-string/jumbo v0, "17733"
+    const-string/jumbo v0, "17734"
+    const-string/jumbo v0, "17735"
+    const-string/jumbo v0, "17736"
+    const-string/jumbo v0, "17737"
+    const-string/jumbo v0, "17738"
+    const-string/jumbo v0, "17739"
+    const-string/jumbo v0, "17740"
+    const-string/jumbo v0, "17741"
+    const-string/jumbo v0, "17742"
+    const-string/jumbo v0, "17743"
+    const-string/jumbo v0, "17744"
+    const-string/jumbo v0, "17745"
+    const-string/jumbo v0, "17746"
+    const-string/jumbo v0, "17747"
+    const-string/jumbo v0, "17748"
+    const-string/jumbo v0, "17749"
+    const-string/jumbo v0, "17750"
+    const-string/jumbo v0, "17751"
+    const-string/jumbo v0, "17752"
+    const-string/jumbo v0, "17753"
+    const-string/jumbo v0, "17754"
+    const-string/jumbo v0, "17755"
+    const-string/jumbo v0, "17756"
+    const-string/jumbo v0, "17757"
+    const-string/jumbo v0, "17758"
+    const-string/jumbo v0, "17759"
+    const-string/jumbo v0, "17760"
+    const-string/jumbo v0, "17761"
+    const-string/jumbo v0, "17762"
+    const-string/jumbo v0, "17763"
+    const-string/jumbo v0, "17764"
+    const-string/jumbo v0, "17765"
+    const-string/jumbo v0, "17766"
+    const-string/jumbo v0, "17767"
+    const-string/jumbo v0, "17768"
+    const-string/jumbo v0, "17769"
+    const-string/jumbo v0, "17770"
+    const-string/jumbo v0, "17771"
+    const-string/jumbo v0, "17772"
+    const-string/jumbo v0, "17773"
+    const-string/jumbo v0, "17774"
+    const-string/jumbo v0, "17775"
+    const-string/jumbo v0, "17776"
+    const-string/jumbo v0, "17777"
+    const-string/jumbo v0, "17778"
+    const-string/jumbo v0, "17779"
+    const-string/jumbo v0, "17780"
+    const-string/jumbo v0, "17781"
+    const-string/jumbo v0, "17782"
+    const-string/jumbo v0, "17783"
+    const-string/jumbo v0, "17784"
+    const-string/jumbo v0, "17785"
+    const-string/jumbo v0, "17786"
+    const-string/jumbo v0, "17787"
+    const-string/jumbo v0, "17788"
+    const-string/jumbo v0, "17789"
+    const-string/jumbo v0, "17790"
+    const-string/jumbo v0, "17791"
+    const-string/jumbo v0, "17792"
+    const-string/jumbo v0, "17793"
+    const-string/jumbo v0, "17794"
+    const-string/jumbo v0, "17795"
+    const-string/jumbo v0, "17796"
+    const-string/jumbo v0, "17797"
+    const-string/jumbo v0, "17798"
+    const-string/jumbo v0, "17799"
+    const-string/jumbo v0, "17800"
+    const-string/jumbo v0, "17801"
+    const-string/jumbo v0, "17802"
+    const-string/jumbo v0, "17803"
+    const-string/jumbo v0, "17804"
+    const-string/jumbo v0, "17805"
+    const-string/jumbo v0, "17806"
+    const-string/jumbo v0, "17807"
+    const-string/jumbo v0, "17808"
+    const-string/jumbo v0, "17809"
+    const-string/jumbo v0, "17810"
+    const-string/jumbo v0, "17811"
+    const-string/jumbo v0, "17812"
+    const-string/jumbo v0, "17813"
+    const-string/jumbo v0, "17814"
+    const-string/jumbo v0, "17815"
+    const-string/jumbo v0, "17816"
+    const-string/jumbo v0, "17817"
+    const-string/jumbo v0, "17818"
+    const-string/jumbo v0, "17819"
+    const-string/jumbo v0, "17820"
+    const-string/jumbo v0, "17821"
+    const-string/jumbo v0, "17822"
+    const-string/jumbo v0, "17823"
+    const-string/jumbo v0, "17824"
+    const-string/jumbo v0, "17825"
+    const-string/jumbo v0, "17826"
+    const-string/jumbo v0, "17827"
+    const-string/jumbo v0, "17828"
+    const-string/jumbo v0, "17829"
+    const-string/jumbo v0, "17830"
+    const-string/jumbo v0, "17831"
+    const-string/jumbo v0, "17832"
+    const-string/jumbo v0, "17833"
+    const-string/jumbo v0, "17834"
+    const-string/jumbo v0, "17835"
+    const-string/jumbo v0, "17836"
+    const-string/jumbo v0, "17837"
+    const-string/jumbo v0, "17838"
+    const-string/jumbo v0, "17839"
+    const-string/jumbo v0, "17840"
+    const-string/jumbo v0, "17841"
+    const-string/jumbo v0, "17842"
+    const-string/jumbo v0, "17843"
+    const-string/jumbo v0, "17844"
+    const-string/jumbo v0, "17845"
+    const-string/jumbo v0, "17846"
+    const-string/jumbo v0, "17847"
+    const-string/jumbo v0, "17848"
+    const-string/jumbo v0, "17849"
+    const-string/jumbo v0, "17850"
+    const-string/jumbo v0, "17851"
+    const-string/jumbo v0, "17852"
+    const-string/jumbo v0, "17853"
+    const-string/jumbo v0, "17854"
+    const-string/jumbo v0, "17855"
+    const-string/jumbo v0, "17856"
+    const-string/jumbo v0, "17857"
+    const-string/jumbo v0, "17858"
+    const-string/jumbo v0, "17859"
+    const-string/jumbo v0, "17860"
+    const-string/jumbo v0, "17861"
+    const-string/jumbo v0, "17862"
+    const-string/jumbo v0, "17863"
+    const-string/jumbo v0, "17864"
+    const-string/jumbo v0, "17865"
+    const-string/jumbo v0, "17866"
+    const-string/jumbo v0, "17867"
+    const-string/jumbo v0, "17868"
+    const-string/jumbo v0, "17869"
+    const-string/jumbo v0, "17870"
+    const-string/jumbo v0, "17871"
+    const-string/jumbo v0, "17872"
+    const-string/jumbo v0, "17873"
+    const-string/jumbo v0, "17874"
+    const-string/jumbo v0, "17875"
+    const-string/jumbo v0, "17876"
+    const-string/jumbo v0, "17877"
+    const-string/jumbo v0, "17878"
+    const-string/jumbo v0, "17879"
+    const-string/jumbo v0, "17880"
+    const-string/jumbo v0, "17881"
+    const-string/jumbo v0, "17882"
+    const-string/jumbo v0, "17883"
+    const-string/jumbo v0, "17884"
+    const-string/jumbo v0, "17885"
+    const-string/jumbo v0, "17886"
+    const-string/jumbo v0, "17887"
+    const-string/jumbo v0, "17888"
+    const-string/jumbo v0, "17889"
+    const-string/jumbo v0, "17890"
+    const-string/jumbo v0, "17891"
+    const-string/jumbo v0, "17892"
+    const-string/jumbo v0, "17893"
+    const-string/jumbo v0, "17894"
+    const-string/jumbo v0, "17895"
+    const-string/jumbo v0, "17896"
+    const-string/jumbo v0, "17897"
+    const-string/jumbo v0, "17898"
+    const-string/jumbo v0, "17899"
+    const-string/jumbo v0, "17900"
+    const-string/jumbo v0, "17901"
+    const-string/jumbo v0, "17902"
+    const-string/jumbo v0, "17903"
+    const-string/jumbo v0, "17904"
+    const-string/jumbo v0, "17905"
+    const-string/jumbo v0, "17906"
+    const-string/jumbo v0, "17907"
+    const-string/jumbo v0, "17908"
+    const-string/jumbo v0, "17909"
+    const-string/jumbo v0, "17910"
+    const-string/jumbo v0, "17911"
+    const-string/jumbo v0, "17912"
+    const-string/jumbo v0, "17913"
+    const-string/jumbo v0, "17914"
+    const-string/jumbo v0, "17915"
+    const-string/jumbo v0, "17916"
+    const-string/jumbo v0, "17917"
+    const-string/jumbo v0, "17918"
+    const-string/jumbo v0, "17919"
+    const-string/jumbo v0, "17920"
+    const-string/jumbo v0, "17921"
+    const-string/jumbo v0, "17922"
+    const-string/jumbo v0, "17923"
+    const-string/jumbo v0, "17924"
+    const-string/jumbo v0, "17925"
+    const-string/jumbo v0, "17926"
+    const-string/jumbo v0, "17927"
+    const-string/jumbo v0, "17928"
+    const-string/jumbo v0, "17929"
+    const-string/jumbo v0, "17930"
+    const-string/jumbo v0, "17931"
+    const-string/jumbo v0, "17932"
+    const-string/jumbo v0, "17933"
+    const-string/jumbo v0, "17934"
+    const-string/jumbo v0, "17935"
+    const-string/jumbo v0, "17936"
+    const-string/jumbo v0, "17937"
+    const-string/jumbo v0, "17938"
+    const-string/jumbo v0, "17939"
+    const-string/jumbo v0, "17940"
+    const-string/jumbo v0, "17941"
+    const-string/jumbo v0, "17942"
+    const-string/jumbo v0, "17943"
+    const-string/jumbo v0, "17944"
+    const-string/jumbo v0, "17945"
+    const-string/jumbo v0, "17946"
+    const-string/jumbo v0, "17947"
+    const-string/jumbo v0, "17948"
+    const-string/jumbo v0, "17949"
+    const-string/jumbo v0, "17950"
+    const-string/jumbo v0, "17951"
+    const-string/jumbo v0, "17952"
+    const-string/jumbo v0, "17953"
+    const-string/jumbo v0, "17954"
+    const-string/jumbo v0, "17955"
+    const-string/jumbo v0, "17956"
+    const-string/jumbo v0, "17957"
+    const-string/jumbo v0, "17958"
+    const-string/jumbo v0, "17959"
+    const-string/jumbo v0, "17960"
+    const-string/jumbo v0, "17961"
+    const-string/jumbo v0, "17962"
+    const-string/jumbo v0, "17963"
+    const-string/jumbo v0, "17964"
+    const-string/jumbo v0, "17965"
+    const-string/jumbo v0, "17966"
+    const-string/jumbo v0, "17967"
+    const-string/jumbo v0, "17968"
+    const-string/jumbo v0, "17969"
+    const-string/jumbo v0, "17970"
+    const-string/jumbo v0, "17971"
+    const-string/jumbo v0, "17972"
+    const-string/jumbo v0, "17973"
+    const-string/jumbo v0, "17974"
+    const-string/jumbo v0, "17975"
+    const-string/jumbo v0, "17976"
+    const-string/jumbo v0, "17977"
+    const-string/jumbo v0, "17978"
+    const-string/jumbo v0, "17979"
+    const-string/jumbo v0, "17980"
+    const-string/jumbo v0, "17981"
+    const-string/jumbo v0, "17982"
+    const-string/jumbo v0, "17983"
+    const-string/jumbo v0, "17984"
+    const-string/jumbo v0, "17985"
+    const-string/jumbo v0, "17986"
+    const-string/jumbo v0, "17987"
+    const-string/jumbo v0, "17988"
+    const-string/jumbo v0, "17989"
+    const-string/jumbo v0, "17990"
+    const-string/jumbo v0, "17991"
+    const-string/jumbo v0, "17992"
+    const-string/jumbo v0, "17993"
+    const-string/jumbo v0, "17994"
+    const-string/jumbo v0, "17995"
+    const-string/jumbo v0, "17996"
+    const-string/jumbo v0, "17997"
+    const-string/jumbo v0, "17998"
+    const-string/jumbo v0, "17999"
+    const-string/jumbo v0, "18000"
+    const-string/jumbo v0, "18001"
+    const-string/jumbo v0, "18002"
+    const-string/jumbo v0, "18003"
+    const-string/jumbo v0, "18004"
+    const-string/jumbo v0, "18005"
+    const-string/jumbo v0, "18006"
+    const-string/jumbo v0, "18007"
+    const-string/jumbo v0, "18008"
+    const-string/jumbo v0, "18009"
+    const-string/jumbo v0, "18010"
+    const-string/jumbo v0, "18011"
+    const-string/jumbo v0, "18012"
+    const-string/jumbo v0, "18013"
+    const-string/jumbo v0, "18014"
+    const-string/jumbo v0, "18015"
+    const-string/jumbo v0, "18016"
+    const-string/jumbo v0, "18017"
+    const-string/jumbo v0, "18018"
+    const-string/jumbo v0, "18019"
+    const-string/jumbo v0, "18020"
+    const-string/jumbo v0, "18021"
+    const-string/jumbo v0, "18022"
+    const-string/jumbo v0, "18023"
+    const-string/jumbo v0, "18024"
+    const-string/jumbo v0, "18025"
+    const-string/jumbo v0, "18026"
+    const-string/jumbo v0, "18027"
+    const-string/jumbo v0, "18028"
+    const-string/jumbo v0, "18029"
+    const-string/jumbo v0, "18030"
+    const-string/jumbo v0, "18031"
+    const-string/jumbo v0, "18032"
+    const-string/jumbo v0, "18033"
+    const-string/jumbo v0, "18034"
+    const-string/jumbo v0, "18035"
+    const-string/jumbo v0, "18036"
+    const-string/jumbo v0, "18037"
+    const-string/jumbo v0, "18038"
+    const-string/jumbo v0, "18039"
+    const-string/jumbo v0, "18040"
+    const-string/jumbo v0, "18041"
+    const-string/jumbo v0, "18042"
+    const-string/jumbo v0, "18043"
+    const-string/jumbo v0, "18044"
+    const-string/jumbo v0, "18045"
+    const-string/jumbo v0, "18046"
+    const-string/jumbo v0, "18047"
+    const-string/jumbo v0, "18048"
+    const-string/jumbo v0, "18049"
+    const-string/jumbo v0, "18050"
+    const-string/jumbo v0, "18051"
+    const-string/jumbo v0, "18052"
+    const-string/jumbo v0, "18053"
+    const-string/jumbo v0, "18054"
+    const-string/jumbo v0, "18055"
+    const-string/jumbo v0, "18056"
+    const-string/jumbo v0, "18057"
+    const-string/jumbo v0, "18058"
+    const-string/jumbo v0, "18059"
+    const-string/jumbo v0, "18060"
+    const-string/jumbo v0, "18061"
+    const-string/jumbo v0, "18062"
+    const-string/jumbo v0, "18063"
+    const-string/jumbo v0, "18064"
+    const-string/jumbo v0, "18065"
+    const-string/jumbo v0, "18066"
+    const-string/jumbo v0, "18067"
+    const-string/jumbo v0, "18068"
+    const-string/jumbo v0, "18069"
+    const-string/jumbo v0, "18070"
+    const-string/jumbo v0, "18071"
+    const-string/jumbo v0, "18072"
+    const-string/jumbo v0, "18073"
+    const-string/jumbo v0, "18074"
+    const-string/jumbo v0, "18075"
+    const-string/jumbo v0, "18076"
+    const-string/jumbo v0, "18077"
+    const-string/jumbo v0, "18078"
+    const-string/jumbo v0, "18079"
+    const-string/jumbo v0, "18080"
+    const-string/jumbo v0, "18081"
+    const-string/jumbo v0, "18082"
+    const-string/jumbo v0, "18083"
+    const-string/jumbo v0, "18084"
+    const-string/jumbo v0, "18085"
+    const-string/jumbo v0, "18086"
+    const-string/jumbo v0, "18087"
+    const-string/jumbo v0, "18088"
+    const-string/jumbo v0, "18089"
+    const-string/jumbo v0, "18090"
+    const-string/jumbo v0, "18091"
+    const-string/jumbo v0, "18092"
+    const-string/jumbo v0, "18093"
+    const-string/jumbo v0, "18094"
+    const-string/jumbo v0, "18095"
+    const-string/jumbo v0, "18096"
+    const-string/jumbo v0, "18097"
+    const-string/jumbo v0, "18098"
+    const-string/jumbo v0, "18099"
+    const-string/jumbo v0, "18100"
+    const-string/jumbo v0, "18101"
+    const-string/jumbo v0, "18102"
+    const-string/jumbo v0, "18103"
+    const-string/jumbo v0, "18104"
+    const-string/jumbo v0, "18105"
+    const-string/jumbo v0, "18106"
+    const-string/jumbo v0, "18107"
+    const-string/jumbo v0, "18108"
+    const-string/jumbo v0, "18109"
+    const-string/jumbo v0, "18110"
+    const-string/jumbo v0, "18111"
+    const-string/jumbo v0, "18112"
+    const-string/jumbo v0, "18113"
+    const-string/jumbo v0, "18114"
+    const-string/jumbo v0, "18115"
+    const-string/jumbo v0, "18116"
+    const-string/jumbo v0, "18117"
+    const-string/jumbo v0, "18118"
+    const-string/jumbo v0, "18119"
+    const-string/jumbo v0, "18120"
+    const-string/jumbo v0, "18121"
+    const-string/jumbo v0, "18122"
+    const-string/jumbo v0, "18123"
+    const-string/jumbo v0, "18124"
+    const-string/jumbo v0, "18125"
+    const-string/jumbo v0, "18126"
+    const-string/jumbo v0, "18127"
+    const-string/jumbo v0, "18128"
+    const-string/jumbo v0, "18129"
+    const-string/jumbo v0, "18130"
+    const-string/jumbo v0, "18131"
+    const-string/jumbo v0, "18132"
+    const-string/jumbo v0, "18133"
+    const-string/jumbo v0, "18134"
+    const-string/jumbo v0, "18135"
+    const-string/jumbo v0, "18136"
+    const-string/jumbo v0, "18137"
+    const-string/jumbo v0, "18138"
+    const-string/jumbo v0, "18139"
+    const-string/jumbo v0, "18140"
+    const-string/jumbo v0, "18141"
+    const-string/jumbo v0, "18142"
+    const-string/jumbo v0, "18143"
+    const-string/jumbo v0, "18144"
+    const-string/jumbo v0, "18145"
+    const-string/jumbo v0, "18146"
+    const-string/jumbo v0, "18147"
+    const-string/jumbo v0, "18148"
+    const-string/jumbo v0, "18149"
+    const-string/jumbo v0, "18150"
+    const-string/jumbo v0, "18151"
+    const-string/jumbo v0, "18152"
+    const-string/jumbo v0, "18153"
+    const-string/jumbo v0, "18154"
+    const-string/jumbo v0, "18155"
+    const-string/jumbo v0, "18156"
+    const-string/jumbo v0, "18157"
+    const-string/jumbo v0, "18158"
+    const-string/jumbo v0, "18159"
+    const-string/jumbo v0, "18160"
+    const-string/jumbo v0, "18161"
+    const-string/jumbo v0, "18162"
+    const-string/jumbo v0, "18163"
+    const-string/jumbo v0, "18164"
+    const-string/jumbo v0, "18165"
+    const-string/jumbo v0, "18166"
+    const-string/jumbo v0, "18167"
+    const-string/jumbo v0, "18168"
+    const-string/jumbo v0, "18169"
+    const-string/jumbo v0, "18170"
+    const-string/jumbo v0, "18171"
+    const-string/jumbo v0, "18172"
+    const-string/jumbo v0, "18173"
+    const-string/jumbo v0, "18174"
+    const-string/jumbo v0, "18175"
+    const-string/jumbo v0, "18176"
+    const-string/jumbo v0, "18177"
+    const-string/jumbo v0, "18178"
+    const-string/jumbo v0, "18179"
+    const-string/jumbo v0, "18180"
+    const-string/jumbo v0, "18181"
+    const-string/jumbo v0, "18182"
+    const-string/jumbo v0, "18183"
+    const-string/jumbo v0, "18184"
+    const-string/jumbo v0, "18185"
+    const-string/jumbo v0, "18186"
+    const-string/jumbo v0, "18187"
+    const-string/jumbo v0, "18188"
+    const-string/jumbo v0, "18189"
+    const-string/jumbo v0, "18190"
+    const-string/jumbo v0, "18191"
+    const-string/jumbo v0, "18192"
+    const-string/jumbo v0, "18193"
+    const-string/jumbo v0, "18194"
+    const-string/jumbo v0, "18195"
+    const-string/jumbo v0, "18196"
+    const-string/jumbo v0, "18197"
+    const-string/jumbo v0, "18198"
+    const-string/jumbo v0, "18199"
+    const-string/jumbo v0, "18200"
+    const-string/jumbo v0, "18201"
+    const-string/jumbo v0, "18202"
+    const-string/jumbo v0, "18203"
+    const-string/jumbo v0, "18204"
+    const-string/jumbo v0, "18205"
+    const-string/jumbo v0, "18206"
+    const-string/jumbo v0, "18207"
+    const-string/jumbo v0, "18208"
+    const-string/jumbo v0, "18209"
+    const-string/jumbo v0, "18210"
+    const-string/jumbo v0, "18211"
+    const-string/jumbo v0, "18212"
+    const-string/jumbo v0, "18213"
+    const-string/jumbo v0, "18214"
+    const-string/jumbo v0, "18215"
+    const-string/jumbo v0, "18216"
+    const-string/jumbo v0, "18217"
+    const-string/jumbo v0, "18218"
+    const-string/jumbo v0, "18219"
+    const-string/jumbo v0, "18220"
+    const-string/jumbo v0, "18221"
+    const-string/jumbo v0, "18222"
+    const-string/jumbo v0, "18223"
+    const-string/jumbo v0, "18224"
+    const-string/jumbo v0, "18225"
+    const-string/jumbo v0, "18226"
+    const-string/jumbo v0, "18227"
+    const-string/jumbo v0, "18228"
+    const-string/jumbo v0, "18229"
+    const-string/jumbo v0, "18230"
+    const-string/jumbo v0, "18231"
+    const-string/jumbo v0, "18232"
+    const-string/jumbo v0, "18233"
+    const-string/jumbo v0, "18234"
+    const-string/jumbo v0, "18235"
+    const-string/jumbo v0, "18236"
+    const-string/jumbo v0, "18237"
+    const-string/jumbo v0, "18238"
+    const-string/jumbo v0, "18239"
+    const-string/jumbo v0, "18240"
+    const-string/jumbo v0, "18241"
+    const-string/jumbo v0, "18242"
+    const-string/jumbo v0, "18243"
+    const-string/jumbo v0, "18244"
+    const-string/jumbo v0, "18245"
+    const-string/jumbo v0, "18246"
+    const-string/jumbo v0, "18247"
+    const-string/jumbo v0, "18248"
+    const-string/jumbo v0, "18249"
+    const-string/jumbo v0, "18250"
+    const-string/jumbo v0, "18251"
+    const-string/jumbo v0, "18252"
+    const-string/jumbo v0, "18253"
+    const-string/jumbo v0, "18254"
+    const-string/jumbo v0, "18255"
+    const-string/jumbo v0, "18256"
+    const-string/jumbo v0, "18257"
+    const-string/jumbo v0, "18258"
+    const-string/jumbo v0, "18259"
+    const-string/jumbo v0, "18260"
+    const-string/jumbo v0, "18261"
+    const-string/jumbo v0, "18262"
+    const-string/jumbo v0, "18263"
+    const-string/jumbo v0, "18264"
+    const-string/jumbo v0, "18265"
+    const-string/jumbo v0, "18266"
+    const-string/jumbo v0, "18267"
+    const-string/jumbo v0, "18268"
+    const-string/jumbo v0, "18269"
+    const-string/jumbo v0, "18270"
+    const-string/jumbo v0, "18271"
+    const-string/jumbo v0, "18272"
+    const-string/jumbo v0, "18273"
+    const-string/jumbo v0, "18274"
+    const-string/jumbo v0, "18275"
+    const-string/jumbo v0, "18276"
+    const-string/jumbo v0, "18277"
+    const-string/jumbo v0, "18278"
+    const-string/jumbo v0, "18279"
+    const-string/jumbo v0, "18280"
+    const-string/jumbo v0, "18281"
+    const-string/jumbo v0, "18282"
+    const-string/jumbo v0, "18283"
+    const-string/jumbo v0, "18284"
+    const-string/jumbo v0, "18285"
+    const-string/jumbo v0, "18286"
+    const-string/jumbo v0, "18287"
+    const-string/jumbo v0, "18288"
+    const-string/jumbo v0, "18289"
+    const-string/jumbo v0, "18290"
+    const-string/jumbo v0, "18291"
+    const-string/jumbo v0, "18292"
+    const-string/jumbo v0, "18293"
+    const-string/jumbo v0, "18294"
+    const-string/jumbo v0, "18295"
+    const-string/jumbo v0, "18296"
+    const-string/jumbo v0, "18297"
+    const-string/jumbo v0, "18298"
+    const-string/jumbo v0, "18299"
+    const-string/jumbo v0, "18300"
+    const-string/jumbo v0, "18301"
+    const-string/jumbo v0, "18302"
+    const-string/jumbo v0, "18303"
+    const-string/jumbo v0, "18304"
+    const-string/jumbo v0, "18305"
+    const-string/jumbo v0, "18306"
+    const-string/jumbo v0, "18307"
+    const-string/jumbo v0, "18308"
+    const-string/jumbo v0, "18309"
+    const-string/jumbo v0, "18310"
+    const-string/jumbo v0, "18311"
+    const-string/jumbo v0, "18312"
+    const-string/jumbo v0, "18313"
+    const-string/jumbo v0, "18314"
+    const-string/jumbo v0, "18315"
+    const-string/jumbo v0, "18316"
+    const-string/jumbo v0, "18317"
+    const-string/jumbo v0, "18318"
+    const-string/jumbo v0, "18319"
+    const-string/jumbo v0, "18320"
+    const-string/jumbo v0, "18321"
+    const-string/jumbo v0, "18322"
+    const-string/jumbo v0, "18323"
+    const-string/jumbo v0, "18324"
+    const-string/jumbo v0, "18325"
+    const-string/jumbo v0, "18326"
+    const-string/jumbo v0, "18327"
+    const-string/jumbo v0, "18328"
+    const-string/jumbo v0, "18329"
+    const-string/jumbo v0, "18330"
+    const-string/jumbo v0, "18331"
+    const-string/jumbo v0, "18332"
+    const-string/jumbo v0, "18333"
+    const-string/jumbo v0, "18334"
+    const-string/jumbo v0, "18335"
+    const-string/jumbo v0, "18336"
+    const-string/jumbo v0, "18337"
+    const-string/jumbo v0, "18338"
+    const-string/jumbo v0, "18339"
+    const-string/jumbo v0, "18340"
+    const-string/jumbo v0, "18341"
+    const-string/jumbo v0, "18342"
+    const-string/jumbo v0, "18343"
+    const-string/jumbo v0, "18344"
+    const-string/jumbo v0, "18345"
+    const-string/jumbo v0, "18346"
+    const-string/jumbo v0, "18347"
+    const-string/jumbo v0, "18348"
+    const-string/jumbo v0, "18349"
+    const-string/jumbo v0, "18350"
+    const-string/jumbo v0, "18351"
+    const-string/jumbo v0, "18352"
+    const-string/jumbo v0, "18353"
+    const-string/jumbo v0, "18354"
+    const-string/jumbo v0, "18355"
+    const-string/jumbo v0, "18356"
+    const-string/jumbo v0, "18357"
+    const-string/jumbo v0, "18358"
+    const-string/jumbo v0, "18359"
+    const-string/jumbo v0, "18360"
+    const-string/jumbo v0, "18361"
+    const-string/jumbo v0, "18362"
+    const-string/jumbo v0, "18363"
+    const-string/jumbo v0, "18364"
+    const-string/jumbo v0, "18365"
+    const-string/jumbo v0, "18366"
+    const-string/jumbo v0, "18367"
+    const-string/jumbo v0, "18368"
+    const-string/jumbo v0, "18369"
+    const-string/jumbo v0, "18370"
+    const-string/jumbo v0, "18371"
+    const-string/jumbo v0, "18372"
+    const-string/jumbo v0, "18373"
+    const-string/jumbo v0, "18374"
+    const-string/jumbo v0, "18375"
+    const-string/jumbo v0, "18376"
+    const-string/jumbo v0, "18377"
+    const-string/jumbo v0, "18378"
+    const-string/jumbo v0, "18379"
+    const-string/jumbo v0, "18380"
+    const-string/jumbo v0, "18381"
+    const-string/jumbo v0, "18382"
+    const-string/jumbo v0, "18383"
+    const-string/jumbo v0, "18384"
+    const-string/jumbo v0, "18385"
+    const-string/jumbo v0, "18386"
+    const-string/jumbo v0, "18387"
+    const-string/jumbo v0, "18388"
+    const-string/jumbo v0, "18389"
+    const-string/jumbo v0, "18390"
+    const-string/jumbo v0, "18391"
+    const-string/jumbo v0, "18392"
+    const-string/jumbo v0, "18393"
+    const-string/jumbo v0, "18394"
+    const-string/jumbo v0, "18395"
+    const-string/jumbo v0, "18396"
+    const-string/jumbo v0, "18397"
+    const-string/jumbo v0, "18398"
+    const-string/jumbo v0, "18399"
+    const-string/jumbo v0, "18400"
+    const-string/jumbo v0, "18401"
+    const-string/jumbo v0, "18402"
+    const-string/jumbo v0, "18403"
+    const-string/jumbo v0, "18404"
+    const-string/jumbo v0, "18405"
+    const-string/jumbo v0, "18406"
+    const-string/jumbo v0, "18407"
+    const-string/jumbo v0, "18408"
+    const-string/jumbo v0, "18409"
+    const-string/jumbo v0, "18410"
+    const-string/jumbo v0, "18411"
+    const-string/jumbo v0, "18412"
+    const-string/jumbo v0, "18413"
+    const-string/jumbo v0, "18414"
+    const-string/jumbo v0, "18415"
+    const-string/jumbo v0, "18416"
+    const-string/jumbo v0, "18417"
+    const-string/jumbo v0, "18418"
+    const-string/jumbo v0, "18419"
+    const-string/jumbo v0, "18420"
+    const-string/jumbo v0, "18421"
+    const-string/jumbo v0, "18422"
+    const-string/jumbo v0, "18423"
+    const-string/jumbo v0, "18424"
+    const-string/jumbo v0, "18425"
+    const-string/jumbo v0, "18426"
+    const-string/jumbo v0, "18427"
+    const-string/jumbo v0, "18428"
+    const-string/jumbo v0, "18429"
+    const-string/jumbo v0, "18430"
+    const-string/jumbo v0, "18431"
+    const-string/jumbo v0, "18432"
+    const-string/jumbo v0, "18433"
+    const-string/jumbo v0, "18434"
+    const-string/jumbo v0, "18435"
+    const-string/jumbo v0, "18436"
+    const-string/jumbo v0, "18437"
+    const-string/jumbo v0, "18438"
+    const-string/jumbo v0, "18439"
+    const-string/jumbo v0, "18440"
+    const-string/jumbo v0, "18441"
+    const-string/jumbo v0, "18442"
+    const-string/jumbo v0, "18443"
+    const-string/jumbo v0, "18444"
+    const-string/jumbo v0, "18445"
+    const-string/jumbo v0, "18446"
+    const-string/jumbo v0, "18447"
+    const-string/jumbo v0, "18448"
+    const-string/jumbo v0, "18449"
+    const-string/jumbo v0, "18450"
+    const-string/jumbo v0, "18451"
+    const-string/jumbo v0, "18452"
+    const-string/jumbo v0, "18453"
+    const-string/jumbo v0, "18454"
+    const-string/jumbo v0, "18455"
+    const-string/jumbo v0, "18456"
+    const-string/jumbo v0, "18457"
+    const-string/jumbo v0, "18458"
+    const-string/jumbo v0, "18459"
+    const-string/jumbo v0, "18460"
+    const-string/jumbo v0, "18461"
+    const-string/jumbo v0, "18462"
+    const-string/jumbo v0, "18463"
+    const-string/jumbo v0, "18464"
+    const-string/jumbo v0, "18465"
+    const-string/jumbo v0, "18466"
+    const-string/jumbo v0, "18467"
+    const-string/jumbo v0, "18468"
+    const-string/jumbo v0, "18469"
+    const-string/jumbo v0, "18470"
+    const-string/jumbo v0, "18471"
+    const-string/jumbo v0, "18472"
+    const-string/jumbo v0, "18473"
+    const-string/jumbo v0, "18474"
+    const-string/jumbo v0, "18475"
+    const-string/jumbo v0, "18476"
+    const-string/jumbo v0, "18477"
+    const-string/jumbo v0, "18478"
+    const-string/jumbo v0, "18479"
+    const-string/jumbo v0, "18480"
+    const-string/jumbo v0, "18481"
+    const-string/jumbo v0, "18482"
+    const-string/jumbo v0, "18483"
+    const-string/jumbo v0, "18484"
+    const-string/jumbo v0, "18485"
+    const-string/jumbo v0, "18486"
+    const-string/jumbo v0, "18487"
+    const-string/jumbo v0, "18488"
+    const-string/jumbo v0, "18489"
+    const-string/jumbo v0, "18490"
+    const-string/jumbo v0, "18491"
+    const-string/jumbo v0, "18492"
+    const-string/jumbo v0, "18493"
+    const-string/jumbo v0, "18494"
+    const-string/jumbo v0, "18495"
+    const-string/jumbo v0, "18496"
+    const-string/jumbo v0, "18497"
+    const-string/jumbo v0, "18498"
+    const-string/jumbo v0, "18499"
+    const-string/jumbo v0, "18500"
+    const-string/jumbo v0, "18501"
+    const-string/jumbo v0, "18502"
+    const-string/jumbo v0, "18503"
+    const-string/jumbo v0, "18504"
+    const-string/jumbo v0, "18505"
+    const-string/jumbo v0, "18506"
+    const-string/jumbo v0, "18507"
+    const-string/jumbo v0, "18508"
+    const-string/jumbo v0, "18509"
+    const-string/jumbo v0, "18510"
+    const-string/jumbo v0, "18511"
+    const-string/jumbo v0, "18512"
+    const-string/jumbo v0, "18513"
+    const-string/jumbo v0, "18514"
+    const-string/jumbo v0, "18515"
+    const-string/jumbo v0, "18516"
+    const-string/jumbo v0, "18517"
+    const-string/jumbo v0, "18518"
+    const-string/jumbo v0, "18519"
+    const-string/jumbo v0, "18520"
+    const-string/jumbo v0, "18521"
+    const-string/jumbo v0, "18522"
+    const-string/jumbo v0, "18523"
+    const-string/jumbo v0, "18524"
+    const-string/jumbo v0, "18525"
+    const-string/jumbo v0, "18526"
+    const-string/jumbo v0, "18527"
+    const-string/jumbo v0, "18528"
+    const-string/jumbo v0, "18529"
+    const-string/jumbo v0, "18530"
+    const-string/jumbo v0, "18531"
+    const-string/jumbo v0, "18532"
+    const-string/jumbo v0, "18533"
+    const-string/jumbo v0, "18534"
+    const-string/jumbo v0, "18535"
+    const-string/jumbo v0, "18536"
+    const-string/jumbo v0, "18537"
+    const-string/jumbo v0, "18538"
+    const-string/jumbo v0, "18539"
+    const-string/jumbo v0, "18540"
+    const-string/jumbo v0, "18541"
+    const-string/jumbo v0, "18542"
+    const-string/jumbo v0, "18543"
+    const-string/jumbo v0, "18544"
+    const-string/jumbo v0, "18545"
+    const-string/jumbo v0, "18546"
+    const-string/jumbo v0, "18547"
+    const-string/jumbo v0, "18548"
+    const-string/jumbo v0, "18549"
+    const-string/jumbo v0, "18550"
+    const-string/jumbo v0, "18551"
+    const-string/jumbo v0, "18552"
+    const-string/jumbo v0, "18553"
+    const-string/jumbo v0, "18554"
+    const-string/jumbo v0, "18555"
+    const-string/jumbo v0, "18556"
+    const-string/jumbo v0, "18557"
+    const-string/jumbo v0, "18558"
+    const-string/jumbo v0, "18559"
+    const-string/jumbo v0, "18560"
+    const-string/jumbo v0, "18561"
+    const-string/jumbo v0, "18562"
+    const-string/jumbo v0, "18563"
+    const-string/jumbo v0, "18564"
+    const-string/jumbo v0, "18565"
+    const-string/jumbo v0, "18566"
+    const-string/jumbo v0, "18567"
+    const-string/jumbo v0, "18568"
+    const-string/jumbo v0, "18569"
+    const-string/jumbo v0, "18570"
+    const-string/jumbo v0, "18571"
+    const-string/jumbo v0, "18572"
+    const-string/jumbo v0, "18573"
+    const-string/jumbo v0, "18574"
+    const-string/jumbo v0, "18575"
+    const-string/jumbo v0, "18576"
+    const-string/jumbo v0, "18577"
+    const-string/jumbo v0, "18578"
+    const-string/jumbo v0, "18579"
+    const-string/jumbo v0, "18580"
+    const-string/jumbo v0, "18581"
+    const-string/jumbo v0, "18582"
+    const-string/jumbo v0, "18583"
+    const-string/jumbo v0, "18584"
+    const-string/jumbo v0, "18585"
+    const-string/jumbo v0, "18586"
+    const-string/jumbo v0, "18587"
+    const-string/jumbo v0, "18588"
+    const-string/jumbo v0, "18589"
+    const-string/jumbo v0, "18590"
+    const-string/jumbo v0, "18591"
+    const-string/jumbo v0, "18592"
+    const-string/jumbo v0, "18593"
+    const-string/jumbo v0, "18594"
+    const-string/jumbo v0, "18595"
+    const-string/jumbo v0, "18596"
+    const-string/jumbo v0, "18597"
+    const-string/jumbo v0, "18598"
+    const-string/jumbo v0, "18599"
+    const-string/jumbo v0, "18600"
+    const-string/jumbo v0, "18601"
+    const-string/jumbo v0, "18602"
+    const-string/jumbo v0, "18603"
+    const-string/jumbo v0, "18604"
+    const-string/jumbo v0, "18605"
+    const-string/jumbo v0, "18606"
+    const-string/jumbo v0, "18607"
+    const-string/jumbo v0, "18608"
+    const-string/jumbo v0, "18609"
+    const-string/jumbo v0, "18610"
+    const-string/jumbo v0, "18611"
+    const-string/jumbo v0, "18612"
+    const-string/jumbo v0, "18613"
+    const-string/jumbo v0, "18614"
+    const-string/jumbo v0, "18615"
+    const-string/jumbo v0, "18616"
+    const-string/jumbo v0, "18617"
+    const-string/jumbo v0, "18618"
+    const-string/jumbo v0, "18619"
+    const-string/jumbo v0, "18620"
+    const-string/jumbo v0, "18621"
+    const-string/jumbo v0, "18622"
+    const-string/jumbo v0, "18623"
+    const-string/jumbo v0, "18624"
+    const-string/jumbo v0, "18625"
+    const-string/jumbo v0, "18626"
+    const-string/jumbo v0, "18627"
+    const-string/jumbo v0, "18628"
+    const-string/jumbo v0, "18629"
+    const-string/jumbo v0, "18630"
+    const-string/jumbo v0, "18631"
+    const-string/jumbo v0, "18632"
+    const-string/jumbo v0, "18633"
+    const-string/jumbo v0, "18634"
+    const-string/jumbo v0, "18635"
+    const-string/jumbo v0, "18636"
+    const-string/jumbo v0, "18637"
+    const-string/jumbo v0, "18638"
+    const-string/jumbo v0, "18639"
+    const-string/jumbo v0, "18640"
+    const-string/jumbo v0, "18641"
+    const-string/jumbo v0, "18642"
+    const-string/jumbo v0, "18643"
+    const-string/jumbo v0, "18644"
+    const-string/jumbo v0, "18645"
+    const-string/jumbo v0, "18646"
+    const-string/jumbo v0, "18647"
+    const-string/jumbo v0, "18648"
+    const-string/jumbo v0, "18649"
+    const-string/jumbo v0, "18650"
+    const-string/jumbo v0, "18651"
+    const-string/jumbo v0, "18652"
+    const-string/jumbo v0, "18653"
+    const-string/jumbo v0, "18654"
+    const-string/jumbo v0, "18655"
+    const-string/jumbo v0, "18656"
+    const-string/jumbo v0, "18657"
+    const-string/jumbo v0, "18658"
+    const-string/jumbo v0, "18659"
+    const-string/jumbo v0, "18660"
+    const-string/jumbo v0, "18661"
+    const-string/jumbo v0, "18662"
+    const-string/jumbo v0, "18663"
+    const-string/jumbo v0, "18664"
+    const-string/jumbo v0, "18665"
+    const-string/jumbo v0, "18666"
+    const-string/jumbo v0, "18667"
+    const-string/jumbo v0, "18668"
+    const-string/jumbo v0, "18669"
+    const-string/jumbo v0, "18670"
+    const-string/jumbo v0, "18671"
+    const-string/jumbo v0, "18672"
+    const-string/jumbo v0, "18673"
+    const-string/jumbo v0, "18674"
+    const-string/jumbo v0, "18675"
+    const-string/jumbo v0, "18676"
+    const-string/jumbo v0, "18677"
+    const-string/jumbo v0, "18678"
+    const-string/jumbo v0, "18679"
+    const-string/jumbo v0, "18680"
+    const-string/jumbo v0, "18681"
+    const-string/jumbo v0, "18682"
+    const-string/jumbo v0, "18683"
+    const-string/jumbo v0, "18684"
+    const-string/jumbo v0, "18685"
+    const-string/jumbo v0, "18686"
+    const-string/jumbo v0, "18687"
+    const-string/jumbo v0, "18688"
+    const-string/jumbo v0, "18689"
+    const-string/jumbo v0, "18690"
+    const-string/jumbo v0, "18691"
+    const-string/jumbo v0, "18692"
+    const-string/jumbo v0, "18693"
+    const-string/jumbo v0, "18694"
+    const-string/jumbo v0, "18695"
+    const-string/jumbo v0, "18696"
+    const-string/jumbo v0, "18697"
+    const-string/jumbo v0, "18698"
+    const-string/jumbo v0, "18699"
+    const-string/jumbo v0, "18700"
+    const-string/jumbo v0, "18701"
+    const-string/jumbo v0, "18702"
+    const-string/jumbo v0, "18703"
+    const-string/jumbo v0, "18704"
+    const-string/jumbo v0, "18705"
+    const-string/jumbo v0, "18706"
+    const-string/jumbo v0, "18707"
+    const-string/jumbo v0, "18708"
+    const-string/jumbo v0, "18709"
+    const-string/jumbo v0, "18710"
+    const-string/jumbo v0, "18711"
+    const-string/jumbo v0, "18712"
+    const-string/jumbo v0, "18713"
+    const-string/jumbo v0, "18714"
+    const-string/jumbo v0, "18715"
+    const-string/jumbo v0, "18716"
+    const-string/jumbo v0, "18717"
+    const-string/jumbo v0, "18718"
+    const-string/jumbo v0, "18719"
+    const-string/jumbo v0, "18720"
+    const-string/jumbo v0, "18721"
+    const-string/jumbo v0, "18722"
+    const-string/jumbo v0, "18723"
+    const-string/jumbo v0, "18724"
+    const-string/jumbo v0, "18725"
+    const-string/jumbo v0, "18726"
+    const-string/jumbo v0, "18727"
+    const-string/jumbo v0, "18728"
+    const-string/jumbo v0, "18729"
+    const-string/jumbo v0, "18730"
+    const-string/jumbo v0, "18731"
+    const-string/jumbo v0, "18732"
+    const-string/jumbo v0, "18733"
+    const-string/jumbo v0, "18734"
+    const-string/jumbo v0, "18735"
+    const-string/jumbo v0, "18736"
+    const-string/jumbo v0, "18737"
+    const-string/jumbo v0, "18738"
+    const-string/jumbo v0, "18739"
+    const-string/jumbo v0, "18740"
+    const-string/jumbo v0, "18741"
+    const-string/jumbo v0, "18742"
+    const-string/jumbo v0, "18743"
+    const-string/jumbo v0, "18744"
+    const-string/jumbo v0, "18745"
+    const-string/jumbo v0, "18746"
+    const-string/jumbo v0, "18747"
+    const-string/jumbo v0, "18748"
+    const-string/jumbo v0, "18749"
+    const-string/jumbo v0, "18750"
+    const-string/jumbo v0, "18751"
+    const-string/jumbo v0, "18752"
+    const-string/jumbo v0, "18753"
+    const-string/jumbo v0, "18754"
+    const-string/jumbo v0, "18755"
+    const-string/jumbo v0, "18756"
+    const-string/jumbo v0, "18757"
+    const-string/jumbo v0, "18758"
+    const-string/jumbo v0, "18759"
+    const-string/jumbo v0, "18760"
+    const-string/jumbo v0, "18761"
+    const-string/jumbo v0, "18762"
+    const-string/jumbo v0, "18763"
+    const-string/jumbo v0, "18764"
+    const-string/jumbo v0, "18765"
+    const-string/jumbo v0, "18766"
+    const-string/jumbo v0, "18767"
+    const-string/jumbo v0, "18768"
+    const-string/jumbo v0, "18769"
+    const-string/jumbo v0, "18770"
+    const-string/jumbo v0, "18771"
+    const-string/jumbo v0, "18772"
+    const-string/jumbo v0, "18773"
+    const-string/jumbo v0, "18774"
+    const-string/jumbo v0, "18775"
+    const-string/jumbo v0, "18776"
+    const-string/jumbo v0, "18777"
+    const-string/jumbo v0, "18778"
+    const-string/jumbo v0, "18779"
+    const-string/jumbo v0, "18780"
+    const-string/jumbo v0, "18781"
+    const-string/jumbo v0, "18782"
+    const-string/jumbo v0, "18783"
+    const-string/jumbo v0, "18784"
+    const-string/jumbo v0, "18785"
+    const-string/jumbo v0, "18786"
+    const-string/jumbo v0, "18787"
+    const-string/jumbo v0, "18788"
+    const-string/jumbo v0, "18789"
+    const-string/jumbo v0, "18790"
+    const-string/jumbo v0, "18791"
+    const-string/jumbo v0, "18792"
+    const-string/jumbo v0, "18793"
+    const-string/jumbo v0, "18794"
+    const-string/jumbo v0, "18795"
+    const-string/jumbo v0, "18796"
+    const-string/jumbo v0, "18797"
+    const-string/jumbo v0, "18798"
+    const-string/jumbo v0, "18799"
+    const-string/jumbo v0, "18800"
+    const-string/jumbo v0, "18801"
+    const-string/jumbo v0, "18802"
+    const-string/jumbo v0, "18803"
+    const-string/jumbo v0, "18804"
+    const-string/jumbo v0, "18805"
+    const-string/jumbo v0, "18806"
+    const-string/jumbo v0, "18807"
+    const-string/jumbo v0, "18808"
+    const-string/jumbo v0, "18809"
+    const-string/jumbo v0, "18810"
+    const-string/jumbo v0, "18811"
+    const-string/jumbo v0, "18812"
+    const-string/jumbo v0, "18813"
+    const-string/jumbo v0, "18814"
+    const-string/jumbo v0, "18815"
+    const-string/jumbo v0, "18816"
+    const-string/jumbo v0, "18817"
+    const-string/jumbo v0, "18818"
+    const-string/jumbo v0, "18819"
+    const-string/jumbo v0, "18820"
+    const-string/jumbo v0, "18821"
+    const-string/jumbo v0, "18822"
+    const-string/jumbo v0, "18823"
+    const-string/jumbo v0, "18824"
+    const-string/jumbo v0, "18825"
+    const-string/jumbo v0, "18826"
+    const-string/jumbo v0, "18827"
+    const-string/jumbo v0, "18828"
+    const-string/jumbo v0, "18829"
+    const-string/jumbo v0, "18830"
+    const-string/jumbo v0, "18831"
+    const-string/jumbo v0, "18832"
+    const-string/jumbo v0, "18833"
+    const-string/jumbo v0, "18834"
+    const-string/jumbo v0, "18835"
+    const-string/jumbo v0, "18836"
+    const-string/jumbo v0, "18837"
+    const-string/jumbo v0, "18838"
+    const-string/jumbo v0, "18839"
+    const-string/jumbo v0, "18840"
+    const-string/jumbo v0, "18841"
+    const-string/jumbo v0, "18842"
+    const-string/jumbo v0, "18843"
+    const-string/jumbo v0, "18844"
+    const-string/jumbo v0, "18845"
+    const-string/jumbo v0, "18846"
+    const-string/jumbo v0, "18847"
+    const-string/jumbo v0, "18848"
+    const-string/jumbo v0, "18849"
+    const-string/jumbo v0, "18850"
+    const-string/jumbo v0, "18851"
+    const-string/jumbo v0, "18852"
+    const-string/jumbo v0, "18853"
+    const-string/jumbo v0, "18854"
+    const-string/jumbo v0, "18855"
+    const-string/jumbo v0, "18856"
+    const-string/jumbo v0, "18857"
+    const-string/jumbo v0, "18858"
+    const-string/jumbo v0, "18859"
+    const-string/jumbo v0, "18860"
+    const-string/jumbo v0, "18861"
+    const-string/jumbo v0, "18862"
+    const-string/jumbo v0, "18863"
+    const-string/jumbo v0, "18864"
+    const-string/jumbo v0, "18865"
+    const-string/jumbo v0, "18866"
+    const-string/jumbo v0, "18867"
+    const-string/jumbo v0, "18868"
+    const-string/jumbo v0, "18869"
+    const-string/jumbo v0, "18870"
+    const-string/jumbo v0, "18871"
+    const-string/jumbo v0, "18872"
+    const-string/jumbo v0, "18873"
+    const-string/jumbo v0, "18874"
+    const-string/jumbo v0, "18875"
+    const-string/jumbo v0, "18876"
+    const-string/jumbo v0, "18877"
+    const-string/jumbo v0, "18878"
+    const-string/jumbo v0, "18879"
+    const-string/jumbo v0, "18880"
+    const-string/jumbo v0, "18881"
+    const-string/jumbo v0, "18882"
+    const-string/jumbo v0, "18883"
+    const-string/jumbo v0, "18884"
+    const-string/jumbo v0, "18885"
+    const-string/jumbo v0, "18886"
+    const-string/jumbo v0, "18887"
+    const-string/jumbo v0, "18888"
+    const-string/jumbo v0, "18889"
+    const-string/jumbo v0, "18890"
+    const-string/jumbo v0, "18891"
+    const-string/jumbo v0, "18892"
+    const-string/jumbo v0, "18893"
+    const-string/jumbo v0, "18894"
+    const-string/jumbo v0, "18895"
+    const-string/jumbo v0, "18896"
+    const-string/jumbo v0, "18897"
+    const-string/jumbo v0, "18898"
+    const-string/jumbo v0, "18899"
+    const-string/jumbo v0, "18900"
+    const-string/jumbo v0, "18901"
+    const-string/jumbo v0, "18902"
+    const-string/jumbo v0, "18903"
+    const-string/jumbo v0, "18904"
+    const-string/jumbo v0, "18905"
+    const-string/jumbo v0, "18906"
+    const-string/jumbo v0, "18907"
+    const-string/jumbo v0, "18908"
+    const-string/jumbo v0, "18909"
+    const-string/jumbo v0, "18910"
+    const-string/jumbo v0, "18911"
+    const-string/jumbo v0, "18912"
+    const-string/jumbo v0, "18913"
+    const-string/jumbo v0, "18914"
+    const-string/jumbo v0, "18915"
+    const-string/jumbo v0, "18916"
+    const-string/jumbo v0, "18917"
+    const-string/jumbo v0, "18918"
+    const-string/jumbo v0, "18919"
+    const-string/jumbo v0, "18920"
+    const-string/jumbo v0, "18921"
+    const-string/jumbo v0, "18922"
+    const-string/jumbo v0, "18923"
+    const-string/jumbo v0, "18924"
+    const-string/jumbo v0, "18925"
+    const-string/jumbo v0, "18926"
+    const-string/jumbo v0, "18927"
+    const-string/jumbo v0, "18928"
+    const-string/jumbo v0, "18929"
+    const-string/jumbo v0, "18930"
+    const-string/jumbo v0, "18931"
+    const-string/jumbo v0, "18932"
+    const-string/jumbo v0, "18933"
+    const-string/jumbo v0, "18934"
+    const-string/jumbo v0, "18935"
+    const-string/jumbo v0, "18936"
+    const-string/jumbo v0, "18937"
+    const-string/jumbo v0, "18938"
+    const-string/jumbo v0, "18939"
+    const-string/jumbo v0, "18940"
+    const-string/jumbo v0, "18941"
+    const-string/jumbo v0, "18942"
+    const-string/jumbo v0, "18943"
+    const-string/jumbo v0, "18944"
+    const-string/jumbo v0, "18945"
+    const-string/jumbo v0, "18946"
+    const-string/jumbo v0, "18947"
+    const-string/jumbo v0, "18948"
+    const-string/jumbo v0, "18949"
+    const-string/jumbo v0, "18950"
+    const-string/jumbo v0, "18951"
+    const-string/jumbo v0, "18952"
+    const-string/jumbo v0, "18953"
+    const-string/jumbo v0, "18954"
+    const-string/jumbo v0, "18955"
+    const-string/jumbo v0, "18956"
+    const-string/jumbo v0, "18957"
+    const-string/jumbo v0, "18958"
+    const-string/jumbo v0, "18959"
+    const-string/jumbo v0, "18960"
+    const-string/jumbo v0, "18961"
+    const-string/jumbo v0, "18962"
+    const-string/jumbo v0, "18963"
+    const-string/jumbo v0, "18964"
+    const-string/jumbo v0, "18965"
+    const-string/jumbo v0, "18966"
+    const-string/jumbo v0, "18967"
+    const-string/jumbo v0, "18968"
+    const-string/jumbo v0, "18969"
+    const-string/jumbo v0, "18970"
+    const-string/jumbo v0, "18971"
+    const-string/jumbo v0, "18972"
+    const-string/jumbo v0, "18973"
+    const-string/jumbo v0, "18974"
+    const-string/jumbo v0, "18975"
+    const-string/jumbo v0, "18976"
+    const-string/jumbo v0, "18977"
+    const-string/jumbo v0, "18978"
+    const-string/jumbo v0, "18979"
+    const-string/jumbo v0, "18980"
+    const-string/jumbo v0, "18981"
+    const-string/jumbo v0, "18982"
+    const-string/jumbo v0, "18983"
+    const-string/jumbo v0, "18984"
+    const-string/jumbo v0, "18985"
+    const-string/jumbo v0, "18986"
+    const-string/jumbo v0, "18987"
+    const-string/jumbo v0, "18988"
+    const-string/jumbo v0, "18989"
+    const-string/jumbo v0, "18990"
+    const-string/jumbo v0, "18991"
+    const-string/jumbo v0, "18992"
+    const-string/jumbo v0, "18993"
+    const-string/jumbo v0, "18994"
+    const-string/jumbo v0, "18995"
+    const-string/jumbo v0, "18996"
+    const-string/jumbo v0, "18997"
+    const-string/jumbo v0, "18998"
+    const-string/jumbo v0, "18999"
+    const-string/jumbo v0, "19000"
+    const-string/jumbo v0, "19001"
+    const-string/jumbo v0, "19002"
+    const-string/jumbo v0, "19003"
+    const-string/jumbo v0, "19004"
+    const-string/jumbo v0, "19005"
+    const-string/jumbo v0, "19006"
+    const-string/jumbo v0, "19007"
+    const-string/jumbo v0, "19008"
+    const-string/jumbo v0, "19009"
+    const-string/jumbo v0, "19010"
+    const-string/jumbo v0, "19011"
+    const-string/jumbo v0, "19012"
+    const-string/jumbo v0, "19013"
+    const-string/jumbo v0, "19014"
+    const-string/jumbo v0, "19015"
+    const-string/jumbo v0, "19016"
+    const-string/jumbo v0, "19017"
+    const-string/jumbo v0, "19018"
+    const-string/jumbo v0, "19019"
+    const-string/jumbo v0, "19020"
+    const-string/jumbo v0, "19021"
+    const-string/jumbo v0, "19022"
+    const-string/jumbo v0, "19023"
+    const-string/jumbo v0, "19024"
+    const-string/jumbo v0, "19025"
+    const-string/jumbo v0, "19026"
+    const-string/jumbo v0, "19027"
+    const-string/jumbo v0, "19028"
+    const-string/jumbo v0, "19029"
+    const-string/jumbo v0, "19030"
+    const-string/jumbo v0, "19031"
+    const-string/jumbo v0, "19032"
+    const-string/jumbo v0, "19033"
+    const-string/jumbo v0, "19034"
+    const-string/jumbo v0, "19035"
+    const-string/jumbo v0, "19036"
+    const-string/jumbo v0, "19037"
+    const-string/jumbo v0, "19038"
+    const-string/jumbo v0, "19039"
+    const-string/jumbo v0, "19040"
+    const-string/jumbo v0, "19041"
+    const-string/jumbo v0, "19042"
+    const-string/jumbo v0, "19043"
+    const-string/jumbo v0, "19044"
+    const-string/jumbo v0, "19045"
+    const-string/jumbo v0, "19046"
+    const-string/jumbo v0, "19047"
+    const-string/jumbo v0, "19048"
+    const-string/jumbo v0, "19049"
+    const-string/jumbo v0, "19050"
+    const-string/jumbo v0, "19051"
+    const-string/jumbo v0, "19052"
+    const-string/jumbo v0, "19053"
+    const-string/jumbo v0, "19054"
+    const-string/jumbo v0, "19055"
+    const-string/jumbo v0, "19056"
+    const-string/jumbo v0, "19057"
+    const-string/jumbo v0, "19058"
+    const-string/jumbo v0, "19059"
+    const-string/jumbo v0, "19060"
+    const-string/jumbo v0, "19061"
+    const-string/jumbo v0, "19062"
+    const-string/jumbo v0, "19063"
+    const-string/jumbo v0, "19064"
+    const-string/jumbo v0, "19065"
+    const-string/jumbo v0, "19066"
+    const-string/jumbo v0, "19067"
+    const-string/jumbo v0, "19068"
+    const-string/jumbo v0, "19069"
+    const-string/jumbo v0, "19070"
+    const-string/jumbo v0, "19071"
+    const-string/jumbo v0, "19072"
+    const-string/jumbo v0, "19073"
+    const-string/jumbo v0, "19074"
+    const-string/jumbo v0, "19075"
+    const-string/jumbo v0, "19076"
+    const-string/jumbo v0, "19077"
+    const-string/jumbo v0, "19078"
+    const-string/jumbo v0, "19079"
+    const-string/jumbo v0, "19080"
+    const-string/jumbo v0, "19081"
+    const-string/jumbo v0, "19082"
+    const-string/jumbo v0, "19083"
+    const-string/jumbo v0, "19084"
+    const-string/jumbo v0, "19085"
+    const-string/jumbo v0, "19086"
+    const-string/jumbo v0, "19087"
+    const-string/jumbo v0, "19088"
+    const-string/jumbo v0, "19089"
+    const-string/jumbo v0, "19090"
+    const-string/jumbo v0, "19091"
+    const-string/jumbo v0, "19092"
+    const-string/jumbo v0, "19093"
+    const-string/jumbo v0, "19094"
+    const-string/jumbo v0, "19095"
+    const-string/jumbo v0, "19096"
+    const-string/jumbo v0, "19097"
+    const-string/jumbo v0, "19098"
+    const-string/jumbo v0, "19099"
+    const-string/jumbo v0, "19100"
+    const-string/jumbo v0, "19101"
+    const-string/jumbo v0, "19102"
+    const-string/jumbo v0, "19103"
+    const-string/jumbo v0, "19104"
+    const-string/jumbo v0, "19105"
+    const-string/jumbo v0, "19106"
+    const-string/jumbo v0, "19107"
+    const-string/jumbo v0, "19108"
+    const-string/jumbo v0, "19109"
+    const-string/jumbo v0, "19110"
+    const-string/jumbo v0, "19111"
+    const-string/jumbo v0, "19112"
+    const-string/jumbo v0, "19113"
+    const-string/jumbo v0, "19114"
+    const-string/jumbo v0, "19115"
+    const-string/jumbo v0, "19116"
+    const-string/jumbo v0, "19117"
+    const-string/jumbo v0, "19118"
+    const-string/jumbo v0, "19119"
+    const-string/jumbo v0, "19120"
+    const-string/jumbo v0, "19121"
+    const-string/jumbo v0, "19122"
+    const-string/jumbo v0, "19123"
+    const-string/jumbo v0, "19124"
+    const-string/jumbo v0, "19125"
+    const-string/jumbo v0, "19126"
+    const-string/jumbo v0, "19127"
+    const-string/jumbo v0, "19128"
+    const-string/jumbo v0, "19129"
+    const-string/jumbo v0, "19130"
+    const-string/jumbo v0, "19131"
+    const-string/jumbo v0, "19132"
+    const-string/jumbo v0, "19133"
+    const-string/jumbo v0, "19134"
+    const-string/jumbo v0, "19135"
+    const-string/jumbo v0, "19136"
+    const-string/jumbo v0, "19137"
+    const-string/jumbo v0, "19138"
+    const-string/jumbo v0, "19139"
+    const-string/jumbo v0, "19140"
+    const-string/jumbo v0, "19141"
+    const-string/jumbo v0, "19142"
+    const-string/jumbo v0, "19143"
+    const-string/jumbo v0, "19144"
+    const-string/jumbo v0, "19145"
+    const-string/jumbo v0, "19146"
+    const-string/jumbo v0, "19147"
+    const-string/jumbo v0, "19148"
+    const-string/jumbo v0, "19149"
+    const-string/jumbo v0, "19150"
+    const-string/jumbo v0, "19151"
+    const-string/jumbo v0, "19152"
+    const-string/jumbo v0, "19153"
+    const-string/jumbo v0, "19154"
+    const-string/jumbo v0, "19155"
+    const-string/jumbo v0, "19156"
+    const-string/jumbo v0, "19157"
+    const-string/jumbo v0, "19158"
+    const-string/jumbo v0, "19159"
+    const-string/jumbo v0, "19160"
+    const-string/jumbo v0, "19161"
+    const-string/jumbo v0, "19162"
+    const-string/jumbo v0, "19163"
+    const-string/jumbo v0, "19164"
+    const-string/jumbo v0, "19165"
+    const-string/jumbo v0, "19166"
+    const-string/jumbo v0, "19167"
+    const-string/jumbo v0, "19168"
+    const-string/jumbo v0, "19169"
+    const-string/jumbo v0, "19170"
+    const-string/jumbo v0, "19171"
+    const-string/jumbo v0, "19172"
+    const-string/jumbo v0, "19173"
+    const-string/jumbo v0, "19174"
+    const-string/jumbo v0, "19175"
+    const-string/jumbo v0, "19176"
+    const-string/jumbo v0, "19177"
+    const-string/jumbo v0, "19178"
+    const-string/jumbo v0, "19179"
+    const-string/jumbo v0, "19180"
+    const-string/jumbo v0, "19181"
+    const-string/jumbo v0, "19182"
+    const-string/jumbo v0, "19183"
+    const-string/jumbo v0, "19184"
+    const-string/jumbo v0, "19185"
+    const-string/jumbo v0, "19186"
+    const-string/jumbo v0, "19187"
+    const-string/jumbo v0, "19188"
+    const-string/jumbo v0, "19189"
+    const-string/jumbo v0, "19190"
+    const-string/jumbo v0, "19191"
+    const-string/jumbo v0, "19192"
+    const-string/jumbo v0, "19193"
+    const-string/jumbo v0, "19194"
+    const-string/jumbo v0, "19195"
+    const-string/jumbo v0, "19196"
+    const-string/jumbo v0, "19197"
+    const-string/jumbo v0, "19198"
+    const-string/jumbo v0, "19199"
+    const-string/jumbo v0, "19200"
+    const-string/jumbo v0, "19201"
+    const-string/jumbo v0, "19202"
+    const-string/jumbo v0, "19203"
+    const-string/jumbo v0, "19204"
+    const-string/jumbo v0, "19205"
+    const-string/jumbo v0, "19206"
+    const-string/jumbo v0, "19207"
+    const-string/jumbo v0, "19208"
+    const-string/jumbo v0, "19209"
+    const-string/jumbo v0, "19210"
+    const-string/jumbo v0, "19211"
+    const-string/jumbo v0, "19212"
+    const-string/jumbo v0, "19213"
+    const-string/jumbo v0, "19214"
+    const-string/jumbo v0, "19215"
+    const-string/jumbo v0, "19216"
+    const-string/jumbo v0, "19217"
+    const-string/jumbo v0, "19218"
+    const-string/jumbo v0, "19219"
+    const-string/jumbo v0, "19220"
+    const-string/jumbo v0, "19221"
+    const-string/jumbo v0, "19222"
+    const-string/jumbo v0, "19223"
+    const-string/jumbo v0, "19224"
+    const-string/jumbo v0, "19225"
+    const-string/jumbo v0, "19226"
+    const-string/jumbo v0, "19227"
+    const-string/jumbo v0, "19228"
+    const-string/jumbo v0, "19229"
+    const-string/jumbo v0, "19230"
+    const-string/jumbo v0, "19231"
+    const-string/jumbo v0, "19232"
+    const-string/jumbo v0, "19233"
+    const-string/jumbo v0, "19234"
+    const-string/jumbo v0, "19235"
+    const-string/jumbo v0, "19236"
+    const-string/jumbo v0, "19237"
+    const-string/jumbo v0, "19238"
+    const-string/jumbo v0, "19239"
+    const-string/jumbo v0, "19240"
+    const-string/jumbo v0, "19241"
+    const-string/jumbo v0, "19242"
+    const-string/jumbo v0, "19243"
+    const-string/jumbo v0, "19244"
+    const-string/jumbo v0, "19245"
+    const-string/jumbo v0, "19246"
+    const-string/jumbo v0, "19247"
+    const-string/jumbo v0, "19248"
+    const-string/jumbo v0, "19249"
+    const-string/jumbo v0, "19250"
+    const-string/jumbo v0, "19251"
+    const-string/jumbo v0, "19252"
+    const-string/jumbo v0, "19253"
+    const-string/jumbo v0, "19254"
+    const-string/jumbo v0, "19255"
+    const-string/jumbo v0, "19256"
+    const-string/jumbo v0, "19257"
+    const-string/jumbo v0, "19258"
+    const-string/jumbo v0, "19259"
+    const-string/jumbo v0, "19260"
+    const-string/jumbo v0, "19261"
+    const-string/jumbo v0, "19262"
+    const-string/jumbo v0, "19263"
+    const-string/jumbo v0, "19264"
+    const-string/jumbo v0, "19265"
+    const-string/jumbo v0, "19266"
+    const-string/jumbo v0, "19267"
+    const-string/jumbo v0, "19268"
+    const-string/jumbo v0, "19269"
+    const-string/jumbo v0, "19270"
+    const-string/jumbo v0, "19271"
+    const-string/jumbo v0, "19272"
+    const-string/jumbo v0, "19273"
+    const-string/jumbo v0, "19274"
+    const-string/jumbo v0, "19275"
+    const-string/jumbo v0, "19276"
+    const-string/jumbo v0, "19277"
+    const-string/jumbo v0, "19278"
+    const-string/jumbo v0, "19279"
+    const-string/jumbo v0, "19280"
+    const-string/jumbo v0, "19281"
+    const-string/jumbo v0, "19282"
+    const-string/jumbo v0, "19283"
+    const-string/jumbo v0, "19284"
+    const-string/jumbo v0, "19285"
+    const-string/jumbo v0, "19286"
+    const-string/jumbo v0, "19287"
+    const-string/jumbo v0, "19288"
+    const-string/jumbo v0, "19289"
+    const-string/jumbo v0, "19290"
+    const-string/jumbo v0, "19291"
+    const-string/jumbo v0, "19292"
+    const-string/jumbo v0, "19293"
+    const-string/jumbo v0, "19294"
+    const-string/jumbo v0, "19295"
+    const-string/jumbo v0, "19296"
+    const-string/jumbo v0, "19297"
+    const-string/jumbo v0, "19298"
+    const-string/jumbo v0, "19299"
+    const-string/jumbo v0, "19300"
+    const-string/jumbo v0, "19301"
+    const-string/jumbo v0, "19302"
+    const-string/jumbo v0, "19303"
+    const-string/jumbo v0, "19304"
+    const-string/jumbo v0, "19305"
+    const-string/jumbo v0, "19306"
+    const-string/jumbo v0, "19307"
+    const-string/jumbo v0, "19308"
+    const-string/jumbo v0, "19309"
+    const-string/jumbo v0, "19310"
+    const-string/jumbo v0, "19311"
+    const-string/jumbo v0, "19312"
+    const-string/jumbo v0, "19313"
+    const-string/jumbo v0, "19314"
+    const-string/jumbo v0, "19315"
+    const-string/jumbo v0, "19316"
+    const-string/jumbo v0, "19317"
+    const-string/jumbo v0, "19318"
+    const-string/jumbo v0, "19319"
+    const-string/jumbo v0, "19320"
+    const-string/jumbo v0, "19321"
+    const-string/jumbo v0, "19322"
+    const-string/jumbo v0, "19323"
+    const-string/jumbo v0, "19324"
+    const-string/jumbo v0, "19325"
+    const-string/jumbo v0, "19326"
+    const-string/jumbo v0, "19327"
+    const-string/jumbo v0, "19328"
+    const-string/jumbo v0, "19329"
+    const-string/jumbo v0, "19330"
+    const-string/jumbo v0, "19331"
+    const-string/jumbo v0, "19332"
+    const-string/jumbo v0, "19333"
+    const-string/jumbo v0, "19334"
+    const-string/jumbo v0, "19335"
+    const-string/jumbo v0, "19336"
+    const-string/jumbo v0, "19337"
+    const-string/jumbo v0, "19338"
+    const-string/jumbo v0, "19339"
+    const-string/jumbo v0, "19340"
+    const-string/jumbo v0, "19341"
+    const-string/jumbo v0, "19342"
+    const-string/jumbo v0, "19343"
+    const-string/jumbo v0, "19344"
+    const-string/jumbo v0, "19345"
+    const-string/jumbo v0, "19346"
+    const-string/jumbo v0, "19347"
+    const-string/jumbo v0, "19348"
+    const-string/jumbo v0, "19349"
+    const-string/jumbo v0, "19350"
+    const-string/jumbo v0, "19351"
+    const-string/jumbo v0, "19352"
+    const-string/jumbo v0, "19353"
+    const-string/jumbo v0, "19354"
+    const-string/jumbo v0, "19355"
+    const-string/jumbo v0, "19356"
+    const-string/jumbo v0, "19357"
+    const-string/jumbo v0, "19358"
+    const-string/jumbo v0, "19359"
+    const-string/jumbo v0, "19360"
+    const-string/jumbo v0, "19361"
+    const-string/jumbo v0, "19362"
+    const-string/jumbo v0, "19363"
+    const-string/jumbo v0, "19364"
+    const-string/jumbo v0, "19365"
+    const-string/jumbo v0, "19366"
+    const-string/jumbo v0, "19367"
+    const-string/jumbo v0, "19368"
+    const-string/jumbo v0, "19369"
+    const-string/jumbo v0, "19370"
+    const-string/jumbo v0, "19371"
+    const-string/jumbo v0, "19372"
+    const-string/jumbo v0, "19373"
+    const-string/jumbo v0, "19374"
+    const-string/jumbo v0, "19375"
+    const-string/jumbo v0, "19376"
+    const-string/jumbo v0, "19377"
+    const-string/jumbo v0, "19378"
+    const-string/jumbo v0, "19379"
+    const-string/jumbo v0, "19380"
+    const-string/jumbo v0, "19381"
+    const-string/jumbo v0, "19382"
+    const-string/jumbo v0, "19383"
+    const-string/jumbo v0, "19384"
+    const-string/jumbo v0, "19385"
+    const-string/jumbo v0, "19386"
+    const-string/jumbo v0, "19387"
+    const-string/jumbo v0, "19388"
+    const-string/jumbo v0, "19389"
+    const-string/jumbo v0, "19390"
+    const-string/jumbo v0, "19391"
+    const-string/jumbo v0, "19392"
+    const-string/jumbo v0, "19393"
+    const-string/jumbo v0, "19394"
+    const-string/jumbo v0, "19395"
+    const-string/jumbo v0, "19396"
+    const-string/jumbo v0, "19397"
+    const-string/jumbo v0, "19398"
+    const-string/jumbo v0, "19399"
+    const-string/jumbo v0, "19400"
+    const-string/jumbo v0, "19401"
+    const-string/jumbo v0, "19402"
+    const-string/jumbo v0, "19403"
+    const-string/jumbo v0, "19404"
+    const-string/jumbo v0, "19405"
+    const-string/jumbo v0, "19406"
+    const-string/jumbo v0, "19407"
+    const-string/jumbo v0, "19408"
+    const-string/jumbo v0, "19409"
+    const-string/jumbo v0, "19410"
+    const-string/jumbo v0, "19411"
+    const-string/jumbo v0, "19412"
+    const-string/jumbo v0, "19413"
+    const-string/jumbo v0, "19414"
+    const-string/jumbo v0, "19415"
+    const-string/jumbo v0, "19416"
+    const-string/jumbo v0, "19417"
+    const-string/jumbo v0, "19418"
+    const-string/jumbo v0, "19419"
+    const-string/jumbo v0, "19420"
+    const-string/jumbo v0, "19421"
+    const-string/jumbo v0, "19422"
+    const-string/jumbo v0, "19423"
+    const-string/jumbo v0, "19424"
+    const-string/jumbo v0, "19425"
+    const-string/jumbo v0, "19426"
+    const-string/jumbo v0, "19427"
+    const-string/jumbo v0, "19428"
+    const-string/jumbo v0, "19429"
+    const-string/jumbo v0, "19430"
+    const-string/jumbo v0, "19431"
+    const-string/jumbo v0, "19432"
+    const-string/jumbo v0, "19433"
+    const-string/jumbo v0, "19434"
+    const-string/jumbo v0, "19435"
+    const-string/jumbo v0, "19436"
+    const-string/jumbo v0, "19437"
+    const-string/jumbo v0, "19438"
+    const-string/jumbo v0, "19439"
+    const-string/jumbo v0, "19440"
+    const-string/jumbo v0, "19441"
+    const-string/jumbo v0, "19442"
+    const-string/jumbo v0, "19443"
+    const-string/jumbo v0, "19444"
+    const-string/jumbo v0, "19445"
+    const-string/jumbo v0, "19446"
+    const-string/jumbo v0, "19447"
+    const-string/jumbo v0, "19448"
+    const-string/jumbo v0, "19449"
+    const-string/jumbo v0, "19450"
+    const-string/jumbo v0, "19451"
+    const-string/jumbo v0, "19452"
+    const-string/jumbo v0, "19453"
+    const-string/jumbo v0, "19454"
+    const-string/jumbo v0, "19455"
+    const-string/jumbo v0, "19456"
+    const-string/jumbo v0, "19457"
+    const-string/jumbo v0, "19458"
+    const-string/jumbo v0, "19459"
+    const-string/jumbo v0, "19460"
+    const-string/jumbo v0, "19461"
+    const-string/jumbo v0, "19462"
+    const-string/jumbo v0, "19463"
+    const-string/jumbo v0, "19464"
+    const-string/jumbo v0, "19465"
+    const-string/jumbo v0, "19466"
+    const-string/jumbo v0, "19467"
+    const-string/jumbo v0, "19468"
+    const-string/jumbo v0, "19469"
+    const-string/jumbo v0, "19470"
+    const-string/jumbo v0, "19471"
+    const-string/jumbo v0, "19472"
+    const-string/jumbo v0, "19473"
+    const-string/jumbo v0, "19474"
+    const-string/jumbo v0, "19475"
+    const-string/jumbo v0, "19476"
+    const-string/jumbo v0, "19477"
+    const-string/jumbo v0, "19478"
+    const-string/jumbo v0, "19479"
+    const-string/jumbo v0, "19480"
+    const-string/jumbo v0, "19481"
+    const-string/jumbo v0, "19482"
+    const-string/jumbo v0, "19483"
+    const-string/jumbo v0, "19484"
+    const-string/jumbo v0, "19485"
+    const-string/jumbo v0, "19486"
+    const-string/jumbo v0, "19487"
+    const-string/jumbo v0, "19488"
+    const-string/jumbo v0, "19489"
+    const-string/jumbo v0, "19490"
+    const-string/jumbo v0, "19491"
+    const-string/jumbo v0, "19492"
+    const-string/jumbo v0, "19493"
+    const-string/jumbo v0, "19494"
+    const-string/jumbo v0, "19495"
+    const-string/jumbo v0, "19496"
+    const-string/jumbo v0, "19497"
+    const-string/jumbo v0, "19498"
+    const-string/jumbo v0, "19499"
+    const-string/jumbo v0, "19500"
+    const-string/jumbo v0, "19501"
+    const-string/jumbo v0, "19502"
+    const-string/jumbo v0, "19503"
+    const-string/jumbo v0, "19504"
+    const-string/jumbo v0, "19505"
+    const-string/jumbo v0, "19506"
+    const-string/jumbo v0, "19507"
+    const-string/jumbo v0, "19508"
+    const-string/jumbo v0, "19509"
+    const-string/jumbo v0, "19510"
+    const-string/jumbo v0, "19511"
+    const-string/jumbo v0, "19512"
+    const-string/jumbo v0, "19513"
+    const-string/jumbo v0, "19514"
+    const-string/jumbo v0, "19515"
+    const-string/jumbo v0, "19516"
+    const-string/jumbo v0, "19517"
+    const-string/jumbo v0, "19518"
+    const-string/jumbo v0, "19519"
+    const-string/jumbo v0, "19520"
+    const-string/jumbo v0, "19521"
+    const-string/jumbo v0, "19522"
+    const-string/jumbo v0, "19523"
+    const-string/jumbo v0, "19524"
+    const-string/jumbo v0, "19525"
+    const-string/jumbo v0, "19526"
+    const-string/jumbo v0, "19527"
+    const-string/jumbo v0, "19528"
+    const-string/jumbo v0, "19529"
+    const-string/jumbo v0, "19530"
+    const-string/jumbo v0, "19531"
+    const-string/jumbo v0, "19532"
+    const-string/jumbo v0, "19533"
+    const-string/jumbo v0, "19534"
+    const-string/jumbo v0, "19535"
+    const-string/jumbo v0, "19536"
+    const-string/jumbo v0, "19537"
+    const-string/jumbo v0, "19538"
+    const-string/jumbo v0, "19539"
+    const-string/jumbo v0, "19540"
+    const-string/jumbo v0, "19541"
+    const-string/jumbo v0, "19542"
+    const-string/jumbo v0, "19543"
+    const-string/jumbo v0, "19544"
+    const-string/jumbo v0, "19545"
+    const-string/jumbo v0, "19546"
+    const-string/jumbo v0, "19547"
+    const-string/jumbo v0, "19548"
+    const-string/jumbo v0, "19549"
+    const-string/jumbo v0, "19550"
+    const-string/jumbo v0, "19551"
+    const-string/jumbo v0, "19552"
+    const-string/jumbo v0, "19553"
+    const-string/jumbo v0, "19554"
+    const-string/jumbo v0, "19555"
+    const-string/jumbo v0, "19556"
+    const-string/jumbo v0, "19557"
+    const-string/jumbo v0, "19558"
+    const-string/jumbo v0, "19559"
+    const-string/jumbo v0, "19560"
+    const-string/jumbo v0, "19561"
+    const-string/jumbo v0, "19562"
+    const-string/jumbo v0, "19563"
+    const-string/jumbo v0, "19564"
+    const-string/jumbo v0, "19565"
+    const-string/jumbo v0, "19566"
+    const-string/jumbo v0, "19567"
+    const-string/jumbo v0, "19568"
+    const-string/jumbo v0, "19569"
+    const-string/jumbo v0, "19570"
+    const-string/jumbo v0, "19571"
+    const-string/jumbo v0, "19572"
+    const-string/jumbo v0, "19573"
+    const-string/jumbo v0, "19574"
+    const-string/jumbo v0, "19575"
+    const-string/jumbo v0, "19576"
+    const-string/jumbo v0, "19577"
+    const-string/jumbo v0, "19578"
+    const-string/jumbo v0, "19579"
+    const-string/jumbo v0, "19580"
+    const-string/jumbo v0, "19581"
+    const-string/jumbo v0, "19582"
+    const-string/jumbo v0, "19583"
+    const-string/jumbo v0, "19584"
+    const-string/jumbo v0, "19585"
+    const-string/jumbo v0, "19586"
+    const-string/jumbo v0, "19587"
+    const-string/jumbo v0, "19588"
+    const-string/jumbo v0, "19589"
+    const-string/jumbo v0, "19590"
+    const-string/jumbo v0, "19591"
+    const-string/jumbo v0, "19592"
+    const-string/jumbo v0, "19593"
+    const-string/jumbo v0, "19594"
+    const-string/jumbo v0, "19595"
+    const-string/jumbo v0, "19596"
+    const-string/jumbo v0, "19597"
+    const-string/jumbo v0, "19598"
+    const-string/jumbo v0, "19599"
+    const-string/jumbo v0, "19600"
+    const-string/jumbo v0, "19601"
+    const-string/jumbo v0, "19602"
+    const-string/jumbo v0, "19603"
+    const-string/jumbo v0, "19604"
+    const-string/jumbo v0, "19605"
+    const-string/jumbo v0, "19606"
+    const-string/jumbo v0, "19607"
+    const-string/jumbo v0, "19608"
+    const-string/jumbo v0, "19609"
+    const-string/jumbo v0, "19610"
+    const-string/jumbo v0, "19611"
+    const-string/jumbo v0, "19612"
+    const-string/jumbo v0, "19613"
+    const-string/jumbo v0, "19614"
+    const-string/jumbo v0, "19615"
+    const-string/jumbo v0, "19616"
+    const-string/jumbo v0, "19617"
+    const-string/jumbo v0, "19618"
+    const-string/jumbo v0, "19619"
+    const-string/jumbo v0, "19620"
+    const-string/jumbo v0, "19621"
+    const-string/jumbo v0, "19622"
+    const-string/jumbo v0, "19623"
+    const-string/jumbo v0, "19624"
+    const-string/jumbo v0, "19625"
+    const-string/jumbo v0, "19626"
+    const-string/jumbo v0, "19627"
+    const-string/jumbo v0, "19628"
+    const-string/jumbo v0, "19629"
+    const-string/jumbo v0, "19630"
+    const-string/jumbo v0, "19631"
+    const-string/jumbo v0, "19632"
+    const-string/jumbo v0, "19633"
+    const-string/jumbo v0, "19634"
+    const-string/jumbo v0, "19635"
+    const-string/jumbo v0, "19636"
+    const-string/jumbo v0, "19637"
+    const-string/jumbo v0, "19638"
+    const-string/jumbo v0, "19639"
+    const-string/jumbo v0, "19640"
+    const-string/jumbo v0, "19641"
+    const-string/jumbo v0, "19642"
+    const-string/jumbo v0, "19643"
+    const-string/jumbo v0, "19644"
+    const-string/jumbo v0, "19645"
+    const-string/jumbo v0, "19646"
+    const-string/jumbo v0, "19647"
+    const-string/jumbo v0, "19648"
+    const-string/jumbo v0, "19649"
+    const-string/jumbo v0, "19650"
+    const-string/jumbo v0, "19651"
+    const-string/jumbo v0, "19652"
+    const-string/jumbo v0, "19653"
+    const-string/jumbo v0, "19654"
+    const-string/jumbo v0, "19655"
+    const-string/jumbo v0, "19656"
+    const-string/jumbo v0, "19657"
+    const-string/jumbo v0, "19658"
+    const-string/jumbo v0, "19659"
+    const-string/jumbo v0, "19660"
+    const-string/jumbo v0, "19661"
+    const-string/jumbo v0, "19662"
+    const-string/jumbo v0, "19663"
+    const-string/jumbo v0, "19664"
+    const-string/jumbo v0, "19665"
+    const-string/jumbo v0, "19666"
+    const-string/jumbo v0, "19667"
+    const-string/jumbo v0, "19668"
+    const-string/jumbo v0, "19669"
+    const-string/jumbo v0, "19670"
+    const-string/jumbo v0, "19671"
+    const-string/jumbo v0, "19672"
+    const-string/jumbo v0, "19673"
+    const-string/jumbo v0, "19674"
+    const-string/jumbo v0, "19675"
+    const-string/jumbo v0, "19676"
+    const-string/jumbo v0, "19677"
+    const-string/jumbo v0, "19678"
+    const-string/jumbo v0, "19679"
+    const-string/jumbo v0, "19680"
+    const-string/jumbo v0, "19681"
+    const-string/jumbo v0, "19682"
+    const-string/jumbo v0, "19683"
+    const-string/jumbo v0, "19684"
+    const-string/jumbo v0, "19685"
+    const-string/jumbo v0, "19686"
+    const-string/jumbo v0, "19687"
+    const-string/jumbo v0, "19688"
+    const-string/jumbo v0, "19689"
+    const-string/jumbo v0, "19690"
+    const-string/jumbo v0, "19691"
+    const-string/jumbo v0, "19692"
+    const-string/jumbo v0, "19693"
+    const-string/jumbo v0, "19694"
+    const-string/jumbo v0, "19695"
+    const-string/jumbo v0, "19696"
+    const-string/jumbo v0, "19697"
+    const-string/jumbo v0, "19698"
+    const-string/jumbo v0, "19699"
+    const-string/jumbo v0, "19700"
+    const-string/jumbo v0, "19701"
+    const-string/jumbo v0, "19702"
+    const-string/jumbo v0, "19703"
+    const-string/jumbo v0, "19704"
+    const-string/jumbo v0, "19705"
+    const-string/jumbo v0, "19706"
+    const-string/jumbo v0, "19707"
+    const-string/jumbo v0, "19708"
+    const-string/jumbo v0, "19709"
+    const-string/jumbo v0, "19710"
+    const-string/jumbo v0, "19711"
+    const-string/jumbo v0, "19712"
+    const-string/jumbo v0, "19713"
+    const-string/jumbo v0, "19714"
+    const-string/jumbo v0, "19715"
+    const-string/jumbo v0, "19716"
+    const-string/jumbo v0, "19717"
+    const-string/jumbo v0, "19718"
+    const-string/jumbo v0, "19719"
+    const-string/jumbo v0, "19720"
+    const-string/jumbo v0, "19721"
+    const-string/jumbo v0, "19722"
+    const-string/jumbo v0, "19723"
+    const-string/jumbo v0, "19724"
+    const-string/jumbo v0, "19725"
+    const-string/jumbo v0, "19726"
+    const-string/jumbo v0, "19727"
+    const-string/jumbo v0, "19728"
+    const-string/jumbo v0, "19729"
+    const-string/jumbo v0, "19730"
+    const-string/jumbo v0, "19731"
+    const-string/jumbo v0, "19732"
+    const-string/jumbo v0, "19733"
+    const-string/jumbo v0, "19734"
+    const-string/jumbo v0, "19735"
+    const-string/jumbo v0, "19736"
+    const-string/jumbo v0, "19737"
+    const-string/jumbo v0, "19738"
+    const-string/jumbo v0, "19739"
+    const-string/jumbo v0, "19740"
+    const-string/jumbo v0, "19741"
+    const-string/jumbo v0, "19742"
+    const-string/jumbo v0, "19743"
+    const-string/jumbo v0, "19744"
+    const-string/jumbo v0, "19745"
+    const-string/jumbo v0, "19746"
+    const-string/jumbo v0, "19747"
+    const-string/jumbo v0, "19748"
+    const-string/jumbo v0, "19749"
+    const-string/jumbo v0, "19750"
+    const-string/jumbo v0, "19751"
+    const-string/jumbo v0, "19752"
+    const-string/jumbo v0, "19753"
+    const-string/jumbo v0, "19754"
+    const-string/jumbo v0, "19755"
+    const-string/jumbo v0, "19756"
+    const-string/jumbo v0, "19757"
+    const-string/jumbo v0, "19758"
+    const-string/jumbo v0, "19759"
+    const-string/jumbo v0, "19760"
+    const-string/jumbo v0, "19761"
+    const-string/jumbo v0, "19762"
+    const-string/jumbo v0, "19763"
+    const-string/jumbo v0, "19764"
+    const-string/jumbo v0, "19765"
+    const-string/jumbo v0, "19766"
+    const-string/jumbo v0, "19767"
+    const-string/jumbo v0, "19768"
+    const-string/jumbo v0, "19769"
+    const-string/jumbo v0, "19770"
+    const-string/jumbo v0, "19771"
+    const-string/jumbo v0, "19772"
+    const-string/jumbo v0, "19773"
+    const-string/jumbo v0, "19774"
+    const-string/jumbo v0, "19775"
+    const-string/jumbo v0, "19776"
+    const-string/jumbo v0, "19777"
+    const-string/jumbo v0, "19778"
+    const-string/jumbo v0, "19779"
+    const-string/jumbo v0, "19780"
+    const-string/jumbo v0, "19781"
+    const-string/jumbo v0, "19782"
+    const-string/jumbo v0, "19783"
+    const-string/jumbo v0, "19784"
+    const-string/jumbo v0, "19785"
+    const-string/jumbo v0, "19786"
+    const-string/jumbo v0, "19787"
+    const-string/jumbo v0, "19788"
+    const-string/jumbo v0, "19789"
+    const-string/jumbo v0, "19790"
+    const-string/jumbo v0, "19791"
+    const-string/jumbo v0, "19792"
+    const-string/jumbo v0, "19793"
+    const-string/jumbo v0, "19794"
+    const-string/jumbo v0, "19795"
+    const-string/jumbo v0, "19796"
+    const-string/jumbo v0, "19797"
+    const-string/jumbo v0, "19798"
+    const-string/jumbo v0, "19799"
+    const-string/jumbo v0, "19800"
+    const-string/jumbo v0, "19801"
+    const-string/jumbo v0, "19802"
+    const-string/jumbo v0, "19803"
+    const-string/jumbo v0, "19804"
+    const-string/jumbo v0, "19805"
+    const-string/jumbo v0, "19806"
+    const-string/jumbo v0, "19807"
+    const-string/jumbo v0, "19808"
+    const-string/jumbo v0, "19809"
+    const-string/jumbo v0, "19810"
+    const-string/jumbo v0, "19811"
+    const-string/jumbo v0, "19812"
+    const-string/jumbo v0, "19813"
+    const-string/jumbo v0, "19814"
+    const-string/jumbo v0, "19815"
+    const-string/jumbo v0, "19816"
+    const-string/jumbo v0, "19817"
+    const-string/jumbo v0, "19818"
+    const-string/jumbo v0, "19819"
+    const-string/jumbo v0, "19820"
+    const-string/jumbo v0, "19821"
+    const-string/jumbo v0, "19822"
+    const-string/jumbo v0, "19823"
+    const-string/jumbo v0, "19824"
+    const-string/jumbo v0, "19825"
+    const-string/jumbo v0, "19826"
+    const-string/jumbo v0, "19827"
+    const-string/jumbo v0, "19828"
+    const-string/jumbo v0, "19829"
+    const-string/jumbo v0, "19830"
+    const-string/jumbo v0, "19831"
+    const-string/jumbo v0, "19832"
+    const-string/jumbo v0, "19833"
+    const-string/jumbo v0, "19834"
+    const-string/jumbo v0, "19835"
+    const-string/jumbo v0, "19836"
+    const-string/jumbo v0, "19837"
+    const-string/jumbo v0, "19838"
+    const-string/jumbo v0, "19839"
+    const-string/jumbo v0, "19840"
+    const-string/jumbo v0, "19841"
+    const-string/jumbo v0, "19842"
+    const-string/jumbo v0, "19843"
+    const-string/jumbo v0, "19844"
+    const-string/jumbo v0, "19845"
+    const-string/jumbo v0, "19846"
+    const-string/jumbo v0, "19847"
+    const-string/jumbo v0, "19848"
+    const-string/jumbo v0, "19849"
+    const-string/jumbo v0, "19850"
+    const-string/jumbo v0, "19851"
+    const-string/jumbo v0, "19852"
+    const-string/jumbo v0, "19853"
+    const-string/jumbo v0, "19854"
+    const-string/jumbo v0, "19855"
+    const-string/jumbo v0, "19856"
+    const-string/jumbo v0, "19857"
+    const-string/jumbo v0, "19858"
+    const-string/jumbo v0, "19859"
+    const-string/jumbo v0, "19860"
+    const-string/jumbo v0, "19861"
+    const-string/jumbo v0, "19862"
+    const-string/jumbo v0, "19863"
+    const-string/jumbo v0, "19864"
+    const-string/jumbo v0, "19865"
+    const-string/jumbo v0, "19866"
+    const-string/jumbo v0, "19867"
+    const-string/jumbo v0, "19868"
+    const-string/jumbo v0, "19869"
+    const-string/jumbo v0, "19870"
+    const-string/jumbo v0, "19871"
+    const-string/jumbo v0, "19872"
+    const-string/jumbo v0, "19873"
+    const-string/jumbo v0, "19874"
+    const-string/jumbo v0, "19875"
+    const-string/jumbo v0, "19876"
+    const-string/jumbo v0, "19877"
+    const-string/jumbo v0, "19878"
+    const-string/jumbo v0, "19879"
+    const-string/jumbo v0, "19880"
+    const-string/jumbo v0, "19881"
+    const-string/jumbo v0, "19882"
+    const-string/jumbo v0, "19883"
+    const-string/jumbo v0, "19884"
+    const-string/jumbo v0, "19885"
+    const-string/jumbo v0, "19886"
+    const-string/jumbo v0, "19887"
+    const-string/jumbo v0, "19888"
+    const-string/jumbo v0, "19889"
+    const-string/jumbo v0, "19890"
+    const-string/jumbo v0, "19891"
+    const-string/jumbo v0, "19892"
+    const-string/jumbo v0, "19893"
+    const-string/jumbo v0, "19894"
+    const-string/jumbo v0, "19895"
+    const-string/jumbo v0, "19896"
+    const-string/jumbo v0, "19897"
+    const-string/jumbo v0, "19898"
+    const-string/jumbo v0, "19899"
+    const-string/jumbo v0, "19900"
+    const-string/jumbo v0, "19901"
+    const-string/jumbo v0, "19902"
+    const-string/jumbo v0, "19903"
+    const-string/jumbo v0, "19904"
+    const-string/jumbo v0, "19905"
+    const-string/jumbo v0, "19906"
+    const-string/jumbo v0, "19907"
+    const-string/jumbo v0, "19908"
+    const-string/jumbo v0, "19909"
+    const-string/jumbo v0, "19910"
+    const-string/jumbo v0, "19911"
+    const-string/jumbo v0, "19912"
+    const-string/jumbo v0, "19913"
+    const-string/jumbo v0, "19914"
+    const-string/jumbo v0, "19915"
+    const-string/jumbo v0, "19916"
+    const-string/jumbo v0, "19917"
+    const-string/jumbo v0, "19918"
+    const-string/jumbo v0, "19919"
+    const-string/jumbo v0, "19920"
+    const-string/jumbo v0, "19921"
+    const-string/jumbo v0, "19922"
+    const-string/jumbo v0, "19923"
+    const-string/jumbo v0, "19924"
+    const-string/jumbo v0, "19925"
+    const-string/jumbo v0, "19926"
+    const-string/jumbo v0, "19927"
+    const-string/jumbo v0, "19928"
+    const-string/jumbo v0, "19929"
+    const-string/jumbo v0, "19930"
+    const-string/jumbo v0, "19931"
+    const-string/jumbo v0, "19932"
+    const-string/jumbo v0, "19933"
+    const-string/jumbo v0, "19934"
+    const-string/jumbo v0, "19935"
+    const-string/jumbo v0, "19936"
+    const-string/jumbo v0, "19937"
+    const-string/jumbo v0, "19938"
+    const-string/jumbo v0, "19939"
+    const-string/jumbo v0, "19940"
+    const-string/jumbo v0, "19941"
+    const-string/jumbo v0, "19942"
+    const-string/jumbo v0, "19943"
+    const-string/jumbo v0, "19944"
+    const-string/jumbo v0, "19945"
+    const-string/jumbo v0, "19946"
+    const-string/jumbo v0, "19947"
+    const-string/jumbo v0, "19948"
+    const-string/jumbo v0, "19949"
+    const-string/jumbo v0, "19950"
+    const-string/jumbo v0, "19951"
+    const-string/jumbo v0, "19952"
+    const-string/jumbo v0, "19953"
+    const-string/jumbo v0, "19954"
+    const-string/jumbo v0, "19955"
+    const-string/jumbo v0, "19956"
+    const-string/jumbo v0, "19957"
+    const-string/jumbo v0, "19958"
+    const-string/jumbo v0, "19959"
+    const-string/jumbo v0, "19960"
+    const-string/jumbo v0, "19961"
+    const-string/jumbo v0, "19962"
+    const-string/jumbo v0, "19963"
+    const-string/jumbo v0, "19964"
+    const-string/jumbo v0, "19965"
+    const-string/jumbo v0, "19966"
+    const-string/jumbo v0, "19967"
+    const-string/jumbo v0, "19968"
+    const-string/jumbo v0, "19969"
+    const-string/jumbo v0, "19970"
+    const-string/jumbo v0, "19971"
+    const-string/jumbo v0, "19972"
+    const-string/jumbo v0, "19973"
+    const-string/jumbo v0, "19974"
+    const-string/jumbo v0, "19975"
+    const-string/jumbo v0, "19976"
+    const-string/jumbo v0, "19977"
+    const-string/jumbo v0, "19978"
+    const-string/jumbo v0, "19979"
+    const-string/jumbo v0, "19980"
+    const-string/jumbo v0, "19981"
+    const-string/jumbo v0, "19982"
+    const-string/jumbo v0, "19983"
+    const-string/jumbo v0, "19984"
+    const-string/jumbo v0, "19985"
+    const-string/jumbo v0, "19986"
+    const-string/jumbo v0, "19987"
+    const-string/jumbo v0, "19988"
+    const-string/jumbo v0, "19989"
+    const-string/jumbo v0, "19990"
+    const-string/jumbo v0, "19991"
+    const-string/jumbo v0, "19992"
+    const-string/jumbo v0, "19993"
+    const-string/jumbo v0, "19994"
+    const-string/jumbo v0, "19995"
+    const-string/jumbo v0, "19996"
+    const-string/jumbo v0, "19997"
+    const-string/jumbo v0, "19998"
+    const-string/jumbo v0, "19999"
+    const-string/jumbo v0, "20000"
+    const-string/jumbo v0, "20001"
+    const-string/jumbo v0, "20002"
+    const-string/jumbo v0, "20003"
+    const-string/jumbo v0, "20004"
+    const-string/jumbo v0, "20005"
+    const-string/jumbo v0, "20006"
+    const-string/jumbo v0, "20007"
+    const-string/jumbo v0, "20008"
+    const-string/jumbo v0, "20009"
+    const-string/jumbo v0, "20010"
+    const-string/jumbo v0, "20011"
+    const-string/jumbo v0, "20012"
+    const-string/jumbo v0, "20013"
+    const-string/jumbo v0, "20014"
+    const-string/jumbo v0, "20015"
+    const-string/jumbo v0, "20016"
+    const-string/jumbo v0, "20017"
+    const-string/jumbo v0, "20018"
+    const-string/jumbo v0, "20019"
+    const-string/jumbo v0, "20020"
+    const-string/jumbo v0, "20021"
+    const-string/jumbo v0, "20022"
+    const-string/jumbo v0, "20023"
+    const-string/jumbo v0, "20024"
+    const-string/jumbo v0, "20025"
+    const-string/jumbo v0, "20026"
+    const-string/jumbo v0, "20027"
+    const-string/jumbo v0, "20028"
+    const-string/jumbo v0, "20029"
+    const-string/jumbo v0, "20030"
+    const-string/jumbo v0, "20031"
+    const-string/jumbo v0, "20032"
+    const-string/jumbo v0, "20033"
+    const-string/jumbo v0, "20034"
+    const-string/jumbo v0, "20035"
+    const-string/jumbo v0, "20036"
+    const-string/jumbo v0, "20037"
+    const-string/jumbo v0, "20038"
+    const-string/jumbo v0, "20039"
+    const-string/jumbo v0, "20040"
+    const-string/jumbo v0, "20041"
+    const-string/jumbo v0, "20042"
+    const-string/jumbo v0, "20043"
+    const-string/jumbo v0, "20044"
+    const-string/jumbo v0, "20045"
+    const-string/jumbo v0, "20046"
+    const-string/jumbo v0, "20047"
+    const-string/jumbo v0, "20048"
+    const-string/jumbo v0, "20049"
+    const-string/jumbo v0, "20050"
+    const-string/jumbo v0, "20051"
+    const-string/jumbo v0, "20052"
+    const-string/jumbo v0, "20053"
+    const-string/jumbo v0, "20054"
+    const-string/jumbo v0, "20055"
+    const-string/jumbo v0, "20056"
+    const-string/jumbo v0, "20057"
+    const-string/jumbo v0, "20058"
+    const-string/jumbo v0, "20059"
+    const-string/jumbo v0, "20060"
+    const-string/jumbo v0, "20061"
+    const-string/jumbo v0, "20062"
+    const-string/jumbo v0, "20063"
+    const-string/jumbo v0, "20064"
+    const-string/jumbo v0, "20065"
+    const-string/jumbo v0, "20066"
+    const-string/jumbo v0, "20067"
+    const-string/jumbo v0, "20068"
+    const-string/jumbo v0, "20069"
+    const-string/jumbo v0, "20070"
+    const-string/jumbo v0, "20071"
+    const-string/jumbo v0, "20072"
+    const-string/jumbo v0, "20073"
+    const-string/jumbo v0, "20074"
+    const-string/jumbo v0, "20075"
+    const-string/jumbo v0, "20076"
+    const-string/jumbo v0, "20077"
+    const-string/jumbo v0, "20078"
+    const-string/jumbo v0, "20079"
+    const-string/jumbo v0, "20080"
+    const-string/jumbo v0, "20081"
+    const-string/jumbo v0, "20082"
+    const-string/jumbo v0, "20083"
+    const-string/jumbo v0, "20084"
+    const-string/jumbo v0, "20085"
+    const-string/jumbo v0, "20086"
+    const-string/jumbo v0, "20087"
+    const-string/jumbo v0, "20088"
+    const-string/jumbo v0, "20089"
+    const-string/jumbo v0, "20090"
+    const-string/jumbo v0, "20091"
+    const-string/jumbo v0, "20092"
+    const-string/jumbo v0, "20093"
+    const-string/jumbo v0, "20094"
+    const-string/jumbo v0, "20095"
+    const-string/jumbo v0, "20096"
+    const-string/jumbo v0, "20097"
+    const-string/jumbo v0, "20098"
+    const-string/jumbo v0, "20099"
+    const-string/jumbo v0, "20100"
+    const-string/jumbo v0, "20101"
+    const-string/jumbo v0, "20102"
+    const-string/jumbo v0, "20103"
+    const-string/jumbo v0, "20104"
+    const-string/jumbo v0, "20105"
+    const-string/jumbo v0, "20106"
+    const-string/jumbo v0, "20107"
+    const-string/jumbo v0, "20108"
+    const-string/jumbo v0, "20109"
+    const-string/jumbo v0, "20110"
+    const-string/jumbo v0, "20111"
+    const-string/jumbo v0, "20112"
+    const-string/jumbo v0, "20113"
+    const-string/jumbo v0, "20114"
+    const-string/jumbo v0, "20115"
+    const-string/jumbo v0, "20116"
+    const-string/jumbo v0, "20117"
+    const-string/jumbo v0, "20118"
+    const-string/jumbo v0, "20119"
+    const-string/jumbo v0, "20120"
+    const-string/jumbo v0, "20121"
+    const-string/jumbo v0, "20122"
+    const-string/jumbo v0, "20123"
+    const-string/jumbo v0, "20124"
+    const-string/jumbo v0, "20125"
+    const-string/jumbo v0, "20126"
+    const-string/jumbo v0, "20127"
+    const-string/jumbo v0, "20128"
+    const-string/jumbo v0, "20129"
+    const-string/jumbo v0, "20130"
+    const-string/jumbo v0, "20131"
+    const-string/jumbo v0, "20132"
+    const-string/jumbo v0, "20133"
+    const-string/jumbo v0, "20134"
+    const-string/jumbo v0, "20135"
+    const-string/jumbo v0, "20136"
+    const-string/jumbo v0, "20137"
+    const-string/jumbo v0, "20138"
+    const-string/jumbo v0, "20139"
+    const-string/jumbo v0, "20140"
+    const-string/jumbo v0, "20141"
+    const-string/jumbo v0, "20142"
+    const-string/jumbo v0, "20143"
+    const-string/jumbo v0, "20144"
+    const-string/jumbo v0, "20145"
+    const-string/jumbo v0, "20146"
+    const-string/jumbo v0, "20147"
+    const-string/jumbo v0, "20148"
+    const-string/jumbo v0, "20149"
+    const-string/jumbo v0, "20150"
+    const-string/jumbo v0, "20151"
+    const-string/jumbo v0, "20152"
+    const-string/jumbo v0, "20153"
+    const-string/jumbo v0, "20154"
+    const-string/jumbo v0, "20155"
+    const-string/jumbo v0, "20156"
+    const-string/jumbo v0, "20157"
+    const-string/jumbo v0, "20158"
+    const-string/jumbo v0, "20159"
+    const-string/jumbo v0, "20160"
+    const-string/jumbo v0, "20161"
+    const-string/jumbo v0, "20162"
+    const-string/jumbo v0, "20163"
+    const-string/jumbo v0, "20164"
+    const-string/jumbo v0, "20165"
+    const-string/jumbo v0, "20166"
+    const-string/jumbo v0, "20167"
+    const-string/jumbo v0, "20168"
+    const-string/jumbo v0, "20169"
+    const-string/jumbo v0, "20170"
+    const-string/jumbo v0, "20171"
+    const-string/jumbo v0, "20172"
+    const-string/jumbo v0, "20173"
+    const-string/jumbo v0, "20174"
+    const-string/jumbo v0, "20175"
+    const-string/jumbo v0, "20176"
+    const-string/jumbo v0, "20177"
+    const-string/jumbo v0, "20178"
+    const-string/jumbo v0, "20179"
+    const-string/jumbo v0, "20180"
+    const-string/jumbo v0, "20181"
+    const-string/jumbo v0, "20182"
+    const-string/jumbo v0, "20183"
+    const-string/jumbo v0, "20184"
+    const-string/jumbo v0, "20185"
+    const-string/jumbo v0, "20186"
+    const-string/jumbo v0, "20187"
+    const-string/jumbo v0, "20188"
+    const-string/jumbo v0, "20189"
+    const-string/jumbo v0, "20190"
+    const-string/jumbo v0, "20191"
+    const-string/jumbo v0, "20192"
+    const-string/jumbo v0, "20193"
+    const-string/jumbo v0, "20194"
+    const-string/jumbo v0, "20195"
+    const-string/jumbo v0, "20196"
+    const-string/jumbo v0, "20197"
+    const-string/jumbo v0, "20198"
+    const-string/jumbo v0, "20199"
+    const-string/jumbo v0, "20200"
+    const-string/jumbo v0, "20201"
+    const-string/jumbo v0, "20202"
+    const-string/jumbo v0, "20203"
+    const-string/jumbo v0, "20204"
+    const-string/jumbo v0, "20205"
+    const-string/jumbo v0, "20206"
+    const-string/jumbo v0, "20207"
+    const-string/jumbo v0, "20208"
+    const-string/jumbo v0, "20209"
+    const-string/jumbo v0, "20210"
+    const-string/jumbo v0, "20211"
+    const-string/jumbo v0, "20212"
+    const-string/jumbo v0, "20213"
+    const-string/jumbo v0, "20214"
+    const-string/jumbo v0, "20215"
+    const-string/jumbo v0, "20216"
+    const-string/jumbo v0, "20217"
+    const-string/jumbo v0, "20218"
+    const-string/jumbo v0, "20219"
+    const-string/jumbo v0, "20220"
+    const-string/jumbo v0, "20221"
+    const-string/jumbo v0, "20222"
+    const-string/jumbo v0, "20223"
+    const-string/jumbo v0, "20224"
+    const-string/jumbo v0, "20225"
+    const-string/jumbo v0, "20226"
+    const-string/jumbo v0, "20227"
+    const-string/jumbo v0, "20228"
+    const-string/jumbo v0, "20229"
+    const-string/jumbo v0, "20230"
+    const-string/jumbo v0, "20231"
+    const-string/jumbo v0, "20232"
+    const-string/jumbo v0, "20233"
+    const-string/jumbo v0, "20234"
+    const-string/jumbo v0, "20235"
+    const-string/jumbo v0, "20236"
+    const-string/jumbo v0, "20237"
+    const-string/jumbo v0, "20238"
+    const-string/jumbo v0, "20239"
+    const-string/jumbo v0, "20240"
+    const-string/jumbo v0, "20241"
+    const-string/jumbo v0, "20242"
+    const-string/jumbo v0, "20243"
+    const-string/jumbo v0, "20244"
+    const-string/jumbo v0, "20245"
+    const-string/jumbo v0, "20246"
+    const-string/jumbo v0, "20247"
+    const-string/jumbo v0, "20248"
+    const-string/jumbo v0, "20249"
+    const-string/jumbo v0, "20250"
+    const-string/jumbo v0, "20251"
+    const-string/jumbo v0, "20252"
+    const-string/jumbo v0, "20253"
+    const-string/jumbo v0, "20254"
+    const-string/jumbo v0, "20255"
+    const-string/jumbo v0, "20256"
+    const-string/jumbo v0, "20257"
+    const-string/jumbo v0, "20258"
+    const-string/jumbo v0, "20259"
+    const-string/jumbo v0, "20260"
+    const-string/jumbo v0, "20261"
+    const-string/jumbo v0, "20262"
+    const-string/jumbo v0, "20263"
+    const-string/jumbo v0, "20264"
+    const-string/jumbo v0, "20265"
+    const-string/jumbo v0, "20266"
+    const-string/jumbo v0, "20267"
+    const-string/jumbo v0, "20268"
+    const-string/jumbo v0, "20269"
+    const-string/jumbo v0, "20270"
+    const-string/jumbo v0, "20271"
+    const-string/jumbo v0, "20272"
+    const-string/jumbo v0, "20273"
+    const-string/jumbo v0, "20274"
+    const-string/jumbo v0, "20275"
+    const-string/jumbo v0, "20276"
+    const-string/jumbo v0, "20277"
+    const-string/jumbo v0, "20278"
+    const-string/jumbo v0, "20279"
+    const-string/jumbo v0, "20280"
+    const-string/jumbo v0, "20281"
+    const-string/jumbo v0, "20282"
+    const-string/jumbo v0, "20283"
+    const-string/jumbo v0, "20284"
+    const-string/jumbo v0, "20285"
+    const-string/jumbo v0, "20286"
+    const-string/jumbo v0, "20287"
+    const-string/jumbo v0, "20288"
+    const-string/jumbo v0, "20289"
+    const-string/jumbo v0, "20290"
+    const-string/jumbo v0, "20291"
+    const-string/jumbo v0, "20292"
+    const-string/jumbo v0, "20293"
+    const-string/jumbo v0, "20294"
+    const-string/jumbo v0, "20295"
+    const-string/jumbo v0, "20296"
+    const-string/jumbo v0, "20297"
+    const-string/jumbo v0, "20298"
+    const-string/jumbo v0, "20299"
+    const-string/jumbo v0, "20300"
+    const-string/jumbo v0, "20301"
+    const-string/jumbo v0, "20302"
+    const-string/jumbo v0, "20303"
+    const-string/jumbo v0, "20304"
+    const-string/jumbo v0, "20305"
+    const-string/jumbo v0, "20306"
+    const-string/jumbo v0, "20307"
+    const-string/jumbo v0, "20308"
+    const-string/jumbo v0, "20309"
+    const-string/jumbo v0, "20310"
+    const-string/jumbo v0, "20311"
+    const-string/jumbo v0, "20312"
+    const-string/jumbo v0, "20313"
+    const-string/jumbo v0, "20314"
+    const-string/jumbo v0, "20315"
+    const-string/jumbo v0, "20316"
+    const-string/jumbo v0, "20317"
+    const-string/jumbo v0, "20318"
+    const-string/jumbo v0, "20319"
+    const-string/jumbo v0, "20320"
+    const-string/jumbo v0, "20321"
+    const-string/jumbo v0, "20322"
+    const-string/jumbo v0, "20323"
+    const-string/jumbo v0, "20324"
+    const-string/jumbo v0, "20325"
+    const-string/jumbo v0, "20326"
+    const-string/jumbo v0, "20327"
+    const-string/jumbo v0, "20328"
+    const-string/jumbo v0, "20329"
+    const-string/jumbo v0, "20330"
+    const-string/jumbo v0, "20331"
+    const-string/jumbo v0, "20332"
+    const-string/jumbo v0, "20333"
+    const-string/jumbo v0, "20334"
+    const-string/jumbo v0, "20335"
+    const-string/jumbo v0, "20336"
+    const-string/jumbo v0, "20337"
+    const-string/jumbo v0, "20338"
+    const-string/jumbo v0, "20339"
+    const-string/jumbo v0, "20340"
+    const-string/jumbo v0, "20341"
+    const-string/jumbo v0, "20342"
+    const-string/jumbo v0, "20343"
+    const-string/jumbo v0, "20344"
+    const-string/jumbo v0, "20345"
+    const-string/jumbo v0, "20346"
+    const-string/jumbo v0, "20347"
+    const-string/jumbo v0, "20348"
+    const-string/jumbo v0, "20349"
+    const-string/jumbo v0, "20350"
+    const-string/jumbo v0, "20351"
+    const-string/jumbo v0, "20352"
+    const-string/jumbo v0, "20353"
+    const-string/jumbo v0, "20354"
+    const-string/jumbo v0, "20355"
+    const-string/jumbo v0, "20356"
+    const-string/jumbo v0, "20357"
+    const-string/jumbo v0, "20358"
+    const-string/jumbo v0, "20359"
+    const-string/jumbo v0, "20360"
+    const-string/jumbo v0, "20361"
+    const-string/jumbo v0, "20362"
+    const-string/jumbo v0, "20363"
+    const-string/jumbo v0, "20364"
+    const-string/jumbo v0, "20365"
+    const-string/jumbo v0, "20366"
+    const-string/jumbo v0, "20367"
+    const-string/jumbo v0, "20368"
+    const-string/jumbo v0, "20369"
+    const-string/jumbo v0, "20370"
+    const-string/jumbo v0, "20371"
+    const-string/jumbo v0, "20372"
+    const-string/jumbo v0, "20373"
+    const-string/jumbo v0, "20374"
+    const-string/jumbo v0, "20375"
+    const-string/jumbo v0, "20376"
+    const-string/jumbo v0, "20377"
+    const-string/jumbo v0, "20378"
+    const-string/jumbo v0, "20379"
+    const-string/jumbo v0, "20380"
+    const-string/jumbo v0, "20381"
+    const-string/jumbo v0, "20382"
+    const-string/jumbo v0, "20383"
+    const-string/jumbo v0, "20384"
+    const-string/jumbo v0, "20385"
+    const-string/jumbo v0, "20386"
+    const-string/jumbo v0, "20387"
+    const-string/jumbo v0, "20388"
+    const-string/jumbo v0, "20389"
+    const-string/jumbo v0, "20390"
+    const-string/jumbo v0, "20391"
+    const-string/jumbo v0, "20392"
+    const-string/jumbo v0, "20393"
+    const-string/jumbo v0, "20394"
+    const-string/jumbo v0, "20395"
+    const-string/jumbo v0, "20396"
+    const-string/jumbo v0, "20397"
+    const-string/jumbo v0, "20398"
+    const-string/jumbo v0, "20399"
+    const-string/jumbo v0, "20400"
+    const-string/jumbo v0, "20401"
+    const-string/jumbo v0, "20402"
+    const-string/jumbo v0, "20403"
+    const-string/jumbo v0, "20404"
+    const-string/jumbo v0, "20405"
+    const-string/jumbo v0, "20406"
+    const-string/jumbo v0, "20407"
+    const-string/jumbo v0, "20408"
+    const-string/jumbo v0, "20409"
+    const-string/jumbo v0, "20410"
+    const-string/jumbo v0, "20411"
+    const-string/jumbo v0, "20412"
+    const-string/jumbo v0, "20413"
+    const-string/jumbo v0, "20414"
+    const-string/jumbo v0, "20415"
+    const-string/jumbo v0, "20416"
+    const-string/jumbo v0, "20417"
+    const-string/jumbo v0, "20418"
+    const-string/jumbo v0, "20419"
+    const-string/jumbo v0, "20420"
+    const-string/jumbo v0, "20421"
+    const-string/jumbo v0, "20422"
+    const-string/jumbo v0, "20423"
+    const-string/jumbo v0, "20424"
+    const-string/jumbo v0, "20425"
+    const-string/jumbo v0, "20426"
+    const-string/jumbo v0, "20427"
+    const-string/jumbo v0, "20428"
+    const-string/jumbo v0, "20429"
+    const-string/jumbo v0, "20430"
+    const-string/jumbo v0, "20431"
+    const-string/jumbo v0, "20432"
+    const-string/jumbo v0, "20433"
+    const-string/jumbo v0, "20434"
+    const-string/jumbo v0, "20435"
+    const-string/jumbo v0, "20436"
+    const-string/jumbo v0, "20437"
+    const-string/jumbo v0, "20438"
+    const-string/jumbo v0, "20439"
+    const-string/jumbo v0, "20440"
+    const-string/jumbo v0, "20441"
+    const-string/jumbo v0, "20442"
+    const-string/jumbo v0, "20443"
+    const-string/jumbo v0, "20444"
+    const-string/jumbo v0, "20445"
+    const-string/jumbo v0, "20446"
+    const-string/jumbo v0, "20447"
+    const-string/jumbo v0, "20448"
+    const-string/jumbo v0, "20449"
+    const-string/jumbo v0, "20450"
+    const-string/jumbo v0, "20451"
+    const-string/jumbo v0, "20452"
+    const-string/jumbo v0, "20453"
+    const-string/jumbo v0, "20454"
+    const-string/jumbo v0, "20455"
+    const-string/jumbo v0, "20456"
+    const-string/jumbo v0, "20457"
+    const-string/jumbo v0, "20458"
+    const-string/jumbo v0, "20459"
+    const-string/jumbo v0, "20460"
+    const-string/jumbo v0, "20461"
+    const-string/jumbo v0, "20462"
+    const-string/jumbo v0, "20463"
+    const-string/jumbo v0, "20464"
+    const-string/jumbo v0, "20465"
+    const-string/jumbo v0, "20466"
+    const-string/jumbo v0, "20467"
+    const-string/jumbo v0, "20468"
+    const-string/jumbo v0, "20469"
+    const-string/jumbo v0, "20470"
+    const-string/jumbo v0, "20471"
+    const-string/jumbo v0, "20472"
+    const-string/jumbo v0, "20473"
+    const-string/jumbo v0, "20474"
+    const-string/jumbo v0, "20475"
+    const-string/jumbo v0, "20476"
+    const-string/jumbo v0, "20477"
+    const-string/jumbo v0, "20478"
+    const-string/jumbo v0, "20479"
+    const-string/jumbo v0, "20480"
+    const-string/jumbo v0, "20481"
+    const-string/jumbo v0, "20482"
+    const-string/jumbo v0, "20483"
+    const-string/jumbo v0, "20484"
+    const-string/jumbo v0, "20485"
+    const-string/jumbo v0, "20486"
+    const-string/jumbo v0, "20487"
+    const-string/jumbo v0, "20488"
+    const-string/jumbo v0, "20489"
+    const-string/jumbo v0, "20490"
+    const-string/jumbo v0, "20491"
+    const-string/jumbo v0, "20492"
+    const-string/jumbo v0, "20493"
+    const-string/jumbo v0, "20494"
+    const-string/jumbo v0, "20495"
+    const-string/jumbo v0, "20496"
+    const-string/jumbo v0, "20497"
+    const-string/jumbo v0, "20498"
+    const-string/jumbo v0, "20499"
+    const-string/jumbo v0, "20500"
+    const-string/jumbo v0, "20501"
+    const-string/jumbo v0, "20502"
+    const-string/jumbo v0, "20503"
+    const-string/jumbo v0, "20504"
+    const-string/jumbo v0, "20505"
+    const-string/jumbo v0, "20506"
+    const-string/jumbo v0, "20507"
+    const-string/jumbo v0, "20508"
+    const-string/jumbo v0, "20509"
+    const-string/jumbo v0, "20510"
+    const-string/jumbo v0, "20511"
+    const-string/jumbo v0, "20512"
+    const-string/jumbo v0, "20513"
+    const-string/jumbo v0, "20514"
+    const-string/jumbo v0, "20515"
+    const-string/jumbo v0, "20516"
+    const-string/jumbo v0, "20517"
+    const-string/jumbo v0, "20518"
+    const-string/jumbo v0, "20519"
+    const-string/jumbo v0, "20520"
+    const-string/jumbo v0, "20521"
+    const-string/jumbo v0, "20522"
+    const-string/jumbo v0, "20523"
+    const-string/jumbo v0, "20524"
+    const-string/jumbo v0, "20525"
+    const-string/jumbo v0, "20526"
+    const-string/jumbo v0, "20527"
+    const-string/jumbo v0, "20528"
+    const-string/jumbo v0, "20529"
+    const-string/jumbo v0, "20530"
+    const-string/jumbo v0, "20531"
+    const-string/jumbo v0, "20532"
+    const-string/jumbo v0, "20533"
+    const-string/jumbo v0, "20534"
+    const-string/jumbo v0, "20535"
+    const-string/jumbo v0, "20536"
+    const-string/jumbo v0, "20537"
+    const-string/jumbo v0, "20538"
+    const-string/jumbo v0, "20539"
+    const-string/jumbo v0, "20540"
+    const-string/jumbo v0, "20541"
+    const-string/jumbo v0, "20542"
+    const-string/jumbo v0, "20543"
+    const-string/jumbo v0, "20544"
+    const-string/jumbo v0, "20545"
+    const-string/jumbo v0, "20546"
+    const-string/jumbo v0, "20547"
+    const-string/jumbo v0, "20548"
+    const-string/jumbo v0, "20549"
+    const-string/jumbo v0, "20550"
+    const-string/jumbo v0, "20551"
+    const-string/jumbo v0, "20552"
+    const-string/jumbo v0, "20553"
+    const-string/jumbo v0, "20554"
+    const-string/jumbo v0, "20555"
+    const-string/jumbo v0, "20556"
+    const-string/jumbo v0, "20557"
+    const-string/jumbo v0, "20558"
+    const-string/jumbo v0, "20559"
+    const-string/jumbo v0, "20560"
+    const-string/jumbo v0, "20561"
+    const-string/jumbo v0, "20562"
+    const-string/jumbo v0, "20563"
+    const-string/jumbo v0, "20564"
+    const-string/jumbo v0, "20565"
+    const-string/jumbo v0, "20566"
+    const-string/jumbo v0, "20567"
+    const-string/jumbo v0, "20568"
+    const-string/jumbo v0, "20569"
+    const-string/jumbo v0, "20570"
+    const-string/jumbo v0, "20571"
+    const-string/jumbo v0, "20572"
+    const-string/jumbo v0, "20573"
+    const-string/jumbo v0, "20574"
+    const-string/jumbo v0, "20575"
+    const-string/jumbo v0, "20576"
+    const-string/jumbo v0, "20577"
+    const-string/jumbo v0, "20578"
+    const-string/jumbo v0, "20579"
+    const-string/jumbo v0, "20580"
+    const-string/jumbo v0, "20581"
+    const-string/jumbo v0, "20582"
+    const-string/jumbo v0, "20583"
+    const-string/jumbo v0, "20584"
+    const-string/jumbo v0, "20585"
+    const-string/jumbo v0, "20586"
+    const-string/jumbo v0, "20587"
+    const-string/jumbo v0, "20588"
+    const-string/jumbo v0, "20589"
+    const-string/jumbo v0, "20590"
+    const-string/jumbo v0, "20591"
+    const-string/jumbo v0, "20592"
+    const-string/jumbo v0, "20593"
+    const-string/jumbo v0, "20594"
+    const-string/jumbo v0, "20595"
+    const-string/jumbo v0, "20596"
+    const-string/jumbo v0, "20597"
+    const-string/jumbo v0, "20598"
+    const-string/jumbo v0, "20599"
+    const-string/jumbo v0, "20600"
+    const-string/jumbo v0, "20601"
+    const-string/jumbo v0, "20602"
+    const-string/jumbo v0, "20603"
+    const-string/jumbo v0, "20604"
+    const-string/jumbo v0, "20605"
+    const-string/jumbo v0, "20606"
+    const-string/jumbo v0, "20607"
+    const-string/jumbo v0, "20608"
+    const-string/jumbo v0, "20609"
+    const-string/jumbo v0, "20610"
+    const-string/jumbo v0, "20611"
+    const-string/jumbo v0, "20612"
+    const-string/jumbo v0, "20613"
+    const-string/jumbo v0, "20614"
+    const-string/jumbo v0, "20615"
+    const-string/jumbo v0, "20616"
+    const-string/jumbo v0, "20617"
+    const-string/jumbo v0, "20618"
+    const-string/jumbo v0, "20619"
+    const-string/jumbo v0, "20620"
+    const-string/jumbo v0, "20621"
+    const-string/jumbo v0, "20622"
+    const-string/jumbo v0, "20623"
+    const-string/jumbo v0, "20624"
+    const-string/jumbo v0, "20625"
+    const-string/jumbo v0, "20626"
+    const-string/jumbo v0, "20627"
+    const-string/jumbo v0, "20628"
+    const-string/jumbo v0, "20629"
+    const-string/jumbo v0, "20630"
+    const-string/jumbo v0, "20631"
+    const-string/jumbo v0, "20632"
+    const-string/jumbo v0, "20633"
+    const-string/jumbo v0, "20634"
+    const-string/jumbo v0, "20635"
+    const-string/jumbo v0, "20636"
+    const-string/jumbo v0, "20637"
+    const-string/jumbo v0, "20638"
+    const-string/jumbo v0, "20639"
+    const-string/jumbo v0, "20640"
+    const-string/jumbo v0, "20641"
+    const-string/jumbo v0, "20642"
+    const-string/jumbo v0, "20643"
+    const-string/jumbo v0, "20644"
+    const-string/jumbo v0, "20645"
+    const-string/jumbo v0, "20646"
+    const-string/jumbo v0, "20647"
+    const-string/jumbo v0, "20648"
+    const-string/jumbo v0, "20649"
+    const-string/jumbo v0, "20650"
+    const-string/jumbo v0, "20651"
+    const-string/jumbo v0, "20652"
+    const-string/jumbo v0, "20653"
+    const-string/jumbo v0, "20654"
+    const-string/jumbo v0, "20655"
+    const-string/jumbo v0, "20656"
+    const-string/jumbo v0, "20657"
+    const-string/jumbo v0, "20658"
+    const-string/jumbo v0, "20659"
+    const-string/jumbo v0, "20660"
+    const-string/jumbo v0, "20661"
+    const-string/jumbo v0, "20662"
+    const-string/jumbo v0, "20663"
+    const-string/jumbo v0, "20664"
+    const-string/jumbo v0, "20665"
+    const-string/jumbo v0, "20666"
+    const-string/jumbo v0, "20667"
+    const-string/jumbo v0, "20668"
+    const-string/jumbo v0, "20669"
+    const-string/jumbo v0, "20670"
+    const-string/jumbo v0, "20671"
+    const-string/jumbo v0, "20672"
+    const-string/jumbo v0, "20673"
+    const-string/jumbo v0, "20674"
+    const-string/jumbo v0, "20675"
+    const-string/jumbo v0, "20676"
+    const-string/jumbo v0, "20677"
+    const-string/jumbo v0, "20678"
+    const-string/jumbo v0, "20679"
+    const-string/jumbo v0, "20680"
+    const-string/jumbo v0, "20681"
+    const-string/jumbo v0, "20682"
+    const-string/jumbo v0, "20683"
+    const-string/jumbo v0, "20684"
+    const-string/jumbo v0, "20685"
+    const-string/jumbo v0, "20686"
+    const-string/jumbo v0, "20687"
+    const-string/jumbo v0, "20688"
+    const-string/jumbo v0, "20689"
+    const-string/jumbo v0, "20690"
+    const-string/jumbo v0, "20691"
+    const-string/jumbo v0, "20692"
+    const-string/jumbo v0, "20693"
+    const-string/jumbo v0, "20694"
+    const-string/jumbo v0, "20695"
+    const-string/jumbo v0, "20696"
+    const-string/jumbo v0, "20697"
+    const-string/jumbo v0, "20698"
+    const-string/jumbo v0, "20699"
+    const-string/jumbo v0, "20700"
+    const-string/jumbo v0, "20701"
+    const-string/jumbo v0, "20702"
+    const-string/jumbo v0, "20703"
+    const-string/jumbo v0, "20704"
+    const-string/jumbo v0, "20705"
+    const-string/jumbo v0, "20706"
+    const-string/jumbo v0, "20707"
+    const-string/jumbo v0, "20708"
+    const-string/jumbo v0, "20709"
+    const-string/jumbo v0, "20710"
+    const-string/jumbo v0, "20711"
+    const-string/jumbo v0, "20712"
+    const-string/jumbo v0, "20713"
+    const-string/jumbo v0, "20714"
+    const-string/jumbo v0, "20715"
+    const-string/jumbo v0, "20716"
+    const-string/jumbo v0, "20717"
+    const-string/jumbo v0, "20718"
+    const-string/jumbo v0, "20719"
+    const-string/jumbo v0, "20720"
+    const-string/jumbo v0, "20721"
+    const-string/jumbo v0, "20722"
+    const-string/jumbo v0, "20723"
+    const-string/jumbo v0, "20724"
+    const-string/jumbo v0, "20725"
+    const-string/jumbo v0, "20726"
+    const-string/jumbo v0, "20727"
+    const-string/jumbo v0, "20728"
+    const-string/jumbo v0, "20729"
+    const-string/jumbo v0, "20730"
+    const-string/jumbo v0, "20731"
+    const-string/jumbo v0, "20732"
+    const-string/jumbo v0, "20733"
+    const-string/jumbo v0, "20734"
+    const-string/jumbo v0, "20735"
+    const-string/jumbo v0, "20736"
+    const-string/jumbo v0, "20737"
+    const-string/jumbo v0, "20738"
+    const-string/jumbo v0, "20739"
+    const-string/jumbo v0, "20740"
+    const-string/jumbo v0, "20741"
+    const-string/jumbo v0, "20742"
+    const-string/jumbo v0, "20743"
+    const-string/jumbo v0, "20744"
+    const-string/jumbo v0, "20745"
+    const-string/jumbo v0, "20746"
+    const-string/jumbo v0, "20747"
+    const-string/jumbo v0, "20748"
+    const-string/jumbo v0, "20749"
+    const-string/jumbo v0, "20750"
+    const-string/jumbo v0, "20751"
+    const-string/jumbo v0, "20752"
+    const-string/jumbo v0, "20753"
+    const-string/jumbo v0, "20754"
+    const-string/jumbo v0, "20755"
+    const-string/jumbo v0, "20756"
+    const-string/jumbo v0, "20757"
+    const-string/jumbo v0, "20758"
+    const-string/jumbo v0, "20759"
+    const-string/jumbo v0, "20760"
+    const-string/jumbo v0, "20761"
+    const-string/jumbo v0, "20762"
+    const-string/jumbo v0, "20763"
+    const-string/jumbo v0, "20764"
+    const-string/jumbo v0, "20765"
+    const-string/jumbo v0, "20766"
+    const-string/jumbo v0, "20767"
+    const-string/jumbo v0, "20768"
+    const-string/jumbo v0, "20769"
+    const-string/jumbo v0, "20770"
+    const-string/jumbo v0, "20771"
+    const-string/jumbo v0, "20772"
+    const-string/jumbo v0, "20773"
+    const-string/jumbo v0, "20774"
+    const-string/jumbo v0, "20775"
+    const-string/jumbo v0, "20776"
+    const-string/jumbo v0, "20777"
+    const-string/jumbo v0, "20778"
+    const-string/jumbo v0, "20779"
+    const-string/jumbo v0, "20780"
+    const-string/jumbo v0, "20781"
+    const-string/jumbo v0, "20782"
+    const-string/jumbo v0, "20783"
+    const-string/jumbo v0, "20784"
+    const-string/jumbo v0, "20785"
+    const-string/jumbo v0, "20786"
+    const-string/jumbo v0, "20787"
+    const-string/jumbo v0, "20788"
+    const-string/jumbo v0, "20789"
+    const-string/jumbo v0, "20790"
+    const-string/jumbo v0, "20791"
+    const-string/jumbo v0, "20792"
+    const-string/jumbo v0, "20793"
+    const-string/jumbo v0, "20794"
+    const-string/jumbo v0, "20795"
+    const-string/jumbo v0, "20796"
+    const-string/jumbo v0, "20797"
+    const-string/jumbo v0, "20798"
+    const-string/jumbo v0, "20799"
+    const-string/jumbo v0, "20800"
+    const-string/jumbo v0, "20801"
+    const-string/jumbo v0, "20802"
+    const-string/jumbo v0, "20803"
+    const-string/jumbo v0, "20804"
+    const-string/jumbo v0, "20805"
+    const-string/jumbo v0, "20806"
+    const-string/jumbo v0, "20807"
+    const-string/jumbo v0, "20808"
+    const-string/jumbo v0, "20809"
+    const-string/jumbo v0, "20810"
+    const-string/jumbo v0, "20811"
+    const-string/jumbo v0, "20812"
+    const-string/jumbo v0, "20813"
+    const-string/jumbo v0, "20814"
+    const-string/jumbo v0, "20815"
+    const-string/jumbo v0, "20816"
+    const-string/jumbo v0, "20817"
+    const-string/jumbo v0, "20818"
+    const-string/jumbo v0, "20819"
+    const-string/jumbo v0, "20820"
+    const-string/jumbo v0, "20821"
+    const-string/jumbo v0, "20822"
+    const-string/jumbo v0, "20823"
+    const-string/jumbo v0, "20824"
+    const-string/jumbo v0, "20825"
+    const-string/jumbo v0, "20826"
+    const-string/jumbo v0, "20827"
+    const-string/jumbo v0, "20828"
+    const-string/jumbo v0, "20829"
+    const-string/jumbo v0, "20830"
+    const-string/jumbo v0, "20831"
+    const-string/jumbo v0, "20832"
+    const-string/jumbo v0, "20833"
+    const-string/jumbo v0, "20834"
+    const-string/jumbo v0, "20835"
+    const-string/jumbo v0, "20836"
+    const-string/jumbo v0, "20837"
+    const-string/jumbo v0, "20838"
+    const-string/jumbo v0, "20839"
+    const-string/jumbo v0, "20840"
+    const-string/jumbo v0, "20841"
+    const-string/jumbo v0, "20842"
+    const-string/jumbo v0, "20843"
+    const-string/jumbo v0, "20844"
+    const-string/jumbo v0, "20845"
+    const-string/jumbo v0, "20846"
+    const-string/jumbo v0, "20847"
+    const-string/jumbo v0, "20848"
+    const-string/jumbo v0, "20849"
+    const-string/jumbo v0, "20850"
+    const-string/jumbo v0, "20851"
+    const-string/jumbo v0, "20852"
+    const-string/jumbo v0, "20853"
+    const-string/jumbo v0, "20854"
+    const-string/jumbo v0, "20855"
+    const-string/jumbo v0, "20856"
+    const-string/jumbo v0, "20857"
+    const-string/jumbo v0, "20858"
+    const-string/jumbo v0, "20859"
+    const-string/jumbo v0, "20860"
+    const-string/jumbo v0, "20861"
+    const-string/jumbo v0, "20862"
+    const-string/jumbo v0, "20863"
+    const-string/jumbo v0, "20864"
+    const-string/jumbo v0, "20865"
+    const-string/jumbo v0, "20866"
+    const-string/jumbo v0, "20867"
+    const-string/jumbo v0, "20868"
+    const-string/jumbo v0, "20869"
+    const-string/jumbo v0, "20870"
+    const-string/jumbo v0, "20871"
+    const-string/jumbo v0, "20872"
+    const-string/jumbo v0, "20873"
+    const-string/jumbo v0, "20874"
+    const-string/jumbo v0, "20875"
+    const-string/jumbo v0, "20876"
+    const-string/jumbo v0, "20877"
+    const-string/jumbo v0, "20878"
+    const-string/jumbo v0, "20879"
+    const-string/jumbo v0, "20880"
+    const-string/jumbo v0, "20881"
+    const-string/jumbo v0, "20882"
+    const-string/jumbo v0, "20883"
+    const-string/jumbo v0, "20884"
+    const-string/jumbo v0, "20885"
+    const-string/jumbo v0, "20886"
+    const-string/jumbo v0, "20887"
+    const-string/jumbo v0, "20888"
+    const-string/jumbo v0, "20889"
+    const-string/jumbo v0, "20890"
+    const-string/jumbo v0, "20891"
+    const-string/jumbo v0, "20892"
+    const-string/jumbo v0, "20893"
+    const-string/jumbo v0, "20894"
+    const-string/jumbo v0, "20895"
+    const-string/jumbo v0, "20896"
+    const-string/jumbo v0, "20897"
+    const-string/jumbo v0, "20898"
+    const-string/jumbo v0, "20899"
+    const-string/jumbo v0, "20900"
+    const-string/jumbo v0, "20901"
+    const-string/jumbo v0, "20902"
+    const-string/jumbo v0, "20903"
+    const-string/jumbo v0, "20904"
+    const-string/jumbo v0, "20905"
+    const-string/jumbo v0, "20906"
+    const-string/jumbo v0, "20907"
+    const-string/jumbo v0, "20908"
+    const-string/jumbo v0, "20909"
+    const-string/jumbo v0, "20910"
+    const-string/jumbo v0, "20911"
+    const-string/jumbo v0, "20912"
+    const-string/jumbo v0, "20913"
+    const-string/jumbo v0, "20914"
+    const-string/jumbo v0, "20915"
+    const-string/jumbo v0, "20916"
+    const-string/jumbo v0, "20917"
+    const-string/jumbo v0, "20918"
+    const-string/jumbo v0, "20919"
+    const-string/jumbo v0, "20920"
+    const-string/jumbo v0, "20921"
+    const-string/jumbo v0, "20922"
+    const-string/jumbo v0, "20923"
+    const-string/jumbo v0, "20924"
+    const-string/jumbo v0, "20925"
+    const-string/jumbo v0, "20926"
+    const-string/jumbo v0, "20927"
+    const-string/jumbo v0, "20928"
+    const-string/jumbo v0, "20929"
+    const-string/jumbo v0, "20930"
+    const-string/jumbo v0, "20931"
+    const-string/jumbo v0, "20932"
+    const-string/jumbo v0, "20933"
+    const-string/jumbo v0, "20934"
+    const-string/jumbo v0, "20935"
+    const-string/jumbo v0, "20936"
+    const-string/jumbo v0, "20937"
+    const-string/jumbo v0, "20938"
+    const-string/jumbo v0, "20939"
+    const-string/jumbo v0, "20940"
+    const-string/jumbo v0, "20941"
+    const-string/jumbo v0, "20942"
+    const-string/jumbo v0, "20943"
+    const-string/jumbo v0, "20944"
+    const-string/jumbo v0, "20945"
+    const-string/jumbo v0, "20946"
+    const-string/jumbo v0, "20947"
+    const-string/jumbo v0, "20948"
+    const-string/jumbo v0, "20949"
+    const-string/jumbo v0, "20950"
+    const-string/jumbo v0, "20951"
+    const-string/jumbo v0, "20952"
+    const-string/jumbo v0, "20953"
+    const-string/jumbo v0, "20954"
+    const-string/jumbo v0, "20955"
+    const-string/jumbo v0, "20956"
+    const-string/jumbo v0, "20957"
+    const-string/jumbo v0, "20958"
+    const-string/jumbo v0, "20959"
+    const-string/jumbo v0, "20960"
+    const-string/jumbo v0, "20961"
+    const-string/jumbo v0, "20962"
+    const-string/jumbo v0, "20963"
+    const-string/jumbo v0, "20964"
+    const-string/jumbo v0, "20965"
+    const-string/jumbo v0, "20966"
+    const-string/jumbo v0, "20967"
+    const-string/jumbo v0, "20968"
+    const-string/jumbo v0, "20969"
+    const-string/jumbo v0, "20970"
+    const-string/jumbo v0, "20971"
+    const-string/jumbo v0, "20972"
+    const-string/jumbo v0, "20973"
+    const-string/jumbo v0, "20974"
+    const-string/jumbo v0, "20975"
+    const-string/jumbo v0, "20976"
+    const-string/jumbo v0, "20977"
+    const-string/jumbo v0, "20978"
+    const-string/jumbo v0, "20979"
+    const-string/jumbo v0, "20980"
+    const-string/jumbo v0, "20981"
+    const-string/jumbo v0, "20982"
+    const-string/jumbo v0, "20983"
+    const-string/jumbo v0, "20984"
+    const-string/jumbo v0, "20985"
+    const-string/jumbo v0, "20986"
+    const-string/jumbo v0, "20987"
+    const-string/jumbo v0, "20988"
+    const-string/jumbo v0, "20989"
+    const-string/jumbo v0, "20990"
+    const-string/jumbo v0, "20991"
+    const-string/jumbo v0, "20992"
+    const-string/jumbo v0, "20993"
+    const-string/jumbo v0, "20994"
+    const-string/jumbo v0, "20995"
+    const-string/jumbo v0, "20996"
+    const-string/jumbo v0, "20997"
+    const-string/jumbo v0, "20998"
+    const-string/jumbo v0, "20999"
+    const-string/jumbo v0, "21000"
+    const-string/jumbo v0, "21001"
+    const-string/jumbo v0, "21002"
+    const-string/jumbo v0, "21003"
+    const-string/jumbo v0, "21004"
+    const-string/jumbo v0, "21005"
+    const-string/jumbo v0, "21006"
+    const-string/jumbo v0, "21007"
+    const-string/jumbo v0, "21008"
+    const-string/jumbo v0, "21009"
+    const-string/jumbo v0, "21010"
+    const-string/jumbo v0, "21011"
+    const-string/jumbo v0, "21012"
+    const-string/jumbo v0, "21013"
+    const-string/jumbo v0, "21014"
+    const-string/jumbo v0, "21015"
+    const-string/jumbo v0, "21016"
+    const-string/jumbo v0, "21017"
+    const-string/jumbo v0, "21018"
+    const-string/jumbo v0, "21019"
+    const-string/jumbo v0, "21020"
+    const-string/jumbo v0, "21021"
+    const-string/jumbo v0, "21022"
+    const-string/jumbo v0, "21023"
+    const-string/jumbo v0, "21024"
+    const-string/jumbo v0, "21025"
+    const-string/jumbo v0, "21026"
+    const-string/jumbo v0, "21027"
+    const-string/jumbo v0, "21028"
+    const-string/jumbo v0, "21029"
+    const-string/jumbo v0, "21030"
+    const-string/jumbo v0, "21031"
+    const-string/jumbo v0, "21032"
+    const-string/jumbo v0, "21033"
+    const-string/jumbo v0, "21034"
+    const-string/jumbo v0, "21035"
+    const-string/jumbo v0, "21036"
+    const-string/jumbo v0, "21037"
+    const-string/jumbo v0, "21038"
+    const-string/jumbo v0, "21039"
+    const-string/jumbo v0, "21040"
+    const-string/jumbo v0, "21041"
+    const-string/jumbo v0, "21042"
+    const-string/jumbo v0, "21043"
+    const-string/jumbo v0, "21044"
+    const-string/jumbo v0, "21045"
+    const-string/jumbo v0, "21046"
+    const-string/jumbo v0, "21047"
+    const-string/jumbo v0, "21048"
+    const-string/jumbo v0, "21049"
+    const-string/jumbo v0, "21050"
+    const-string/jumbo v0, "21051"
+    const-string/jumbo v0, "21052"
+    const-string/jumbo v0, "21053"
+    const-string/jumbo v0, "21054"
+    const-string/jumbo v0, "21055"
+    const-string/jumbo v0, "21056"
+    const-string/jumbo v0, "21057"
+    const-string/jumbo v0, "21058"
+    const-string/jumbo v0, "21059"
+    const-string/jumbo v0, "21060"
+    const-string/jumbo v0, "21061"
+    const-string/jumbo v0, "21062"
+    const-string/jumbo v0, "21063"
+    const-string/jumbo v0, "21064"
+    const-string/jumbo v0, "21065"
+    const-string/jumbo v0, "21066"
+    const-string/jumbo v0, "21067"
+    const-string/jumbo v0, "21068"
+    const-string/jumbo v0, "21069"
+    const-string/jumbo v0, "21070"
+    const-string/jumbo v0, "21071"
+    const-string/jumbo v0, "21072"
+    const-string/jumbo v0, "21073"
+    const-string/jumbo v0, "21074"
+    const-string/jumbo v0, "21075"
+    const-string/jumbo v0, "21076"
+    const-string/jumbo v0, "21077"
+    const-string/jumbo v0, "21078"
+    const-string/jumbo v0, "21079"
+    const-string/jumbo v0, "21080"
+    const-string/jumbo v0, "21081"
+    const-string/jumbo v0, "21082"
+    const-string/jumbo v0, "21083"
+    const-string/jumbo v0, "21084"
+    const-string/jumbo v0, "21085"
+    const-string/jumbo v0, "21086"
+    const-string/jumbo v0, "21087"
+    const-string/jumbo v0, "21088"
+    const-string/jumbo v0, "21089"
+    const-string/jumbo v0, "21090"
+    const-string/jumbo v0, "21091"
+    const-string/jumbo v0, "21092"
+    const-string/jumbo v0, "21093"
+    const-string/jumbo v0, "21094"
+    const-string/jumbo v0, "21095"
+    const-string/jumbo v0, "21096"
+    const-string/jumbo v0, "21097"
+    const-string/jumbo v0, "21098"
+    const-string/jumbo v0, "21099"
+    const-string/jumbo v0, "21100"
+    const-string/jumbo v0, "21101"
+    const-string/jumbo v0, "21102"
+    const-string/jumbo v0, "21103"
+    const-string/jumbo v0, "21104"
+    const-string/jumbo v0, "21105"
+    const-string/jumbo v0, "21106"
+    const-string/jumbo v0, "21107"
+    const-string/jumbo v0, "21108"
+    const-string/jumbo v0, "21109"
+    const-string/jumbo v0, "21110"
+    const-string/jumbo v0, "21111"
+    const-string/jumbo v0, "21112"
+    const-string/jumbo v0, "21113"
+    const-string/jumbo v0, "21114"
+    const-string/jumbo v0, "21115"
+    const-string/jumbo v0, "21116"
+    const-string/jumbo v0, "21117"
+    const-string/jumbo v0, "21118"
+    const-string/jumbo v0, "21119"
+    const-string/jumbo v0, "21120"
+    const-string/jumbo v0, "21121"
+    const-string/jumbo v0, "21122"
+    const-string/jumbo v0, "21123"
+    const-string/jumbo v0, "21124"
+    const-string/jumbo v0, "21125"
+    const-string/jumbo v0, "21126"
+    const-string/jumbo v0, "21127"
+    const-string/jumbo v0, "21128"
+    const-string/jumbo v0, "21129"
+    const-string/jumbo v0, "21130"
+    const-string/jumbo v0, "21131"
+    const-string/jumbo v0, "21132"
+    const-string/jumbo v0, "21133"
+    const-string/jumbo v0, "21134"
+    const-string/jumbo v0, "21135"
+    const-string/jumbo v0, "21136"
+    const-string/jumbo v0, "21137"
+    const-string/jumbo v0, "21138"
+    const-string/jumbo v0, "21139"
+    const-string/jumbo v0, "21140"
+    const-string/jumbo v0, "21141"
+    const-string/jumbo v0, "21142"
+    const-string/jumbo v0, "21143"
+    const-string/jumbo v0, "21144"
+    const-string/jumbo v0, "21145"
+    const-string/jumbo v0, "21146"
+    const-string/jumbo v0, "21147"
+    const-string/jumbo v0, "21148"
+    const-string/jumbo v0, "21149"
+    const-string/jumbo v0, "21150"
+    const-string/jumbo v0, "21151"
+    const-string/jumbo v0, "21152"
+    const-string/jumbo v0, "21153"
+    const-string/jumbo v0, "21154"
+    const-string/jumbo v0, "21155"
+    const-string/jumbo v0, "21156"
+    const-string/jumbo v0, "21157"
+    const-string/jumbo v0, "21158"
+    const-string/jumbo v0, "21159"
+    const-string/jumbo v0, "21160"
+    const-string/jumbo v0, "21161"
+    const-string/jumbo v0, "21162"
+    const-string/jumbo v0, "21163"
+    const-string/jumbo v0, "21164"
+    const-string/jumbo v0, "21165"
+    const-string/jumbo v0, "21166"
+    const-string/jumbo v0, "21167"
+    const-string/jumbo v0, "21168"
+    const-string/jumbo v0, "21169"
+    const-string/jumbo v0, "21170"
+    const-string/jumbo v0, "21171"
+    const-string/jumbo v0, "21172"
+    const-string/jumbo v0, "21173"
+    const-string/jumbo v0, "21174"
+    const-string/jumbo v0, "21175"
+    const-string/jumbo v0, "21176"
+    const-string/jumbo v0, "21177"
+    const-string/jumbo v0, "21178"
+    const-string/jumbo v0, "21179"
+    const-string/jumbo v0, "21180"
+    const-string/jumbo v0, "21181"
+    const-string/jumbo v0, "21182"
+    const-string/jumbo v0, "21183"
+    const-string/jumbo v0, "21184"
+    const-string/jumbo v0, "21185"
+    const-string/jumbo v0, "21186"
+    const-string/jumbo v0, "21187"
+    const-string/jumbo v0, "21188"
+    const-string/jumbo v0, "21189"
+    const-string/jumbo v0, "21190"
+    const-string/jumbo v0, "21191"
+    const-string/jumbo v0, "21192"
+    const-string/jumbo v0, "21193"
+    const-string/jumbo v0, "21194"
+    const-string/jumbo v0, "21195"
+    const-string/jumbo v0, "21196"
+    const-string/jumbo v0, "21197"
+    const-string/jumbo v0, "21198"
+    const-string/jumbo v0, "21199"
+    const-string/jumbo v0, "21200"
+    const-string/jumbo v0, "21201"
+    const-string/jumbo v0, "21202"
+    const-string/jumbo v0, "21203"
+    const-string/jumbo v0, "21204"
+    const-string/jumbo v0, "21205"
+    const-string/jumbo v0, "21206"
+    const-string/jumbo v0, "21207"
+    const-string/jumbo v0, "21208"
+    const-string/jumbo v0, "21209"
+    const-string/jumbo v0, "21210"
+    const-string/jumbo v0, "21211"
+    const-string/jumbo v0, "21212"
+    const-string/jumbo v0, "21213"
+    const-string/jumbo v0, "21214"
+    const-string/jumbo v0, "21215"
+    const-string/jumbo v0, "21216"
+    const-string/jumbo v0, "21217"
+    const-string/jumbo v0, "21218"
+    const-string/jumbo v0, "21219"
+    const-string/jumbo v0, "21220"
+    const-string/jumbo v0, "21221"
+    const-string/jumbo v0, "21222"
+    const-string/jumbo v0, "21223"
+    const-string/jumbo v0, "21224"
+    const-string/jumbo v0, "21225"
+    const-string/jumbo v0, "21226"
+    const-string/jumbo v0, "21227"
+    const-string/jumbo v0, "21228"
+    const-string/jumbo v0, "21229"
+    const-string/jumbo v0, "21230"
+    const-string/jumbo v0, "21231"
+    const-string/jumbo v0, "21232"
+    const-string/jumbo v0, "21233"
+    const-string/jumbo v0, "21234"
+    const-string/jumbo v0, "21235"
+    const-string/jumbo v0, "21236"
+    const-string/jumbo v0, "21237"
+    const-string/jumbo v0, "21238"
+    const-string/jumbo v0, "21239"
+    const-string/jumbo v0, "21240"
+    const-string/jumbo v0, "21241"
+    const-string/jumbo v0, "21242"
+    const-string/jumbo v0, "21243"
+    const-string/jumbo v0, "21244"
+    const-string/jumbo v0, "21245"
+    const-string/jumbo v0, "21246"
+    const-string/jumbo v0, "21247"
+    const-string/jumbo v0, "21248"
+    const-string/jumbo v0, "21249"
+    const-string/jumbo v0, "21250"
+    const-string/jumbo v0, "21251"
+    const-string/jumbo v0, "21252"
+    const-string/jumbo v0, "21253"
+    const-string/jumbo v0, "21254"
+    const-string/jumbo v0, "21255"
+    const-string/jumbo v0, "21256"
+    const-string/jumbo v0, "21257"
+    const-string/jumbo v0, "21258"
+    const-string/jumbo v0, "21259"
+    const-string/jumbo v0, "21260"
+    const-string/jumbo v0, "21261"
+    const-string/jumbo v0, "21262"
+    const-string/jumbo v0, "21263"
+    const-string/jumbo v0, "21264"
+    const-string/jumbo v0, "21265"
+    const-string/jumbo v0, "21266"
+    const-string/jumbo v0, "21267"
+    const-string/jumbo v0, "21268"
+    const-string/jumbo v0, "21269"
+    const-string/jumbo v0, "21270"
+    const-string/jumbo v0, "21271"
+    const-string/jumbo v0, "21272"
+    const-string/jumbo v0, "21273"
+    const-string/jumbo v0, "21274"
+    const-string/jumbo v0, "21275"
+    const-string/jumbo v0, "21276"
+    const-string/jumbo v0, "21277"
+    const-string/jumbo v0, "21278"
+    const-string/jumbo v0, "21279"
+    const-string/jumbo v0, "21280"
+    const-string/jumbo v0, "21281"
+    const-string/jumbo v0, "21282"
+    const-string/jumbo v0, "21283"
+    const-string/jumbo v0, "21284"
+    const-string/jumbo v0, "21285"
+    const-string/jumbo v0, "21286"
+    const-string/jumbo v0, "21287"
+    const-string/jumbo v0, "21288"
+    const-string/jumbo v0, "21289"
+    const-string/jumbo v0, "21290"
+    const-string/jumbo v0, "21291"
+    const-string/jumbo v0, "21292"
+    const-string/jumbo v0, "21293"
+    const-string/jumbo v0, "21294"
+    const-string/jumbo v0, "21295"
+    const-string/jumbo v0, "21296"
+    const-string/jumbo v0, "21297"
+    const-string/jumbo v0, "21298"
+    const-string/jumbo v0, "21299"
+    const-string/jumbo v0, "21300"
+    const-string/jumbo v0, "21301"
+    const-string/jumbo v0, "21302"
+    const-string/jumbo v0, "21303"
+    const-string/jumbo v0, "21304"
+    const-string/jumbo v0, "21305"
+    const-string/jumbo v0, "21306"
+    const-string/jumbo v0, "21307"
+    const-string/jumbo v0, "21308"
+    const-string/jumbo v0, "21309"
+    const-string/jumbo v0, "21310"
+    const-string/jumbo v0, "21311"
+    const-string/jumbo v0, "21312"
+    const-string/jumbo v0, "21313"
+    const-string/jumbo v0, "21314"
+    const-string/jumbo v0, "21315"
+    const-string/jumbo v0, "21316"
+    const-string/jumbo v0, "21317"
+    const-string/jumbo v0, "21318"
+    const-string/jumbo v0, "21319"
+    const-string/jumbo v0, "21320"
+    const-string/jumbo v0, "21321"
+    const-string/jumbo v0, "21322"
+    const-string/jumbo v0, "21323"
+    const-string/jumbo v0, "21324"
+    const-string/jumbo v0, "21325"
+    const-string/jumbo v0, "21326"
+    const-string/jumbo v0, "21327"
+    const-string/jumbo v0, "21328"
+    const-string/jumbo v0, "21329"
+    const-string/jumbo v0, "21330"
+    const-string/jumbo v0, "21331"
+    const-string/jumbo v0, "21332"
+    const-string/jumbo v0, "21333"
+    const-string/jumbo v0, "21334"
+    const-string/jumbo v0, "21335"
+    const-string/jumbo v0, "21336"
+    const-string/jumbo v0, "21337"
+    const-string/jumbo v0, "21338"
+    const-string/jumbo v0, "21339"
+    const-string/jumbo v0, "21340"
+    const-string/jumbo v0, "21341"
+    const-string/jumbo v0, "21342"
+    const-string/jumbo v0, "21343"
+    const-string/jumbo v0, "21344"
+    const-string/jumbo v0, "21345"
+    const-string/jumbo v0, "21346"
+    const-string/jumbo v0, "21347"
+    const-string/jumbo v0, "21348"
+    const-string/jumbo v0, "21349"
+    const-string/jumbo v0, "21350"
+    const-string/jumbo v0, "21351"
+    const-string/jumbo v0, "21352"
+    const-string/jumbo v0, "21353"
+    const-string/jumbo v0, "21354"
+    const-string/jumbo v0, "21355"
+    const-string/jumbo v0, "21356"
+    const-string/jumbo v0, "21357"
+    const-string/jumbo v0, "21358"
+    const-string/jumbo v0, "21359"
+    const-string/jumbo v0, "21360"
+    const-string/jumbo v0, "21361"
+    const-string/jumbo v0, "21362"
+    const-string/jumbo v0, "21363"
+    const-string/jumbo v0, "21364"
+    const-string/jumbo v0, "21365"
+    const-string/jumbo v0, "21366"
+    const-string/jumbo v0, "21367"
+    const-string/jumbo v0, "21368"
+    const-string/jumbo v0, "21369"
+    const-string/jumbo v0, "21370"
+    const-string/jumbo v0, "21371"
+    const-string/jumbo v0, "21372"
+    const-string/jumbo v0, "21373"
+    const-string/jumbo v0, "21374"
+    const-string/jumbo v0, "21375"
+    const-string/jumbo v0, "21376"
+    const-string/jumbo v0, "21377"
+    const-string/jumbo v0, "21378"
+    const-string/jumbo v0, "21379"
+    const-string/jumbo v0, "21380"
+    const-string/jumbo v0, "21381"
+    const-string/jumbo v0, "21382"
+    const-string/jumbo v0, "21383"
+    const-string/jumbo v0, "21384"
+    const-string/jumbo v0, "21385"
+    const-string/jumbo v0, "21386"
+    const-string/jumbo v0, "21387"
+    const-string/jumbo v0, "21388"
+    const-string/jumbo v0, "21389"
+    const-string/jumbo v0, "21390"
+    const-string/jumbo v0, "21391"
+    const-string/jumbo v0, "21392"
+    const-string/jumbo v0, "21393"
+    const-string/jumbo v0, "21394"
+    const-string/jumbo v0, "21395"
+    const-string/jumbo v0, "21396"
+    const-string/jumbo v0, "21397"
+    const-string/jumbo v0, "21398"
+    const-string/jumbo v0, "21399"
+    const-string/jumbo v0, "21400"
+    const-string/jumbo v0, "21401"
+    const-string/jumbo v0, "21402"
+    const-string/jumbo v0, "21403"
+    const-string/jumbo v0, "21404"
+    const-string/jumbo v0, "21405"
+    const-string/jumbo v0, "21406"
+    const-string/jumbo v0, "21407"
+    const-string/jumbo v0, "21408"
+    const-string/jumbo v0, "21409"
+    const-string/jumbo v0, "21410"
+    const-string/jumbo v0, "21411"
+    const-string/jumbo v0, "21412"
+    const-string/jumbo v0, "21413"
+    const-string/jumbo v0, "21414"
+    const-string/jumbo v0, "21415"
+    const-string/jumbo v0, "21416"
+    const-string/jumbo v0, "21417"
+    const-string/jumbo v0, "21418"
+    const-string/jumbo v0, "21419"
+    const-string/jumbo v0, "21420"
+    const-string/jumbo v0, "21421"
+    const-string/jumbo v0, "21422"
+    const-string/jumbo v0, "21423"
+    const-string/jumbo v0, "21424"
+    const-string/jumbo v0, "21425"
+    const-string/jumbo v0, "21426"
+    const-string/jumbo v0, "21427"
+    const-string/jumbo v0, "21428"
+    const-string/jumbo v0, "21429"
+    const-string/jumbo v0, "21430"
+    const-string/jumbo v0, "21431"
+    const-string/jumbo v0, "21432"
+    const-string/jumbo v0, "21433"
+    const-string/jumbo v0, "21434"
+    const-string/jumbo v0, "21435"
+    const-string/jumbo v0, "21436"
+    const-string/jumbo v0, "21437"
+    const-string/jumbo v0, "21438"
+    const-string/jumbo v0, "21439"
+    const-string/jumbo v0, "21440"
+    const-string/jumbo v0, "21441"
+    const-string/jumbo v0, "21442"
+    const-string/jumbo v0, "21443"
+    const-string/jumbo v0, "21444"
+    const-string/jumbo v0, "21445"
+    const-string/jumbo v0, "21446"
+    const-string/jumbo v0, "21447"
+    const-string/jumbo v0, "21448"
+    const-string/jumbo v0, "21449"
+    const-string/jumbo v0, "21450"
+    const-string/jumbo v0, "21451"
+    const-string/jumbo v0, "21452"
+    const-string/jumbo v0, "21453"
+    const-string/jumbo v0, "21454"
+    const-string/jumbo v0, "21455"
+    const-string/jumbo v0, "21456"
+    const-string/jumbo v0, "21457"
+    const-string/jumbo v0, "21458"
+    const-string/jumbo v0, "21459"
+    const-string/jumbo v0, "21460"
+    const-string/jumbo v0, "21461"
+    const-string/jumbo v0, "21462"
+    const-string/jumbo v0, "21463"
+    const-string/jumbo v0, "21464"
+    const-string/jumbo v0, "21465"
+    const-string/jumbo v0, "21466"
+    const-string/jumbo v0, "21467"
+    const-string/jumbo v0, "21468"
+    const-string/jumbo v0, "21469"
+    const-string/jumbo v0, "21470"
+    const-string/jumbo v0, "21471"
+    const-string/jumbo v0, "21472"
+    const-string/jumbo v0, "21473"
+    const-string/jumbo v0, "21474"
+    const-string/jumbo v0, "21475"
+    const-string/jumbo v0, "21476"
+    const-string/jumbo v0, "21477"
+    const-string/jumbo v0, "21478"
+    const-string/jumbo v0, "21479"
+    const-string/jumbo v0, "21480"
+    const-string/jumbo v0, "21481"
+    const-string/jumbo v0, "21482"
+    const-string/jumbo v0, "21483"
+    const-string/jumbo v0, "21484"
+    const-string/jumbo v0, "21485"
+    const-string/jumbo v0, "21486"
+    const-string/jumbo v0, "21487"
+    const-string/jumbo v0, "21488"
+    const-string/jumbo v0, "21489"
+    const-string/jumbo v0, "21490"
+    const-string/jumbo v0, "21491"
+    const-string/jumbo v0, "21492"
+    const-string/jumbo v0, "21493"
+    const-string/jumbo v0, "21494"
+    const-string/jumbo v0, "21495"
+    const-string/jumbo v0, "21496"
+    const-string/jumbo v0, "21497"
+    const-string/jumbo v0, "21498"
+    const-string/jumbo v0, "21499"
+    const-string/jumbo v0, "21500"
+    const-string/jumbo v0, "21501"
+    const-string/jumbo v0, "21502"
+    const-string/jumbo v0, "21503"
+    const-string/jumbo v0, "21504"
+    const-string/jumbo v0, "21505"
+    const-string/jumbo v0, "21506"
+    const-string/jumbo v0, "21507"
+    const-string/jumbo v0, "21508"
+    const-string/jumbo v0, "21509"
+    const-string/jumbo v0, "21510"
+    const-string/jumbo v0, "21511"
+    const-string/jumbo v0, "21512"
+    const-string/jumbo v0, "21513"
+    const-string/jumbo v0, "21514"
+    const-string/jumbo v0, "21515"
+    const-string/jumbo v0, "21516"
+    const-string/jumbo v0, "21517"
+    const-string/jumbo v0, "21518"
+    const-string/jumbo v0, "21519"
+    const-string/jumbo v0, "21520"
+    const-string/jumbo v0, "21521"
+    const-string/jumbo v0, "21522"
+    const-string/jumbo v0, "21523"
+    const-string/jumbo v0, "21524"
+    const-string/jumbo v0, "21525"
+    const-string/jumbo v0, "21526"
+    const-string/jumbo v0, "21527"
+    const-string/jumbo v0, "21528"
+    const-string/jumbo v0, "21529"
+    const-string/jumbo v0, "21530"
+    const-string/jumbo v0, "21531"
+    const-string/jumbo v0, "21532"
+    const-string/jumbo v0, "21533"
+    const-string/jumbo v0, "21534"
+    const-string/jumbo v0, "21535"
+    const-string/jumbo v0, "21536"
+    const-string/jumbo v0, "21537"
+    const-string/jumbo v0, "21538"
+    const-string/jumbo v0, "21539"
+    const-string/jumbo v0, "21540"
+    const-string/jumbo v0, "21541"
+    const-string/jumbo v0, "21542"
+    const-string/jumbo v0, "21543"
+    const-string/jumbo v0, "21544"
+    const-string/jumbo v0, "21545"
+    const-string/jumbo v0, "21546"
+    const-string/jumbo v0, "21547"
+    const-string/jumbo v0, "21548"
+    const-string/jumbo v0, "21549"
+    const-string/jumbo v0, "21550"
+    const-string/jumbo v0, "21551"
+    const-string/jumbo v0, "21552"
+    const-string/jumbo v0, "21553"
+    const-string/jumbo v0, "21554"
+    const-string/jumbo v0, "21555"
+    const-string/jumbo v0, "21556"
+    const-string/jumbo v0, "21557"
+    const-string/jumbo v0, "21558"
+    const-string/jumbo v0, "21559"
+    const-string/jumbo v0, "21560"
+    const-string/jumbo v0, "21561"
+    const-string/jumbo v0, "21562"
+    const-string/jumbo v0, "21563"
+    const-string/jumbo v0, "21564"
+    const-string/jumbo v0, "21565"
+    const-string/jumbo v0, "21566"
+    const-string/jumbo v0, "21567"
+    const-string/jumbo v0, "21568"
+    const-string/jumbo v0, "21569"
+    const-string/jumbo v0, "21570"
+    const-string/jumbo v0, "21571"
+    const-string/jumbo v0, "21572"
+    const-string/jumbo v0, "21573"
+    const-string/jumbo v0, "21574"
+    const-string/jumbo v0, "21575"
+    const-string/jumbo v0, "21576"
+    const-string/jumbo v0, "21577"
+    const-string/jumbo v0, "21578"
+    const-string/jumbo v0, "21579"
+    const-string/jumbo v0, "21580"
+    const-string/jumbo v0, "21581"
+    const-string/jumbo v0, "21582"
+    const-string/jumbo v0, "21583"
+    const-string/jumbo v0, "21584"
+    const-string/jumbo v0, "21585"
+    const-string/jumbo v0, "21586"
+    const-string/jumbo v0, "21587"
+    const-string/jumbo v0, "21588"
+    const-string/jumbo v0, "21589"
+    const-string/jumbo v0, "21590"
+    const-string/jumbo v0, "21591"
+    const-string/jumbo v0, "21592"
+    const-string/jumbo v0, "21593"
+    const-string/jumbo v0, "21594"
+    const-string/jumbo v0, "21595"
+    const-string/jumbo v0, "21596"
+    const-string/jumbo v0, "21597"
+    const-string/jumbo v0, "21598"
+    const-string/jumbo v0, "21599"
+    const-string/jumbo v0, "21600"
+    const-string/jumbo v0, "21601"
+    const-string/jumbo v0, "21602"
+    const-string/jumbo v0, "21603"
+    const-string/jumbo v0, "21604"
+    const-string/jumbo v0, "21605"
+    const-string/jumbo v0, "21606"
+    const-string/jumbo v0, "21607"
+    const-string/jumbo v0, "21608"
+    const-string/jumbo v0, "21609"
+    const-string/jumbo v0, "21610"
+    const-string/jumbo v0, "21611"
+    const-string/jumbo v0, "21612"
+    const-string/jumbo v0, "21613"
+    const-string/jumbo v0, "21614"
+    const-string/jumbo v0, "21615"
+    const-string/jumbo v0, "21616"
+    const-string/jumbo v0, "21617"
+    const-string/jumbo v0, "21618"
+    const-string/jumbo v0, "21619"
+    const-string/jumbo v0, "21620"
+    const-string/jumbo v0, "21621"
+    const-string/jumbo v0, "21622"
+    const-string/jumbo v0, "21623"
+    const-string/jumbo v0, "21624"
+    const-string/jumbo v0, "21625"
+    const-string/jumbo v0, "21626"
+    const-string/jumbo v0, "21627"
+    const-string/jumbo v0, "21628"
+    const-string/jumbo v0, "21629"
+    const-string/jumbo v0, "21630"
+    const-string/jumbo v0, "21631"
+    const-string/jumbo v0, "21632"
+    const-string/jumbo v0, "21633"
+    const-string/jumbo v0, "21634"
+    const-string/jumbo v0, "21635"
+    const-string/jumbo v0, "21636"
+    const-string/jumbo v0, "21637"
+    const-string/jumbo v0, "21638"
+    const-string/jumbo v0, "21639"
+    const-string/jumbo v0, "21640"
+    const-string/jumbo v0, "21641"
+    const-string/jumbo v0, "21642"
+    const-string/jumbo v0, "21643"
+    const-string/jumbo v0, "21644"
+    const-string/jumbo v0, "21645"
+    const-string/jumbo v0, "21646"
+    const-string/jumbo v0, "21647"
+    const-string/jumbo v0, "21648"
+    const-string/jumbo v0, "21649"
+    const-string/jumbo v0, "21650"
+    const-string/jumbo v0, "21651"
+    const-string/jumbo v0, "21652"
+    const-string/jumbo v0, "21653"
+    const-string/jumbo v0, "21654"
+    const-string/jumbo v0, "21655"
+    const-string/jumbo v0, "21656"
+    const-string/jumbo v0, "21657"
+    const-string/jumbo v0, "21658"
+    const-string/jumbo v0, "21659"
+    const-string/jumbo v0, "21660"
+    const-string/jumbo v0, "21661"
+    const-string/jumbo v0, "21662"
+    const-string/jumbo v0, "21663"
+    const-string/jumbo v0, "21664"
+    const-string/jumbo v0, "21665"
+    const-string/jumbo v0, "21666"
+    const-string/jumbo v0, "21667"
+    const-string/jumbo v0, "21668"
+    const-string/jumbo v0, "21669"
+    const-string/jumbo v0, "21670"
+    const-string/jumbo v0, "21671"
+    const-string/jumbo v0, "21672"
+    const-string/jumbo v0, "21673"
+    const-string/jumbo v0, "21674"
+    const-string/jumbo v0, "21675"
+    const-string/jumbo v0, "21676"
+    const-string/jumbo v0, "21677"
+    const-string/jumbo v0, "21678"
+    const-string/jumbo v0, "21679"
+    const-string/jumbo v0, "21680"
+    const-string/jumbo v0, "21681"
+    const-string/jumbo v0, "21682"
+    const-string/jumbo v0, "21683"
+    const-string/jumbo v0, "21684"
+    const-string/jumbo v0, "21685"
+    const-string/jumbo v0, "21686"
+    const-string/jumbo v0, "21687"
+    const-string/jumbo v0, "21688"
+    const-string/jumbo v0, "21689"
+    const-string/jumbo v0, "21690"
+    const-string/jumbo v0, "21691"
+    const-string/jumbo v0, "21692"
+    const-string/jumbo v0, "21693"
+    const-string/jumbo v0, "21694"
+    const-string/jumbo v0, "21695"
+    const-string/jumbo v0, "21696"
+    const-string/jumbo v0, "21697"
+    const-string/jumbo v0, "21698"
+    const-string/jumbo v0, "21699"
+    const-string/jumbo v0, "21700"
+    const-string/jumbo v0, "21701"
+    const-string/jumbo v0, "21702"
+    const-string/jumbo v0, "21703"
+    const-string/jumbo v0, "21704"
+    const-string/jumbo v0, "21705"
+    const-string/jumbo v0, "21706"
+    const-string/jumbo v0, "21707"
+    const-string/jumbo v0, "21708"
+    const-string/jumbo v0, "21709"
+    const-string/jumbo v0, "21710"
+    const-string/jumbo v0, "21711"
+    const-string/jumbo v0, "21712"
+    const-string/jumbo v0, "21713"
+    const-string/jumbo v0, "21714"
+    const-string/jumbo v0, "21715"
+    const-string/jumbo v0, "21716"
+    const-string/jumbo v0, "21717"
+    const-string/jumbo v0, "21718"
+    const-string/jumbo v0, "21719"
+    const-string/jumbo v0, "21720"
+    const-string/jumbo v0, "21721"
+    const-string/jumbo v0, "21722"
+    const-string/jumbo v0, "21723"
+    const-string/jumbo v0, "21724"
+    const-string/jumbo v0, "21725"
+    const-string/jumbo v0, "21726"
+    const-string/jumbo v0, "21727"
+    const-string/jumbo v0, "21728"
+    const-string/jumbo v0, "21729"
+    const-string/jumbo v0, "21730"
+    const-string/jumbo v0, "21731"
+    const-string/jumbo v0, "21732"
+    const-string/jumbo v0, "21733"
+    const-string/jumbo v0, "21734"
+    const-string/jumbo v0, "21735"
+    const-string/jumbo v0, "21736"
+    const-string/jumbo v0, "21737"
+    const-string/jumbo v0, "21738"
+    const-string/jumbo v0, "21739"
+    const-string/jumbo v0, "21740"
+    const-string/jumbo v0, "21741"
+    const-string/jumbo v0, "21742"
+    const-string/jumbo v0, "21743"
+    const-string/jumbo v0, "21744"
+    const-string/jumbo v0, "21745"
+    const-string/jumbo v0, "21746"
+    const-string/jumbo v0, "21747"
+    const-string/jumbo v0, "21748"
+    const-string/jumbo v0, "21749"
+    const-string/jumbo v0, "21750"
+    const-string/jumbo v0, "21751"
+    const-string/jumbo v0, "21752"
+    const-string/jumbo v0, "21753"
+    const-string/jumbo v0, "21754"
+    const-string/jumbo v0, "21755"
+    const-string/jumbo v0, "21756"
+    const-string/jumbo v0, "21757"
+    const-string/jumbo v0, "21758"
+    const-string/jumbo v0, "21759"
+    const-string/jumbo v0, "21760"
+    const-string/jumbo v0, "21761"
+    const-string/jumbo v0, "21762"
+    const-string/jumbo v0, "21763"
+    const-string/jumbo v0, "21764"
+    const-string/jumbo v0, "21765"
+    const-string/jumbo v0, "21766"
+    const-string/jumbo v0, "21767"
+    const-string/jumbo v0, "21768"
+    const-string/jumbo v0, "21769"
+    const-string/jumbo v0, "21770"
+    const-string/jumbo v0, "21771"
+    const-string/jumbo v0, "21772"
+    const-string/jumbo v0, "21773"
+    const-string/jumbo v0, "21774"
+    const-string/jumbo v0, "21775"
+    const-string/jumbo v0, "21776"
+    const-string/jumbo v0, "21777"
+    const-string/jumbo v0, "21778"
+    const-string/jumbo v0, "21779"
+    const-string/jumbo v0, "21780"
+    const-string/jumbo v0, "21781"
+    const-string/jumbo v0, "21782"
+    const-string/jumbo v0, "21783"
+    const-string/jumbo v0, "21784"
+    const-string/jumbo v0, "21785"
+    const-string/jumbo v0, "21786"
+    const-string/jumbo v0, "21787"
+    const-string/jumbo v0, "21788"
+    const-string/jumbo v0, "21789"
+    const-string/jumbo v0, "21790"
+    const-string/jumbo v0, "21791"
+    const-string/jumbo v0, "21792"
+    const-string/jumbo v0, "21793"
+    const-string/jumbo v0, "21794"
+    const-string/jumbo v0, "21795"
+    const-string/jumbo v0, "21796"
+    const-string/jumbo v0, "21797"
+    const-string/jumbo v0, "21798"
+    const-string/jumbo v0, "21799"
+    const-string/jumbo v0, "21800"
+    const-string/jumbo v0, "21801"
+    const-string/jumbo v0, "21802"
+    const-string/jumbo v0, "21803"
+    const-string/jumbo v0, "21804"
+    const-string/jumbo v0, "21805"
+    const-string/jumbo v0, "21806"
+    const-string/jumbo v0, "21807"
+    const-string/jumbo v0, "21808"
+    const-string/jumbo v0, "21809"
+    const-string/jumbo v0, "21810"
+    const-string/jumbo v0, "21811"
+    const-string/jumbo v0, "21812"
+    const-string/jumbo v0, "21813"
+    const-string/jumbo v0, "21814"
+    const-string/jumbo v0, "21815"
+    const-string/jumbo v0, "21816"
+    const-string/jumbo v0, "21817"
+    const-string/jumbo v0, "21818"
+    const-string/jumbo v0, "21819"
+    const-string/jumbo v0, "21820"
+    const-string/jumbo v0, "21821"
+    const-string/jumbo v0, "21822"
+    const-string/jumbo v0, "21823"
+    const-string/jumbo v0, "21824"
+    const-string/jumbo v0, "21825"
+    const-string/jumbo v0, "21826"
+    const-string/jumbo v0, "21827"
+    const-string/jumbo v0, "21828"
+    const-string/jumbo v0, "21829"
+    const-string/jumbo v0, "21830"
+    const-string/jumbo v0, "21831"
+    const-string/jumbo v0, "21832"
+    const-string/jumbo v0, "21833"
+    const-string/jumbo v0, "21834"
+    const-string/jumbo v0, "21835"
+    const-string/jumbo v0, "21836"
+    const-string/jumbo v0, "21837"
+    const-string/jumbo v0, "21838"
+    const-string/jumbo v0, "21839"
+    const-string/jumbo v0, "21840"
+    const-string/jumbo v0, "21841"
+    const-string/jumbo v0, "21842"
+    const-string/jumbo v0, "21843"
+    const-string/jumbo v0, "21844"
+    const-string/jumbo v0, "21845"
+    const-string/jumbo v0, "21846"
+    const-string/jumbo v0, "21847"
+    const-string/jumbo v0, "21848"
+    const-string/jumbo v0, "21849"
+    const-string/jumbo v0, "21850"
+    const-string/jumbo v0, "21851"
+    const-string/jumbo v0, "21852"
+    const-string/jumbo v0, "21853"
+    const-string/jumbo v0, "21854"
+    const-string/jumbo v0, "21855"
+    const-string/jumbo v0, "21856"
+    const-string/jumbo v0, "21857"
+    const-string/jumbo v0, "21858"
+    const-string/jumbo v0, "21859"
+    const-string/jumbo v0, "21860"
+    const-string/jumbo v0, "21861"
+    const-string/jumbo v0, "21862"
+    const-string/jumbo v0, "21863"
+    const-string/jumbo v0, "21864"
+    const-string/jumbo v0, "21865"
+    const-string/jumbo v0, "21866"
+    const-string/jumbo v0, "21867"
+    const-string/jumbo v0, "21868"
+    const-string/jumbo v0, "21869"
+    const-string/jumbo v0, "21870"
+    const-string/jumbo v0, "21871"
+    const-string/jumbo v0, "21872"
+    const-string/jumbo v0, "21873"
+    const-string/jumbo v0, "21874"
+    const-string/jumbo v0, "21875"
+    const-string/jumbo v0, "21876"
+    const-string/jumbo v0, "21877"
+    const-string/jumbo v0, "21878"
+    const-string/jumbo v0, "21879"
+    const-string/jumbo v0, "21880"
+    const-string/jumbo v0, "21881"
+    const-string/jumbo v0, "21882"
+    const-string/jumbo v0, "21883"
+    const-string/jumbo v0, "21884"
+    const-string/jumbo v0, "21885"
+    const-string/jumbo v0, "21886"
+    const-string/jumbo v0, "21887"
+    const-string/jumbo v0, "21888"
+    const-string/jumbo v0, "21889"
+    const-string/jumbo v0, "21890"
+    const-string/jumbo v0, "21891"
+    const-string/jumbo v0, "21892"
+    const-string/jumbo v0, "21893"
+    const-string/jumbo v0, "21894"
+    const-string/jumbo v0, "21895"
+    const-string/jumbo v0, "21896"
+    const-string/jumbo v0, "21897"
+    const-string/jumbo v0, "21898"
+    const-string/jumbo v0, "21899"
+    const-string/jumbo v0, "21900"
+    const-string/jumbo v0, "21901"
+    const-string/jumbo v0, "21902"
+    const-string/jumbo v0, "21903"
+    const-string/jumbo v0, "21904"
+    const-string/jumbo v0, "21905"
+    const-string/jumbo v0, "21906"
+    const-string/jumbo v0, "21907"
+    const-string/jumbo v0, "21908"
+    const-string/jumbo v0, "21909"
+    const-string/jumbo v0, "21910"
+    const-string/jumbo v0, "21911"
+    const-string/jumbo v0, "21912"
+    const-string/jumbo v0, "21913"
+    const-string/jumbo v0, "21914"
+    const-string/jumbo v0, "21915"
+    const-string/jumbo v0, "21916"
+    const-string/jumbo v0, "21917"
+    const-string/jumbo v0, "21918"
+    const-string/jumbo v0, "21919"
+    const-string/jumbo v0, "21920"
+    const-string/jumbo v0, "21921"
+    const-string/jumbo v0, "21922"
+    const-string/jumbo v0, "21923"
+    const-string/jumbo v0, "21924"
+    const-string/jumbo v0, "21925"
+    const-string/jumbo v0, "21926"
+    const-string/jumbo v0, "21927"
+    const-string/jumbo v0, "21928"
+    const-string/jumbo v0, "21929"
+    const-string/jumbo v0, "21930"
+    const-string/jumbo v0, "21931"
+    const-string/jumbo v0, "21932"
+    const-string/jumbo v0, "21933"
+    const-string/jumbo v0, "21934"
+    const-string/jumbo v0, "21935"
+    const-string/jumbo v0, "21936"
+    const-string/jumbo v0, "21937"
+    const-string/jumbo v0, "21938"
+    const-string/jumbo v0, "21939"
+    const-string/jumbo v0, "21940"
+    const-string/jumbo v0, "21941"
+    const-string/jumbo v0, "21942"
+    const-string/jumbo v0, "21943"
+    const-string/jumbo v0, "21944"
+    const-string/jumbo v0, "21945"
+    const-string/jumbo v0, "21946"
+    const-string/jumbo v0, "21947"
+    const-string/jumbo v0, "21948"
+    const-string/jumbo v0, "21949"
+    const-string/jumbo v0, "21950"
+    const-string/jumbo v0, "21951"
+    const-string/jumbo v0, "21952"
+    const-string/jumbo v0, "21953"
+    const-string/jumbo v0, "21954"
+    const-string/jumbo v0, "21955"
+    const-string/jumbo v0, "21956"
+    const-string/jumbo v0, "21957"
+    const-string/jumbo v0, "21958"
+    const-string/jumbo v0, "21959"
+    const-string/jumbo v0, "21960"
+    const-string/jumbo v0, "21961"
+    const-string/jumbo v0, "21962"
+    const-string/jumbo v0, "21963"
+    const-string/jumbo v0, "21964"
+    const-string/jumbo v0, "21965"
+    const-string/jumbo v0, "21966"
+    const-string/jumbo v0, "21967"
+    const-string/jumbo v0, "21968"
+    const-string/jumbo v0, "21969"
+    const-string/jumbo v0, "21970"
+    const-string/jumbo v0, "21971"
+    const-string/jumbo v0, "21972"
+    const-string/jumbo v0, "21973"
+    const-string/jumbo v0, "21974"
+    const-string/jumbo v0, "21975"
+    const-string/jumbo v0, "21976"
+    const-string/jumbo v0, "21977"
+    const-string/jumbo v0, "21978"
+    const-string/jumbo v0, "21979"
+    const-string/jumbo v0, "21980"
+    const-string/jumbo v0, "21981"
+    const-string/jumbo v0, "21982"
+    const-string/jumbo v0, "21983"
+    const-string/jumbo v0, "21984"
+    const-string/jumbo v0, "21985"
+    const-string/jumbo v0, "21986"
+    const-string/jumbo v0, "21987"
+    const-string/jumbo v0, "21988"
+    const-string/jumbo v0, "21989"
+    const-string/jumbo v0, "21990"
+    const-string/jumbo v0, "21991"
+    const-string/jumbo v0, "21992"
+    const-string/jumbo v0, "21993"
+    const-string/jumbo v0, "21994"
+    const-string/jumbo v0, "21995"
+    const-string/jumbo v0, "21996"
+    const-string/jumbo v0, "21997"
+    const-string/jumbo v0, "21998"
+    const-string/jumbo v0, "21999"
+    const-string/jumbo v0, "22000"
+    const-string/jumbo v0, "22001"
+    const-string/jumbo v0, "22002"
+    const-string/jumbo v0, "22003"
+    const-string/jumbo v0, "22004"
+    const-string/jumbo v0, "22005"
+    const-string/jumbo v0, "22006"
+    const-string/jumbo v0, "22007"
+    const-string/jumbo v0, "22008"
+    const-string/jumbo v0, "22009"
+    const-string/jumbo v0, "22010"
+    const-string/jumbo v0, "22011"
+    const-string/jumbo v0, "22012"
+    const-string/jumbo v0, "22013"
+    const-string/jumbo v0, "22014"
+    const-string/jumbo v0, "22015"
+    const-string/jumbo v0, "22016"
+    const-string/jumbo v0, "22017"
+    const-string/jumbo v0, "22018"
+    const-string/jumbo v0, "22019"
+    const-string/jumbo v0, "22020"
+    const-string/jumbo v0, "22021"
+    const-string/jumbo v0, "22022"
+    const-string/jumbo v0, "22023"
+    const-string/jumbo v0, "22024"
+    const-string/jumbo v0, "22025"
+    const-string/jumbo v0, "22026"
+    const-string/jumbo v0, "22027"
+    const-string/jumbo v0, "22028"
+    const-string/jumbo v0, "22029"
+    const-string/jumbo v0, "22030"
+    const-string/jumbo v0, "22031"
+    const-string/jumbo v0, "22032"
+    const-string/jumbo v0, "22033"
+    const-string/jumbo v0, "22034"
+    const-string/jumbo v0, "22035"
+    const-string/jumbo v0, "22036"
+    const-string/jumbo v0, "22037"
+    const-string/jumbo v0, "22038"
+    const-string/jumbo v0, "22039"
+    const-string/jumbo v0, "22040"
+    const-string/jumbo v0, "22041"
+    const-string/jumbo v0, "22042"
+    const-string/jumbo v0, "22043"
+    const-string/jumbo v0, "22044"
+    const-string/jumbo v0, "22045"
+    const-string/jumbo v0, "22046"
+    const-string/jumbo v0, "22047"
+    const-string/jumbo v0, "22048"
+    const-string/jumbo v0, "22049"
+    const-string/jumbo v0, "22050"
+    const-string/jumbo v0, "22051"
+    const-string/jumbo v0, "22052"
+    const-string/jumbo v0, "22053"
+    const-string/jumbo v0, "22054"
+    const-string/jumbo v0, "22055"
+    const-string/jumbo v0, "22056"
+    const-string/jumbo v0, "22057"
+    const-string/jumbo v0, "22058"
+    const-string/jumbo v0, "22059"
+    const-string/jumbo v0, "22060"
+    const-string/jumbo v0, "22061"
+    const-string/jumbo v0, "22062"
+    const-string/jumbo v0, "22063"
+    const-string/jumbo v0, "22064"
+    const-string/jumbo v0, "22065"
+    const-string/jumbo v0, "22066"
+    const-string/jumbo v0, "22067"
+    const-string/jumbo v0, "22068"
+    const-string/jumbo v0, "22069"
+    const-string/jumbo v0, "22070"
+    const-string/jumbo v0, "22071"
+    const-string/jumbo v0, "22072"
+    const-string/jumbo v0, "22073"
+    const-string/jumbo v0, "22074"
+    const-string/jumbo v0, "22075"
+    const-string/jumbo v0, "22076"
+    const-string/jumbo v0, "22077"
+    const-string/jumbo v0, "22078"
+    const-string/jumbo v0, "22079"
+    const-string/jumbo v0, "22080"
+    const-string/jumbo v0, "22081"
+    const-string/jumbo v0, "22082"
+    const-string/jumbo v0, "22083"
+    const-string/jumbo v0, "22084"
+    const-string/jumbo v0, "22085"
+    const-string/jumbo v0, "22086"
+    const-string/jumbo v0, "22087"
+    const-string/jumbo v0, "22088"
+    const-string/jumbo v0, "22089"
+    const-string/jumbo v0, "22090"
+    const-string/jumbo v0, "22091"
+    const-string/jumbo v0, "22092"
+    const-string/jumbo v0, "22093"
+    const-string/jumbo v0, "22094"
+    const-string/jumbo v0, "22095"
+    const-string/jumbo v0, "22096"
+    const-string/jumbo v0, "22097"
+    const-string/jumbo v0, "22098"
+    const-string/jumbo v0, "22099"
+    const-string/jumbo v0, "22100"
+    const-string/jumbo v0, "22101"
+    const-string/jumbo v0, "22102"
+    const-string/jumbo v0, "22103"
+    const-string/jumbo v0, "22104"
+    const-string/jumbo v0, "22105"
+    const-string/jumbo v0, "22106"
+    const-string/jumbo v0, "22107"
+    const-string/jumbo v0, "22108"
+    const-string/jumbo v0, "22109"
+    const-string/jumbo v0, "22110"
+    const-string/jumbo v0, "22111"
+    const-string/jumbo v0, "22112"
+    const-string/jumbo v0, "22113"
+    const-string/jumbo v0, "22114"
+    const-string/jumbo v0, "22115"
+    const-string/jumbo v0, "22116"
+    const-string/jumbo v0, "22117"
+    const-string/jumbo v0, "22118"
+    const-string/jumbo v0, "22119"
+    const-string/jumbo v0, "22120"
+    const-string/jumbo v0, "22121"
+    const-string/jumbo v0, "22122"
+    const-string/jumbo v0, "22123"
+    const-string/jumbo v0, "22124"
+    const-string/jumbo v0, "22125"
+    const-string/jumbo v0, "22126"
+    const-string/jumbo v0, "22127"
+    const-string/jumbo v0, "22128"
+    const-string/jumbo v0, "22129"
+    const-string/jumbo v0, "22130"
+    const-string/jumbo v0, "22131"
+    const-string/jumbo v0, "22132"
+    const-string/jumbo v0, "22133"
+    const-string/jumbo v0, "22134"
+    const-string/jumbo v0, "22135"
+    const-string/jumbo v0, "22136"
+    const-string/jumbo v0, "22137"
+    const-string/jumbo v0, "22138"
+    const-string/jumbo v0, "22139"
+    const-string/jumbo v0, "22140"
+    const-string/jumbo v0, "22141"
+    const-string/jumbo v0, "22142"
+    const-string/jumbo v0, "22143"
+    const-string/jumbo v0, "22144"
+    const-string/jumbo v0, "22145"
+    const-string/jumbo v0, "22146"
+    const-string/jumbo v0, "22147"
+    const-string/jumbo v0, "22148"
+    const-string/jumbo v0, "22149"
+    const-string/jumbo v0, "22150"
+    const-string/jumbo v0, "22151"
+    const-string/jumbo v0, "22152"
+    const-string/jumbo v0, "22153"
+    const-string/jumbo v0, "22154"
+    const-string/jumbo v0, "22155"
+    const-string/jumbo v0, "22156"
+    const-string/jumbo v0, "22157"
+    const-string/jumbo v0, "22158"
+    const-string/jumbo v0, "22159"
+    const-string/jumbo v0, "22160"
+    const-string/jumbo v0, "22161"
+    const-string/jumbo v0, "22162"
+    const-string/jumbo v0, "22163"
+    const-string/jumbo v0, "22164"
+    const-string/jumbo v0, "22165"
+    const-string/jumbo v0, "22166"
+    const-string/jumbo v0, "22167"
+    const-string/jumbo v0, "22168"
+    const-string/jumbo v0, "22169"
+    const-string/jumbo v0, "22170"
+    const-string/jumbo v0, "22171"
+    const-string/jumbo v0, "22172"
+    const-string/jumbo v0, "22173"
+    const-string/jumbo v0, "22174"
+    const-string/jumbo v0, "22175"
+    const-string/jumbo v0, "22176"
+    const-string/jumbo v0, "22177"
+    const-string/jumbo v0, "22178"
+    const-string/jumbo v0, "22179"
+    const-string/jumbo v0, "22180"
+    const-string/jumbo v0, "22181"
+    const-string/jumbo v0, "22182"
+    const-string/jumbo v0, "22183"
+    const-string/jumbo v0, "22184"
+    const-string/jumbo v0, "22185"
+    const-string/jumbo v0, "22186"
+    const-string/jumbo v0, "22187"
+    const-string/jumbo v0, "22188"
+    const-string/jumbo v0, "22189"
+    const-string/jumbo v0, "22190"
+    const-string/jumbo v0, "22191"
+    const-string/jumbo v0, "22192"
+    const-string/jumbo v0, "22193"
+    const-string/jumbo v0, "22194"
+    const-string/jumbo v0, "22195"
+    const-string/jumbo v0, "22196"
+    const-string/jumbo v0, "22197"
+    const-string/jumbo v0, "22198"
+    const-string/jumbo v0, "22199"
+    const-string/jumbo v0, "22200"
+    const-string/jumbo v0, "22201"
+    const-string/jumbo v0, "22202"
+    const-string/jumbo v0, "22203"
+    const-string/jumbo v0, "22204"
+    const-string/jumbo v0, "22205"
+    const-string/jumbo v0, "22206"
+    const-string/jumbo v0, "22207"
+    const-string/jumbo v0, "22208"
+    const-string/jumbo v0, "22209"
+    const-string/jumbo v0, "22210"
+    const-string/jumbo v0, "22211"
+    const-string/jumbo v0, "22212"
+    const-string/jumbo v0, "22213"
+    const-string/jumbo v0, "22214"
+    const-string/jumbo v0, "22215"
+    const-string/jumbo v0, "22216"
+    const-string/jumbo v0, "22217"
+    const-string/jumbo v0, "22218"
+    const-string/jumbo v0, "22219"
+    const-string/jumbo v0, "22220"
+    const-string/jumbo v0, "22221"
+    const-string/jumbo v0, "22222"
+    const-string/jumbo v0, "22223"
+    const-string/jumbo v0, "22224"
+    const-string/jumbo v0, "22225"
+    const-string/jumbo v0, "22226"
+    const-string/jumbo v0, "22227"
+    const-string/jumbo v0, "22228"
+    const-string/jumbo v0, "22229"
+    const-string/jumbo v0, "22230"
+    const-string/jumbo v0, "22231"
+    const-string/jumbo v0, "22232"
+    const-string/jumbo v0, "22233"
+    const-string/jumbo v0, "22234"
+    const-string/jumbo v0, "22235"
+    const-string/jumbo v0, "22236"
+    const-string/jumbo v0, "22237"
+    const-string/jumbo v0, "22238"
+    const-string/jumbo v0, "22239"
+    const-string/jumbo v0, "22240"
+    const-string/jumbo v0, "22241"
+    const-string/jumbo v0, "22242"
+    const-string/jumbo v0, "22243"
+    const-string/jumbo v0, "22244"
+    const-string/jumbo v0, "22245"
+    const-string/jumbo v0, "22246"
+    const-string/jumbo v0, "22247"
+    const-string/jumbo v0, "22248"
+    const-string/jumbo v0, "22249"
+    const-string/jumbo v0, "22250"
+    const-string/jumbo v0, "22251"
+    const-string/jumbo v0, "22252"
+    const-string/jumbo v0, "22253"
+    const-string/jumbo v0, "22254"
+    const-string/jumbo v0, "22255"
+    const-string/jumbo v0, "22256"
+    const-string/jumbo v0, "22257"
+    const-string/jumbo v0, "22258"
+    const-string/jumbo v0, "22259"
+    const-string/jumbo v0, "22260"
+    const-string/jumbo v0, "22261"
+    const-string/jumbo v0, "22262"
+    const-string/jumbo v0, "22263"
+    const-string/jumbo v0, "22264"
+    const-string/jumbo v0, "22265"
+    const-string/jumbo v0, "22266"
+    const-string/jumbo v0, "22267"
+    const-string/jumbo v0, "22268"
+    const-string/jumbo v0, "22269"
+    const-string/jumbo v0, "22270"
+    const-string/jumbo v0, "22271"
+    const-string/jumbo v0, "22272"
+    const-string/jumbo v0, "22273"
+    const-string/jumbo v0, "22274"
+    const-string/jumbo v0, "22275"
+    const-string/jumbo v0, "22276"
+    const-string/jumbo v0, "22277"
+    const-string/jumbo v0, "22278"
+    const-string/jumbo v0, "22279"
+    const-string/jumbo v0, "22280"
+    const-string/jumbo v0, "22281"
+    const-string/jumbo v0, "22282"
+    const-string/jumbo v0, "22283"
+    const-string/jumbo v0, "22284"
+    const-string/jumbo v0, "22285"
+    const-string/jumbo v0, "22286"
+    const-string/jumbo v0, "22287"
+    const-string/jumbo v0, "22288"
+    const-string/jumbo v0, "22289"
+    const-string/jumbo v0, "22290"
+    const-string/jumbo v0, "22291"
+    const-string/jumbo v0, "22292"
+    const-string/jumbo v0, "22293"
+    const-string/jumbo v0, "22294"
+    const-string/jumbo v0, "22295"
+    const-string/jumbo v0, "22296"
+    const-string/jumbo v0, "22297"
+    const-string/jumbo v0, "22298"
+    const-string/jumbo v0, "22299"
+    const-string/jumbo v0, "22300"
+    const-string/jumbo v0, "22301"
+    const-string/jumbo v0, "22302"
+    const-string/jumbo v0, "22303"
+    const-string/jumbo v0, "22304"
+    const-string/jumbo v0, "22305"
+    const-string/jumbo v0, "22306"
+    const-string/jumbo v0, "22307"
+    const-string/jumbo v0, "22308"
+    const-string/jumbo v0, "22309"
+    const-string/jumbo v0, "22310"
+    const-string/jumbo v0, "22311"
+    const-string/jumbo v0, "22312"
+    const-string/jumbo v0, "22313"
+    const-string/jumbo v0, "22314"
+    const-string/jumbo v0, "22315"
+    const-string/jumbo v0, "22316"
+    const-string/jumbo v0, "22317"
+    const-string/jumbo v0, "22318"
+    const-string/jumbo v0, "22319"
+    const-string/jumbo v0, "22320"
+    const-string/jumbo v0, "22321"
+    const-string/jumbo v0, "22322"
+    const-string/jumbo v0, "22323"
+    const-string/jumbo v0, "22324"
+    const-string/jumbo v0, "22325"
+    const-string/jumbo v0, "22326"
+    const-string/jumbo v0, "22327"
+    const-string/jumbo v0, "22328"
+    const-string/jumbo v0, "22329"
+    const-string/jumbo v0, "22330"
+    const-string/jumbo v0, "22331"
+    const-string/jumbo v0, "22332"
+    const-string/jumbo v0, "22333"
+    const-string/jumbo v0, "22334"
+    const-string/jumbo v0, "22335"
+    const-string/jumbo v0, "22336"
+    const-string/jumbo v0, "22337"
+    const-string/jumbo v0, "22338"
+    const-string/jumbo v0, "22339"
+    const-string/jumbo v0, "22340"
+    const-string/jumbo v0, "22341"
+    const-string/jumbo v0, "22342"
+    const-string/jumbo v0, "22343"
+    const-string/jumbo v0, "22344"
+    const-string/jumbo v0, "22345"
+    const-string/jumbo v0, "22346"
+    const-string/jumbo v0, "22347"
+    const-string/jumbo v0, "22348"
+    const-string/jumbo v0, "22349"
+    const-string/jumbo v0, "22350"
+    const-string/jumbo v0, "22351"
+    const-string/jumbo v0, "22352"
+    const-string/jumbo v0, "22353"
+    const-string/jumbo v0, "22354"
+    const-string/jumbo v0, "22355"
+    const-string/jumbo v0, "22356"
+    const-string/jumbo v0, "22357"
+    const-string/jumbo v0, "22358"
+    const-string/jumbo v0, "22359"
+    const-string/jumbo v0, "22360"
+    const-string/jumbo v0, "22361"
+    const-string/jumbo v0, "22362"
+    const-string/jumbo v0, "22363"
+    const-string/jumbo v0, "22364"
+    const-string/jumbo v0, "22365"
+    const-string/jumbo v0, "22366"
+    const-string/jumbo v0, "22367"
+    const-string/jumbo v0, "22368"
+    const-string/jumbo v0, "22369"
+    const-string/jumbo v0, "22370"
+    const-string/jumbo v0, "22371"
+    const-string/jumbo v0, "22372"
+    const-string/jumbo v0, "22373"
+    const-string/jumbo v0, "22374"
+    const-string/jumbo v0, "22375"
+    const-string/jumbo v0, "22376"
+    const-string/jumbo v0, "22377"
+    const-string/jumbo v0, "22378"
+    const-string/jumbo v0, "22379"
+    const-string/jumbo v0, "22380"
+    const-string/jumbo v0, "22381"
+    const-string/jumbo v0, "22382"
+    const-string/jumbo v0, "22383"
+    const-string/jumbo v0, "22384"
+    const-string/jumbo v0, "22385"
+    const-string/jumbo v0, "22386"
+    const-string/jumbo v0, "22387"
+    const-string/jumbo v0, "22388"
+    const-string/jumbo v0, "22389"
+    const-string/jumbo v0, "22390"
+    const-string/jumbo v0, "22391"
+    const-string/jumbo v0, "22392"
+    const-string/jumbo v0, "22393"
+    const-string/jumbo v0, "22394"
+    const-string/jumbo v0, "22395"
+    const-string/jumbo v0, "22396"
+    const-string/jumbo v0, "22397"
+    const-string/jumbo v0, "22398"
+    const-string/jumbo v0, "22399"
+    const-string/jumbo v0, "22400"
+    const-string/jumbo v0, "22401"
+    const-string/jumbo v0, "22402"
+    const-string/jumbo v0, "22403"
+    const-string/jumbo v0, "22404"
+    const-string/jumbo v0, "22405"
+    const-string/jumbo v0, "22406"
+    const-string/jumbo v0, "22407"
+    const-string/jumbo v0, "22408"
+    const-string/jumbo v0, "22409"
+    const-string/jumbo v0, "22410"
+    const-string/jumbo v0, "22411"
+    const-string/jumbo v0, "22412"
+    const-string/jumbo v0, "22413"
+    const-string/jumbo v0, "22414"
+    const-string/jumbo v0, "22415"
+    const-string/jumbo v0, "22416"
+    const-string/jumbo v0, "22417"
+    const-string/jumbo v0, "22418"
+    const-string/jumbo v0, "22419"
+    const-string/jumbo v0, "22420"
+    const-string/jumbo v0, "22421"
+    const-string/jumbo v0, "22422"
+    const-string/jumbo v0, "22423"
+    const-string/jumbo v0, "22424"
+    const-string/jumbo v0, "22425"
+    const-string/jumbo v0, "22426"
+    const-string/jumbo v0, "22427"
+    const-string/jumbo v0, "22428"
+    const-string/jumbo v0, "22429"
+    const-string/jumbo v0, "22430"
+    const-string/jumbo v0, "22431"
+    const-string/jumbo v0, "22432"
+    const-string/jumbo v0, "22433"
+    const-string/jumbo v0, "22434"
+    const-string/jumbo v0, "22435"
+    const-string/jumbo v0, "22436"
+    const-string/jumbo v0, "22437"
+    const-string/jumbo v0, "22438"
+    const-string/jumbo v0, "22439"
+    const-string/jumbo v0, "22440"
+    const-string/jumbo v0, "22441"
+    const-string/jumbo v0, "22442"
+    const-string/jumbo v0, "22443"
+    const-string/jumbo v0, "22444"
+    const-string/jumbo v0, "22445"
+    const-string/jumbo v0, "22446"
+    const-string/jumbo v0, "22447"
+    const-string/jumbo v0, "22448"
+    const-string/jumbo v0, "22449"
+    const-string/jumbo v0, "22450"
+    const-string/jumbo v0, "22451"
+    const-string/jumbo v0, "22452"
+    const-string/jumbo v0, "22453"
+    const-string/jumbo v0, "22454"
+    const-string/jumbo v0, "22455"
+    const-string/jumbo v0, "22456"
+    const-string/jumbo v0, "22457"
+    const-string/jumbo v0, "22458"
+    const-string/jumbo v0, "22459"
+    const-string/jumbo v0, "22460"
+    const-string/jumbo v0, "22461"
+    const-string/jumbo v0, "22462"
+    const-string/jumbo v0, "22463"
+    const-string/jumbo v0, "22464"
+    const-string/jumbo v0, "22465"
+    const-string/jumbo v0, "22466"
+    const-string/jumbo v0, "22467"
+    const-string/jumbo v0, "22468"
+    const-string/jumbo v0, "22469"
+    const-string/jumbo v0, "22470"
+    const-string/jumbo v0, "22471"
+    const-string/jumbo v0, "22472"
+    const-string/jumbo v0, "22473"
+    const-string/jumbo v0, "22474"
+    const-string/jumbo v0, "22475"
+    const-string/jumbo v0, "22476"
+    const-string/jumbo v0, "22477"
+    const-string/jumbo v0, "22478"
+    const-string/jumbo v0, "22479"
+    const-string/jumbo v0, "22480"
+    const-string/jumbo v0, "22481"
+    const-string/jumbo v0, "22482"
+    const-string/jumbo v0, "22483"
+    const-string/jumbo v0, "22484"
+    const-string/jumbo v0, "22485"
+    const-string/jumbo v0, "22486"
+    const-string/jumbo v0, "22487"
+    const-string/jumbo v0, "22488"
+    const-string/jumbo v0, "22489"
+    const-string/jumbo v0, "22490"
+    const-string/jumbo v0, "22491"
+    const-string/jumbo v0, "22492"
+    const-string/jumbo v0, "22493"
+    const-string/jumbo v0, "22494"
+    const-string/jumbo v0, "22495"
+    const-string/jumbo v0, "22496"
+    const-string/jumbo v0, "22497"
+    const-string/jumbo v0, "22498"
+    const-string/jumbo v0, "22499"
+    const-string/jumbo v0, "22500"
+    const-string/jumbo v0, "22501"
+    const-string/jumbo v0, "22502"
+    const-string/jumbo v0, "22503"
+    const-string/jumbo v0, "22504"
+    const-string/jumbo v0, "22505"
+    const-string/jumbo v0, "22506"
+    const-string/jumbo v0, "22507"
+    const-string/jumbo v0, "22508"
+    const-string/jumbo v0, "22509"
+    const-string/jumbo v0, "22510"
+    const-string/jumbo v0, "22511"
+    const-string/jumbo v0, "22512"
+    const-string/jumbo v0, "22513"
+    const-string/jumbo v0, "22514"
+    const-string/jumbo v0, "22515"
+    const-string/jumbo v0, "22516"
+    const-string/jumbo v0, "22517"
+    const-string/jumbo v0, "22518"
+    const-string/jumbo v0, "22519"
+    const-string/jumbo v0, "22520"
+    const-string/jumbo v0, "22521"
+    const-string/jumbo v0, "22522"
+    const-string/jumbo v0, "22523"
+    const-string/jumbo v0, "22524"
+    const-string/jumbo v0, "22525"
+    const-string/jumbo v0, "22526"
+    const-string/jumbo v0, "22527"
+    const-string/jumbo v0, "22528"
+    const-string/jumbo v0, "22529"
+    const-string/jumbo v0, "22530"
+    const-string/jumbo v0, "22531"
+    const-string/jumbo v0, "22532"
+    const-string/jumbo v0, "22533"
+    const-string/jumbo v0, "22534"
+    const-string/jumbo v0, "22535"
+    const-string/jumbo v0, "22536"
+    const-string/jumbo v0, "22537"
+    const-string/jumbo v0, "22538"
+    const-string/jumbo v0, "22539"
+    const-string/jumbo v0, "22540"
+    const-string/jumbo v0, "22541"
+    const-string/jumbo v0, "22542"
+    const-string/jumbo v0, "22543"
+    const-string/jumbo v0, "22544"
+    const-string/jumbo v0, "22545"
+    const-string/jumbo v0, "22546"
+    const-string/jumbo v0, "22547"
+    const-string/jumbo v0, "22548"
+    const-string/jumbo v0, "22549"
+    const-string/jumbo v0, "22550"
+    const-string/jumbo v0, "22551"
+    const-string/jumbo v0, "22552"
+    const-string/jumbo v0, "22553"
+    const-string/jumbo v0, "22554"
+    const-string/jumbo v0, "22555"
+    const-string/jumbo v0, "22556"
+    const-string/jumbo v0, "22557"
+    const-string/jumbo v0, "22558"
+    const-string/jumbo v0, "22559"
+    const-string/jumbo v0, "22560"
+    const-string/jumbo v0, "22561"
+    const-string/jumbo v0, "22562"
+    const-string/jumbo v0, "22563"
+    const-string/jumbo v0, "22564"
+    const-string/jumbo v0, "22565"
+    const-string/jumbo v0, "22566"
+    const-string/jumbo v0, "22567"
+    const-string/jumbo v0, "22568"
+    const-string/jumbo v0, "22569"
+    const-string/jumbo v0, "22570"
+    const-string/jumbo v0, "22571"
+    const-string/jumbo v0, "22572"
+    const-string/jumbo v0, "22573"
+    const-string/jumbo v0, "22574"
+    const-string/jumbo v0, "22575"
+    const-string/jumbo v0, "22576"
+    const-string/jumbo v0, "22577"
+    const-string/jumbo v0, "22578"
+    const-string/jumbo v0, "22579"
+    const-string/jumbo v0, "22580"
+    const-string/jumbo v0, "22581"
+    const-string/jumbo v0, "22582"
+    const-string/jumbo v0, "22583"
+    const-string/jumbo v0, "22584"
+    const-string/jumbo v0, "22585"
+    const-string/jumbo v0, "22586"
+    const-string/jumbo v0, "22587"
+    const-string/jumbo v0, "22588"
+    const-string/jumbo v0, "22589"
+    const-string/jumbo v0, "22590"
+    const-string/jumbo v0, "22591"
+    const-string/jumbo v0, "22592"
+    const-string/jumbo v0, "22593"
+    const-string/jumbo v0, "22594"
+    const-string/jumbo v0, "22595"
+    const-string/jumbo v0, "22596"
+    const-string/jumbo v0, "22597"
+    const-string/jumbo v0, "22598"
+    const-string/jumbo v0, "22599"
+    const-string/jumbo v0, "22600"
+    const-string/jumbo v0, "22601"
+    const-string/jumbo v0, "22602"
+    const-string/jumbo v0, "22603"
+    const-string/jumbo v0, "22604"
+    const-string/jumbo v0, "22605"
+    const-string/jumbo v0, "22606"
+    const-string/jumbo v0, "22607"
+    const-string/jumbo v0, "22608"
+    const-string/jumbo v0, "22609"
+    const-string/jumbo v0, "22610"
+    const-string/jumbo v0, "22611"
+    const-string/jumbo v0, "22612"
+    const-string/jumbo v0, "22613"
+    const-string/jumbo v0, "22614"
+    const-string/jumbo v0, "22615"
+    const-string/jumbo v0, "22616"
+    const-string/jumbo v0, "22617"
+    const-string/jumbo v0, "22618"
+    const-string/jumbo v0, "22619"
+    const-string/jumbo v0, "22620"
+    const-string/jumbo v0, "22621"
+    const-string/jumbo v0, "22622"
+    const-string/jumbo v0, "22623"
+    const-string/jumbo v0, "22624"
+    const-string/jumbo v0, "22625"
+    const-string/jumbo v0, "22626"
+    const-string/jumbo v0, "22627"
+    const-string/jumbo v0, "22628"
+    const-string/jumbo v0, "22629"
+    const-string/jumbo v0, "22630"
+    const-string/jumbo v0, "22631"
+    const-string/jumbo v0, "22632"
+    const-string/jumbo v0, "22633"
+    const-string/jumbo v0, "22634"
+    const-string/jumbo v0, "22635"
+    const-string/jumbo v0, "22636"
+    const-string/jumbo v0, "22637"
+    const-string/jumbo v0, "22638"
+    const-string/jumbo v0, "22639"
+    const-string/jumbo v0, "22640"
+    const-string/jumbo v0, "22641"
+    const-string/jumbo v0, "22642"
+    const-string/jumbo v0, "22643"
+    const-string/jumbo v0, "22644"
+    const-string/jumbo v0, "22645"
+    const-string/jumbo v0, "22646"
+    const-string/jumbo v0, "22647"
+    const-string/jumbo v0, "22648"
+    const-string/jumbo v0, "22649"
+    const-string/jumbo v0, "22650"
+    const-string/jumbo v0, "22651"
+    const-string/jumbo v0, "22652"
+    const-string/jumbo v0, "22653"
+    const-string/jumbo v0, "22654"
+    const-string/jumbo v0, "22655"
+    const-string/jumbo v0, "22656"
+    const-string/jumbo v0, "22657"
+    const-string/jumbo v0, "22658"
+    const-string/jumbo v0, "22659"
+    const-string/jumbo v0, "22660"
+    const-string/jumbo v0, "22661"
+    const-string/jumbo v0, "22662"
+    const-string/jumbo v0, "22663"
+    const-string/jumbo v0, "22664"
+    const-string/jumbo v0, "22665"
+    const-string/jumbo v0, "22666"
+    const-string/jumbo v0, "22667"
+    const-string/jumbo v0, "22668"
+    const-string/jumbo v0, "22669"
+    const-string/jumbo v0, "22670"
+    const-string/jumbo v0, "22671"
+    const-string/jumbo v0, "22672"
+    const-string/jumbo v0, "22673"
+    const-string/jumbo v0, "22674"
+    const-string/jumbo v0, "22675"
+    const-string/jumbo v0, "22676"
+    const-string/jumbo v0, "22677"
+    const-string/jumbo v0, "22678"
+    const-string/jumbo v0, "22679"
+    const-string/jumbo v0, "22680"
+    const-string/jumbo v0, "22681"
+    const-string/jumbo v0, "22682"
+    const-string/jumbo v0, "22683"
+    const-string/jumbo v0, "22684"
+    const-string/jumbo v0, "22685"
+    const-string/jumbo v0, "22686"
+    const-string/jumbo v0, "22687"
+    const-string/jumbo v0, "22688"
+    const-string/jumbo v0, "22689"
+    const-string/jumbo v0, "22690"
+    const-string/jumbo v0, "22691"
+    const-string/jumbo v0, "22692"
+    const-string/jumbo v0, "22693"
+    const-string/jumbo v0, "22694"
+    const-string/jumbo v0, "22695"
+    const-string/jumbo v0, "22696"
+    const-string/jumbo v0, "22697"
+    const-string/jumbo v0, "22698"
+    const-string/jumbo v0, "22699"
+    const-string/jumbo v0, "22700"
+    const-string/jumbo v0, "22701"
+    const-string/jumbo v0, "22702"
+    const-string/jumbo v0, "22703"
+    const-string/jumbo v0, "22704"
+    const-string/jumbo v0, "22705"
+    const-string/jumbo v0, "22706"
+    const-string/jumbo v0, "22707"
+    const-string/jumbo v0, "22708"
+    const-string/jumbo v0, "22709"
+    const-string/jumbo v0, "22710"
+    const-string/jumbo v0, "22711"
+    const-string/jumbo v0, "22712"
+    const-string/jumbo v0, "22713"
+    const-string/jumbo v0, "22714"
+    const-string/jumbo v0, "22715"
+    const-string/jumbo v0, "22716"
+    const-string/jumbo v0, "22717"
+    const-string/jumbo v0, "22718"
+    const-string/jumbo v0, "22719"
+    const-string/jumbo v0, "22720"
+    const-string/jumbo v0, "22721"
+    const-string/jumbo v0, "22722"
+    const-string/jumbo v0, "22723"
+    const-string/jumbo v0, "22724"
+    const-string/jumbo v0, "22725"
+    const-string/jumbo v0, "22726"
+    const-string/jumbo v0, "22727"
+    const-string/jumbo v0, "22728"
+    const-string/jumbo v0, "22729"
+    const-string/jumbo v0, "22730"
+    const-string/jumbo v0, "22731"
+    const-string/jumbo v0, "22732"
+    const-string/jumbo v0, "22733"
+    const-string/jumbo v0, "22734"
+    const-string/jumbo v0, "22735"
+    const-string/jumbo v0, "22736"
+    const-string/jumbo v0, "22737"
+    const-string/jumbo v0, "22738"
+    const-string/jumbo v0, "22739"
+    const-string/jumbo v0, "22740"
+    const-string/jumbo v0, "22741"
+    const-string/jumbo v0, "22742"
+    const-string/jumbo v0, "22743"
+    const-string/jumbo v0, "22744"
+    const-string/jumbo v0, "22745"
+    const-string/jumbo v0, "22746"
+    const-string/jumbo v0, "22747"
+    const-string/jumbo v0, "22748"
+    const-string/jumbo v0, "22749"
+    const-string/jumbo v0, "22750"
+    const-string/jumbo v0, "22751"
+    const-string/jumbo v0, "22752"
+    const-string/jumbo v0, "22753"
+    const-string/jumbo v0, "22754"
+    const-string/jumbo v0, "22755"
+    const-string/jumbo v0, "22756"
+    const-string/jumbo v0, "22757"
+    const-string/jumbo v0, "22758"
+    const-string/jumbo v0, "22759"
+    const-string/jumbo v0, "22760"
+    const-string/jumbo v0, "22761"
+    const-string/jumbo v0, "22762"
+    const-string/jumbo v0, "22763"
+    const-string/jumbo v0, "22764"
+    const-string/jumbo v0, "22765"
+    const-string/jumbo v0, "22766"
+    const-string/jumbo v0, "22767"
+    const-string/jumbo v0, "22768"
+    const-string/jumbo v0, "22769"
+    const-string/jumbo v0, "22770"
+    const-string/jumbo v0, "22771"
+    const-string/jumbo v0, "22772"
+    const-string/jumbo v0, "22773"
+    const-string/jumbo v0, "22774"
+    const-string/jumbo v0, "22775"
+    const-string/jumbo v0, "22776"
+    const-string/jumbo v0, "22777"
+    const-string/jumbo v0, "22778"
+    const-string/jumbo v0, "22779"
+    const-string/jumbo v0, "22780"
+    const-string/jumbo v0, "22781"
+    const-string/jumbo v0, "22782"
+    const-string/jumbo v0, "22783"
+    const-string/jumbo v0, "22784"
+    const-string/jumbo v0, "22785"
+    const-string/jumbo v0, "22786"
+    const-string/jumbo v0, "22787"
+    const-string/jumbo v0, "22788"
+    const-string/jumbo v0, "22789"
+    const-string/jumbo v0, "22790"
+    const-string/jumbo v0, "22791"
+    const-string/jumbo v0, "22792"
+    const-string/jumbo v0, "22793"
+    const-string/jumbo v0, "22794"
+    const-string/jumbo v0, "22795"
+    const-string/jumbo v0, "22796"
+    const-string/jumbo v0, "22797"
+    const-string/jumbo v0, "22798"
+    const-string/jumbo v0, "22799"
+    const-string/jumbo v0, "22800"
+    const-string/jumbo v0, "22801"
+    const-string/jumbo v0, "22802"
+    const-string/jumbo v0, "22803"
+    const-string/jumbo v0, "22804"
+    const-string/jumbo v0, "22805"
+    const-string/jumbo v0, "22806"
+    const-string/jumbo v0, "22807"
+    const-string/jumbo v0, "22808"
+    const-string/jumbo v0, "22809"
+    const-string/jumbo v0, "22810"
+    const-string/jumbo v0, "22811"
+    const-string/jumbo v0, "22812"
+    const-string/jumbo v0, "22813"
+    const-string/jumbo v0, "22814"
+    const-string/jumbo v0, "22815"
+    const-string/jumbo v0, "22816"
+    const-string/jumbo v0, "22817"
+    const-string/jumbo v0, "22818"
+    const-string/jumbo v0, "22819"
+    const-string/jumbo v0, "22820"
+    const-string/jumbo v0, "22821"
+    const-string/jumbo v0, "22822"
+    const-string/jumbo v0, "22823"
+    const-string/jumbo v0, "22824"
+    const-string/jumbo v0, "22825"
+    const-string/jumbo v0, "22826"
+    const-string/jumbo v0, "22827"
+    const-string/jumbo v0, "22828"
+    const-string/jumbo v0, "22829"
+    const-string/jumbo v0, "22830"
+    const-string/jumbo v0, "22831"
+    const-string/jumbo v0, "22832"
+    const-string/jumbo v0, "22833"
+    const-string/jumbo v0, "22834"
+    const-string/jumbo v0, "22835"
+    const-string/jumbo v0, "22836"
+    const-string/jumbo v0, "22837"
+    const-string/jumbo v0, "22838"
+    const-string/jumbo v0, "22839"
+    const-string/jumbo v0, "22840"
+    const-string/jumbo v0, "22841"
+    const-string/jumbo v0, "22842"
+    const-string/jumbo v0, "22843"
+    const-string/jumbo v0, "22844"
+    const-string/jumbo v0, "22845"
+    const-string/jumbo v0, "22846"
+    const-string/jumbo v0, "22847"
+    const-string/jumbo v0, "22848"
+    const-string/jumbo v0, "22849"
+    const-string/jumbo v0, "22850"
+    const-string/jumbo v0, "22851"
+    const-string/jumbo v0, "22852"
+    const-string/jumbo v0, "22853"
+    const-string/jumbo v0, "22854"
+    const-string/jumbo v0, "22855"
+    const-string/jumbo v0, "22856"
+    const-string/jumbo v0, "22857"
+    const-string/jumbo v0, "22858"
+    const-string/jumbo v0, "22859"
+    const-string/jumbo v0, "22860"
+    const-string/jumbo v0, "22861"
+    const-string/jumbo v0, "22862"
+    const-string/jumbo v0, "22863"
+    const-string/jumbo v0, "22864"
+    const-string/jumbo v0, "22865"
+    const-string/jumbo v0, "22866"
+    const-string/jumbo v0, "22867"
+    const-string/jumbo v0, "22868"
+    const-string/jumbo v0, "22869"
+    const-string/jumbo v0, "22870"
+    const-string/jumbo v0, "22871"
+    const-string/jumbo v0, "22872"
+    const-string/jumbo v0, "22873"
+    const-string/jumbo v0, "22874"
+    const-string/jumbo v0, "22875"
+    const-string/jumbo v0, "22876"
+    const-string/jumbo v0, "22877"
+    const-string/jumbo v0, "22878"
+    const-string/jumbo v0, "22879"
+    const-string/jumbo v0, "22880"
+    const-string/jumbo v0, "22881"
+    const-string/jumbo v0, "22882"
+    const-string/jumbo v0, "22883"
+    const-string/jumbo v0, "22884"
+    const-string/jumbo v0, "22885"
+    const-string/jumbo v0, "22886"
+    const-string/jumbo v0, "22887"
+    const-string/jumbo v0, "22888"
+    const-string/jumbo v0, "22889"
+    const-string/jumbo v0, "22890"
+    const-string/jumbo v0, "22891"
+    const-string/jumbo v0, "22892"
+    const-string/jumbo v0, "22893"
+    const-string/jumbo v0, "22894"
+    const-string/jumbo v0, "22895"
+    const-string/jumbo v0, "22896"
+    const-string/jumbo v0, "22897"
+    const-string/jumbo v0, "22898"
+    const-string/jumbo v0, "22899"
+    const-string/jumbo v0, "22900"
+    const-string/jumbo v0, "22901"
+    const-string/jumbo v0, "22902"
+    const-string/jumbo v0, "22903"
+    const-string/jumbo v0, "22904"
+    const-string/jumbo v0, "22905"
+    const-string/jumbo v0, "22906"
+    const-string/jumbo v0, "22907"
+    const-string/jumbo v0, "22908"
+    const-string/jumbo v0, "22909"
+    const-string/jumbo v0, "22910"
+    const-string/jumbo v0, "22911"
+    const-string/jumbo v0, "22912"
+    const-string/jumbo v0, "22913"
+    const-string/jumbo v0, "22914"
+    const-string/jumbo v0, "22915"
+    const-string/jumbo v0, "22916"
+    const-string/jumbo v0, "22917"
+    const-string/jumbo v0, "22918"
+    const-string/jumbo v0, "22919"
+    const-string/jumbo v0, "22920"
+    const-string/jumbo v0, "22921"
+    const-string/jumbo v0, "22922"
+    const-string/jumbo v0, "22923"
+    const-string/jumbo v0, "22924"
+    const-string/jumbo v0, "22925"
+    const-string/jumbo v0, "22926"
+    const-string/jumbo v0, "22927"
+    const-string/jumbo v0, "22928"
+    const-string/jumbo v0, "22929"
+    const-string/jumbo v0, "22930"
+    const-string/jumbo v0, "22931"
+    const-string/jumbo v0, "22932"
+    const-string/jumbo v0, "22933"
+    const-string/jumbo v0, "22934"
+    const-string/jumbo v0, "22935"
+    const-string/jumbo v0, "22936"
+    const-string/jumbo v0, "22937"
+    const-string/jumbo v0, "22938"
+    const-string/jumbo v0, "22939"
+    const-string/jumbo v0, "22940"
+    const-string/jumbo v0, "22941"
+    const-string/jumbo v0, "22942"
+    const-string/jumbo v0, "22943"
+    const-string/jumbo v0, "22944"
+    const-string/jumbo v0, "22945"
+    const-string/jumbo v0, "22946"
+    const-string/jumbo v0, "22947"
+    const-string/jumbo v0, "22948"
+    const-string/jumbo v0, "22949"
+    const-string/jumbo v0, "22950"
+    const-string/jumbo v0, "22951"
+    const-string/jumbo v0, "22952"
+    const-string/jumbo v0, "22953"
+    const-string/jumbo v0, "22954"
+    const-string/jumbo v0, "22955"
+    const-string/jumbo v0, "22956"
+    const-string/jumbo v0, "22957"
+    const-string/jumbo v0, "22958"
+    const-string/jumbo v0, "22959"
+    const-string/jumbo v0, "22960"
+    const-string/jumbo v0, "22961"
+    const-string/jumbo v0, "22962"
+    const-string/jumbo v0, "22963"
+    const-string/jumbo v0, "22964"
+    const-string/jumbo v0, "22965"
+    const-string/jumbo v0, "22966"
+    const-string/jumbo v0, "22967"
+    const-string/jumbo v0, "22968"
+    const-string/jumbo v0, "22969"
+    const-string/jumbo v0, "22970"
+    const-string/jumbo v0, "22971"
+    const-string/jumbo v0, "22972"
+    const-string/jumbo v0, "22973"
+    const-string/jumbo v0, "22974"
+    const-string/jumbo v0, "22975"
+    const-string/jumbo v0, "22976"
+    const-string/jumbo v0, "22977"
+    const-string/jumbo v0, "22978"
+    const-string/jumbo v0, "22979"
+    const-string/jumbo v0, "22980"
+    const-string/jumbo v0, "22981"
+    const-string/jumbo v0, "22982"
+    const-string/jumbo v0, "22983"
+    const-string/jumbo v0, "22984"
+    const-string/jumbo v0, "22985"
+    const-string/jumbo v0, "22986"
+    const-string/jumbo v0, "22987"
+    const-string/jumbo v0, "22988"
+    const-string/jumbo v0, "22989"
+    const-string/jumbo v0, "22990"
+    const-string/jumbo v0, "22991"
+    const-string/jumbo v0, "22992"
+    const-string/jumbo v0, "22993"
+    const-string/jumbo v0, "22994"
+    const-string/jumbo v0, "22995"
+    const-string/jumbo v0, "22996"
+    const-string/jumbo v0, "22997"
+    const-string/jumbo v0, "22998"
+    const-string/jumbo v0, "22999"
+    const-string/jumbo v0, "23000"
+    const-string/jumbo v0, "23001"
+    const-string/jumbo v0, "23002"
+    const-string/jumbo v0, "23003"
+    const-string/jumbo v0, "23004"
+    const-string/jumbo v0, "23005"
+    const-string/jumbo v0, "23006"
+    const-string/jumbo v0, "23007"
+    const-string/jumbo v0, "23008"
+    const-string/jumbo v0, "23009"
+    const-string/jumbo v0, "23010"
+    const-string/jumbo v0, "23011"
+    const-string/jumbo v0, "23012"
+    const-string/jumbo v0, "23013"
+    const-string/jumbo v0, "23014"
+    const-string/jumbo v0, "23015"
+    const-string/jumbo v0, "23016"
+    const-string/jumbo v0, "23017"
+    const-string/jumbo v0, "23018"
+    const-string/jumbo v0, "23019"
+    const-string/jumbo v0, "23020"
+    const-string/jumbo v0, "23021"
+    const-string/jumbo v0, "23022"
+    const-string/jumbo v0, "23023"
+    const-string/jumbo v0, "23024"
+    const-string/jumbo v0, "23025"
+    const-string/jumbo v0, "23026"
+    const-string/jumbo v0, "23027"
+    const-string/jumbo v0, "23028"
+    const-string/jumbo v0, "23029"
+    const-string/jumbo v0, "23030"
+    const-string/jumbo v0, "23031"
+    const-string/jumbo v0, "23032"
+    const-string/jumbo v0, "23033"
+    const-string/jumbo v0, "23034"
+    const-string/jumbo v0, "23035"
+    const-string/jumbo v0, "23036"
+    const-string/jumbo v0, "23037"
+    const-string/jumbo v0, "23038"
+    const-string/jumbo v0, "23039"
+    const-string/jumbo v0, "23040"
+    const-string/jumbo v0, "23041"
+    const-string/jumbo v0, "23042"
+    const-string/jumbo v0, "23043"
+    const-string/jumbo v0, "23044"
+    const-string/jumbo v0, "23045"
+    const-string/jumbo v0, "23046"
+    const-string/jumbo v0, "23047"
+    const-string/jumbo v0, "23048"
+    const-string/jumbo v0, "23049"
+    const-string/jumbo v0, "23050"
+    const-string/jumbo v0, "23051"
+    const-string/jumbo v0, "23052"
+    const-string/jumbo v0, "23053"
+    const-string/jumbo v0, "23054"
+    const-string/jumbo v0, "23055"
+    const-string/jumbo v0, "23056"
+    const-string/jumbo v0, "23057"
+    const-string/jumbo v0, "23058"
+    const-string/jumbo v0, "23059"
+    const-string/jumbo v0, "23060"
+    const-string/jumbo v0, "23061"
+    const-string/jumbo v0, "23062"
+    const-string/jumbo v0, "23063"
+    const-string/jumbo v0, "23064"
+    const-string/jumbo v0, "23065"
+    const-string/jumbo v0, "23066"
+    const-string/jumbo v0, "23067"
+    const-string/jumbo v0, "23068"
+    const-string/jumbo v0, "23069"
+    const-string/jumbo v0, "23070"
+    const-string/jumbo v0, "23071"
+    const-string/jumbo v0, "23072"
+    const-string/jumbo v0, "23073"
+    const-string/jumbo v0, "23074"
+    const-string/jumbo v0, "23075"
+    const-string/jumbo v0, "23076"
+    const-string/jumbo v0, "23077"
+    const-string/jumbo v0, "23078"
+    const-string/jumbo v0, "23079"
+    const-string/jumbo v0, "23080"
+    const-string/jumbo v0, "23081"
+    const-string/jumbo v0, "23082"
+    const-string/jumbo v0, "23083"
+    const-string/jumbo v0, "23084"
+    const-string/jumbo v0, "23085"
+    const-string/jumbo v0, "23086"
+    const-string/jumbo v0, "23087"
+    const-string/jumbo v0, "23088"
+    const-string/jumbo v0, "23089"
+    const-string/jumbo v0, "23090"
+    const-string/jumbo v0, "23091"
+    const-string/jumbo v0, "23092"
+    const-string/jumbo v0, "23093"
+    const-string/jumbo v0, "23094"
+    const-string/jumbo v0, "23095"
+    const-string/jumbo v0, "23096"
+    const-string/jumbo v0, "23097"
+    const-string/jumbo v0, "23098"
+    const-string/jumbo v0, "23099"
+    const-string/jumbo v0, "23100"
+    const-string/jumbo v0, "23101"
+    const-string/jumbo v0, "23102"
+    const-string/jumbo v0, "23103"
+    const-string/jumbo v0, "23104"
+    const-string/jumbo v0, "23105"
+    const-string/jumbo v0, "23106"
+    const-string/jumbo v0, "23107"
+    const-string/jumbo v0, "23108"
+    const-string/jumbo v0, "23109"
+    const-string/jumbo v0, "23110"
+    const-string/jumbo v0, "23111"
+    const-string/jumbo v0, "23112"
+    const-string/jumbo v0, "23113"
+    const-string/jumbo v0, "23114"
+    const-string/jumbo v0, "23115"
+    const-string/jumbo v0, "23116"
+    const-string/jumbo v0, "23117"
+    const-string/jumbo v0, "23118"
+    const-string/jumbo v0, "23119"
+    const-string/jumbo v0, "23120"
+    const-string/jumbo v0, "23121"
+    const-string/jumbo v0, "23122"
+    const-string/jumbo v0, "23123"
+    const-string/jumbo v0, "23124"
+    const-string/jumbo v0, "23125"
+    const-string/jumbo v0, "23126"
+    const-string/jumbo v0, "23127"
+    const-string/jumbo v0, "23128"
+    const-string/jumbo v0, "23129"
+    const-string/jumbo v0, "23130"
+    const-string/jumbo v0, "23131"
+    const-string/jumbo v0, "23132"
+    const-string/jumbo v0, "23133"
+    const-string/jumbo v0, "23134"
+    const-string/jumbo v0, "23135"
+    const-string/jumbo v0, "23136"
+    const-string/jumbo v0, "23137"
+    const-string/jumbo v0, "23138"
+    const-string/jumbo v0, "23139"
+    const-string/jumbo v0, "23140"
+    const-string/jumbo v0, "23141"
+    const-string/jumbo v0, "23142"
+    const-string/jumbo v0, "23143"
+    const-string/jumbo v0, "23144"
+    const-string/jumbo v0, "23145"
+    const-string/jumbo v0, "23146"
+    const-string/jumbo v0, "23147"
+    const-string/jumbo v0, "23148"
+    const-string/jumbo v0, "23149"
+    const-string/jumbo v0, "23150"
+    const-string/jumbo v0, "23151"
+    const-string/jumbo v0, "23152"
+    const-string/jumbo v0, "23153"
+    const-string/jumbo v0, "23154"
+    const-string/jumbo v0, "23155"
+    const-string/jumbo v0, "23156"
+    const-string/jumbo v0, "23157"
+    const-string/jumbo v0, "23158"
+    const-string/jumbo v0, "23159"
+    const-string/jumbo v0, "23160"
+    const-string/jumbo v0, "23161"
+    const-string/jumbo v0, "23162"
+    const-string/jumbo v0, "23163"
+    const-string/jumbo v0, "23164"
+    const-string/jumbo v0, "23165"
+    const-string/jumbo v0, "23166"
+    const-string/jumbo v0, "23167"
+    const-string/jumbo v0, "23168"
+    const-string/jumbo v0, "23169"
+    const-string/jumbo v0, "23170"
+    const-string/jumbo v0, "23171"
+    const-string/jumbo v0, "23172"
+    const-string/jumbo v0, "23173"
+    const-string/jumbo v0, "23174"
+    const-string/jumbo v0, "23175"
+    const-string/jumbo v0, "23176"
+    const-string/jumbo v0, "23177"
+    const-string/jumbo v0, "23178"
+    const-string/jumbo v0, "23179"
+    const-string/jumbo v0, "23180"
+    const-string/jumbo v0, "23181"
+    const-string/jumbo v0, "23182"
+    const-string/jumbo v0, "23183"
+    const-string/jumbo v0, "23184"
+    const-string/jumbo v0, "23185"
+    const-string/jumbo v0, "23186"
+    const-string/jumbo v0, "23187"
+    const-string/jumbo v0, "23188"
+    const-string/jumbo v0, "23189"
+    const-string/jumbo v0, "23190"
+    const-string/jumbo v0, "23191"
+    const-string/jumbo v0, "23192"
+    const-string/jumbo v0, "23193"
+    const-string/jumbo v0, "23194"
+    const-string/jumbo v0, "23195"
+    const-string/jumbo v0, "23196"
+    const-string/jumbo v0, "23197"
+    const-string/jumbo v0, "23198"
+    const-string/jumbo v0, "23199"
+    const-string/jumbo v0, "23200"
+    const-string/jumbo v0, "23201"
+    const-string/jumbo v0, "23202"
+    const-string/jumbo v0, "23203"
+    const-string/jumbo v0, "23204"
+    const-string/jumbo v0, "23205"
+    const-string/jumbo v0, "23206"
+    const-string/jumbo v0, "23207"
+    const-string/jumbo v0, "23208"
+    const-string/jumbo v0, "23209"
+    const-string/jumbo v0, "23210"
+    const-string/jumbo v0, "23211"
+    const-string/jumbo v0, "23212"
+    const-string/jumbo v0, "23213"
+    const-string/jumbo v0, "23214"
+    const-string/jumbo v0, "23215"
+    const-string/jumbo v0, "23216"
+    const-string/jumbo v0, "23217"
+    const-string/jumbo v0, "23218"
+    const-string/jumbo v0, "23219"
+    const-string/jumbo v0, "23220"
+    const-string/jumbo v0, "23221"
+    const-string/jumbo v0, "23222"
+    const-string/jumbo v0, "23223"
+    const-string/jumbo v0, "23224"
+    const-string/jumbo v0, "23225"
+    const-string/jumbo v0, "23226"
+    const-string/jumbo v0, "23227"
+    const-string/jumbo v0, "23228"
+    const-string/jumbo v0, "23229"
+    const-string/jumbo v0, "23230"
+    const-string/jumbo v0, "23231"
+    const-string/jumbo v0, "23232"
+    const-string/jumbo v0, "23233"
+    const-string/jumbo v0, "23234"
+    const-string/jumbo v0, "23235"
+    const-string/jumbo v0, "23236"
+    const-string/jumbo v0, "23237"
+    const-string/jumbo v0, "23238"
+    const-string/jumbo v0, "23239"
+    const-string/jumbo v0, "23240"
+    const-string/jumbo v0, "23241"
+    const-string/jumbo v0, "23242"
+    const-string/jumbo v0, "23243"
+    const-string/jumbo v0, "23244"
+    const-string/jumbo v0, "23245"
+    const-string/jumbo v0, "23246"
+    const-string/jumbo v0, "23247"
+    const-string/jumbo v0, "23248"
+    const-string/jumbo v0, "23249"
+    const-string/jumbo v0, "23250"
+    const-string/jumbo v0, "23251"
+    const-string/jumbo v0, "23252"
+    const-string/jumbo v0, "23253"
+    const-string/jumbo v0, "23254"
+    const-string/jumbo v0, "23255"
+    const-string/jumbo v0, "23256"
+    const-string/jumbo v0, "23257"
+    const-string/jumbo v0, "23258"
+    const-string/jumbo v0, "23259"
+    const-string/jumbo v0, "23260"
+    const-string/jumbo v0, "23261"
+    const-string/jumbo v0, "23262"
+    const-string/jumbo v0, "23263"
+    const-string/jumbo v0, "23264"
+    const-string/jumbo v0, "23265"
+    const-string/jumbo v0, "23266"
+    const-string/jumbo v0, "23267"
+    const-string/jumbo v0, "23268"
+    const-string/jumbo v0, "23269"
+    const-string/jumbo v0, "23270"
+    const-string/jumbo v0, "23271"
+    const-string/jumbo v0, "23272"
+    const-string/jumbo v0, "23273"
+    const-string/jumbo v0, "23274"
+    const-string/jumbo v0, "23275"
+    const-string/jumbo v0, "23276"
+    const-string/jumbo v0, "23277"
+    const-string/jumbo v0, "23278"
+    const-string/jumbo v0, "23279"
+    const-string/jumbo v0, "23280"
+    const-string/jumbo v0, "23281"
+    const-string/jumbo v0, "23282"
+    const-string/jumbo v0, "23283"
+    const-string/jumbo v0, "23284"
+    const-string/jumbo v0, "23285"
+    const-string/jumbo v0, "23286"
+    const-string/jumbo v0, "23287"
+    const-string/jumbo v0, "23288"
+    const-string/jumbo v0, "23289"
+    const-string/jumbo v0, "23290"
+    const-string/jumbo v0, "23291"
+    const-string/jumbo v0, "23292"
+    const-string/jumbo v0, "23293"
+    const-string/jumbo v0, "23294"
+    const-string/jumbo v0, "23295"
+    const-string/jumbo v0, "23296"
+    const-string/jumbo v0, "23297"
+    const-string/jumbo v0, "23298"
+    const-string/jumbo v0, "23299"
+    const-string/jumbo v0, "23300"
+    const-string/jumbo v0, "23301"
+    const-string/jumbo v0, "23302"
+    const-string/jumbo v0, "23303"
+    const-string/jumbo v0, "23304"
+    const-string/jumbo v0, "23305"
+    const-string/jumbo v0, "23306"
+    const-string/jumbo v0, "23307"
+    const-string/jumbo v0, "23308"
+    const-string/jumbo v0, "23309"
+    const-string/jumbo v0, "23310"
+    const-string/jumbo v0, "23311"
+    const-string/jumbo v0, "23312"
+    const-string/jumbo v0, "23313"
+    const-string/jumbo v0, "23314"
+    const-string/jumbo v0, "23315"
+    const-string/jumbo v0, "23316"
+    const-string/jumbo v0, "23317"
+    const-string/jumbo v0, "23318"
+    const-string/jumbo v0, "23319"
+    const-string/jumbo v0, "23320"
+    const-string/jumbo v0, "23321"
+    const-string/jumbo v0, "23322"
+    const-string/jumbo v0, "23323"
+    const-string/jumbo v0, "23324"
+    const-string/jumbo v0, "23325"
+    const-string/jumbo v0, "23326"
+    const-string/jumbo v0, "23327"
+    const-string/jumbo v0, "23328"
+    const-string/jumbo v0, "23329"
+    const-string/jumbo v0, "23330"
+    const-string/jumbo v0, "23331"
+    const-string/jumbo v0, "23332"
+    const-string/jumbo v0, "23333"
+    const-string/jumbo v0, "23334"
+    const-string/jumbo v0, "23335"
+    const-string/jumbo v0, "23336"
+    const-string/jumbo v0, "23337"
+    const-string/jumbo v0, "23338"
+    const-string/jumbo v0, "23339"
+    const-string/jumbo v0, "23340"
+    const-string/jumbo v0, "23341"
+    const-string/jumbo v0, "23342"
+    const-string/jumbo v0, "23343"
+    const-string/jumbo v0, "23344"
+    const-string/jumbo v0, "23345"
+    const-string/jumbo v0, "23346"
+    const-string/jumbo v0, "23347"
+    const-string/jumbo v0, "23348"
+    const-string/jumbo v0, "23349"
+    const-string/jumbo v0, "23350"
+    const-string/jumbo v0, "23351"
+    const-string/jumbo v0, "23352"
+    const-string/jumbo v0, "23353"
+    const-string/jumbo v0, "23354"
+    const-string/jumbo v0, "23355"
+    const-string/jumbo v0, "23356"
+    const-string/jumbo v0, "23357"
+    const-string/jumbo v0, "23358"
+    const-string/jumbo v0, "23359"
+    const-string/jumbo v0, "23360"
+    const-string/jumbo v0, "23361"
+    const-string/jumbo v0, "23362"
+    const-string/jumbo v0, "23363"
+    const-string/jumbo v0, "23364"
+    const-string/jumbo v0, "23365"
+    const-string/jumbo v0, "23366"
+    const-string/jumbo v0, "23367"
+    const-string/jumbo v0, "23368"
+    const-string/jumbo v0, "23369"
+    const-string/jumbo v0, "23370"
+    const-string/jumbo v0, "23371"
+    const-string/jumbo v0, "23372"
+    const-string/jumbo v0, "23373"
+    const-string/jumbo v0, "23374"
+    const-string/jumbo v0, "23375"
+    const-string/jumbo v0, "23376"
+    const-string/jumbo v0, "23377"
+    const-string/jumbo v0, "23378"
+    const-string/jumbo v0, "23379"
+    const-string/jumbo v0, "23380"
+    const-string/jumbo v0, "23381"
+    const-string/jumbo v0, "23382"
+    const-string/jumbo v0, "23383"
+    const-string/jumbo v0, "23384"
+    const-string/jumbo v0, "23385"
+    const-string/jumbo v0, "23386"
+    const-string/jumbo v0, "23387"
+    const-string/jumbo v0, "23388"
+    const-string/jumbo v0, "23389"
+    const-string/jumbo v0, "23390"
+    const-string/jumbo v0, "23391"
+    const-string/jumbo v0, "23392"
+    const-string/jumbo v0, "23393"
+    const-string/jumbo v0, "23394"
+    const-string/jumbo v0, "23395"
+    const-string/jumbo v0, "23396"
+    const-string/jumbo v0, "23397"
+    const-string/jumbo v0, "23398"
+    const-string/jumbo v0, "23399"
+    const-string/jumbo v0, "23400"
+    const-string/jumbo v0, "23401"
+    const-string/jumbo v0, "23402"
+    const-string/jumbo v0, "23403"
+    const-string/jumbo v0, "23404"
+    const-string/jumbo v0, "23405"
+    const-string/jumbo v0, "23406"
+    const-string/jumbo v0, "23407"
+    const-string/jumbo v0, "23408"
+    const-string/jumbo v0, "23409"
+    const-string/jumbo v0, "23410"
+    const-string/jumbo v0, "23411"
+    const-string/jumbo v0, "23412"
+    const-string/jumbo v0, "23413"
+    const-string/jumbo v0, "23414"
+    const-string/jumbo v0, "23415"
+    const-string/jumbo v0, "23416"
+    const-string/jumbo v0, "23417"
+    const-string/jumbo v0, "23418"
+    const-string/jumbo v0, "23419"
+    const-string/jumbo v0, "23420"
+    const-string/jumbo v0, "23421"
+    const-string/jumbo v0, "23422"
+    const-string/jumbo v0, "23423"
+    const-string/jumbo v0, "23424"
+    const-string/jumbo v0, "23425"
+    const-string/jumbo v0, "23426"
+    const-string/jumbo v0, "23427"
+    const-string/jumbo v0, "23428"
+    const-string/jumbo v0, "23429"
+    const-string/jumbo v0, "23430"
+    const-string/jumbo v0, "23431"
+    const-string/jumbo v0, "23432"
+    const-string/jumbo v0, "23433"
+    const-string/jumbo v0, "23434"
+    const-string/jumbo v0, "23435"
+    const-string/jumbo v0, "23436"
+    const-string/jumbo v0, "23437"
+    const-string/jumbo v0, "23438"
+    const-string/jumbo v0, "23439"
+    const-string/jumbo v0, "23440"
+    const-string/jumbo v0, "23441"
+    const-string/jumbo v0, "23442"
+    const-string/jumbo v0, "23443"
+    const-string/jumbo v0, "23444"
+    const-string/jumbo v0, "23445"
+    const-string/jumbo v0, "23446"
+    const-string/jumbo v0, "23447"
+    const-string/jumbo v0, "23448"
+    const-string/jumbo v0, "23449"
+    const-string/jumbo v0, "23450"
+    const-string/jumbo v0, "23451"
+    const-string/jumbo v0, "23452"
+    const-string/jumbo v0, "23453"
+    const-string/jumbo v0, "23454"
+    const-string/jumbo v0, "23455"
+    const-string/jumbo v0, "23456"
+    const-string/jumbo v0, "23457"
+    const-string/jumbo v0, "23458"
+    const-string/jumbo v0, "23459"
+    const-string/jumbo v0, "23460"
+    const-string/jumbo v0, "23461"
+    const-string/jumbo v0, "23462"
+    const-string/jumbo v0, "23463"
+    const-string/jumbo v0, "23464"
+    const-string/jumbo v0, "23465"
+    const-string/jumbo v0, "23466"
+    const-string/jumbo v0, "23467"
+    const-string/jumbo v0, "23468"
+    const-string/jumbo v0, "23469"
+    const-string/jumbo v0, "23470"
+    const-string/jumbo v0, "23471"
+    const-string/jumbo v0, "23472"
+    const-string/jumbo v0, "23473"
+    const-string/jumbo v0, "23474"
+    const-string/jumbo v0, "23475"
+    const-string/jumbo v0, "23476"
+    const-string/jumbo v0, "23477"
+    const-string/jumbo v0, "23478"
+    const-string/jumbo v0, "23479"
+    const-string/jumbo v0, "23480"
+    const-string/jumbo v0, "23481"
+    const-string/jumbo v0, "23482"
+    const-string/jumbo v0, "23483"
+    const-string/jumbo v0, "23484"
+    const-string/jumbo v0, "23485"
+    const-string/jumbo v0, "23486"
+    const-string/jumbo v0, "23487"
+    const-string/jumbo v0, "23488"
+    const-string/jumbo v0, "23489"
+    const-string/jumbo v0, "23490"
+    const-string/jumbo v0, "23491"
+    const-string/jumbo v0, "23492"
+    const-string/jumbo v0, "23493"
+    const-string/jumbo v0, "23494"
+    const-string/jumbo v0, "23495"
+    const-string/jumbo v0, "23496"
+    const-string/jumbo v0, "23497"
+    const-string/jumbo v0, "23498"
+    const-string/jumbo v0, "23499"
+    const-string/jumbo v0, "23500"
+    const-string/jumbo v0, "23501"
+    const-string/jumbo v0, "23502"
+    const-string/jumbo v0, "23503"
+    const-string/jumbo v0, "23504"
+    const-string/jumbo v0, "23505"
+    const-string/jumbo v0, "23506"
+    const-string/jumbo v0, "23507"
+    const-string/jumbo v0, "23508"
+    const-string/jumbo v0, "23509"
+    const-string/jumbo v0, "23510"
+    const-string/jumbo v0, "23511"
+    const-string/jumbo v0, "23512"
+    const-string/jumbo v0, "23513"
+    const-string/jumbo v0, "23514"
+    const-string/jumbo v0, "23515"
+    const-string/jumbo v0, "23516"
+    const-string/jumbo v0, "23517"
+    const-string/jumbo v0, "23518"
+    const-string/jumbo v0, "23519"
+    const-string/jumbo v0, "23520"
+    const-string/jumbo v0, "23521"
+    const-string/jumbo v0, "23522"
+    const-string/jumbo v0, "23523"
+    const-string/jumbo v0, "23524"
+    const-string/jumbo v0, "23525"
+    const-string/jumbo v0, "23526"
+    const-string/jumbo v0, "23527"
+    const-string/jumbo v0, "23528"
+    const-string/jumbo v0, "23529"
+    const-string/jumbo v0, "23530"
+    const-string/jumbo v0, "23531"
+    const-string/jumbo v0, "23532"
+    const-string/jumbo v0, "23533"
+    const-string/jumbo v0, "23534"
+    const-string/jumbo v0, "23535"
+    const-string/jumbo v0, "23536"
+    const-string/jumbo v0, "23537"
+    const-string/jumbo v0, "23538"
+    const-string/jumbo v0, "23539"
+    const-string/jumbo v0, "23540"
+    const-string/jumbo v0, "23541"
+    const-string/jumbo v0, "23542"
+    const-string/jumbo v0, "23543"
+    const-string/jumbo v0, "23544"
+    const-string/jumbo v0, "23545"
+    const-string/jumbo v0, "23546"
+    const-string/jumbo v0, "23547"
+    const-string/jumbo v0, "23548"
+    const-string/jumbo v0, "23549"
+    const-string/jumbo v0, "23550"
+    const-string/jumbo v0, "23551"
+    const-string/jumbo v0, "23552"
+    const-string/jumbo v0, "23553"
+    const-string/jumbo v0, "23554"
+    const-string/jumbo v0, "23555"
+    const-string/jumbo v0, "23556"
+    const-string/jumbo v0, "23557"
+    const-string/jumbo v0, "23558"
+    const-string/jumbo v0, "23559"
+    const-string/jumbo v0, "23560"
+    const-string/jumbo v0, "23561"
+    const-string/jumbo v0, "23562"
+    const-string/jumbo v0, "23563"
+    const-string/jumbo v0, "23564"
+    const-string/jumbo v0, "23565"
+    const-string/jumbo v0, "23566"
+    const-string/jumbo v0, "23567"
+    const-string/jumbo v0, "23568"
+    const-string/jumbo v0, "23569"
+    const-string/jumbo v0, "23570"
+    const-string/jumbo v0, "23571"
+    const-string/jumbo v0, "23572"
+    const-string/jumbo v0, "23573"
+    const-string/jumbo v0, "23574"
+    const-string/jumbo v0, "23575"
+    const-string/jumbo v0, "23576"
+    const-string/jumbo v0, "23577"
+    const-string/jumbo v0, "23578"
+    const-string/jumbo v0, "23579"
+    const-string/jumbo v0, "23580"
+    const-string/jumbo v0, "23581"
+    const-string/jumbo v0, "23582"
+    const-string/jumbo v0, "23583"
+    const-string/jumbo v0, "23584"
+    const-string/jumbo v0, "23585"
+    const-string/jumbo v0, "23586"
+    const-string/jumbo v0, "23587"
+    const-string/jumbo v0, "23588"
+    const-string/jumbo v0, "23589"
+    const-string/jumbo v0, "23590"
+    const-string/jumbo v0, "23591"
+    const-string/jumbo v0, "23592"
+    const-string/jumbo v0, "23593"
+    const-string/jumbo v0, "23594"
+    const-string/jumbo v0, "23595"
+    const-string/jumbo v0, "23596"
+    const-string/jumbo v0, "23597"
+    const-string/jumbo v0, "23598"
+    const-string/jumbo v0, "23599"
+    const-string/jumbo v0, "23600"
+    const-string/jumbo v0, "23601"
+    const-string/jumbo v0, "23602"
+    const-string/jumbo v0, "23603"
+    const-string/jumbo v0, "23604"
+    const-string/jumbo v0, "23605"
+    const-string/jumbo v0, "23606"
+    const-string/jumbo v0, "23607"
+    const-string/jumbo v0, "23608"
+    const-string/jumbo v0, "23609"
+    const-string/jumbo v0, "23610"
+    const-string/jumbo v0, "23611"
+    const-string/jumbo v0, "23612"
+    const-string/jumbo v0, "23613"
+    const-string/jumbo v0, "23614"
+    const-string/jumbo v0, "23615"
+    const-string/jumbo v0, "23616"
+    const-string/jumbo v0, "23617"
+    const-string/jumbo v0, "23618"
+    const-string/jumbo v0, "23619"
+    const-string/jumbo v0, "23620"
+    const-string/jumbo v0, "23621"
+    const-string/jumbo v0, "23622"
+    const-string/jumbo v0, "23623"
+    const-string/jumbo v0, "23624"
+    const-string/jumbo v0, "23625"
+    const-string/jumbo v0, "23626"
+    const-string/jumbo v0, "23627"
+    const-string/jumbo v0, "23628"
+    const-string/jumbo v0, "23629"
+    const-string/jumbo v0, "23630"
+    const-string/jumbo v0, "23631"
+    const-string/jumbo v0, "23632"
+    const-string/jumbo v0, "23633"
+    const-string/jumbo v0, "23634"
+    const-string/jumbo v0, "23635"
+    const-string/jumbo v0, "23636"
+    const-string/jumbo v0, "23637"
+    const-string/jumbo v0, "23638"
+    const-string/jumbo v0, "23639"
+    const-string/jumbo v0, "23640"
+    const-string/jumbo v0, "23641"
+    const-string/jumbo v0, "23642"
+    const-string/jumbo v0, "23643"
+    const-string/jumbo v0, "23644"
+    const-string/jumbo v0, "23645"
+    const-string/jumbo v0, "23646"
+    const-string/jumbo v0, "23647"
+    const-string/jumbo v0, "23648"
+    const-string/jumbo v0, "23649"
+    const-string/jumbo v0, "23650"
+    const-string/jumbo v0, "23651"
+    const-string/jumbo v0, "23652"
+    const-string/jumbo v0, "23653"
+    const-string/jumbo v0, "23654"
+    const-string/jumbo v0, "23655"
+    const-string/jumbo v0, "23656"
+    const-string/jumbo v0, "23657"
+    const-string/jumbo v0, "23658"
+    const-string/jumbo v0, "23659"
+    const-string/jumbo v0, "23660"
+    const-string/jumbo v0, "23661"
+    const-string/jumbo v0, "23662"
+    const-string/jumbo v0, "23663"
+    const-string/jumbo v0, "23664"
+    const-string/jumbo v0, "23665"
+    const-string/jumbo v0, "23666"
+    const-string/jumbo v0, "23667"
+    const-string/jumbo v0, "23668"
+    const-string/jumbo v0, "23669"
+    const-string/jumbo v0, "23670"
+    const-string/jumbo v0, "23671"
+    const-string/jumbo v0, "23672"
+    const-string/jumbo v0, "23673"
+    const-string/jumbo v0, "23674"
+    const-string/jumbo v0, "23675"
+    const-string/jumbo v0, "23676"
+    const-string/jumbo v0, "23677"
+    const-string/jumbo v0, "23678"
+    const-string/jumbo v0, "23679"
+    const-string/jumbo v0, "23680"
+    const-string/jumbo v0, "23681"
+    const-string/jumbo v0, "23682"
+    const-string/jumbo v0, "23683"
+    const-string/jumbo v0, "23684"
+    const-string/jumbo v0, "23685"
+    const-string/jumbo v0, "23686"
+    const-string/jumbo v0, "23687"
+    const-string/jumbo v0, "23688"
+    const-string/jumbo v0, "23689"
+    const-string/jumbo v0, "23690"
+    const-string/jumbo v0, "23691"
+    const-string/jumbo v0, "23692"
+    const-string/jumbo v0, "23693"
+    const-string/jumbo v0, "23694"
+    const-string/jumbo v0, "23695"
+    const-string/jumbo v0, "23696"
+    const-string/jumbo v0, "23697"
+    const-string/jumbo v0, "23698"
+    const-string/jumbo v0, "23699"
+    const-string/jumbo v0, "23700"
+    const-string/jumbo v0, "23701"
+    const-string/jumbo v0, "23702"
+    const-string/jumbo v0, "23703"
+    const-string/jumbo v0, "23704"
+    const-string/jumbo v0, "23705"
+    const-string/jumbo v0, "23706"
+    const-string/jumbo v0, "23707"
+    const-string/jumbo v0, "23708"
+    const-string/jumbo v0, "23709"
+    const-string/jumbo v0, "23710"
+    const-string/jumbo v0, "23711"
+    const-string/jumbo v0, "23712"
+    const-string/jumbo v0, "23713"
+    const-string/jumbo v0, "23714"
+    const-string/jumbo v0, "23715"
+    const-string/jumbo v0, "23716"
+    const-string/jumbo v0, "23717"
+    const-string/jumbo v0, "23718"
+    const-string/jumbo v0, "23719"
+    const-string/jumbo v0, "23720"
+    const-string/jumbo v0, "23721"
+    const-string/jumbo v0, "23722"
+    const-string/jumbo v0, "23723"
+    const-string/jumbo v0, "23724"
+    const-string/jumbo v0, "23725"
+    const-string/jumbo v0, "23726"
+    const-string/jumbo v0, "23727"
+    const-string/jumbo v0, "23728"
+    const-string/jumbo v0, "23729"
+    const-string/jumbo v0, "23730"
+    const-string/jumbo v0, "23731"
+    const-string/jumbo v0, "23732"
+    const-string/jumbo v0, "23733"
+    const-string/jumbo v0, "23734"
+    const-string/jumbo v0, "23735"
+    const-string/jumbo v0, "23736"
+    const-string/jumbo v0, "23737"
+    const-string/jumbo v0, "23738"
+    const-string/jumbo v0, "23739"
+    const-string/jumbo v0, "23740"
+    const-string/jumbo v0, "23741"
+    const-string/jumbo v0, "23742"
+    const-string/jumbo v0, "23743"
+    const-string/jumbo v0, "23744"
+    const-string/jumbo v0, "23745"
+    const-string/jumbo v0, "23746"
+    const-string/jumbo v0, "23747"
+    const-string/jumbo v0, "23748"
+    const-string/jumbo v0, "23749"
+    const-string/jumbo v0, "23750"
+    const-string/jumbo v0, "23751"
+    const-string/jumbo v0, "23752"
+    const-string/jumbo v0, "23753"
+    const-string/jumbo v0, "23754"
+    const-string/jumbo v0, "23755"
+    const-string/jumbo v0, "23756"
+    const-string/jumbo v0, "23757"
+    const-string/jumbo v0, "23758"
+    const-string/jumbo v0, "23759"
+    const-string/jumbo v0, "23760"
+    const-string/jumbo v0, "23761"
+    const-string/jumbo v0, "23762"
+    const-string/jumbo v0, "23763"
+    const-string/jumbo v0, "23764"
+    const-string/jumbo v0, "23765"
+    const-string/jumbo v0, "23766"
+    const-string/jumbo v0, "23767"
+    const-string/jumbo v0, "23768"
+    const-string/jumbo v0, "23769"
+    const-string/jumbo v0, "23770"
+    const-string/jumbo v0, "23771"
+    const-string/jumbo v0, "23772"
+    const-string/jumbo v0, "23773"
+    const-string/jumbo v0, "23774"
+    const-string/jumbo v0, "23775"
+    const-string/jumbo v0, "23776"
+    const-string/jumbo v0, "23777"
+    const-string/jumbo v0, "23778"
+    const-string/jumbo v0, "23779"
+    const-string/jumbo v0, "23780"
+    const-string/jumbo v0, "23781"
+    const-string/jumbo v0, "23782"
+    const-string/jumbo v0, "23783"
+    const-string/jumbo v0, "23784"
+    const-string/jumbo v0, "23785"
+    const-string/jumbo v0, "23786"
+    const-string/jumbo v0, "23787"
+    const-string/jumbo v0, "23788"
+    const-string/jumbo v0, "23789"
+    const-string/jumbo v0, "23790"
+    const-string/jumbo v0, "23791"
+    const-string/jumbo v0, "23792"
+    const-string/jumbo v0, "23793"
+    const-string/jumbo v0, "23794"
+    const-string/jumbo v0, "23795"
+    const-string/jumbo v0, "23796"
+    const-string/jumbo v0, "23797"
+    const-string/jumbo v0, "23798"
+    const-string/jumbo v0, "23799"
+    const-string/jumbo v0, "23800"
+    const-string/jumbo v0, "23801"
+    const-string/jumbo v0, "23802"
+    const-string/jumbo v0, "23803"
+    const-string/jumbo v0, "23804"
+    const-string/jumbo v0, "23805"
+    const-string/jumbo v0, "23806"
+    const-string/jumbo v0, "23807"
+    const-string/jumbo v0, "23808"
+    const-string/jumbo v0, "23809"
+    const-string/jumbo v0, "23810"
+    const-string/jumbo v0, "23811"
+    const-string/jumbo v0, "23812"
+    const-string/jumbo v0, "23813"
+    const-string/jumbo v0, "23814"
+    const-string/jumbo v0, "23815"
+    const-string/jumbo v0, "23816"
+    const-string/jumbo v0, "23817"
+    const-string/jumbo v0, "23818"
+    const-string/jumbo v0, "23819"
+    const-string/jumbo v0, "23820"
+    const-string/jumbo v0, "23821"
+    const-string/jumbo v0, "23822"
+    const-string/jumbo v0, "23823"
+    const-string/jumbo v0, "23824"
+    const-string/jumbo v0, "23825"
+    const-string/jumbo v0, "23826"
+    const-string/jumbo v0, "23827"
+    const-string/jumbo v0, "23828"
+    const-string/jumbo v0, "23829"
+    const-string/jumbo v0, "23830"
+    const-string/jumbo v0, "23831"
+    const-string/jumbo v0, "23832"
+    const-string/jumbo v0, "23833"
+    const-string/jumbo v0, "23834"
+    const-string/jumbo v0, "23835"
+    const-string/jumbo v0, "23836"
+    const-string/jumbo v0, "23837"
+    const-string/jumbo v0, "23838"
+    const-string/jumbo v0, "23839"
+    const-string/jumbo v0, "23840"
+    const-string/jumbo v0, "23841"
+    const-string/jumbo v0, "23842"
+    const-string/jumbo v0, "23843"
+    const-string/jumbo v0, "23844"
+    const-string/jumbo v0, "23845"
+    const-string/jumbo v0, "23846"
+    const-string/jumbo v0, "23847"
+    const-string/jumbo v0, "23848"
+    const-string/jumbo v0, "23849"
+    const-string/jumbo v0, "23850"
+    const-string/jumbo v0, "23851"
+    const-string/jumbo v0, "23852"
+    const-string/jumbo v0, "23853"
+    const-string/jumbo v0, "23854"
+    const-string/jumbo v0, "23855"
+    const-string/jumbo v0, "23856"
+    const-string/jumbo v0, "23857"
+    const-string/jumbo v0, "23858"
+    const-string/jumbo v0, "23859"
+    const-string/jumbo v0, "23860"
+    const-string/jumbo v0, "23861"
+    const-string/jumbo v0, "23862"
+    const-string/jumbo v0, "23863"
+    const-string/jumbo v0, "23864"
+    const-string/jumbo v0, "23865"
+    const-string/jumbo v0, "23866"
+    const-string/jumbo v0, "23867"
+    const-string/jumbo v0, "23868"
+    const-string/jumbo v0, "23869"
+    const-string/jumbo v0, "23870"
+    const-string/jumbo v0, "23871"
+    const-string/jumbo v0, "23872"
+    const-string/jumbo v0, "23873"
+    const-string/jumbo v0, "23874"
+    const-string/jumbo v0, "23875"
+    const-string/jumbo v0, "23876"
+    const-string/jumbo v0, "23877"
+    const-string/jumbo v0, "23878"
+    const-string/jumbo v0, "23879"
+    const-string/jumbo v0, "23880"
+    const-string/jumbo v0, "23881"
+    const-string/jumbo v0, "23882"
+    const-string/jumbo v0, "23883"
+    const-string/jumbo v0, "23884"
+    const-string/jumbo v0, "23885"
+    const-string/jumbo v0, "23886"
+    const-string/jumbo v0, "23887"
+    const-string/jumbo v0, "23888"
+    const-string/jumbo v0, "23889"
+    const-string/jumbo v0, "23890"
+    const-string/jumbo v0, "23891"
+    const-string/jumbo v0, "23892"
+    const-string/jumbo v0, "23893"
+    const-string/jumbo v0, "23894"
+    const-string/jumbo v0, "23895"
+    const-string/jumbo v0, "23896"
+    const-string/jumbo v0, "23897"
+    const-string/jumbo v0, "23898"
+    const-string/jumbo v0, "23899"
+    const-string/jumbo v0, "23900"
+    const-string/jumbo v0, "23901"
+    const-string/jumbo v0, "23902"
+    const-string/jumbo v0, "23903"
+    const-string/jumbo v0, "23904"
+    const-string/jumbo v0, "23905"
+    const-string/jumbo v0, "23906"
+    const-string/jumbo v0, "23907"
+    const-string/jumbo v0, "23908"
+    const-string/jumbo v0, "23909"
+    const-string/jumbo v0, "23910"
+    const-string/jumbo v0, "23911"
+    const-string/jumbo v0, "23912"
+    const-string/jumbo v0, "23913"
+    const-string/jumbo v0, "23914"
+    const-string/jumbo v0, "23915"
+    const-string/jumbo v0, "23916"
+    const-string/jumbo v0, "23917"
+    const-string/jumbo v0, "23918"
+    const-string/jumbo v0, "23919"
+    const-string/jumbo v0, "23920"
+    const-string/jumbo v0, "23921"
+    const-string/jumbo v0, "23922"
+    const-string/jumbo v0, "23923"
+    const-string/jumbo v0, "23924"
+    const-string/jumbo v0, "23925"
+    const-string/jumbo v0, "23926"
+    const-string/jumbo v0, "23927"
+    const-string/jumbo v0, "23928"
+    const-string/jumbo v0, "23929"
+    const-string/jumbo v0, "23930"
+    const-string/jumbo v0, "23931"
+    const-string/jumbo v0, "23932"
+    const-string/jumbo v0, "23933"
+    const-string/jumbo v0, "23934"
+    const-string/jumbo v0, "23935"
+    const-string/jumbo v0, "23936"
+    const-string/jumbo v0, "23937"
+    const-string/jumbo v0, "23938"
+    const-string/jumbo v0, "23939"
+    const-string/jumbo v0, "23940"
+    const-string/jumbo v0, "23941"
+    const-string/jumbo v0, "23942"
+    const-string/jumbo v0, "23943"
+    const-string/jumbo v0, "23944"
+    const-string/jumbo v0, "23945"
+    const-string/jumbo v0, "23946"
+    const-string/jumbo v0, "23947"
+    const-string/jumbo v0, "23948"
+    const-string/jumbo v0, "23949"
+    const-string/jumbo v0, "23950"
+    const-string/jumbo v0, "23951"
+    const-string/jumbo v0, "23952"
+    const-string/jumbo v0, "23953"
+    const-string/jumbo v0, "23954"
+    const-string/jumbo v0, "23955"
+    const-string/jumbo v0, "23956"
+    const-string/jumbo v0, "23957"
+    const-string/jumbo v0, "23958"
+    const-string/jumbo v0, "23959"
+    const-string/jumbo v0, "23960"
+    const-string/jumbo v0, "23961"
+    const-string/jumbo v0, "23962"
+    const-string/jumbo v0, "23963"
+    const-string/jumbo v0, "23964"
+    const-string/jumbo v0, "23965"
+    const-string/jumbo v0, "23966"
+    const-string/jumbo v0, "23967"
+    const-string/jumbo v0, "23968"
+    const-string/jumbo v0, "23969"
+    const-string/jumbo v0, "23970"
+    const-string/jumbo v0, "23971"
+    const-string/jumbo v0, "23972"
+    const-string/jumbo v0, "23973"
+    const-string/jumbo v0, "23974"
+    const-string/jumbo v0, "23975"
+    const-string/jumbo v0, "23976"
+    const-string/jumbo v0, "23977"
+    const-string/jumbo v0, "23978"
+    const-string/jumbo v0, "23979"
+    const-string/jumbo v0, "23980"
+    const-string/jumbo v0, "23981"
+    const-string/jumbo v0, "23982"
+    const-string/jumbo v0, "23983"
+    const-string/jumbo v0, "23984"
+    const-string/jumbo v0, "23985"
+    const-string/jumbo v0, "23986"
+    const-string/jumbo v0, "23987"
+    const-string/jumbo v0, "23988"
+    const-string/jumbo v0, "23989"
+    const-string/jumbo v0, "23990"
+    const-string/jumbo v0, "23991"
+    const-string/jumbo v0, "23992"
+    const-string/jumbo v0, "23993"
+    const-string/jumbo v0, "23994"
+    const-string/jumbo v0, "23995"
+    const-string/jumbo v0, "23996"
+    const-string/jumbo v0, "23997"
+    const-string/jumbo v0, "23998"
+    const-string/jumbo v0, "23999"
+    const-string/jumbo v0, "24000"
+    const-string/jumbo v0, "24001"
+    const-string/jumbo v0, "24002"
+    const-string/jumbo v0, "24003"
+    const-string/jumbo v0, "24004"
+    const-string/jumbo v0, "24005"
+    const-string/jumbo v0, "24006"
+    const-string/jumbo v0, "24007"
+    const-string/jumbo v0, "24008"
+    const-string/jumbo v0, "24009"
+    const-string/jumbo v0, "24010"
+    const-string/jumbo v0, "24011"
+    const-string/jumbo v0, "24012"
+    const-string/jumbo v0, "24013"
+    const-string/jumbo v0, "24014"
+    const-string/jumbo v0, "24015"
+    const-string/jumbo v0, "24016"
+    const-string/jumbo v0, "24017"
+    const-string/jumbo v0, "24018"
+    const-string/jumbo v0, "24019"
+    const-string/jumbo v0, "24020"
+    const-string/jumbo v0, "24021"
+    const-string/jumbo v0, "24022"
+    const-string/jumbo v0, "24023"
+    const-string/jumbo v0, "24024"
+    const-string/jumbo v0, "24025"
+    const-string/jumbo v0, "24026"
+    const-string/jumbo v0, "24027"
+    const-string/jumbo v0, "24028"
+    const-string/jumbo v0, "24029"
+    const-string/jumbo v0, "24030"
+    const-string/jumbo v0, "24031"
+    const-string/jumbo v0, "24032"
+    const-string/jumbo v0, "24033"
+    const-string/jumbo v0, "24034"
+    const-string/jumbo v0, "24035"
+    const-string/jumbo v0, "24036"
+    const-string/jumbo v0, "24037"
+    const-string/jumbo v0, "24038"
+    const-string/jumbo v0, "24039"
+    const-string/jumbo v0, "24040"
+    const-string/jumbo v0, "24041"
+    const-string/jumbo v0, "24042"
+    const-string/jumbo v0, "24043"
+    const-string/jumbo v0, "24044"
+    const-string/jumbo v0, "24045"
+    const-string/jumbo v0, "24046"
+    const-string/jumbo v0, "24047"
+    const-string/jumbo v0, "24048"
+    const-string/jumbo v0, "24049"
+    const-string/jumbo v0, "24050"
+    const-string/jumbo v0, "24051"
+    const-string/jumbo v0, "24052"
+    const-string/jumbo v0, "24053"
+    const-string/jumbo v0, "24054"
+    const-string/jumbo v0, "24055"
+    const-string/jumbo v0, "24056"
+    const-string/jumbo v0, "24057"
+    const-string/jumbo v0, "24058"
+    const-string/jumbo v0, "24059"
+    const-string/jumbo v0, "24060"
+    const-string/jumbo v0, "24061"
+    const-string/jumbo v0, "24062"
+    const-string/jumbo v0, "24063"
+    const-string/jumbo v0, "24064"
+    const-string/jumbo v0, "24065"
+    const-string/jumbo v0, "24066"
+    const-string/jumbo v0, "24067"
+    const-string/jumbo v0, "24068"
+    const-string/jumbo v0, "24069"
+    const-string/jumbo v0, "24070"
+    const-string/jumbo v0, "24071"
+    const-string/jumbo v0, "24072"
+    const-string/jumbo v0, "24073"
+    const-string/jumbo v0, "24074"
+    const-string/jumbo v0, "24075"
+    const-string/jumbo v0, "24076"
+    const-string/jumbo v0, "24077"
+    const-string/jumbo v0, "24078"
+    const-string/jumbo v0, "24079"
+    const-string/jumbo v0, "24080"
+    const-string/jumbo v0, "24081"
+    const-string/jumbo v0, "24082"
+    const-string/jumbo v0, "24083"
+    const-string/jumbo v0, "24084"
+    const-string/jumbo v0, "24085"
+    const-string/jumbo v0, "24086"
+    const-string/jumbo v0, "24087"
+    const-string/jumbo v0, "24088"
+    const-string/jumbo v0, "24089"
+    const-string/jumbo v0, "24090"
+    const-string/jumbo v0, "24091"
+    const-string/jumbo v0, "24092"
+    const-string/jumbo v0, "24093"
+    const-string/jumbo v0, "24094"
+    const-string/jumbo v0, "24095"
+    const-string/jumbo v0, "24096"
+    const-string/jumbo v0, "24097"
+    const-string/jumbo v0, "24098"
+    const-string/jumbo v0, "24099"
+    const-string/jumbo v0, "24100"
+    const-string/jumbo v0, "24101"
+    const-string/jumbo v0, "24102"
+    const-string/jumbo v0, "24103"
+    const-string/jumbo v0, "24104"
+    const-string/jumbo v0, "24105"
+    const-string/jumbo v0, "24106"
+    const-string/jumbo v0, "24107"
+    const-string/jumbo v0, "24108"
+    const-string/jumbo v0, "24109"
+    const-string/jumbo v0, "24110"
+    const-string/jumbo v0, "24111"
+    const-string/jumbo v0, "24112"
+    const-string/jumbo v0, "24113"
+    const-string/jumbo v0, "24114"
+    const-string/jumbo v0, "24115"
+    const-string/jumbo v0, "24116"
+    const-string/jumbo v0, "24117"
+    const-string/jumbo v0, "24118"
+    const-string/jumbo v0, "24119"
+    const-string/jumbo v0, "24120"
+    const-string/jumbo v0, "24121"
+    const-string/jumbo v0, "24122"
+    const-string/jumbo v0, "24123"
+    const-string/jumbo v0, "24124"
+    const-string/jumbo v0, "24125"
+    const-string/jumbo v0, "24126"
+    const-string/jumbo v0, "24127"
+    const-string/jumbo v0, "24128"
+    const-string/jumbo v0, "24129"
+    const-string/jumbo v0, "24130"
+    const-string/jumbo v0, "24131"
+    const-string/jumbo v0, "24132"
+    const-string/jumbo v0, "24133"
+    const-string/jumbo v0, "24134"
+    const-string/jumbo v0, "24135"
+    const-string/jumbo v0, "24136"
+    const-string/jumbo v0, "24137"
+    const-string/jumbo v0, "24138"
+    const-string/jumbo v0, "24139"
+    const-string/jumbo v0, "24140"
+    const-string/jumbo v0, "24141"
+    const-string/jumbo v0, "24142"
+    const-string/jumbo v0, "24143"
+    const-string/jumbo v0, "24144"
+    const-string/jumbo v0, "24145"
+    const-string/jumbo v0, "24146"
+    const-string/jumbo v0, "24147"
+    const-string/jumbo v0, "24148"
+    const-string/jumbo v0, "24149"
+    const-string/jumbo v0, "24150"
+    const-string/jumbo v0, "24151"
+    const-string/jumbo v0, "24152"
+    const-string/jumbo v0, "24153"
+    const-string/jumbo v0, "24154"
+    const-string/jumbo v0, "24155"
+    const-string/jumbo v0, "24156"
+    const-string/jumbo v0, "24157"
+    const-string/jumbo v0, "24158"
+    const-string/jumbo v0, "24159"
+    const-string/jumbo v0, "24160"
+    const-string/jumbo v0, "24161"
+    const-string/jumbo v0, "24162"
+    const-string/jumbo v0, "24163"
+    const-string/jumbo v0, "24164"
+    const-string/jumbo v0, "24165"
+    const-string/jumbo v0, "24166"
+    const-string/jumbo v0, "24167"
+    const-string/jumbo v0, "24168"
+    const-string/jumbo v0, "24169"
+    const-string/jumbo v0, "24170"
+    const-string/jumbo v0, "24171"
+    const-string/jumbo v0, "24172"
+    const-string/jumbo v0, "24173"
+    const-string/jumbo v0, "24174"
+    const-string/jumbo v0, "24175"
+    const-string/jumbo v0, "24176"
+    const-string/jumbo v0, "24177"
+    const-string/jumbo v0, "24178"
+    const-string/jumbo v0, "24179"
+    const-string/jumbo v0, "24180"
+    const-string/jumbo v0, "24181"
+    const-string/jumbo v0, "24182"
+    const-string/jumbo v0, "24183"
+    const-string/jumbo v0, "24184"
+    const-string/jumbo v0, "24185"
+    const-string/jumbo v0, "24186"
+    const-string/jumbo v0, "24187"
+    const-string/jumbo v0, "24188"
+    const-string/jumbo v0, "24189"
+    const-string/jumbo v0, "24190"
+    const-string/jumbo v0, "24191"
+    const-string/jumbo v0, "24192"
+    const-string/jumbo v0, "24193"
+    const-string/jumbo v0, "24194"
+    const-string/jumbo v0, "24195"
+    const-string/jumbo v0, "24196"
+    const-string/jumbo v0, "24197"
+    const-string/jumbo v0, "24198"
+    const-string/jumbo v0, "24199"
+    const-string/jumbo v0, "24200"
+    const-string/jumbo v0, "24201"
+    const-string/jumbo v0, "24202"
+    const-string/jumbo v0, "24203"
+    const-string/jumbo v0, "24204"
+    const-string/jumbo v0, "24205"
+    const-string/jumbo v0, "24206"
+    const-string/jumbo v0, "24207"
+    const-string/jumbo v0, "24208"
+    const-string/jumbo v0, "24209"
+    const-string/jumbo v0, "24210"
+    const-string/jumbo v0, "24211"
+    const-string/jumbo v0, "24212"
+    const-string/jumbo v0, "24213"
+    const-string/jumbo v0, "24214"
+    const-string/jumbo v0, "24215"
+    const-string/jumbo v0, "24216"
+    const-string/jumbo v0, "24217"
+    const-string/jumbo v0, "24218"
+    const-string/jumbo v0, "24219"
+    const-string/jumbo v0, "24220"
+    const-string/jumbo v0, "24221"
+    const-string/jumbo v0, "24222"
+    const-string/jumbo v0, "24223"
+    const-string/jumbo v0, "24224"
+    const-string/jumbo v0, "24225"
+    const-string/jumbo v0, "24226"
+    const-string/jumbo v0, "24227"
+    const-string/jumbo v0, "24228"
+    const-string/jumbo v0, "24229"
+    const-string/jumbo v0, "24230"
+    const-string/jumbo v0, "24231"
+    const-string/jumbo v0, "24232"
+    const-string/jumbo v0, "24233"
+    const-string/jumbo v0, "24234"
+    const-string/jumbo v0, "24235"
+    const-string/jumbo v0, "24236"
+    const-string/jumbo v0, "24237"
+    const-string/jumbo v0, "24238"
+    const-string/jumbo v0, "24239"
+    const-string/jumbo v0, "24240"
+    const-string/jumbo v0, "24241"
+    const-string/jumbo v0, "24242"
+    const-string/jumbo v0, "24243"
+    const-string/jumbo v0, "24244"
+    const-string/jumbo v0, "24245"
+    const-string/jumbo v0, "24246"
+    const-string/jumbo v0, "24247"
+    const-string/jumbo v0, "24248"
+    const-string/jumbo v0, "24249"
+    const-string/jumbo v0, "24250"
+    const-string/jumbo v0, "24251"
+    const-string/jumbo v0, "24252"
+    const-string/jumbo v0, "24253"
+    const-string/jumbo v0, "24254"
+    const-string/jumbo v0, "24255"
+    const-string/jumbo v0, "24256"
+    const-string/jumbo v0, "24257"
+    const-string/jumbo v0, "24258"
+    const-string/jumbo v0, "24259"
+    const-string/jumbo v0, "24260"
+    const-string/jumbo v0, "24261"
+    const-string/jumbo v0, "24262"
+    const-string/jumbo v0, "24263"
+    const-string/jumbo v0, "24264"
+    const-string/jumbo v0, "24265"
+    const-string/jumbo v0, "24266"
+    const-string/jumbo v0, "24267"
+    const-string/jumbo v0, "24268"
+    const-string/jumbo v0, "24269"
+    const-string/jumbo v0, "24270"
+    const-string/jumbo v0, "24271"
+    const-string/jumbo v0, "24272"
+    const-string/jumbo v0, "24273"
+    const-string/jumbo v0, "24274"
+    const-string/jumbo v0, "24275"
+    const-string/jumbo v0, "24276"
+    const-string/jumbo v0, "24277"
+    const-string/jumbo v0, "24278"
+    const-string/jumbo v0, "24279"
+    const-string/jumbo v0, "24280"
+    const-string/jumbo v0, "24281"
+    const-string/jumbo v0, "24282"
+    const-string/jumbo v0, "24283"
+    const-string/jumbo v0, "24284"
+    const-string/jumbo v0, "24285"
+    const-string/jumbo v0, "24286"
+    const-string/jumbo v0, "24287"
+    const-string/jumbo v0, "24288"
+    const-string/jumbo v0, "24289"
+    const-string/jumbo v0, "24290"
+    const-string/jumbo v0, "24291"
+    const-string/jumbo v0, "24292"
+    const-string/jumbo v0, "24293"
+    const-string/jumbo v0, "24294"
+    const-string/jumbo v0, "24295"
+    const-string/jumbo v0, "24296"
+    const-string/jumbo v0, "24297"
+    const-string/jumbo v0, "24298"
+    const-string/jumbo v0, "24299"
+    const-string/jumbo v0, "24300"
+    const-string/jumbo v0, "24301"
+    const-string/jumbo v0, "24302"
+    const-string/jumbo v0, "24303"
+    const-string/jumbo v0, "24304"
+    const-string/jumbo v0, "24305"
+    const-string/jumbo v0, "24306"
+    const-string/jumbo v0, "24307"
+    const-string/jumbo v0, "24308"
+    const-string/jumbo v0, "24309"
+    const-string/jumbo v0, "24310"
+    const-string/jumbo v0, "24311"
+    const-string/jumbo v0, "24312"
+    const-string/jumbo v0, "24313"
+    const-string/jumbo v0, "24314"
+    const-string/jumbo v0, "24315"
+    const-string/jumbo v0, "24316"
+    const-string/jumbo v0, "24317"
+    const-string/jumbo v0, "24318"
+    const-string/jumbo v0, "24319"
+    const-string/jumbo v0, "24320"
+    const-string/jumbo v0, "24321"
+    const-string/jumbo v0, "24322"
+    const-string/jumbo v0, "24323"
+    const-string/jumbo v0, "24324"
+    const-string/jumbo v0, "24325"
+    const-string/jumbo v0, "24326"
+    const-string/jumbo v0, "24327"
+    const-string/jumbo v0, "24328"
+    const-string/jumbo v0, "24329"
+    const-string/jumbo v0, "24330"
+    const-string/jumbo v0, "24331"
+    const-string/jumbo v0, "24332"
+    const-string/jumbo v0, "24333"
+    const-string/jumbo v0, "24334"
+    const-string/jumbo v0, "24335"
+    const-string/jumbo v0, "24336"
+    const-string/jumbo v0, "24337"
+    const-string/jumbo v0, "24338"
+    const-string/jumbo v0, "24339"
+    const-string/jumbo v0, "24340"
+    const-string/jumbo v0, "24341"
+    const-string/jumbo v0, "24342"
+    const-string/jumbo v0, "24343"
+    const-string/jumbo v0, "24344"
+    const-string/jumbo v0, "24345"
+    const-string/jumbo v0, "24346"
+    const-string/jumbo v0, "24347"
+    const-string/jumbo v0, "24348"
+    const-string/jumbo v0, "24349"
+    const-string/jumbo v0, "24350"
+    const-string/jumbo v0, "24351"
+    const-string/jumbo v0, "24352"
+    const-string/jumbo v0, "24353"
+    const-string/jumbo v0, "24354"
+    const-string/jumbo v0, "24355"
+    const-string/jumbo v0, "24356"
+    const-string/jumbo v0, "24357"
+    const-string/jumbo v0, "24358"
+    const-string/jumbo v0, "24359"
+    const-string/jumbo v0, "24360"
+    const-string/jumbo v0, "24361"
+    const-string/jumbo v0, "24362"
+    const-string/jumbo v0, "24363"
+    const-string/jumbo v0, "24364"
+    const-string/jumbo v0, "24365"
+    const-string/jumbo v0, "24366"
+    const-string/jumbo v0, "24367"
+    const-string/jumbo v0, "24368"
+    const-string/jumbo v0, "24369"
+    const-string/jumbo v0, "24370"
+    const-string/jumbo v0, "24371"
+    const-string/jumbo v0, "24372"
+    const-string/jumbo v0, "24373"
+    const-string/jumbo v0, "24374"
+    const-string/jumbo v0, "24375"
+    const-string/jumbo v0, "24376"
+    const-string/jumbo v0, "24377"
+    const-string/jumbo v0, "24378"
+    const-string/jumbo v0, "24379"
+    const-string/jumbo v0, "24380"
+    const-string/jumbo v0, "24381"
+    const-string/jumbo v0, "24382"
+    const-string/jumbo v0, "24383"
+    const-string/jumbo v0, "24384"
+    const-string/jumbo v0, "24385"
+    const-string/jumbo v0, "24386"
+    const-string/jumbo v0, "24387"
+    const-string/jumbo v0, "24388"
+    const-string/jumbo v0, "24389"
+    const-string/jumbo v0, "24390"
+    const-string/jumbo v0, "24391"
+    const-string/jumbo v0, "24392"
+    const-string/jumbo v0, "24393"
+    const-string/jumbo v0, "24394"
+    const-string/jumbo v0, "24395"
+    const-string/jumbo v0, "24396"
+    const-string/jumbo v0, "24397"
+    const-string/jumbo v0, "24398"
+    const-string/jumbo v0, "24399"
+    const-string/jumbo v0, "24400"
+    const-string/jumbo v0, "24401"
+    const-string/jumbo v0, "24402"
+    const-string/jumbo v0, "24403"
+    const-string/jumbo v0, "24404"
+    const-string/jumbo v0, "24405"
+    const-string/jumbo v0, "24406"
+    const-string/jumbo v0, "24407"
+    const-string/jumbo v0, "24408"
+    const-string/jumbo v0, "24409"
+    const-string/jumbo v0, "24410"
+    const-string/jumbo v0, "24411"
+    const-string/jumbo v0, "24412"
+    const-string/jumbo v0, "24413"
+    const-string/jumbo v0, "24414"
+    const-string/jumbo v0, "24415"
+    const-string/jumbo v0, "24416"
+    const-string/jumbo v0, "24417"
+    const-string/jumbo v0, "24418"
+    const-string/jumbo v0, "24419"
+    const-string/jumbo v0, "24420"
+    const-string/jumbo v0, "24421"
+    const-string/jumbo v0, "24422"
+    const-string/jumbo v0, "24423"
+    const-string/jumbo v0, "24424"
+    const-string/jumbo v0, "24425"
+    const-string/jumbo v0, "24426"
+    const-string/jumbo v0, "24427"
+    const-string/jumbo v0, "24428"
+    const-string/jumbo v0, "24429"
+    const-string/jumbo v0, "24430"
+    const-string/jumbo v0, "24431"
+    const-string/jumbo v0, "24432"
+    const-string/jumbo v0, "24433"
+    const-string/jumbo v0, "24434"
+    const-string/jumbo v0, "24435"
+    const-string/jumbo v0, "24436"
+    const-string/jumbo v0, "24437"
+    const-string/jumbo v0, "24438"
+    const-string/jumbo v0, "24439"
+    const-string/jumbo v0, "24440"
+    const-string/jumbo v0, "24441"
+    const-string/jumbo v0, "24442"
+    const-string/jumbo v0, "24443"
+    const-string/jumbo v0, "24444"
+    const-string/jumbo v0, "24445"
+    const-string/jumbo v0, "24446"
+    const-string/jumbo v0, "24447"
+    const-string/jumbo v0, "24448"
+    const-string/jumbo v0, "24449"
+    const-string/jumbo v0, "24450"
+    const-string/jumbo v0, "24451"
+    const-string/jumbo v0, "24452"
+    const-string/jumbo v0, "24453"
+    const-string/jumbo v0, "24454"
+    const-string/jumbo v0, "24455"
+    const-string/jumbo v0, "24456"
+    const-string/jumbo v0, "24457"
+    const-string/jumbo v0, "24458"
+    const-string/jumbo v0, "24459"
+    const-string/jumbo v0, "24460"
+    const-string/jumbo v0, "24461"
+    const-string/jumbo v0, "24462"
+    const-string/jumbo v0, "24463"
+    const-string/jumbo v0, "24464"
+    const-string/jumbo v0, "24465"
+    const-string/jumbo v0, "24466"
+    const-string/jumbo v0, "24467"
+    const-string/jumbo v0, "24468"
+    const-string/jumbo v0, "24469"
+    const-string/jumbo v0, "24470"
+    const-string/jumbo v0, "24471"
+    const-string/jumbo v0, "24472"
+    const-string/jumbo v0, "24473"
+    const-string/jumbo v0, "24474"
+    const-string/jumbo v0, "24475"
+    const-string/jumbo v0, "24476"
+    const-string/jumbo v0, "24477"
+    const-string/jumbo v0, "24478"
+    const-string/jumbo v0, "24479"
+    const-string/jumbo v0, "24480"
+    const-string/jumbo v0, "24481"
+    const-string/jumbo v0, "24482"
+    const-string/jumbo v0, "24483"
+    const-string/jumbo v0, "24484"
+    const-string/jumbo v0, "24485"
+    const-string/jumbo v0, "24486"
+    const-string/jumbo v0, "24487"
+    const-string/jumbo v0, "24488"
+    const-string/jumbo v0, "24489"
+    const-string/jumbo v0, "24490"
+    const-string/jumbo v0, "24491"
+    const-string/jumbo v0, "24492"
+    const-string/jumbo v0, "24493"
+    const-string/jumbo v0, "24494"
+    const-string/jumbo v0, "24495"
+    const-string/jumbo v0, "24496"
+    const-string/jumbo v0, "24497"
+    const-string/jumbo v0, "24498"
+    const-string/jumbo v0, "24499"
+    const-string/jumbo v0, "24500"
+    const-string/jumbo v0, "24501"
+    const-string/jumbo v0, "24502"
+    const-string/jumbo v0, "24503"
+    const-string/jumbo v0, "24504"
+    const-string/jumbo v0, "24505"
+    const-string/jumbo v0, "24506"
+    const-string/jumbo v0, "24507"
+    const-string/jumbo v0, "24508"
+    const-string/jumbo v0, "24509"
+    const-string/jumbo v0, "24510"
+    const-string/jumbo v0, "24511"
+    const-string/jumbo v0, "24512"
+    const-string/jumbo v0, "24513"
+    const-string/jumbo v0, "24514"
+    const-string/jumbo v0, "24515"
+    const-string/jumbo v0, "24516"
+    const-string/jumbo v0, "24517"
+    const-string/jumbo v0, "24518"
+    const-string/jumbo v0, "24519"
+    const-string/jumbo v0, "24520"
+    const-string/jumbo v0, "24521"
+    const-string/jumbo v0, "24522"
+    const-string/jumbo v0, "24523"
+    const-string/jumbo v0, "24524"
+    const-string/jumbo v0, "24525"
+    const-string/jumbo v0, "24526"
+    const-string/jumbo v0, "24527"
+    const-string/jumbo v0, "24528"
+    const-string/jumbo v0, "24529"
+    const-string/jumbo v0, "24530"
+    const-string/jumbo v0, "24531"
+    const-string/jumbo v0, "24532"
+    const-string/jumbo v0, "24533"
+    const-string/jumbo v0, "24534"
+    const-string/jumbo v0, "24535"
+    const-string/jumbo v0, "24536"
+    const-string/jumbo v0, "24537"
+    const-string/jumbo v0, "24538"
+    const-string/jumbo v0, "24539"
+    const-string/jumbo v0, "24540"
+    const-string/jumbo v0, "24541"
+    const-string/jumbo v0, "24542"
+    const-string/jumbo v0, "24543"
+    const-string/jumbo v0, "24544"
+    const-string/jumbo v0, "24545"
+    const-string/jumbo v0, "24546"
+    const-string/jumbo v0, "24547"
+    const-string/jumbo v0, "24548"
+    const-string/jumbo v0, "24549"
+    const-string/jumbo v0, "24550"
+    const-string/jumbo v0, "24551"
+    const-string/jumbo v0, "24552"
+    const-string/jumbo v0, "24553"
+    const-string/jumbo v0, "24554"
+    const-string/jumbo v0, "24555"
+    const-string/jumbo v0, "24556"
+    const-string/jumbo v0, "24557"
+    const-string/jumbo v0, "24558"
+    const-string/jumbo v0, "24559"
+    const-string/jumbo v0, "24560"
+    const-string/jumbo v0, "24561"
+    const-string/jumbo v0, "24562"
+    const-string/jumbo v0, "24563"
+    const-string/jumbo v0, "24564"
+    const-string/jumbo v0, "24565"
+    const-string/jumbo v0, "24566"
+    const-string/jumbo v0, "24567"
+    const-string/jumbo v0, "24568"
+    const-string/jumbo v0, "24569"
+    const-string/jumbo v0, "24570"
+    const-string/jumbo v0, "24571"
+    const-string/jumbo v0, "24572"
+    const-string/jumbo v0, "24573"
+    const-string/jumbo v0, "24574"
+    const-string/jumbo v0, "24575"
+    const-string/jumbo v0, "24576"
+    const-string/jumbo v0, "24577"
+    const-string/jumbo v0, "24578"
+    const-string/jumbo v0, "24579"
+    const-string/jumbo v0, "24580"
+    const-string/jumbo v0, "24581"
+    const-string/jumbo v0, "24582"
+    const-string/jumbo v0, "24583"
+    const-string/jumbo v0, "24584"
+    const-string/jumbo v0, "24585"
+    const-string/jumbo v0, "24586"
+    const-string/jumbo v0, "24587"
+    const-string/jumbo v0, "24588"
+    const-string/jumbo v0, "24589"
+    const-string/jumbo v0, "24590"
+    const-string/jumbo v0, "24591"
+    const-string/jumbo v0, "24592"
+    const-string/jumbo v0, "24593"
+    const-string/jumbo v0, "24594"
+    const-string/jumbo v0, "24595"
+    const-string/jumbo v0, "24596"
+    const-string/jumbo v0, "24597"
+    const-string/jumbo v0, "24598"
+    const-string/jumbo v0, "24599"
+    const-string/jumbo v0, "24600"
+    const-string/jumbo v0, "24601"
+    const-string/jumbo v0, "24602"
+    const-string/jumbo v0, "24603"
+    const-string/jumbo v0, "24604"
+    const-string/jumbo v0, "24605"
+    const-string/jumbo v0, "24606"
+    const-string/jumbo v0, "24607"
+    const-string/jumbo v0, "24608"
+    const-string/jumbo v0, "24609"
+    const-string/jumbo v0, "24610"
+    const-string/jumbo v0, "24611"
+    const-string/jumbo v0, "24612"
+    const-string/jumbo v0, "24613"
+    const-string/jumbo v0, "24614"
+    const-string/jumbo v0, "24615"
+    const-string/jumbo v0, "24616"
+    const-string/jumbo v0, "24617"
+    const-string/jumbo v0, "24618"
+    const-string/jumbo v0, "24619"
+    const-string/jumbo v0, "24620"
+    const-string/jumbo v0, "24621"
+    const-string/jumbo v0, "24622"
+    const-string/jumbo v0, "24623"
+    const-string/jumbo v0, "24624"
+    const-string/jumbo v0, "24625"
+    const-string/jumbo v0, "24626"
+    const-string/jumbo v0, "24627"
+    const-string/jumbo v0, "24628"
+    const-string/jumbo v0, "24629"
+    const-string/jumbo v0, "24630"
+    const-string/jumbo v0, "24631"
+    const-string/jumbo v0, "24632"
+    const-string/jumbo v0, "24633"
+    const-string/jumbo v0, "24634"
+    const-string/jumbo v0, "24635"
+    const-string/jumbo v0, "24636"
+    const-string/jumbo v0, "24637"
+    const-string/jumbo v0, "24638"
+    const-string/jumbo v0, "24639"
+    const-string/jumbo v0, "24640"
+    const-string/jumbo v0, "24641"
+    const-string/jumbo v0, "24642"
+    const-string/jumbo v0, "24643"
+    const-string/jumbo v0, "24644"
+    const-string/jumbo v0, "24645"
+    const-string/jumbo v0, "24646"
+    const-string/jumbo v0, "24647"
+    const-string/jumbo v0, "24648"
+    const-string/jumbo v0, "24649"
+    const-string/jumbo v0, "24650"
+    const-string/jumbo v0, "24651"
+    const-string/jumbo v0, "24652"
+    const-string/jumbo v0, "24653"
+    const-string/jumbo v0, "24654"
+    const-string/jumbo v0, "24655"
+    const-string/jumbo v0, "24656"
+    const-string/jumbo v0, "24657"
+    const-string/jumbo v0, "24658"
+    const-string/jumbo v0, "24659"
+    const-string/jumbo v0, "24660"
+    const-string/jumbo v0, "24661"
+    const-string/jumbo v0, "24662"
+    const-string/jumbo v0, "24663"
+    const-string/jumbo v0, "24664"
+    const-string/jumbo v0, "24665"
+    const-string/jumbo v0, "24666"
+    const-string/jumbo v0, "24667"
+    const-string/jumbo v0, "24668"
+    const-string/jumbo v0, "24669"
+    const-string/jumbo v0, "24670"
+    const-string/jumbo v0, "24671"
+    const-string/jumbo v0, "24672"
+    const-string/jumbo v0, "24673"
+    const-string/jumbo v0, "24674"
+    const-string/jumbo v0, "24675"
+    const-string/jumbo v0, "24676"
+    const-string/jumbo v0, "24677"
+    const-string/jumbo v0, "24678"
+    const-string/jumbo v0, "24679"
+    const-string/jumbo v0, "24680"
+    const-string/jumbo v0, "24681"
+    const-string/jumbo v0, "24682"
+    const-string/jumbo v0, "24683"
+    const-string/jumbo v0, "24684"
+    const-string/jumbo v0, "24685"
+    const-string/jumbo v0, "24686"
+    const-string/jumbo v0, "24687"
+    const-string/jumbo v0, "24688"
+    const-string/jumbo v0, "24689"
+    const-string/jumbo v0, "24690"
+    const-string/jumbo v0, "24691"
+    const-string/jumbo v0, "24692"
+    const-string/jumbo v0, "24693"
+    const-string/jumbo v0, "24694"
+    const-string/jumbo v0, "24695"
+    const-string/jumbo v0, "24696"
+    const-string/jumbo v0, "24697"
+    const-string/jumbo v0, "24698"
+    const-string/jumbo v0, "24699"
+    const-string/jumbo v0, "24700"
+    const-string/jumbo v0, "24701"
+    const-string/jumbo v0, "24702"
+    const-string/jumbo v0, "24703"
+    const-string/jumbo v0, "24704"
+    const-string/jumbo v0, "24705"
+    const-string/jumbo v0, "24706"
+    const-string/jumbo v0, "24707"
+    const-string/jumbo v0, "24708"
+    const-string/jumbo v0, "24709"
+    const-string/jumbo v0, "24710"
+    const-string/jumbo v0, "24711"
+    const-string/jumbo v0, "24712"
+    const-string/jumbo v0, "24713"
+    const-string/jumbo v0, "24714"
+    const-string/jumbo v0, "24715"
+    const-string/jumbo v0, "24716"
+    const-string/jumbo v0, "24717"
+    const-string/jumbo v0, "24718"
+    const-string/jumbo v0, "24719"
+    const-string/jumbo v0, "24720"
+    const-string/jumbo v0, "24721"
+    const-string/jumbo v0, "24722"
+    const-string/jumbo v0, "24723"
+    const-string/jumbo v0, "24724"
+    const-string/jumbo v0, "24725"
+    const-string/jumbo v0, "24726"
+    const-string/jumbo v0, "24727"
+    const-string/jumbo v0, "24728"
+    const-string/jumbo v0, "24729"
+    const-string/jumbo v0, "24730"
+    const-string/jumbo v0, "24731"
+    const-string/jumbo v0, "24732"
+    const-string/jumbo v0, "24733"
+    const-string/jumbo v0, "24734"
+    const-string/jumbo v0, "24735"
+    const-string/jumbo v0, "24736"
+    const-string/jumbo v0, "24737"
+    const-string/jumbo v0, "24738"
+    const-string/jumbo v0, "24739"
+    const-string/jumbo v0, "24740"
+    const-string/jumbo v0, "24741"
+    const-string/jumbo v0, "24742"
+    const-string/jumbo v0, "24743"
+    const-string/jumbo v0, "24744"
+    const-string/jumbo v0, "24745"
+    const-string/jumbo v0, "24746"
+    const-string/jumbo v0, "24747"
+    const-string/jumbo v0, "24748"
+    const-string/jumbo v0, "24749"
+    const-string/jumbo v0, "24750"
+    const-string/jumbo v0, "24751"
+    const-string/jumbo v0, "24752"
+    const-string/jumbo v0, "24753"
+    const-string/jumbo v0, "24754"
+    const-string/jumbo v0, "24755"
+    const-string/jumbo v0, "24756"
+    const-string/jumbo v0, "24757"
+    const-string/jumbo v0, "24758"
+    const-string/jumbo v0, "24759"
+    const-string/jumbo v0, "24760"
+    const-string/jumbo v0, "24761"
+    const-string/jumbo v0, "24762"
+    const-string/jumbo v0, "24763"
+    const-string/jumbo v0, "24764"
+    const-string/jumbo v0, "24765"
+    const-string/jumbo v0, "24766"
+    const-string/jumbo v0, "24767"
+    const-string/jumbo v0, "24768"
+    const-string/jumbo v0, "24769"
+    const-string/jumbo v0, "24770"
+    const-string/jumbo v0, "24771"
+    const-string/jumbo v0, "24772"
+    const-string/jumbo v0, "24773"
+    const-string/jumbo v0, "24774"
+    const-string/jumbo v0, "24775"
+    const-string/jumbo v0, "24776"
+    const-string/jumbo v0, "24777"
+    const-string/jumbo v0, "24778"
+    const-string/jumbo v0, "24779"
+    const-string/jumbo v0, "24780"
+    const-string/jumbo v0, "24781"
+    const-string/jumbo v0, "24782"
+    const-string/jumbo v0, "24783"
+    const-string/jumbo v0, "24784"
+    const-string/jumbo v0, "24785"
+    const-string/jumbo v0, "24786"
+    const-string/jumbo v0, "24787"
+    const-string/jumbo v0, "24788"
+    const-string/jumbo v0, "24789"
+    const-string/jumbo v0, "24790"
+    const-string/jumbo v0, "24791"
+    const-string/jumbo v0, "24792"
+    const-string/jumbo v0, "24793"
+    const-string/jumbo v0, "24794"
+    const-string/jumbo v0, "24795"
+    const-string/jumbo v0, "24796"
+    const-string/jumbo v0, "24797"
+    const-string/jumbo v0, "24798"
+    const-string/jumbo v0, "24799"
+    const-string/jumbo v0, "24800"
+    const-string/jumbo v0, "24801"
+    const-string/jumbo v0, "24802"
+    const-string/jumbo v0, "24803"
+    const-string/jumbo v0, "24804"
+    const-string/jumbo v0, "24805"
+    const-string/jumbo v0, "24806"
+    const-string/jumbo v0, "24807"
+    const-string/jumbo v0, "24808"
+    const-string/jumbo v0, "24809"
+    const-string/jumbo v0, "24810"
+    const-string/jumbo v0, "24811"
+    const-string/jumbo v0, "24812"
+    const-string/jumbo v0, "24813"
+    const-string/jumbo v0, "24814"
+    const-string/jumbo v0, "24815"
+    const-string/jumbo v0, "24816"
+    const-string/jumbo v0, "24817"
+    const-string/jumbo v0, "24818"
+    const-string/jumbo v0, "24819"
+    const-string/jumbo v0, "24820"
+    const-string/jumbo v0, "24821"
+    const-string/jumbo v0, "24822"
+    const-string/jumbo v0, "24823"
+    const-string/jumbo v0, "24824"
+    const-string/jumbo v0, "24825"
+    const-string/jumbo v0, "24826"
+    const-string/jumbo v0, "24827"
+    const-string/jumbo v0, "24828"
+    const-string/jumbo v0, "24829"
+    const-string/jumbo v0, "24830"
+    const-string/jumbo v0, "24831"
+    const-string/jumbo v0, "24832"
+    const-string/jumbo v0, "24833"
+    const-string/jumbo v0, "24834"
+    const-string/jumbo v0, "24835"
+    const-string/jumbo v0, "24836"
+    const-string/jumbo v0, "24837"
+    const-string/jumbo v0, "24838"
+    const-string/jumbo v0, "24839"
+    const-string/jumbo v0, "24840"
+    const-string/jumbo v0, "24841"
+    const-string/jumbo v0, "24842"
+    const-string/jumbo v0, "24843"
+    const-string/jumbo v0, "24844"
+    const-string/jumbo v0, "24845"
+    const-string/jumbo v0, "24846"
+    const-string/jumbo v0, "24847"
+    const-string/jumbo v0, "24848"
+    const-string/jumbo v0, "24849"
+    const-string/jumbo v0, "24850"
+    const-string/jumbo v0, "24851"
+    const-string/jumbo v0, "24852"
+    const-string/jumbo v0, "24853"
+    const-string/jumbo v0, "24854"
+    const-string/jumbo v0, "24855"
+    const-string/jumbo v0, "24856"
+    const-string/jumbo v0, "24857"
+    const-string/jumbo v0, "24858"
+    const-string/jumbo v0, "24859"
+    const-string/jumbo v0, "24860"
+    const-string/jumbo v0, "24861"
+    const-string/jumbo v0, "24862"
+    const-string/jumbo v0, "24863"
+    const-string/jumbo v0, "24864"
+    const-string/jumbo v0, "24865"
+    const-string/jumbo v0, "24866"
+    const-string/jumbo v0, "24867"
+    const-string/jumbo v0, "24868"
+    const-string/jumbo v0, "24869"
+    const-string/jumbo v0, "24870"
+    const-string/jumbo v0, "24871"
+    const-string/jumbo v0, "24872"
+    const-string/jumbo v0, "24873"
+    const-string/jumbo v0, "24874"
+    const-string/jumbo v0, "24875"
+    const-string/jumbo v0, "24876"
+    const-string/jumbo v0, "24877"
+    const-string/jumbo v0, "24878"
+    const-string/jumbo v0, "24879"
+    const-string/jumbo v0, "24880"
+    const-string/jumbo v0, "24881"
+    const-string/jumbo v0, "24882"
+    const-string/jumbo v0, "24883"
+    const-string/jumbo v0, "24884"
+    const-string/jumbo v0, "24885"
+    const-string/jumbo v0, "24886"
+    const-string/jumbo v0, "24887"
+    const-string/jumbo v0, "24888"
+    const-string/jumbo v0, "24889"
+    const-string/jumbo v0, "24890"
+    const-string/jumbo v0, "24891"
+    const-string/jumbo v0, "24892"
+    const-string/jumbo v0, "24893"
+    const-string/jumbo v0, "24894"
+    const-string/jumbo v0, "24895"
+    const-string/jumbo v0, "24896"
+    const-string/jumbo v0, "24897"
+    const-string/jumbo v0, "24898"
+    const-string/jumbo v0, "24899"
+    const-string/jumbo v0, "24900"
+    const-string/jumbo v0, "24901"
+    const-string/jumbo v0, "24902"
+    const-string/jumbo v0, "24903"
+    const-string/jumbo v0, "24904"
+    const-string/jumbo v0, "24905"
+    const-string/jumbo v0, "24906"
+    const-string/jumbo v0, "24907"
+    const-string/jumbo v0, "24908"
+    const-string/jumbo v0, "24909"
+    const-string/jumbo v0, "24910"
+    const-string/jumbo v0, "24911"
+    const-string/jumbo v0, "24912"
+    const-string/jumbo v0, "24913"
+    const-string/jumbo v0, "24914"
+    const-string/jumbo v0, "24915"
+    const-string/jumbo v0, "24916"
+    const-string/jumbo v0, "24917"
+    const-string/jumbo v0, "24918"
+    const-string/jumbo v0, "24919"
+    const-string/jumbo v0, "24920"
+    const-string/jumbo v0, "24921"
+    const-string/jumbo v0, "24922"
+    const-string/jumbo v0, "24923"
+    const-string/jumbo v0, "24924"
+    const-string/jumbo v0, "24925"
+    const-string/jumbo v0, "24926"
+    const-string/jumbo v0, "24927"
+    const-string/jumbo v0, "24928"
+    const-string/jumbo v0, "24929"
+    const-string/jumbo v0, "24930"
+    const-string/jumbo v0, "24931"
+    const-string/jumbo v0, "24932"
+    const-string/jumbo v0, "24933"
+    const-string/jumbo v0, "24934"
+    const-string/jumbo v0, "24935"
+    const-string/jumbo v0, "24936"
+    const-string/jumbo v0, "24937"
+    const-string/jumbo v0, "24938"
+    const-string/jumbo v0, "24939"
+    const-string/jumbo v0, "24940"
+    const-string/jumbo v0, "24941"
+    const-string/jumbo v0, "24942"
+    const-string/jumbo v0, "24943"
+    const-string/jumbo v0, "24944"
+    const-string/jumbo v0, "24945"
+    const-string/jumbo v0, "24946"
+    const-string/jumbo v0, "24947"
+    const-string/jumbo v0, "24948"
+    const-string/jumbo v0, "24949"
+    const-string/jumbo v0, "24950"
+    const-string/jumbo v0, "24951"
+    const-string/jumbo v0, "24952"
+    const-string/jumbo v0, "24953"
+    const-string/jumbo v0, "24954"
+    const-string/jumbo v0, "24955"
+    const-string/jumbo v0, "24956"
+    const-string/jumbo v0, "24957"
+    const-string/jumbo v0, "24958"
+    const-string/jumbo v0, "24959"
+    const-string/jumbo v0, "24960"
+    const-string/jumbo v0, "24961"
+    const-string/jumbo v0, "24962"
+    const-string/jumbo v0, "24963"
+    const-string/jumbo v0, "24964"
+    const-string/jumbo v0, "24965"
+    const-string/jumbo v0, "24966"
+    const-string/jumbo v0, "24967"
+    const-string/jumbo v0, "24968"
+    const-string/jumbo v0, "24969"
+    const-string/jumbo v0, "24970"
+    const-string/jumbo v0, "24971"
+    const-string/jumbo v0, "24972"
+    const-string/jumbo v0, "24973"
+    const-string/jumbo v0, "24974"
+    const-string/jumbo v0, "24975"
+    const-string/jumbo v0, "24976"
+    const-string/jumbo v0, "24977"
+    const-string/jumbo v0, "24978"
+    const-string/jumbo v0, "24979"
+    const-string/jumbo v0, "24980"
+    const-string/jumbo v0, "24981"
+    const-string/jumbo v0, "24982"
+    const-string/jumbo v0, "24983"
+    const-string/jumbo v0, "24984"
+    const-string/jumbo v0, "24985"
+    const-string/jumbo v0, "24986"
+    const-string/jumbo v0, "24987"
+    const-string/jumbo v0, "24988"
+    const-string/jumbo v0, "24989"
+    const-string/jumbo v0, "24990"
+    const-string/jumbo v0, "24991"
+    const-string/jumbo v0, "24992"
+    const-string/jumbo v0, "24993"
+    const-string/jumbo v0, "24994"
+    const-string/jumbo v0, "24995"
+    const-string/jumbo v0, "24996"
+    const-string/jumbo v0, "24997"
+    const-string/jumbo v0, "24998"
+    const-string/jumbo v0, "24999"
+    const-string/jumbo v0, "25000"
+    const-string/jumbo v0, "25001"
+    const-string/jumbo v0, "25002"
+    const-string/jumbo v0, "25003"
+    const-string/jumbo v0, "25004"
+    const-string/jumbo v0, "25005"
+    const-string/jumbo v0, "25006"
+    const-string/jumbo v0, "25007"
+    const-string/jumbo v0, "25008"
+    const-string/jumbo v0, "25009"
+    const-string/jumbo v0, "25010"
+    const-string/jumbo v0, "25011"
+    const-string/jumbo v0, "25012"
+    const-string/jumbo v0, "25013"
+    const-string/jumbo v0, "25014"
+    const-string/jumbo v0, "25015"
+    const-string/jumbo v0, "25016"
+    const-string/jumbo v0, "25017"
+    const-string/jumbo v0, "25018"
+    const-string/jumbo v0, "25019"
+    const-string/jumbo v0, "25020"
+    const-string/jumbo v0, "25021"
+    const-string/jumbo v0, "25022"
+    const-string/jumbo v0, "25023"
+    const-string/jumbo v0, "25024"
+    const-string/jumbo v0, "25025"
+    const-string/jumbo v0, "25026"
+    const-string/jumbo v0, "25027"
+    const-string/jumbo v0, "25028"
+    const-string/jumbo v0, "25029"
+    const-string/jumbo v0, "25030"
+    const-string/jumbo v0, "25031"
+    const-string/jumbo v0, "25032"
+    const-string/jumbo v0, "25033"
+    const-string/jumbo v0, "25034"
+    const-string/jumbo v0, "25035"
+    const-string/jumbo v0, "25036"
+    const-string/jumbo v0, "25037"
+    const-string/jumbo v0, "25038"
+    const-string/jumbo v0, "25039"
+    const-string/jumbo v0, "25040"
+    const-string/jumbo v0, "25041"
+    const-string/jumbo v0, "25042"
+    const-string/jumbo v0, "25043"
+    const-string/jumbo v0, "25044"
+    const-string/jumbo v0, "25045"
+    const-string/jumbo v0, "25046"
+    const-string/jumbo v0, "25047"
+    const-string/jumbo v0, "25048"
+    const-string/jumbo v0, "25049"
+    const-string/jumbo v0, "25050"
+    const-string/jumbo v0, "25051"
+    const-string/jumbo v0, "25052"
+    const-string/jumbo v0, "25053"
+    const-string/jumbo v0, "25054"
+    const-string/jumbo v0, "25055"
+    const-string/jumbo v0, "25056"
+    const-string/jumbo v0, "25057"
+    const-string/jumbo v0, "25058"
+    const-string/jumbo v0, "25059"
+    const-string/jumbo v0, "25060"
+    const-string/jumbo v0, "25061"
+    const-string/jumbo v0, "25062"
+    const-string/jumbo v0, "25063"
+    const-string/jumbo v0, "25064"
+    const-string/jumbo v0, "25065"
+    const-string/jumbo v0, "25066"
+    const-string/jumbo v0, "25067"
+    const-string/jumbo v0, "25068"
+    const-string/jumbo v0, "25069"
+    const-string/jumbo v0, "25070"
+    const-string/jumbo v0, "25071"
+    const-string/jumbo v0, "25072"
+    const-string/jumbo v0, "25073"
+    const-string/jumbo v0, "25074"
+    const-string/jumbo v0, "25075"
+    const-string/jumbo v0, "25076"
+    const-string/jumbo v0, "25077"
+    const-string/jumbo v0, "25078"
+    const-string/jumbo v0, "25079"
+    const-string/jumbo v0, "25080"
+    const-string/jumbo v0, "25081"
+    const-string/jumbo v0, "25082"
+    const-string/jumbo v0, "25083"
+    const-string/jumbo v0, "25084"
+    const-string/jumbo v0, "25085"
+    const-string/jumbo v0, "25086"
+    const-string/jumbo v0, "25087"
+    const-string/jumbo v0, "25088"
+    const-string/jumbo v0, "25089"
+    const-string/jumbo v0, "25090"
+    const-string/jumbo v0, "25091"
+    const-string/jumbo v0, "25092"
+    const-string/jumbo v0, "25093"
+    const-string/jumbo v0, "25094"
+    const-string/jumbo v0, "25095"
+    const-string/jumbo v0, "25096"
+    const-string/jumbo v0, "25097"
+    const-string/jumbo v0, "25098"
+    const-string/jumbo v0, "25099"
+    const-string/jumbo v0, "25100"
+    const-string/jumbo v0, "25101"
+    const-string/jumbo v0, "25102"
+    const-string/jumbo v0, "25103"
+    const-string/jumbo v0, "25104"
+    const-string/jumbo v0, "25105"
+    const-string/jumbo v0, "25106"
+    const-string/jumbo v0, "25107"
+    const-string/jumbo v0, "25108"
+    const-string/jumbo v0, "25109"
+    const-string/jumbo v0, "25110"
+    const-string/jumbo v0, "25111"
+    const-string/jumbo v0, "25112"
+    const-string/jumbo v0, "25113"
+    const-string/jumbo v0, "25114"
+    const-string/jumbo v0, "25115"
+    const-string/jumbo v0, "25116"
+    const-string/jumbo v0, "25117"
+    const-string/jumbo v0, "25118"
+    const-string/jumbo v0, "25119"
+    const-string/jumbo v0, "25120"
+    const-string/jumbo v0, "25121"
+    const-string/jumbo v0, "25122"
+    const-string/jumbo v0, "25123"
+    const-string/jumbo v0, "25124"
+    const-string/jumbo v0, "25125"
+    const-string/jumbo v0, "25126"
+    const-string/jumbo v0, "25127"
+    const-string/jumbo v0, "25128"
+    const-string/jumbo v0, "25129"
+    const-string/jumbo v0, "25130"
+    const-string/jumbo v0, "25131"
+    const-string/jumbo v0, "25132"
+    const-string/jumbo v0, "25133"
+    const-string/jumbo v0, "25134"
+    const-string/jumbo v0, "25135"
+    const-string/jumbo v0, "25136"
+    const-string/jumbo v0, "25137"
+    const-string/jumbo v0, "25138"
+    const-string/jumbo v0, "25139"
+    const-string/jumbo v0, "25140"
+    const-string/jumbo v0, "25141"
+    const-string/jumbo v0, "25142"
+    const-string/jumbo v0, "25143"
+    const-string/jumbo v0, "25144"
+    const-string/jumbo v0, "25145"
+    const-string/jumbo v0, "25146"
+    const-string/jumbo v0, "25147"
+    const-string/jumbo v0, "25148"
+    const-string/jumbo v0, "25149"
+    const-string/jumbo v0, "25150"
+    const-string/jumbo v0, "25151"
+    const-string/jumbo v0, "25152"
+    const-string/jumbo v0, "25153"
+    const-string/jumbo v0, "25154"
+    const-string/jumbo v0, "25155"
+    const-string/jumbo v0, "25156"
+    const-string/jumbo v0, "25157"
+    const-string/jumbo v0, "25158"
+    const-string/jumbo v0, "25159"
+    const-string/jumbo v0, "25160"
+    const-string/jumbo v0, "25161"
+    const-string/jumbo v0, "25162"
+    const-string/jumbo v0, "25163"
+    const-string/jumbo v0, "25164"
+    const-string/jumbo v0, "25165"
+    const-string/jumbo v0, "25166"
+    const-string/jumbo v0, "25167"
+    const-string/jumbo v0, "25168"
+    const-string/jumbo v0, "25169"
+    const-string/jumbo v0, "25170"
+    const-string/jumbo v0, "25171"
+    const-string/jumbo v0, "25172"
+    const-string/jumbo v0, "25173"
+    const-string/jumbo v0, "25174"
+    const-string/jumbo v0, "25175"
+    const-string/jumbo v0, "25176"
+    const-string/jumbo v0, "25177"
+    const-string/jumbo v0, "25178"
+    const-string/jumbo v0, "25179"
+    const-string/jumbo v0, "25180"
+    const-string/jumbo v0, "25181"
+    const-string/jumbo v0, "25182"
+    const-string/jumbo v0, "25183"
+    const-string/jumbo v0, "25184"
+    const-string/jumbo v0, "25185"
+    const-string/jumbo v0, "25186"
+    const-string/jumbo v0, "25187"
+    const-string/jumbo v0, "25188"
+    const-string/jumbo v0, "25189"
+    const-string/jumbo v0, "25190"
+    const-string/jumbo v0, "25191"
+    const-string/jumbo v0, "25192"
+    const-string/jumbo v0, "25193"
+    const-string/jumbo v0, "25194"
+    const-string/jumbo v0, "25195"
+    const-string/jumbo v0, "25196"
+    const-string/jumbo v0, "25197"
+    const-string/jumbo v0, "25198"
+    const-string/jumbo v0, "25199"
+    const-string/jumbo v0, "25200"
+    const-string/jumbo v0, "25201"
+    const-string/jumbo v0, "25202"
+    const-string/jumbo v0, "25203"
+    const-string/jumbo v0, "25204"
+    const-string/jumbo v0, "25205"
+    const-string/jumbo v0, "25206"
+    const-string/jumbo v0, "25207"
+    const-string/jumbo v0, "25208"
+    const-string/jumbo v0, "25209"
+    const-string/jumbo v0, "25210"
+    const-string/jumbo v0, "25211"
+    const-string/jumbo v0, "25212"
+    const-string/jumbo v0, "25213"
+    const-string/jumbo v0, "25214"
+    const-string/jumbo v0, "25215"
+    const-string/jumbo v0, "25216"
+    const-string/jumbo v0, "25217"
+    const-string/jumbo v0, "25218"
+    const-string/jumbo v0, "25219"
+    const-string/jumbo v0, "25220"
+    const-string/jumbo v0, "25221"
+    const-string/jumbo v0, "25222"
+    const-string/jumbo v0, "25223"
+    const-string/jumbo v0, "25224"
+    const-string/jumbo v0, "25225"
+    const-string/jumbo v0, "25226"
+    const-string/jumbo v0, "25227"
+    const-string/jumbo v0, "25228"
+    const-string/jumbo v0, "25229"
+    const-string/jumbo v0, "25230"
+    const-string/jumbo v0, "25231"
+    const-string/jumbo v0, "25232"
+    const-string/jumbo v0, "25233"
+    const-string/jumbo v0, "25234"
+    const-string/jumbo v0, "25235"
+    const-string/jumbo v0, "25236"
+    const-string/jumbo v0, "25237"
+    const-string/jumbo v0, "25238"
+    const-string/jumbo v0, "25239"
+    const-string/jumbo v0, "25240"
+    const-string/jumbo v0, "25241"
+    const-string/jumbo v0, "25242"
+    const-string/jumbo v0, "25243"
+    const-string/jumbo v0, "25244"
+    const-string/jumbo v0, "25245"
+    const-string/jumbo v0, "25246"
+    const-string/jumbo v0, "25247"
+    const-string/jumbo v0, "25248"
+    const-string/jumbo v0, "25249"
+    const-string/jumbo v0, "25250"
+    const-string/jumbo v0, "25251"
+    const-string/jumbo v0, "25252"
+    const-string/jumbo v0, "25253"
+    const-string/jumbo v0, "25254"
+    const-string/jumbo v0, "25255"
+    const-string/jumbo v0, "25256"
+    const-string/jumbo v0, "25257"
+    const-string/jumbo v0, "25258"
+    const-string/jumbo v0, "25259"
+    const-string/jumbo v0, "25260"
+    const-string/jumbo v0, "25261"
+    const-string/jumbo v0, "25262"
+    const-string/jumbo v0, "25263"
+    const-string/jumbo v0, "25264"
+    const-string/jumbo v0, "25265"
+    const-string/jumbo v0, "25266"
+    const-string/jumbo v0, "25267"
+    const-string/jumbo v0, "25268"
+    const-string/jumbo v0, "25269"
+    const-string/jumbo v0, "25270"
+    const-string/jumbo v0, "25271"
+    const-string/jumbo v0, "25272"
+    const-string/jumbo v0, "25273"
+    const-string/jumbo v0, "25274"
+    const-string/jumbo v0, "25275"
+    const-string/jumbo v0, "25276"
+    const-string/jumbo v0, "25277"
+    const-string/jumbo v0, "25278"
+    const-string/jumbo v0, "25279"
+    const-string/jumbo v0, "25280"
+    const-string/jumbo v0, "25281"
+    const-string/jumbo v0, "25282"
+    const-string/jumbo v0, "25283"
+    const-string/jumbo v0, "25284"
+    const-string/jumbo v0, "25285"
+    const-string/jumbo v0, "25286"
+    const-string/jumbo v0, "25287"
+    const-string/jumbo v0, "25288"
+    const-string/jumbo v0, "25289"
+    const-string/jumbo v0, "25290"
+    const-string/jumbo v0, "25291"
+    const-string/jumbo v0, "25292"
+    const-string/jumbo v0, "25293"
+    const-string/jumbo v0, "25294"
+    const-string/jumbo v0, "25295"
+    const-string/jumbo v0, "25296"
+    const-string/jumbo v0, "25297"
+    const-string/jumbo v0, "25298"
+    const-string/jumbo v0, "25299"
+    const-string/jumbo v0, "25300"
+    const-string/jumbo v0, "25301"
+    const-string/jumbo v0, "25302"
+    const-string/jumbo v0, "25303"
+    const-string/jumbo v0, "25304"
+    const-string/jumbo v0, "25305"
+    const-string/jumbo v0, "25306"
+    const-string/jumbo v0, "25307"
+    const-string/jumbo v0, "25308"
+    const-string/jumbo v0, "25309"
+    const-string/jumbo v0, "25310"
+    const-string/jumbo v0, "25311"
+    const-string/jumbo v0, "25312"
+    const-string/jumbo v0, "25313"
+    const-string/jumbo v0, "25314"
+    const-string/jumbo v0, "25315"
+    const-string/jumbo v0, "25316"
+    const-string/jumbo v0, "25317"
+    const-string/jumbo v0, "25318"
+    const-string/jumbo v0, "25319"
+    const-string/jumbo v0, "25320"
+    const-string/jumbo v0, "25321"
+    const-string/jumbo v0, "25322"
+    const-string/jumbo v0, "25323"
+    const-string/jumbo v0, "25324"
+    const-string/jumbo v0, "25325"
+    const-string/jumbo v0, "25326"
+    const-string/jumbo v0, "25327"
+    const-string/jumbo v0, "25328"
+    const-string/jumbo v0, "25329"
+    const-string/jumbo v0, "25330"
+    const-string/jumbo v0, "25331"
+    const-string/jumbo v0, "25332"
+    const-string/jumbo v0, "25333"
+    const-string/jumbo v0, "25334"
+    const-string/jumbo v0, "25335"
+    const-string/jumbo v0, "25336"
+    const-string/jumbo v0, "25337"
+    const-string/jumbo v0, "25338"
+    const-string/jumbo v0, "25339"
+    const-string/jumbo v0, "25340"
+    const-string/jumbo v0, "25341"
+    const-string/jumbo v0, "25342"
+    const-string/jumbo v0, "25343"
+    const-string/jumbo v0, "25344"
+    const-string/jumbo v0, "25345"
+    const-string/jumbo v0, "25346"
+    const-string/jumbo v0, "25347"
+    const-string/jumbo v0, "25348"
+    const-string/jumbo v0, "25349"
+    const-string/jumbo v0, "25350"
+    const-string/jumbo v0, "25351"
+    const-string/jumbo v0, "25352"
+    const-string/jumbo v0, "25353"
+    const-string/jumbo v0, "25354"
+    const-string/jumbo v0, "25355"
+    const-string/jumbo v0, "25356"
+    const-string/jumbo v0, "25357"
+    const-string/jumbo v0, "25358"
+    const-string/jumbo v0, "25359"
+    const-string/jumbo v0, "25360"
+    const-string/jumbo v0, "25361"
+    const-string/jumbo v0, "25362"
+    const-string/jumbo v0, "25363"
+    const-string/jumbo v0, "25364"
+    const-string/jumbo v0, "25365"
+    const-string/jumbo v0, "25366"
+    const-string/jumbo v0, "25367"
+    const-string/jumbo v0, "25368"
+    const-string/jumbo v0, "25369"
+    const-string/jumbo v0, "25370"
+    const-string/jumbo v0, "25371"
+    const-string/jumbo v0, "25372"
+    const-string/jumbo v0, "25373"
+    const-string/jumbo v0, "25374"
+    const-string/jumbo v0, "25375"
+    const-string/jumbo v0, "25376"
+    const-string/jumbo v0, "25377"
+    const-string/jumbo v0, "25378"
+    const-string/jumbo v0, "25379"
+    const-string/jumbo v0, "25380"
+    const-string/jumbo v0, "25381"
+    const-string/jumbo v0, "25382"
+    const-string/jumbo v0, "25383"
+    const-string/jumbo v0, "25384"
+    const-string/jumbo v0, "25385"
+    const-string/jumbo v0, "25386"
+    const-string/jumbo v0, "25387"
+    const-string/jumbo v0, "25388"
+    const-string/jumbo v0, "25389"
+    const-string/jumbo v0, "25390"
+    const-string/jumbo v0, "25391"
+    const-string/jumbo v0, "25392"
+    const-string/jumbo v0, "25393"
+    const-string/jumbo v0, "25394"
+    const-string/jumbo v0, "25395"
+    const-string/jumbo v0, "25396"
+    const-string/jumbo v0, "25397"
+    const-string/jumbo v0, "25398"
+    const-string/jumbo v0, "25399"
+    const-string/jumbo v0, "25400"
+    const-string/jumbo v0, "25401"
+    const-string/jumbo v0, "25402"
+    const-string/jumbo v0, "25403"
+    const-string/jumbo v0, "25404"
+    const-string/jumbo v0, "25405"
+    const-string/jumbo v0, "25406"
+    const-string/jumbo v0, "25407"
+    const-string/jumbo v0, "25408"
+    const-string/jumbo v0, "25409"
+    const-string/jumbo v0, "25410"
+    const-string/jumbo v0, "25411"
+    const-string/jumbo v0, "25412"
+    const-string/jumbo v0, "25413"
+    const-string/jumbo v0, "25414"
+    const-string/jumbo v0, "25415"
+    const-string/jumbo v0, "25416"
+    const-string/jumbo v0, "25417"
+    const-string/jumbo v0, "25418"
+    const-string/jumbo v0, "25419"
+    const-string/jumbo v0, "25420"
+    const-string/jumbo v0, "25421"
+    const-string/jumbo v0, "25422"
+    const-string/jumbo v0, "25423"
+    const-string/jumbo v0, "25424"
+    const-string/jumbo v0, "25425"
+    const-string/jumbo v0, "25426"
+    const-string/jumbo v0, "25427"
+    const-string/jumbo v0, "25428"
+    const-string/jumbo v0, "25429"
+    const-string/jumbo v0, "25430"
+    const-string/jumbo v0, "25431"
+    const-string/jumbo v0, "25432"
+    const-string/jumbo v0, "25433"
+    const-string/jumbo v0, "25434"
+    const-string/jumbo v0, "25435"
+    const-string/jumbo v0, "25436"
+    const-string/jumbo v0, "25437"
+    const-string/jumbo v0, "25438"
+    const-string/jumbo v0, "25439"
+    const-string/jumbo v0, "25440"
+    const-string/jumbo v0, "25441"
+    const-string/jumbo v0, "25442"
+    const-string/jumbo v0, "25443"
+    const-string/jumbo v0, "25444"
+    const-string/jumbo v0, "25445"
+    const-string/jumbo v0, "25446"
+    const-string/jumbo v0, "25447"
+    const-string/jumbo v0, "25448"
+    const-string/jumbo v0, "25449"
+    const-string/jumbo v0, "25450"
+    const-string/jumbo v0, "25451"
+    const-string/jumbo v0, "25452"
+    const-string/jumbo v0, "25453"
+    const-string/jumbo v0, "25454"
+    const-string/jumbo v0, "25455"
+    const-string/jumbo v0, "25456"
+    const-string/jumbo v0, "25457"
+    const-string/jumbo v0, "25458"
+    const-string/jumbo v0, "25459"
+    const-string/jumbo v0, "25460"
+    const-string/jumbo v0, "25461"
+    const-string/jumbo v0, "25462"
+    const-string/jumbo v0, "25463"
+    const-string/jumbo v0, "25464"
+    const-string/jumbo v0, "25465"
+    const-string/jumbo v0, "25466"
+    const-string/jumbo v0, "25467"
+    const-string/jumbo v0, "25468"
+    const-string/jumbo v0, "25469"
+    const-string/jumbo v0, "25470"
+    const-string/jumbo v0, "25471"
+    const-string/jumbo v0, "25472"
+    const-string/jumbo v0, "25473"
+    const-string/jumbo v0, "25474"
+    const-string/jumbo v0, "25475"
+    const-string/jumbo v0, "25476"
+    const-string/jumbo v0, "25477"
+    const-string/jumbo v0, "25478"
+    const-string/jumbo v0, "25479"
+    const-string/jumbo v0, "25480"
+    const-string/jumbo v0, "25481"
+    const-string/jumbo v0, "25482"
+    const-string/jumbo v0, "25483"
+    const-string/jumbo v0, "25484"
+    const-string/jumbo v0, "25485"
+    const-string/jumbo v0, "25486"
+    const-string/jumbo v0, "25487"
+    const-string/jumbo v0, "25488"
+    const-string/jumbo v0, "25489"
+    const-string/jumbo v0, "25490"
+    const-string/jumbo v0, "25491"
+    const-string/jumbo v0, "25492"
+    const-string/jumbo v0, "25493"
+    const-string/jumbo v0, "25494"
+    const-string/jumbo v0, "25495"
+    const-string/jumbo v0, "25496"
+    const-string/jumbo v0, "25497"
+    const-string/jumbo v0, "25498"
+    const-string/jumbo v0, "25499"
+    const-string/jumbo v0, "25500"
+    const-string/jumbo v0, "25501"
+    const-string/jumbo v0, "25502"
+    const-string/jumbo v0, "25503"
+    const-string/jumbo v0, "25504"
+    const-string/jumbo v0, "25505"
+    const-string/jumbo v0, "25506"
+    const-string/jumbo v0, "25507"
+    const-string/jumbo v0, "25508"
+    const-string/jumbo v0, "25509"
+    const-string/jumbo v0, "25510"
+    const-string/jumbo v0, "25511"
+    const-string/jumbo v0, "25512"
+    const-string/jumbo v0, "25513"
+    const-string/jumbo v0, "25514"
+    const-string/jumbo v0, "25515"
+    const-string/jumbo v0, "25516"
+    const-string/jumbo v0, "25517"
+    const-string/jumbo v0, "25518"
+    const-string/jumbo v0, "25519"
+    const-string/jumbo v0, "25520"
+    const-string/jumbo v0, "25521"
+    const-string/jumbo v0, "25522"
+    const-string/jumbo v0, "25523"
+    const-string/jumbo v0, "25524"
+    const-string/jumbo v0, "25525"
+    const-string/jumbo v0, "25526"
+    const-string/jumbo v0, "25527"
+    const-string/jumbo v0, "25528"
+    const-string/jumbo v0, "25529"
+    const-string/jumbo v0, "25530"
+    const-string/jumbo v0, "25531"
+    const-string/jumbo v0, "25532"
+    const-string/jumbo v0, "25533"
+    const-string/jumbo v0, "25534"
+    const-string/jumbo v0, "25535"
+    const-string/jumbo v0, "25536"
+    const-string/jumbo v0, "25537"
+    const-string/jumbo v0, "25538"
+    const-string/jumbo v0, "25539"
+    const-string/jumbo v0, "25540"
+    const-string/jumbo v0, "25541"
+    const-string/jumbo v0, "25542"
+    const-string/jumbo v0, "25543"
+    const-string/jumbo v0, "25544"
+    const-string/jumbo v0, "25545"
+    const-string/jumbo v0, "25546"
+    const-string/jumbo v0, "25547"
+    const-string/jumbo v0, "25548"
+    const-string/jumbo v0, "25549"
+    const-string/jumbo v0, "25550"
+    const-string/jumbo v0, "25551"
+    const-string/jumbo v0, "25552"
+    const-string/jumbo v0, "25553"
+    const-string/jumbo v0, "25554"
+    const-string/jumbo v0, "25555"
+    const-string/jumbo v0, "25556"
+    const-string/jumbo v0, "25557"
+    const-string/jumbo v0, "25558"
+    const-string/jumbo v0, "25559"
+    const-string/jumbo v0, "25560"
+    const-string/jumbo v0, "25561"
+    const-string/jumbo v0, "25562"
+    const-string/jumbo v0, "25563"
+    const-string/jumbo v0, "25564"
+    const-string/jumbo v0, "25565"
+    const-string/jumbo v0, "25566"
+    const-string/jumbo v0, "25567"
+    const-string/jumbo v0, "25568"
+    const-string/jumbo v0, "25569"
+    const-string/jumbo v0, "25570"
+    const-string/jumbo v0, "25571"
+    const-string/jumbo v0, "25572"
+    const-string/jumbo v0, "25573"
+    const-string/jumbo v0, "25574"
+    const-string/jumbo v0, "25575"
+    const-string/jumbo v0, "25576"
+    const-string/jumbo v0, "25577"
+    const-string/jumbo v0, "25578"
+    const-string/jumbo v0, "25579"
+    const-string/jumbo v0, "25580"
+    const-string/jumbo v0, "25581"
+    const-string/jumbo v0, "25582"
+    const-string/jumbo v0, "25583"
+    const-string/jumbo v0, "25584"
+    const-string/jumbo v0, "25585"
+    const-string/jumbo v0, "25586"
+    const-string/jumbo v0, "25587"
+    const-string/jumbo v0, "25588"
+    const-string/jumbo v0, "25589"
+    const-string/jumbo v0, "25590"
+    const-string/jumbo v0, "25591"
+    const-string/jumbo v0, "25592"
+    const-string/jumbo v0, "25593"
+    const-string/jumbo v0, "25594"
+    const-string/jumbo v0, "25595"
+    const-string/jumbo v0, "25596"
+    const-string/jumbo v0, "25597"
+    const-string/jumbo v0, "25598"
+    const-string/jumbo v0, "25599"
+    const-string/jumbo v0, "25600"
+    const-string/jumbo v0, "25601"
+    const-string/jumbo v0, "25602"
+    const-string/jumbo v0, "25603"
+    const-string/jumbo v0, "25604"
+    const-string/jumbo v0, "25605"
+    const-string/jumbo v0, "25606"
+    const-string/jumbo v0, "25607"
+    const-string/jumbo v0, "25608"
+    const-string/jumbo v0, "25609"
+    const-string/jumbo v0, "25610"
+    const-string/jumbo v0, "25611"
+    const-string/jumbo v0, "25612"
+    const-string/jumbo v0, "25613"
+    const-string/jumbo v0, "25614"
+    const-string/jumbo v0, "25615"
+    const-string/jumbo v0, "25616"
+    const-string/jumbo v0, "25617"
+    const-string/jumbo v0, "25618"
+    const-string/jumbo v0, "25619"
+    const-string/jumbo v0, "25620"
+    const-string/jumbo v0, "25621"
+    const-string/jumbo v0, "25622"
+    const-string/jumbo v0, "25623"
+    const-string/jumbo v0, "25624"
+    const-string/jumbo v0, "25625"
+    const-string/jumbo v0, "25626"
+    const-string/jumbo v0, "25627"
+    const-string/jumbo v0, "25628"
+    const-string/jumbo v0, "25629"
+    const-string/jumbo v0, "25630"
+    const-string/jumbo v0, "25631"
+    const-string/jumbo v0, "25632"
+    const-string/jumbo v0, "25633"
+    const-string/jumbo v0, "25634"
+    const-string/jumbo v0, "25635"
+    const-string/jumbo v0, "25636"
+    const-string/jumbo v0, "25637"
+    const-string/jumbo v0, "25638"
+    const-string/jumbo v0, "25639"
+    const-string/jumbo v0, "25640"
+    const-string/jumbo v0, "25641"
+    const-string/jumbo v0, "25642"
+    const-string/jumbo v0, "25643"
+    const-string/jumbo v0, "25644"
+    const-string/jumbo v0, "25645"
+    const-string/jumbo v0, "25646"
+    const-string/jumbo v0, "25647"
+    const-string/jumbo v0, "25648"
+    const-string/jumbo v0, "25649"
+    const-string/jumbo v0, "25650"
+    const-string/jumbo v0, "25651"
+    const-string/jumbo v0, "25652"
+    const-string/jumbo v0, "25653"
+    const-string/jumbo v0, "25654"
+    const-string/jumbo v0, "25655"
+    const-string/jumbo v0, "25656"
+    const-string/jumbo v0, "25657"
+    const-string/jumbo v0, "25658"
+    const-string/jumbo v0, "25659"
+    const-string/jumbo v0, "25660"
+    const-string/jumbo v0, "25661"
+    const-string/jumbo v0, "25662"
+    const-string/jumbo v0, "25663"
+    const-string/jumbo v0, "25664"
+    const-string/jumbo v0, "25665"
+    const-string/jumbo v0, "25666"
+    const-string/jumbo v0, "25667"
+    const-string/jumbo v0, "25668"
+    const-string/jumbo v0, "25669"
+    const-string/jumbo v0, "25670"
+    const-string/jumbo v0, "25671"
+    const-string/jumbo v0, "25672"
+    const-string/jumbo v0, "25673"
+    const-string/jumbo v0, "25674"
+    const-string/jumbo v0, "25675"
+    const-string/jumbo v0, "25676"
+    const-string/jumbo v0, "25677"
+    const-string/jumbo v0, "25678"
+    const-string/jumbo v0, "25679"
+    const-string/jumbo v0, "25680"
+    const-string/jumbo v0, "25681"
+    const-string/jumbo v0, "25682"
+    const-string/jumbo v0, "25683"
+    const-string/jumbo v0, "25684"
+    const-string/jumbo v0, "25685"
+    const-string/jumbo v0, "25686"
+    const-string/jumbo v0, "25687"
+    const-string/jumbo v0, "25688"
+    const-string/jumbo v0, "25689"
+    const-string/jumbo v0, "25690"
+    const-string/jumbo v0, "25691"
+    const-string/jumbo v0, "25692"
+    const-string/jumbo v0, "25693"
+    const-string/jumbo v0, "25694"
+    const-string/jumbo v0, "25695"
+    const-string/jumbo v0, "25696"
+    const-string/jumbo v0, "25697"
+    const-string/jumbo v0, "25698"
+    const-string/jumbo v0, "25699"
+    const-string/jumbo v0, "25700"
+    const-string/jumbo v0, "25701"
+    const-string/jumbo v0, "25702"
+    const-string/jumbo v0, "25703"
+    const-string/jumbo v0, "25704"
+    const-string/jumbo v0, "25705"
+    const-string/jumbo v0, "25706"
+    const-string/jumbo v0, "25707"
+    const-string/jumbo v0, "25708"
+    const-string/jumbo v0, "25709"
+    const-string/jumbo v0, "25710"
+    const-string/jumbo v0, "25711"
+    const-string/jumbo v0, "25712"
+    const-string/jumbo v0, "25713"
+    const-string/jumbo v0, "25714"
+    const-string/jumbo v0, "25715"
+    const-string/jumbo v0, "25716"
+    const-string/jumbo v0, "25717"
+    const-string/jumbo v0, "25718"
+    const-string/jumbo v0, "25719"
+    const-string/jumbo v0, "25720"
+    const-string/jumbo v0, "25721"
+    const-string/jumbo v0, "25722"
+    const-string/jumbo v0, "25723"
+    const-string/jumbo v0, "25724"
+    const-string/jumbo v0, "25725"
+    const-string/jumbo v0, "25726"
+    const-string/jumbo v0, "25727"
+    const-string/jumbo v0, "25728"
+    const-string/jumbo v0, "25729"
+    const-string/jumbo v0, "25730"
+    const-string/jumbo v0, "25731"
+    const-string/jumbo v0, "25732"
+    const-string/jumbo v0, "25733"
+    const-string/jumbo v0, "25734"
+    const-string/jumbo v0, "25735"
+    const-string/jumbo v0, "25736"
+    const-string/jumbo v0, "25737"
+    const-string/jumbo v0, "25738"
+    const-string/jumbo v0, "25739"
+    const-string/jumbo v0, "25740"
+    const-string/jumbo v0, "25741"
+    const-string/jumbo v0, "25742"
+    const-string/jumbo v0, "25743"
+    const-string/jumbo v0, "25744"
+    const-string/jumbo v0, "25745"
+    const-string/jumbo v0, "25746"
+    const-string/jumbo v0, "25747"
+    const-string/jumbo v0, "25748"
+    const-string/jumbo v0, "25749"
+    const-string/jumbo v0, "25750"
+    const-string/jumbo v0, "25751"
+    const-string/jumbo v0, "25752"
+    const-string/jumbo v0, "25753"
+    const-string/jumbo v0, "25754"
+    const-string/jumbo v0, "25755"
+    const-string/jumbo v0, "25756"
+    const-string/jumbo v0, "25757"
+    const-string/jumbo v0, "25758"
+    const-string/jumbo v0, "25759"
+    const-string/jumbo v0, "25760"
+    const-string/jumbo v0, "25761"
+    const-string/jumbo v0, "25762"
+    const-string/jumbo v0, "25763"
+    const-string/jumbo v0, "25764"
+    const-string/jumbo v0, "25765"
+    const-string/jumbo v0, "25766"
+    const-string/jumbo v0, "25767"
+    const-string/jumbo v0, "25768"
+    const-string/jumbo v0, "25769"
+    const-string/jumbo v0, "25770"
+    const-string/jumbo v0, "25771"
+    const-string/jumbo v0, "25772"
+    const-string/jumbo v0, "25773"
+    const-string/jumbo v0, "25774"
+    const-string/jumbo v0, "25775"
+    const-string/jumbo v0, "25776"
+    const-string/jumbo v0, "25777"
+    const-string/jumbo v0, "25778"
+    const-string/jumbo v0, "25779"
+    const-string/jumbo v0, "25780"
+    const-string/jumbo v0, "25781"
+    const-string/jumbo v0, "25782"
+    const-string/jumbo v0, "25783"
+    const-string/jumbo v0, "25784"
+    const-string/jumbo v0, "25785"
+    const-string/jumbo v0, "25786"
+    const-string/jumbo v0, "25787"
+    const-string/jumbo v0, "25788"
+    const-string/jumbo v0, "25789"
+    const-string/jumbo v0, "25790"
+    const-string/jumbo v0, "25791"
+    const-string/jumbo v0, "25792"
+    const-string/jumbo v0, "25793"
+    const-string/jumbo v0, "25794"
+    const-string/jumbo v0, "25795"
+    const-string/jumbo v0, "25796"
+    const-string/jumbo v0, "25797"
+    const-string/jumbo v0, "25798"
+    const-string/jumbo v0, "25799"
+    const-string/jumbo v0, "25800"
+    const-string/jumbo v0, "25801"
+    const-string/jumbo v0, "25802"
+    const-string/jumbo v0, "25803"
+    const-string/jumbo v0, "25804"
+    const-string/jumbo v0, "25805"
+    const-string/jumbo v0, "25806"
+    const-string/jumbo v0, "25807"
+    const-string/jumbo v0, "25808"
+    const-string/jumbo v0, "25809"
+    const-string/jumbo v0, "25810"
+    const-string/jumbo v0, "25811"
+    const-string/jumbo v0, "25812"
+    const-string/jumbo v0, "25813"
+    const-string/jumbo v0, "25814"
+    const-string/jumbo v0, "25815"
+    const-string/jumbo v0, "25816"
+    const-string/jumbo v0, "25817"
+    const-string/jumbo v0, "25818"
+    const-string/jumbo v0, "25819"
+    const-string/jumbo v0, "25820"
+    const-string/jumbo v0, "25821"
+    const-string/jumbo v0, "25822"
+    const-string/jumbo v0, "25823"
+    const-string/jumbo v0, "25824"
+    const-string/jumbo v0, "25825"
+    const-string/jumbo v0, "25826"
+    const-string/jumbo v0, "25827"
+    const-string/jumbo v0, "25828"
+    const-string/jumbo v0, "25829"
+    const-string/jumbo v0, "25830"
+    const-string/jumbo v0, "25831"
+    const-string/jumbo v0, "25832"
+    const-string/jumbo v0, "25833"
+    const-string/jumbo v0, "25834"
+    const-string/jumbo v0, "25835"
+    const-string/jumbo v0, "25836"
+    const-string/jumbo v0, "25837"
+    const-string/jumbo v0, "25838"
+    const-string/jumbo v0, "25839"
+    const-string/jumbo v0, "25840"
+    const-string/jumbo v0, "25841"
+    const-string/jumbo v0, "25842"
+    const-string/jumbo v0, "25843"
+    const-string/jumbo v0, "25844"
+    const-string/jumbo v0, "25845"
+    const-string/jumbo v0, "25846"
+    const-string/jumbo v0, "25847"
+    const-string/jumbo v0, "25848"
+    const-string/jumbo v0, "25849"
+    const-string/jumbo v0, "25850"
+    const-string/jumbo v0, "25851"
+    const-string/jumbo v0, "25852"
+    const-string/jumbo v0, "25853"
+    const-string/jumbo v0, "25854"
+    const-string/jumbo v0, "25855"
+    const-string/jumbo v0, "25856"
+    const-string/jumbo v0, "25857"
+    const-string/jumbo v0, "25858"
+    const-string/jumbo v0, "25859"
+    const-string/jumbo v0, "25860"
+    const-string/jumbo v0, "25861"
+    const-string/jumbo v0, "25862"
+    const-string/jumbo v0, "25863"
+    const-string/jumbo v0, "25864"
+    const-string/jumbo v0, "25865"
+    const-string/jumbo v0, "25866"
+    const-string/jumbo v0, "25867"
+    const-string/jumbo v0, "25868"
+    const-string/jumbo v0, "25869"
+    const-string/jumbo v0, "25870"
+    const-string/jumbo v0, "25871"
+    const-string/jumbo v0, "25872"
+    const-string/jumbo v0, "25873"
+    const-string/jumbo v0, "25874"
+    const-string/jumbo v0, "25875"
+    const-string/jumbo v0, "25876"
+    const-string/jumbo v0, "25877"
+    const-string/jumbo v0, "25878"
+    const-string/jumbo v0, "25879"
+    const-string/jumbo v0, "25880"
+    const-string/jumbo v0, "25881"
+    const-string/jumbo v0, "25882"
+    const-string/jumbo v0, "25883"
+    const-string/jumbo v0, "25884"
+    const-string/jumbo v0, "25885"
+    const-string/jumbo v0, "25886"
+    const-string/jumbo v0, "25887"
+    const-string/jumbo v0, "25888"
+    const-string/jumbo v0, "25889"
+    const-string/jumbo v0, "25890"
+    const-string/jumbo v0, "25891"
+    const-string/jumbo v0, "25892"
+    const-string/jumbo v0, "25893"
+    const-string/jumbo v0, "25894"
+    const-string/jumbo v0, "25895"
+    const-string/jumbo v0, "25896"
+    const-string/jumbo v0, "25897"
+    const-string/jumbo v0, "25898"
+    const-string/jumbo v0, "25899"
+    const-string/jumbo v0, "25900"
+    const-string/jumbo v0, "25901"
+    const-string/jumbo v0, "25902"
+    const-string/jumbo v0, "25903"
+    const-string/jumbo v0, "25904"
+    const-string/jumbo v0, "25905"
+    const-string/jumbo v0, "25906"
+    const-string/jumbo v0, "25907"
+    const-string/jumbo v0, "25908"
+    const-string/jumbo v0, "25909"
+    const-string/jumbo v0, "25910"
+    const-string/jumbo v0, "25911"
+    const-string/jumbo v0, "25912"
+    const-string/jumbo v0, "25913"
+    const-string/jumbo v0, "25914"
+    const-string/jumbo v0, "25915"
+    const-string/jumbo v0, "25916"
+    const-string/jumbo v0, "25917"
+    const-string/jumbo v0, "25918"
+    const-string/jumbo v0, "25919"
+    const-string/jumbo v0, "25920"
+    const-string/jumbo v0, "25921"
+    const-string/jumbo v0, "25922"
+    const-string/jumbo v0, "25923"
+    const-string/jumbo v0, "25924"
+    const-string/jumbo v0, "25925"
+    const-string/jumbo v0, "25926"
+    const-string/jumbo v0, "25927"
+    const-string/jumbo v0, "25928"
+    const-string/jumbo v0, "25929"
+    const-string/jumbo v0, "25930"
+    const-string/jumbo v0, "25931"
+    const-string/jumbo v0, "25932"
+    const-string/jumbo v0, "25933"
+    const-string/jumbo v0, "25934"
+    const-string/jumbo v0, "25935"
+    const-string/jumbo v0, "25936"
+    const-string/jumbo v0, "25937"
+    const-string/jumbo v0, "25938"
+    const-string/jumbo v0, "25939"
+    const-string/jumbo v0, "25940"
+    const-string/jumbo v0, "25941"
+    const-string/jumbo v0, "25942"
+    const-string/jumbo v0, "25943"
+    const-string/jumbo v0, "25944"
+    const-string/jumbo v0, "25945"
+    const-string/jumbo v0, "25946"
+    const-string/jumbo v0, "25947"
+    const-string/jumbo v0, "25948"
+    const-string/jumbo v0, "25949"
+    const-string/jumbo v0, "25950"
+    const-string/jumbo v0, "25951"
+    const-string/jumbo v0, "25952"
+    const-string/jumbo v0, "25953"
+    const-string/jumbo v0, "25954"
+    const-string/jumbo v0, "25955"
+    const-string/jumbo v0, "25956"
+    const-string/jumbo v0, "25957"
+    const-string/jumbo v0, "25958"
+    const-string/jumbo v0, "25959"
+    const-string/jumbo v0, "25960"
+    const-string/jumbo v0, "25961"
+    const-string/jumbo v0, "25962"
+    const-string/jumbo v0, "25963"
+    const-string/jumbo v0, "25964"
+    const-string/jumbo v0, "25965"
+    const-string/jumbo v0, "25966"
+    const-string/jumbo v0, "25967"
+    const-string/jumbo v0, "25968"
+    const-string/jumbo v0, "25969"
+    const-string/jumbo v0, "25970"
+    const-string/jumbo v0, "25971"
+    const-string/jumbo v0, "25972"
+    const-string/jumbo v0, "25973"
+    const-string/jumbo v0, "25974"
+    const-string/jumbo v0, "25975"
+    const-string/jumbo v0, "25976"
+    const-string/jumbo v0, "25977"
+    const-string/jumbo v0, "25978"
+    const-string/jumbo v0, "25979"
+    const-string/jumbo v0, "25980"
+    const-string/jumbo v0, "25981"
+    const-string/jumbo v0, "25982"
+    const-string/jumbo v0, "25983"
+    const-string/jumbo v0, "25984"
+    const-string/jumbo v0, "25985"
+    const-string/jumbo v0, "25986"
+    const-string/jumbo v0, "25987"
+    const-string/jumbo v0, "25988"
+    const-string/jumbo v0, "25989"
+    const-string/jumbo v0, "25990"
+    const-string/jumbo v0, "25991"
+    const-string/jumbo v0, "25992"
+    const-string/jumbo v0, "25993"
+    const-string/jumbo v0, "25994"
+    const-string/jumbo v0, "25995"
+    const-string/jumbo v0, "25996"
+    const-string/jumbo v0, "25997"
+    const-string/jumbo v0, "25998"
+    const-string/jumbo v0, "25999"
+    const-string/jumbo v0, "26000"
+    const-string/jumbo v0, "26001"
+    const-string/jumbo v0, "26002"
+    const-string/jumbo v0, "26003"
+    const-string/jumbo v0, "26004"
+    const-string/jumbo v0, "26005"
+    const-string/jumbo v0, "26006"
+    const-string/jumbo v0, "26007"
+    const-string/jumbo v0, "26008"
+    const-string/jumbo v0, "26009"
+    const-string/jumbo v0, "26010"
+    const-string/jumbo v0, "26011"
+    const-string/jumbo v0, "26012"
+    const-string/jumbo v0, "26013"
+    const-string/jumbo v0, "26014"
+    const-string/jumbo v0, "26015"
+    const-string/jumbo v0, "26016"
+    const-string/jumbo v0, "26017"
+    const-string/jumbo v0, "26018"
+    const-string/jumbo v0, "26019"
+    const-string/jumbo v0, "26020"
+    const-string/jumbo v0, "26021"
+    const-string/jumbo v0, "26022"
+    const-string/jumbo v0, "26023"
+    const-string/jumbo v0, "26024"
+    const-string/jumbo v0, "26025"
+    const-string/jumbo v0, "26026"
+    const-string/jumbo v0, "26027"
+    const-string/jumbo v0, "26028"
+    const-string/jumbo v0, "26029"
+    const-string/jumbo v0, "26030"
+    const-string/jumbo v0, "26031"
+    const-string/jumbo v0, "26032"
+    const-string/jumbo v0, "26033"
+    const-string/jumbo v0, "26034"
+    const-string/jumbo v0, "26035"
+    const-string/jumbo v0, "26036"
+    const-string/jumbo v0, "26037"
+    const-string/jumbo v0, "26038"
+    const-string/jumbo v0, "26039"
+    const-string/jumbo v0, "26040"
+    const-string/jumbo v0, "26041"
+    const-string/jumbo v0, "26042"
+    const-string/jumbo v0, "26043"
+    const-string/jumbo v0, "26044"
+    const-string/jumbo v0, "26045"
+    const-string/jumbo v0, "26046"
+    const-string/jumbo v0, "26047"
+    const-string/jumbo v0, "26048"
+    const-string/jumbo v0, "26049"
+    const-string/jumbo v0, "26050"
+    const-string/jumbo v0, "26051"
+    const-string/jumbo v0, "26052"
+    const-string/jumbo v0, "26053"
+    const-string/jumbo v0, "26054"
+    const-string/jumbo v0, "26055"
+    const-string/jumbo v0, "26056"
+    const-string/jumbo v0, "26057"
+    const-string/jumbo v0, "26058"
+    const-string/jumbo v0, "26059"
+    const-string/jumbo v0, "26060"
+    const-string/jumbo v0, "26061"
+    const-string/jumbo v0, "26062"
+    const-string/jumbo v0, "26063"
+    const-string/jumbo v0, "26064"
+    const-string/jumbo v0, "26065"
+    const-string/jumbo v0, "26066"
+    const-string/jumbo v0, "26067"
+    const-string/jumbo v0, "26068"
+    const-string/jumbo v0, "26069"
+    const-string/jumbo v0, "26070"
+    const-string/jumbo v0, "26071"
+    const-string/jumbo v0, "26072"
+    const-string/jumbo v0, "26073"
+    const-string/jumbo v0, "26074"
+    const-string/jumbo v0, "26075"
+    const-string/jumbo v0, "26076"
+    const-string/jumbo v0, "26077"
+    const-string/jumbo v0, "26078"
+    const-string/jumbo v0, "26079"
+    const-string/jumbo v0, "26080"
+    const-string/jumbo v0, "26081"
+    const-string/jumbo v0, "26082"
+    const-string/jumbo v0, "26083"
+    const-string/jumbo v0, "26084"
+    const-string/jumbo v0, "26085"
+    const-string/jumbo v0, "26086"
+    const-string/jumbo v0, "26087"
+    const-string/jumbo v0, "26088"
+    const-string/jumbo v0, "26089"
+    const-string/jumbo v0, "26090"
+    const-string/jumbo v0, "26091"
+    const-string/jumbo v0, "26092"
+    const-string/jumbo v0, "26093"
+    const-string/jumbo v0, "26094"
+    const-string/jumbo v0, "26095"
+    const-string/jumbo v0, "26096"
+    const-string/jumbo v0, "26097"
+    const-string/jumbo v0, "26098"
+    const-string/jumbo v0, "26099"
+    const-string/jumbo v0, "26100"
+    const-string/jumbo v0, "26101"
+    const-string/jumbo v0, "26102"
+    const-string/jumbo v0, "26103"
+    const-string/jumbo v0, "26104"
+    const-string/jumbo v0, "26105"
+    const-string/jumbo v0, "26106"
+    const-string/jumbo v0, "26107"
+    const-string/jumbo v0, "26108"
+    const-string/jumbo v0, "26109"
+    const-string/jumbo v0, "26110"
+    const-string/jumbo v0, "26111"
+    const-string/jumbo v0, "26112"
+    const-string/jumbo v0, "26113"
+    const-string/jumbo v0, "26114"
+    const-string/jumbo v0, "26115"
+    const-string/jumbo v0, "26116"
+    const-string/jumbo v0, "26117"
+    const-string/jumbo v0, "26118"
+    const-string/jumbo v0, "26119"
+    const-string/jumbo v0, "26120"
+    const-string/jumbo v0, "26121"
+    const-string/jumbo v0, "26122"
+    const-string/jumbo v0, "26123"
+    const-string/jumbo v0, "26124"
+    const-string/jumbo v0, "26125"
+    const-string/jumbo v0, "26126"
+    const-string/jumbo v0, "26127"
+    const-string/jumbo v0, "26128"
+    const-string/jumbo v0, "26129"
+    const-string/jumbo v0, "26130"
+    const-string/jumbo v0, "26131"
+    const-string/jumbo v0, "26132"
+    const-string/jumbo v0, "26133"
+    const-string/jumbo v0, "26134"
+    const-string/jumbo v0, "26135"
+    const-string/jumbo v0, "26136"
+    const-string/jumbo v0, "26137"
+    const-string/jumbo v0, "26138"
+    const-string/jumbo v0, "26139"
+    const-string/jumbo v0, "26140"
+    const-string/jumbo v0, "26141"
+    const-string/jumbo v0, "26142"
+    const-string/jumbo v0, "26143"
+    const-string/jumbo v0, "26144"
+    const-string/jumbo v0, "26145"
+    const-string/jumbo v0, "26146"
+    const-string/jumbo v0, "26147"
+    const-string/jumbo v0, "26148"
+    const-string/jumbo v0, "26149"
+    const-string/jumbo v0, "26150"
+    const-string/jumbo v0, "26151"
+    const-string/jumbo v0, "26152"
+    const-string/jumbo v0, "26153"
+    const-string/jumbo v0, "26154"
+    const-string/jumbo v0, "26155"
+    const-string/jumbo v0, "26156"
+    const-string/jumbo v0, "26157"
+    const-string/jumbo v0, "26158"
+    const-string/jumbo v0, "26159"
+    const-string/jumbo v0, "26160"
+    const-string/jumbo v0, "26161"
+    const-string/jumbo v0, "26162"
+    const-string/jumbo v0, "26163"
+    const-string/jumbo v0, "26164"
+    const-string/jumbo v0, "26165"
+    const-string/jumbo v0, "26166"
+    const-string/jumbo v0, "26167"
+    const-string/jumbo v0, "26168"
+    const-string/jumbo v0, "26169"
+    const-string/jumbo v0, "26170"
+    const-string/jumbo v0, "26171"
+    const-string/jumbo v0, "26172"
+    const-string/jumbo v0, "26173"
+    const-string/jumbo v0, "26174"
+    const-string/jumbo v0, "26175"
+    const-string/jumbo v0, "26176"
+    const-string/jumbo v0, "26177"
+    const-string/jumbo v0, "26178"
+    const-string/jumbo v0, "26179"
+    const-string/jumbo v0, "26180"
+    const-string/jumbo v0, "26181"
+    const-string/jumbo v0, "26182"
+    const-string/jumbo v0, "26183"
+    const-string/jumbo v0, "26184"
+    const-string/jumbo v0, "26185"
+    const-string/jumbo v0, "26186"
+    const-string/jumbo v0, "26187"
+    const-string/jumbo v0, "26188"
+    const-string/jumbo v0, "26189"
+    const-string/jumbo v0, "26190"
+    const-string/jumbo v0, "26191"
+    const-string/jumbo v0, "26192"
+    const-string/jumbo v0, "26193"
+    const-string/jumbo v0, "26194"
+    const-string/jumbo v0, "26195"
+    const-string/jumbo v0, "26196"
+    const-string/jumbo v0, "26197"
+    const-string/jumbo v0, "26198"
+    const-string/jumbo v0, "26199"
+    const-string/jumbo v0, "26200"
+    const-string/jumbo v0, "26201"
+    const-string/jumbo v0, "26202"
+    const-string/jumbo v0, "26203"
+    const-string/jumbo v0, "26204"
+    const-string/jumbo v0, "26205"
+    const-string/jumbo v0, "26206"
+    const-string/jumbo v0, "26207"
+    const-string/jumbo v0, "26208"
+    const-string/jumbo v0, "26209"
+    const-string/jumbo v0, "26210"
+    const-string/jumbo v0, "26211"
+    const-string/jumbo v0, "26212"
+    const-string/jumbo v0, "26213"
+    const-string/jumbo v0, "26214"
+    const-string/jumbo v0, "26215"
+    const-string/jumbo v0, "26216"
+    const-string/jumbo v0, "26217"
+    const-string/jumbo v0, "26218"
+    const-string/jumbo v0, "26219"
+    const-string/jumbo v0, "26220"
+    const-string/jumbo v0, "26221"
+    const-string/jumbo v0, "26222"
+    const-string/jumbo v0, "26223"
+    const-string/jumbo v0, "26224"
+    const-string/jumbo v0, "26225"
+    const-string/jumbo v0, "26226"
+    const-string/jumbo v0, "26227"
+    const-string/jumbo v0, "26228"
+    const-string/jumbo v0, "26229"
+    const-string/jumbo v0, "26230"
+    const-string/jumbo v0, "26231"
+    const-string/jumbo v0, "26232"
+    const-string/jumbo v0, "26233"
+    const-string/jumbo v0, "26234"
+    const-string/jumbo v0, "26235"
+    const-string/jumbo v0, "26236"
+    const-string/jumbo v0, "26237"
+    const-string/jumbo v0, "26238"
+    const-string/jumbo v0, "26239"
+    const-string/jumbo v0, "26240"
+    const-string/jumbo v0, "26241"
+    const-string/jumbo v0, "26242"
+    const-string/jumbo v0, "26243"
+    const-string/jumbo v0, "26244"
+    const-string/jumbo v0, "26245"
+    const-string/jumbo v0, "26246"
+    const-string/jumbo v0, "26247"
+    const-string/jumbo v0, "26248"
+    const-string/jumbo v0, "26249"
+    const-string/jumbo v0, "26250"
+    const-string/jumbo v0, "26251"
+    const-string/jumbo v0, "26252"
+    const-string/jumbo v0, "26253"
+    const-string/jumbo v0, "26254"
+    const-string/jumbo v0, "26255"
+    const-string/jumbo v0, "26256"
+    const-string/jumbo v0, "26257"
+    const-string/jumbo v0, "26258"
+    const-string/jumbo v0, "26259"
+    const-string/jumbo v0, "26260"
+    const-string/jumbo v0, "26261"
+    const-string/jumbo v0, "26262"
+    const-string/jumbo v0, "26263"
+    const-string/jumbo v0, "26264"
+    const-string/jumbo v0, "26265"
+    const-string/jumbo v0, "26266"
+    const-string/jumbo v0, "26267"
+    const-string/jumbo v0, "26268"
+    const-string/jumbo v0, "26269"
+    const-string/jumbo v0, "26270"
+    const-string/jumbo v0, "26271"
+    const-string/jumbo v0, "26272"
+    const-string/jumbo v0, "26273"
+    const-string/jumbo v0, "26274"
+    const-string/jumbo v0, "26275"
+    const-string/jumbo v0, "26276"
+    const-string/jumbo v0, "26277"
+    const-string/jumbo v0, "26278"
+    const-string/jumbo v0, "26279"
+    const-string/jumbo v0, "26280"
+    const-string/jumbo v0, "26281"
+    const-string/jumbo v0, "26282"
+    const-string/jumbo v0, "26283"
+    const-string/jumbo v0, "26284"
+    const-string/jumbo v0, "26285"
+    const-string/jumbo v0, "26286"
+    const-string/jumbo v0, "26287"
+    const-string/jumbo v0, "26288"
+    const-string/jumbo v0, "26289"
+    const-string/jumbo v0, "26290"
+    const-string/jumbo v0, "26291"
+    const-string/jumbo v0, "26292"
+    const-string/jumbo v0, "26293"
+    const-string/jumbo v0, "26294"
+    const-string/jumbo v0, "26295"
+    const-string/jumbo v0, "26296"
+    const-string/jumbo v0, "26297"
+    const-string/jumbo v0, "26298"
+    const-string/jumbo v0, "26299"
+    const-string/jumbo v0, "26300"
+    const-string/jumbo v0, "26301"
+    const-string/jumbo v0, "26302"
+    const-string/jumbo v0, "26303"
+    const-string/jumbo v0, "26304"
+    const-string/jumbo v0, "26305"
+    const-string/jumbo v0, "26306"
+    const-string/jumbo v0, "26307"
+    const-string/jumbo v0, "26308"
+    const-string/jumbo v0, "26309"
+    const-string/jumbo v0, "26310"
+    const-string/jumbo v0, "26311"
+    const-string/jumbo v0, "26312"
+    const-string/jumbo v0, "26313"
+    const-string/jumbo v0, "26314"
+    const-string/jumbo v0, "26315"
+    const-string/jumbo v0, "26316"
+    const-string/jumbo v0, "26317"
+    const-string/jumbo v0, "26318"
+    const-string/jumbo v0, "26319"
+    const-string/jumbo v0, "26320"
+    const-string/jumbo v0, "26321"
+    const-string/jumbo v0, "26322"
+    const-string/jumbo v0, "26323"
+    const-string/jumbo v0, "26324"
+    const-string/jumbo v0, "26325"
+    const-string/jumbo v0, "26326"
+    const-string/jumbo v0, "26327"
+    const-string/jumbo v0, "26328"
+    const-string/jumbo v0, "26329"
+    const-string/jumbo v0, "26330"
+    const-string/jumbo v0, "26331"
+    const-string/jumbo v0, "26332"
+    const-string/jumbo v0, "26333"
+    const-string/jumbo v0, "26334"
+    const-string/jumbo v0, "26335"
+    const-string/jumbo v0, "26336"
+    const-string/jumbo v0, "26337"
+    const-string/jumbo v0, "26338"
+    const-string/jumbo v0, "26339"
+    const-string/jumbo v0, "26340"
+    const-string/jumbo v0, "26341"
+    const-string/jumbo v0, "26342"
+    const-string/jumbo v0, "26343"
+    const-string/jumbo v0, "26344"
+    const-string/jumbo v0, "26345"
+    const-string/jumbo v0, "26346"
+    const-string/jumbo v0, "26347"
+    const-string/jumbo v0, "26348"
+    const-string/jumbo v0, "26349"
+    const-string/jumbo v0, "26350"
+    const-string/jumbo v0, "26351"
+    const-string/jumbo v0, "26352"
+    const-string/jumbo v0, "26353"
+    const-string/jumbo v0, "26354"
+    const-string/jumbo v0, "26355"
+    const-string/jumbo v0, "26356"
+    const-string/jumbo v0, "26357"
+    const-string/jumbo v0, "26358"
+    const-string/jumbo v0, "26359"
+    const-string/jumbo v0, "26360"
+    const-string/jumbo v0, "26361"
+    const-string/jumbo v0, "26362"
+    const-string/jumbo v0, "26363"
+    const-string/jumbo v0, "26364"
+    const-string/jumbo v0, "26365"
+    const-string/jumbo v0, "26366"
+    const-string/jumbo v0, "26367"
+    const-string/jumbo v0, "26368"
+    const-string/jumbo v0, "26369"
+    const-string/jumbo v0, "26370"
+    const-string/jumbo v0, "26371"
+    const-string/jumbo v0, "26372"
+    const-string/jumbo v0, "26373"
+    const-string/jumbo v0, "26374"
+    const-string/jumbo v0, "26375"
+    const-string/jumbo v0, "26376"
+    const-string/jumbo v0, "26377"
+    const-string/jumbo v0, "26378"
+    const-string/jumbo v0, "26379"
+    const-string/jumbo v0, "26380"
+    const-string/jumbo v0, "26381"
+    const-string/jumbo v0, "26382"
+    const-string/jumbo v0, "26383"
+    const-string/jumbo v0, "26384"
+    const-string/jumbo v0, "26385"
+    const-string/jumbo v0, "26386"
+    const-string/jumbo v0, "26387"
+    const-string/jumbo v0, "26388"
+    const-string/jumbo v0, "26389"
+    const-string/jumbo v0, "26390"
+    const-string/jumbo v0, "26391"
+    const-string/jumbo v0, "26392"
+    const-string/jumbo v0, "26393"
+    const-string/jumbo v0, "26394"
+    const-string/jumbo v0, "26395"
+    const-string/jumbo v0, "26396"
+    const-string/jumbo v0, "26397"
+    const-string/jumbo v0, "26398"
+    const-string/jumbo v0, "26399"
+    const-string/jumbo v0, "26400"
+    const-string/jumbo v0, "26401"
+    const-string/jumbo v0, "26402"
+    const-string/jumbo v0, "26403"
+    const-string/jumbo v0, "26404"
+    const-string/jumbo v0, "26405"
+    const-string/jumbo v0, "26406"
+    const-string/jumbo v0, "26407"
+    const-string/jumbo v0, "26408"
+    const-string/jumbo v0, "26409"
+    const-string/jumbo v0, "26410"
+    const-string/jumbo v0, "26411"
+    const-string/jumbo v0, "26412"
+    const-string/jumbo v0, "26413"
+    const-string/jumbo v0, "26414"
+    const-string/jumbo v0, "26415"
+    const-string/jumbo v0, "26416"
+    const-string/jumbo v0, "26417"
+    const-string/jumbo v0, "26418"
+    const-string/jumbo v0, "26419"
+    const-string/jumbo v0, "26420"
+    const-string/jumbo v0, "26421"
+    const-string/jumbo v0, "26422"
+    const-string/jumbo v0, "26423"
+    const-string/jumbo v0, "26424"
+    const-string/jumbo v0, "26425"
+    const-string/jumbo v0, "26426"
+    const-string/jumbo v0, "26427"
+    const-string/jumbo v0, "26428"
+    const-string/jumbo v0, "26429"
+    const-string/jumbo v0, "26430"
+    const-string/jumbo v0, "26431"
+    const-string/jumbo v0, "26432"
+    const-string/jumbo v0, "26433"
+    const-string/jumbo v0, "26434"
+    const-string/jumbo v0, "26435"
+    const-string/jumbo v0, "26436"
+    const-string/jumbo v0, "26437"
+    const-string/jumbo v0, "26438"
+    const-string/jumbo v0, "26439"
+    const-string/jumbo v0, "26440"
+    const-string/jumbo v0, "26441"
+    const-string/jumbo v0, "26442"
+    const-string/jumbo v0, "26443"
+    const-string/jumbo v0, "26444"
+    const-string/jumbo v0, "26445"
+    const-string/jumbo v0, "26446"
+    const-string/jumbo v0, "26447"
+    const-string/jumbo v0, "26448"
+    const-string/jumbo v0, "26449"
+    const-string/jumbo v0, "26450"
+    const-string/jumbo v0, "26451"
+    const-string/jumbo v0, "26452"
+    const-string/jumbo v0, "26453"
+    const-string/jumbo v0, "26454"
+    const-string/jumbo v0, "26455"
+    const-string/jumbo v0, "26456"
+    const-string/jumbo v0, "26457"
+    const-string/jumbo v0, "26458"
+    const-string/jumbo v0, "26459"
+    const-string/jumbo v0, "26460"
+    const-string/jumbo v0, "26461"
+    const-string/jumbo v0, "26462"
+    const-string/jumbo v0, "26463"
+    const-string/jumbo v0, "26464"
+    const-string/jumbo v0, "26465"
+    const-string/jumbo v0, "26466"
+    const-string/jumbo v0, "26467"
+    const-string/jumbo v0, "26468"
+    const-string/jumbo v0, "26469"
+    const-string/jumbo v0, "26470"
+    const-string/jumbo v0, "26471"
+    const-string/jumbo v0, "26472"
+    const-string/jumbo v0, "26473"
+    const-string/jumbo v0, "26474"
+    const-string/jumbo v0, "26475"
+    const-string/jumbo v0, "26476"
+    const-string/jumbo v0, "26477"
+    const-string/jumbo v0, "26478"
+    const-string/jumbo v0, "26479"
+    const-string/jumbo v0, "26480"
+    const-string/jumbo v0, "26481"
+    const-string/jumbo v0, "26482"
+    const-string/jumbo v0, "26483"
+    const-string/jumbo v0, "26484"
+    const-string/jumbo v0, "26485"
+    const-string/jumbo v0, "26486"
+    const-string/jumbo v0, "26487"
+    const-string/jumbo v0, "26488"
+    const-string/jumbo v0, "26489"
+    const-string/jumbo v0, "26490"
+    const-string/jumbo v0, "26491"
+    const-string/jumbo v0, "26492"
+    const-string/jumbo v0, "26493"
+    const-string/jumbo v0, "26494"
+    const-string/jumbo v0, "26495"
+    const-string/jumbo v0, "26496"
+    const-string/jumbo v0, "26497"
+    const-string/jumbo v0, "26498"
+    const-string/jumbo v0, "26499"
+    const-string/jumbo v0, "26500"
+    const-string/jumbo v0, "26501"
+    const-string/jumbo v0, "26502"
+    const-string/jumbo v0, "26503"
+    const-string/jumbo v0, "26504"
+    const-string/jumbo v0, "26505"
+    const-string/jumbo v0, "26506"
+    const-string/jumbo v0, "26507"
+    const-string/jumbo v0, "26508"
+    const-string/jumbo v0, "26509"
+    const-string/jumbo v0, "26510"
+    const-string/jumbo v0, "26511"
+    const-string/jumbo v0, "26512"
+    const-string/jumbo v0, "26513"
+    const-string/jumbo v0, "26514"
+    const-string/jumbo v0, "26515"
+    const-string/jumbo v0, "26516"
+    const-string/jumbo v0, "26517"
+    const-string/jumbo v0, "26518"
+    const-string/jumbo v0, "26519"
+    const-string/jumbo v0, "26520"
+    const-string/jumbo v0, "26521"
+    const-string/jumbo v0, "26522"
+    const-string/jumbo v0, "26523"
+    const-string/jumbo v0, "26524"
+    const-string/jumbo v0, "26525"
+    const-string/jumbo v0, "26526"
+    const-string/jumbo v0, "26527"
+    const-string/jumbo v0, "26528"
+    const-string/jumbo v0, "26529"
+    const-string/jumbo v0, "26530"
+    const-string/jumbo v0, "26531"
+    const-string/jumbo v0, "26532"
+    const-string/jumbo v0, "26533"
+    const-string/jumbo v0, "26534"
+    const-string/jumbo v0, "26535"
+    const-string/jumbo v0, "26536"
+    const-string/jumbo v0, "26537"
+    const-string/jumbo v0, "26538"
+    const-string/jumbo v0, "26539"
+    const-string/jumbo v0, "26540"
+    const-string/jumbo v0, "26541"
+    const-string/jumbo v0, "26542"
+    const-string/jumbo v0, "26543"
+    const-string/jumbo v0, "26544"
+    const-string/jumbo v0, "26545"
+    const-string/jumbo v0, "26546"
+    const-string/jumbo v0, "26547"
+    const-string/jumbo v0, "26548"
+    const-string/jumbo v0, "26549"
+    const-string/jumbo v0, "26550"
+    const-string/jumbo v0, "26551"
+    const-string/jumbo v0, "26552"
+    const-string/jumbo v0, "26553"
+    const-string/jumbo v0, "26554"
+    const-string/jumbo v0, "26555"
+    const-string/jumbo v0, "26556"
+    const-string/jumbo v0, "26557"
+    const-string/jumbo v0, "26558"
+    const-string/jumbo v0, "26559"
+    const-string/jumbo v0, "26560"
+    const-string/jumbo v0, "26561"
+    const-string/jumbo v0, "26562"
+    const-string/jumbo v0, "26563"
+    const-string/jumbo v0, "26564"
+    const-string/jumbo v0, "26565"
+    const-string/jumbo v0, "26566"
+    const-string/jumbo v0, "26567"
+    const-string/jumbo v0, "26568"
+    const-string/jumbo v0, "26569"
+    const-string/jumbo v0, "26570"
+    const-string/jumbo v0, "26571"
+    const-string/jumbo v0, "26572"
+    const-string/jumbo v0, "26573"
+    const-string/jumbo v0, "26574"
+    const-string/jumbo v0, "26575"
+    const-string/jumbo v0, "26576"
+    const-string/jumbo v0, "26577"
+    const-string/jumbo v0, "26578"
+    const-string/jumbo v0, "26579"
+    const-string/jumbo v0, "26580"
+    const-string/jumbo v0, "26581"
+    const-string/jumbo v0, "26582"
+    const-string/jumbo v0, "26583"
+    const-string/jumbo v0, "26584"
+    const-string/jumbo v0, "26585"
+    const-string/jumbo v0, "26586"
+    const-string/jumbo v0, "26587"
+    const-string/jumbo v0, "26588"
+    const-string/jumbo v0, "26589"
+    const-string/jumbo v0, "26590"
+    const-string/jumbo v0, "26591"
+    const-string/jumbo v0, "26592"
+    const-string/jumbo v0, "26593"
+    const-string/jumbo v0, "26594"
+    const-string/jumbo v0, "26595"
+    const-string/jumbo v0, "26596"
+    const-string/jumbo v0, "26597"
+    const-string/jumbo v0, "26598"
+    const-string/jumbo v0, "26599"
+    const-string/jumbo v0, "26600"
+    const-string/jumbo v0, "26601"
+    const-string/jumbo v0, "26602"
+    const-string/jumbo v0, "26603"
+    const-string/jumbo v0, "26604"
+    const-string/jumbo v0, "26605"
+    const-string/jumbo v0, "26606"
+    const-string/jumbo v0, "26607"
+    const-string/jumbo v0, "26608"
+    const-string/jumbo v0, "26609"
+    const-string/jumbo v0, "26610"
+    const-string/jumbo v0, "26611"
+    const-string/jumbo v0, "26612"
+    const-string/jumbo v0, "26613"
+    const-string/jumbo v0, "26614"
+    const-string/jumbo v0, "26615"
+    const-string/jumbo v0, "26616"
+    const-string/jumbo v0, "26617"
+    const-string/jumbo v0, "26618"
+    const-string/jumbo v0, "26619"
+    const-string/jumbo v0, "26620"
+    const-string/jumbo v0, "26621"
+    const-string/jumbo v0, "26622"
+    const-string/jumbo v0, "26623"
+    const-string/jumbo v0, "26624"
+    const-string/jumbo v0, "26625"
+    const-string/jumbo v0, "26626"
+    const-string/jumbo v0, "26627"
+    const-string/jumbo v0, "26628"
+    const-string/jumbo v0, "26629"
+    const-string/jumbo v0, "26630"
+    const-string/jumbo v0, "26631"
+    const-string/jumbo v0, "26632"
+    const-string/jumbo v0, "26633"
+    const-string/jumbo v0, "26634"
+    const-string/jumbo v0, "26635"
+    const-string/jumbo v0, "26636"
+    const-string/jumbo v0, "26637"
+    const-string/jumbo v0, "26638"
+    const-string/jumbo v0, "26639"
+    const-string/jumbo v0, "26640"
+    const-string/jumbo v0, "26641"
+    const-string/jumbo v0, "26642"
+    const-string/jumbo v0, "26643"
+    const-string/jumbo v0, "26644"
+    const-string/jumbo v0, "26645"
+    const-string/jumbo v0, "26646"
+    const-string/jumbo v0, "26647"
+    const-string/jumbo v0, "26648"
+    const-string/jumbo v0, "26649"
+    const-string/jumbo v0, "26650"
+    const-string/jumbo v0, "26651"
+    const-string/jumbo v0, "26652"
+    const-string/jumbo v0, "26653"
+    const-string/jumbo v0, "26654"
+    const-string/jumbo v0, "26655"
+    const-string/jumbo v0, "26656"
+    const-string/jumbo v0, "26657"
+    const-string/jumbo v0, "26658"
+    const-string/jumbo v0, "26659"
+    const-string/jumbo v0, "26660"
+    const-string/jumbo v0, "26661"
+    const-string/jumbo v0, "26662"
+    const-string/jumbo v0, "26663"
+    const-string/jumbo v0, "26664"
+    const-string/jumbo v0, "26665"
+    const-string/jumbo v0, "26666"
+    const-string/jumbo v0, "26667"
+    const-string/jumbo v0, "26668"
+    const-string/jumbo v0, "26669"
+    const-string/jumbo v0, "26670"
+    const-string/jumbo v0, "26671"
+    const-string/jumbo v0, "26672"
+    const-string/jumbo v0, "26673"
+    const-string/jumbo v0, "26674"
+    const-string/jumbo v0, "26675"
+    const-string/jumbo v0, "26676"
+    const-string/jumbo v0, "26677"
+    const-string/jumbo v0, "26678"
+    const-string/jumbo v0, "26679"
+    const-string/jumbo v0, "26680"
+    const-string/jumbo v0, "26681"
+    const-string/jumbo v0, "26682"
+    const-string/jumbo v0, "26683"
+    const-string/jumbo v0, "26684"
+    const-string/jumbo v0, "26685"
+    const-string/jumbo v0, "26686"
+    const-string/jumbo v0, "26687"
+    const-string/jumbo v0, "26688"
+    const-string/jumbo v0, "26689"
+    const-string/jumbo v0, "26690"
+    const-string/jumbo v0, "26691"
+    const-string/jumbo v0, "26692"
+    const-string/jumbo v0, "26693"
+    const-string/jumbo v0, "26694"
+    const-string/jumbo v0, "26695"
+    const-string/jumbo v0, "26696"
+    const-string/jumbo v0, "26697"
+    const-string/jumbo v0, "26698"
+    const-string/jumbo v0, "26699"
+    const-string/jumbo v0, "26700"
+    const-string/jumbo v0, "26701"
+    const-string/jumbo v0, "26702"
+    const-string/jumbo v0, "26703"
+    const-string/jumbo v0, "26704"
+    const-string/jumbo v0, "26705"
+    const-string/jumbo v0, "26706"
+    const-string/jumbo v0, "26707"
+    const-string/jumbo v0, "26708"
+    const-string/jumbo v0, "26709"
+    const-string/jumbo v0, "26710"
+    const-string/jumbo v0, "26711"
+    const-string/jumbo v0, "26712"
+    const-string/jumbo v0, "26713"
+    const-string/jumbo v0, "26714"
+    const-string/jumbo v0, "26715"
+    const-string/jumbo v0, "26716"
+    const-string/jumbo v0, "26717"
+    const-string/jumbo v0, "26718"
+    const-string/jumbo v0, "26719"
+    const-string/jumbo v0, "26720"
+    const-string/jumbo v0, "26721"
+    const-string/jumbo v0, "26722"
+    const-string/jumbo v0, "26723"
+    const-string/jumbo v0, "26724"
+    const-string/jumbo v0, "26725"
+    const-string/jumbo v0, "26726"
+    const-string/jumbo v0, "26727"
+    const-string/jumbo v0, "26728"
+    const-string/jumbo v0, "26729"
+    const-string/jumbo v0, "26730"
+    const-string/jumbo v0, "26731"
+    const-string/jumbo v0, "26732"
+    const-string/jumbo v0, "26733"
+    const-string/jumbo v0, "26734"
+    const-string/jumbo v0, "26735"
+    const-string/jumbo v0, "26736"
+    const-string/jumbo v0, "26737"
+    const-string/jumbo v0, "26738"
+    const-string/jumbo v0, "26739"
+    const-string/jumbo v0, "26740"
+    const-string/jumbo v0, "26741"
+    const-string/jumbo v0, "26742"
+    const-string/jumbo v0, "26743"
+    const-string/jumbo v0, "26744"
+    const-string/jumbo v0, "26745"
+    const-string/jumbo v0, "26746"
+    const-string/jumbo v0, "26747"
+    const-string/jumbo v0, "26748"
+    const-string/jumbo v0, "26749"
+    const-string/jumbo v0, "26750"
+    const-string/jumbo v0, "26751"
+    const-string/jumbo v0, "26752"
+    const-string/jumbo v0, "26753"
+    const-string/jumbo v0, "26754"
+    const-string/jumbo v0, "26755"
+    const-string/jumbo v0, "26756"
+    const-string/jumbo v0, "26757"
+    const-string/jumbo v0, "26758"
+    const-string/jumbo v0, "26759"
+    const-string/jumbo v0, "26760"
+    const-string/jumbo v0, "26761"
+    const-string/jumbo v0, "26762"
+    const-string/jumbo v0, "26763"
+    const-string/jumbo v0, "26764"
+    const-string/jumbo v0, "26765"
+    const-string/jumbo v0, "26766"
+    const-string/jumbo v0, "26767"
+    const-string/jumbo v0, "26768"
+    const-string/jumbo v0, "26769"
+    const-string/jumbo v0, "26770"
+    const-string/jumbo v0, "26771"
+    const-string/jumbo v0, "26772"
+    const-string/jumbo v0, "26773"
+    const-string/jumbo v0, "26774"
+    const-string/jumbo v0, "26775"
+    const-string/jumbo v0, "26776"
+    const-string/jumbo v0, "26777"
+    const-string/jumbo v0, "26778"
+    const-string/jumbo v0, "26779"
+    const-string/jumbo v0, "26780"
+    const-string/jumbo v0, "26781"
+    const-string/jumbo v0, "26782"
+    const-string/jumbo v0, "26783"
+    const-string/jumbo v0, "26784"
+    const-string/jumbo v0, "26785"
+    const-string/jumbo v0, "26786"
+    const-string/jumbo v0, "26787"
+    const-string/jumbo v0, "26788"
+    const-string/jumbo v0, "26789"
+    const-string/jumbo v0, "26790"
+    const-string/jumbo v0, "26791"
+    const-string/jumbo v0, "26792"
+    const-string/jumbo v0, "26793"
+    const-string/jumbo v0, "26794"
+    const-string/jumbo v0, "26795"
+    const-string/jumbo v0, "26796"
+    const-string/jumbo v0, "26797"
+    const-string/jumbo v0, "26798"
+    const-string/jumbo v0, "26799"
+    const-string/jumbo v0, "26800"
+    const-string/jumbo v0, "26801"
+    const-string/jumbo v0, "26802"
+    const-string/jumbo v0, "26803"
+    const-string/jumbo v0, "26804"
+    const-string/jumbo v0, "26805"
+    const-string/jumbo v0, "26806"
+    const-string/jumbo v0, "26807"
+    const-string/jumbo v0, "26808"
+    const-string/jumbo v0, "26809"
+    const-string/jumbo v0, "26810"
+    const-string/jumbo v0, "26811"
+    const-string/jumbo v0, "26812"
+    const-string/jumbo v0, "26813"
+    const-string/jumbo v0, "26814"
+    const-string/jumbo v0, "26815"
+    const-string/jumbo v0, "26816"
+    const-string/jumbo v0, "26817"
+    const-string/jumbo v0, "26818"
+    const-string/jumbo v0, "26819"
+    const-string/jumbo v0, "26820"
+    const-string/jumbo v0, "26821"
+    const-string/jumbo v0, "26822"
+    const-string/jumbo v0, "26823"
+    const-string/jumbo v0, "26824"
+    const-string/jumbo v0, "26825"
+    const-string/jumbo v0, "26826"
+    const-string/jumbo v0, "26827"
+    const-string/jumbo v0, "26828"
+    const-string/jumbo v0, "26829"
+    const-string/jumbo v0, "26830"
+    const-string/jumbo v0, "26831"
+    const-string/jumbo v0, "26832"
+    const-string/jumbo v0, "26833"
+    const-string/jumbo v0, "26834"
+    const-string/jumbo v0, "26835"
+    const-string/jumbo v0, "26836"
+    const-string/jumbo v0, "26837"
+    const-string/jumbo v0, "26838"
+    const-string/jumbo v0, "26839"
+    const-string/jumbo v0, "26840"
+    const-string/jumbo v0, "26841"
+    const-string/jumbo v0, "26842"
+    const-string/jumbo v0, "26843"
+    const-string/jumbo v0, "26844"
+    const-string/jumbo v0, "26845"
+    const-string/jumbo v0, "26846"
+    const-string/jumbo v0, "26847"
+    const-string/jumbo v0, "26848"
+    const-string/jumbo v0, "26849"
+    const-string/jumbo v0, "26850"
+    const-string/jumbo v0, "26851"
+    const-string/jumbo v0, "26852"
+    const-string/jumbo v0, "26853"
+    const-string/jumbo v0, "26854"
+    const-string/jumbo v0, "26855"
+    const-string/jumbo v0, "26856"
+    const-string/jumbo v0, "26857"
+    const-string/jumbo v0, "26858"
+    const-string/jumbo v0, "26859"
+    const-string/jumbo v0, "26860"
+    const-string/jumbo v0, "26861"
+    const-string/jumbo v0, "26862"
+    const-string/jumbo v0, "26863"
+    const-string/jumbo v0, "26864"
+    const-string/jumbo v0, "26865"
+    const-string/jumbo v0, "26866"
+    const-string/jumbo v0, "26867"
+    const-string/jumbo v0, "26868"
+    const-string/jumbo v0, "26869"
+    const-string/jumbo v0, "26870"
+    const-string/jumbo v0, "26871"
+    const-string/jumbo v0, "26872"
+    const-string/jumbo v0, "26873"
+    const-string/jumbo v0, "26874"
+    const-string/jumbo v0, "26875"
+    const-string/jumbo v0, "26876"
+    const-string/jumbo v0, "26877"
+    const-string/jumbo v0, "26878"
+    const-string/jumbo v0, "26879"
+    const-string/jumbo v0, "26880"
+    const-string/jumbo v0, "26881"
+    const-string/jumbo v0, "26882"
+    const-string/jumbo v0, "26883"
+    const-string/jumbo v0, "26884"
+    const-string/jumbo v0, "26885"
+    const-string/jumbo v0, "26886"
+    const-string/jumbo v0, "26887"
+    const-string/jumbo v0, "26888"
+    const-string/jumbo v0, "26889"
+    const-string/jumbo v0, "26890"
+    const-string/jumbo v0, "26891"
+    const-string/jumbo v0, "26892"
+    const-string/jumbo v0, "26893"
+    const-string/jumbo v0, "26894"
+    const-string/jumbo v0, "26895"
+    const-string/jumbo v0, "26896"
+    const-string/jumbo v0, "26897"
+    const-string/jumbo v0, "26898"
+    const-string/jumbo v0, "26899"
+    const-string/jumbo v0, "26900"
+    const-string/jumbo v0, "26901"
+    const-string/jumbo v0, "26902"
+    const-string/jumbo v0, "26903"
+    const-string/jumbo v0, "26904"
+    const-string/jumbo v0, "26905"
+    const-string/jumbo v0, "26906"
+    const-string/jumbo v0, "26907"
+    const-string/jumbo v0, "26908"
+    const-string/jumbo v0, "26909"
+    const-string/jumbo v0, "26910"
+    const-string/jumbo v0, "26911"
+    const-string/jumbo v0, "26912"
+    const-string/jumbo v0, "26913"
+    const-string/jumbo v0, "26914"
+    const-string/jumbo v0, "26915"
+    const-string/jumbo v0, "26916"
+    const-string/jumbo v0, "26917"
+    const-string/jumbo v0, "26918"
+    const-string/jumbo v0, "26919"
+    const-string/jumbo v0, "26920"
+    const-string/jumbo v0, "26921"
+    const-string/jumbo v0, "26922"
+    const-string/jumbo v0, "26923"
+    const-string/jumbo v0, "26924"
+    const-string/jumbo v0, "26925"
+    const-string/jumbo v0, "26926"
+    const-string/jumbo v0, "26927"
+    const-string/jumbo v0, "26928"
+    const-string/jumbo v0, "26929"
+    const-string/jumbo v0, "26930"
+    const-string/jumbo v0, "26931"
+    const-string/jumbo v0, "26932"
+    const-string/jumbo v0, "26933"
+    const-string/jumbo v0, "26934"
+    const-string/jumbo v0, "26935"
+    const-string/jumbo v0, "26936"
+    const-string/jumbo v0, "26937"
+    const-string/jumbo v0, "26938"
+    const-string/jumbo v0, "26939"
+    const-string/jumbo v0, "26940"
+    const-string/jumbo v0, "26941"
+    const-string/jumbo v0, "26942"
+    const-string/jumbo v0, "26943"
+    const-string/jumbo v0, "26944"
+    const-string/jumbo v0, "26945"
+    const-string/jumbo v0, "26946"
+    const-string/jumbo v0, "26947"
+    const-string/jumbo v0, "26948"
+    const-string/jumbo v0, "26949"
+    const-string/jumbo v0, "26950"
+    const-string/jumbo v0, "26951"
+    const-string/jumbo v0, "26952"
+    const-string/jumbo v0, "26953"
+    const-string/jumbo v0, "26954"
+    const-string/jumbo v0, "26955"
+    const-string/jumbo v0, "26956"
+    const-string/jumbo v0, "26957"
+    const-string/jumbo v0, "26958"
+    const-string/jumbo v0, "26959"
+    const-string/jumbo v0, "26960"
+    const-string/jumbo v0, "26961"
+    const-string/jumbo v0, "26962"
+    const-string/jumbo v0, "26963"
+    const-string/jumbo v0, "26964"
+    const-string/jumbo v0, "26965"
+    const-string/jumbo v0, "26966"
+    const-string/jumbo v0, "26967"
+    const-string/jumbo v0, "26968"
+    const-string/jumbo v0, "26969"
+    const-string/jumbo v0, "26970"
+    const-string/jumbo v0, "26971"
+    const-string/jumbo v0, "26972"
+    const-string/jumbo v0, "26973"
+    const-string/jumbo v0, "26974"
+    const-string/jumbo v0, "26975"
+    const-string/jumbo v0, "26976"
+    const-string/jumbo v0, "26977"
+    const-string/jumbo v0, "26978"
+    const-string/jumbo v0, "26979"
+    const-string/jumbo v0, "26980"
+    const-string/jumbo v0, "26981"
+    const-string/jumbo v0, "26982"
+    const-string/jumbo v0, "26983"
+    const-string/jumbo v0, "26984"
+    const-string/jumbo v0, "26985"
+    const-string/jumbo v0, "26986"
+    const-string/jumbo v0, "26987"
+    const-string/jumbo v0, "26988"
+    const-string/jumbo v0, "26989"
+    const-string/jumbo v0, "26990"
+    const-string/jumbo v0, "26991"
+    const-string/jumbo v0, "26992"
+    const-string/jumbo v0, "26993"
+    const-string/jumbo v0, "26994"
+    const-string/jumbo v0, "26995"
+    const-string/jumbo v0, "26996"
+    const-string/jumbo v0, "26997"
+    const-string/jumbo v0, "26998"
+    const-string/jumbo v0, "26999"
+    const-string/jumbo v0, "27000"
+    const-string/jumbo v0, "27001"
+    const-string/jumbo v0, "27002"
+    const-string/jumbo v0, "27003"
+    const-string/jumbo v0, "27004"
+    const-string/jumbo v0, "27005"
+    const-string/jumbo v0, "27006"
+    const-string/jumbo v0, "27007"
+    const-string/jumbo v0, "27008"
+    const-string/jumbo v0, "27009"
+    const-string/jumbo v0, "27010"
+    const-string/jumbo v0, "27011"
+    const-string/jumbo v0, "27012"
+    const-string/jumbo v0, "27013"
+    const-string/jumbo v0, "27014"
+    const-string/jumbo v0, "27015"
+    const-string/jumbo v0, "27016"
+    const-string/jumbo v0, "27017"
+    const-string/jumbo v0, "27018"
+    const-string/jumbo v0, "27019"
+    const-string/jumbo v0, "27020"
+    const-string/jumbo v0, "27021"
+    const-string/jumbo v0, "27022"
+    const-string/jumbo v0, "27023"
+    const-string/jumbo v0, "27024"
+    const-string/jumbo v0, "27025"
+    const-string/jumbo v0, "27026"
+    const-string/jumbo v0, "27027"
+    const-string/jumbo v0, "27028"
+    const-string/jumbo v0, "27029"
+    const-string/jumbo v0, "27030"
+    const-string/jumbo v0, "27031"
+    const-string/jumbo v0, "27032"
+    const-string/jumbo v0, "27033"
+    const-string/jumbo v0, "27034"
+    const-string/jumbo v0, "27035"
+    const-string/jumbo v0, "27036"
+    const-string/jumbo v0, "27037"
+    const-string/jumbo v0, "27038"
+    const-string/jumbo v0, "27039"
+    const-string/jumbo v0, "27040"
+    const-string/jumbo v0, "27041"
+    const-string/jumbo v0, "27042"
+    const-string/jumbo v0, "27043"
+    const-string/jumbo v0, "27044"
+    const-string/jumbo v0, "27045"
+    const-string/jumbo v0, "27046"
+    const-string/jumbo v0, "27047"
+    const-string/jumbo v0, "27048"
+    const-string/jumbo v0, "27049"
+    const-string/jumbo v0, "27050"
+    const-string/jumbo v0, "27051"
+    const-string/jumbo v0, "27052"
+    const-string/jumbo v0, "27053"
+    const-string/jumbo v0, "27054"
+    const-string/jumbo v0, "27055"
+    const-string/jumbo v0, "27056"
+    const-string/jumbo v0, "27057"
+    const-string/jumbo v0, "27058"
+    const-string/jumbo v0, "27059"
+    const-string/jumbo v0, "27060"
+    const-string/jumbo v0, "27061"
+    const-string/jumbo v0, "27062"
+    const-string/jumbo v0, "27063"
+    const-string/jumbo v0, "27064"
+    const-string/jumbo v0, "27065"
+    const-string/jumbo v0, "27066"
+    const-string/jumbo v0, "27067"
+    const-string/jumbo v0, "27068"
+    const-string/jumbo v0, "27069"
+    const-string/jumbo v0, "27070"
+    const-string/jumbo v0, "27071"
+    const-string/jumbo v0, "27072"
+    const-string/jumbo v0, "27073"
+    const-string/jumbo v0, "27074"
+    const-string/jumbo v0, "27075"
+    const-string/jumbo v0, "27076"
+    const-string/jumbo v0, "27077"
+    const-string/jumbo v0, "27078"
+    const-string/jumbo v0, "27079"
+    const-string/jumbo v0, "27080"
+    const-string/jumbo v0, "27081"
+    const-string/jumbo v0, "27082"
+    const-string/jumbo v0, "27083"
+    const-string/jumbo v0, "27084"
+    const-string/jumbo v0, "27085"
+    const-string/jumbo v0, "27086"
+    const-string/jumbo v0, "27087"
+    const-string/jumbo v0, "27088"
+    const-string/jumbo v0, "27089"
+    const-string/jumbo v0, "27090"
+    const-string/jumbo v0, "27091"
+    const-string/jumbo v0, "27092"
+    const-string/jumbo v0, "27093"
+    const-string/jumbo v0, "27094"
+    const-string/jumbo v0, "27095"
+    const-string/jumbo v0, "27096"
+    const-string/jumbo v0, "27097"
+    const-string/jumbo v0, "27098"
+    const-string/jumbo v0, "27099"
+    const-string/jumbo v0, "27100"
+    const-string/jumbo v0, "27101"
+    const-string/jumbo v0, "27102"
+    const-string/jumbo v0, "27103"
+    const-string/jumbo v0, "27104"
+    const-string/jumbo v0, "27105"
+    const-string/jumbo v0, "27106"
+    const-string/jumbo v0, "27107"
+    const-string/jumbo v0, "27108"
+    const-string/jumbo v0, "27109"
+    const-string/jumbo v0, "27110"
+    const-string/jumbo v0, "27111"
+    const-string/jumbo v0, "27112"
+    const-string/jumbo v0, "27113"
+    const-string/jumbo v0, "27114"
+    const-string/jumbo v0, "27115"
+    const-string/jumbo v0, "27116"
+    const-string/jumbo v0, "27117"
+    const-string/jumbo v0, "27118"
+    const-string/jumbo v0, "27119"
+    const-string/jumbo v0, "27120"
+    const-string/jumbo v0, "27121"
+    const-string/jumbo v0, "27122"
+    const-string/jumbo v0, "27123"
+    const-string/jumbo v0, "27124"
+    const-string/jumbo v0, "27125"
+    const-string/jumbo v0, "27126"
+    const-string/jumbo v0, "27127"
+    const-string/jumbo v0, "27128"
+    const-string/jumbo v0, "27129"
+    const-string/jumbo v0, "27130"
+    const-string/jumbo v0, "27131"
+    const-string/jumbo v0, "27132"
+    const-string/jumbo v0, "27133"
+    const-string/jumbo v0, "27134"
+    const-string/jumbo v0, "27135"
+    const-string/jumbo v0, "27136"
+    const-string/jumbo v0, "27137"
+    const-string/jumbo v0, "27138"
+    const-string/jumbo v0, "27139"
+    const-string/jumbo v0, "27140"
+    const-string/jumbo v0, "27141"
+    const-string/jumbo v0, "27142"
+    const-string/jumbo v0, "27143"
+    const-string/jumbo v0, "27144"
+    const-string/jumbo v0, "27145"
+    const-string/jumbo v0, "27146"
+    const-string/jumbo v0, "27147"
+    const-string/jumbo v0, "27148"
+    const-string/jumbo v0, "27149"
+    const-string/jumbo v0, "27150"
+    const-string/jumbo v0, "27151"
+    const-string/jumbo v0, "27152"
+    const-string/jumbo v0, "27153"
+    const-string/jumbo v0, "27154"
+    const-string/jumbo v0, "27155"
+    const-string/jumbo v0, "27156"
+    const-string/jumbo v0, "27157"
+    const-string/jumbo v0, "27158"
+    const-string/jumbo v0, "27159"
+    const-string/jumbo v0, "27160"
+    const-string/jumbo v0, "27161"
+    const-string/jumbo v0, "27162"
+    const-string/jumbo v0, "27163"
+    const-string/jumbo v0, "27164"
+    const-string/jumbo v0, "27165"
+    const-string/jumbo v0, "27166"
+    const-string/jumbo v0, "27167"
+    const-string/jumbo v0, "27168"
+    const-string/jumbo v0, "27169"
+    const-string/jumbo v0, "27170"
+    const-string/jumbo v0, "27171"
+    const-string/jumbo v0, "27172"
+    const-string/jumbo v0, "27173"
+    const-string/jumbo v0, "27174"
+    const-string/jumbo v0, "27175"
+    const-string/jumbo v0, "27176"
+    const-string/jumbo v0, "27177"
+    const-string/jumbo v0, "27178"
+    const-string/jumbo v0, "27179"
+    const-string/jumbo v0, "27180"
+    const-string/jumbo v0, "27181"
+    const-string/jumbo v0, "27182"
+    const-string/jumbo v0, "27183"
+    const-string/jumbo v0, "27184"
+    const-string/jumbo v0, "27185"
+    const-string/jumbo v0, "27186"
+    const-string/jumbo v0, "27187"
+    const-string/jumbo v0, "27188"
+    const-string/jumbo v0, "27189"
+    const-string/jumbo v0, "27190"
+    const-string/jumbo v0, "27191"
+    const-string/jumbo v0, "27192"
+    const-string/jumbo v0, "27193"
+    const-string/jumbo v0, "27194"
+    const-string/jumbo v0, "27195"
+    const-string/jumbo v0, "27196"
+    const-string/jumbo v0, "27197"
+    const-string/jumbo v0, "27198"
+    const-string/jumbo v0, "27199"
+    const-string/jumbo v0, "27200"
+    const-string/jumbo v0, "27201"
+    const-string/jumbo v0, "27202"
+    const-string/jumbo v0, "27203"
+    const-string/jumbo v0, "27204"
+    const-string/jumbo v0, "27205"
+    const-string/jumbo v0, "27206"
+    const-string/jumbo v0, "27207"
+    const-string/jumbo v0, "27208"
+    const-string/jumbo v0, "27209"
+    const-string/jumbo v0, "27210"
+    const-string/jumbo v0, "27211"
+    const-string/jumbo v0, "27212"
+    const-string/jumbo v0, "27213"
+    const-string/jumbo v0, "27214"
+    const-string/jumbo v0, "27215"
+    const-string/jumbo v0, "27216"
+    const-string/jumbo v0, "27217"
+    const-string/jumbo v0, "27218"
+    const-string/jumbo v0, "27219"
+    const-string/jumbo v0, "27220"
+    const-string/jumbo v0, "27221"
+    const-string/jumbo v0, "27222"
+    const-string/jumbo v0, "27223"
+    const-string/jumbo v0, "27224"
+    const-string/jumbo v0, "27225"
+    const-string/jumbo v0, "27226"
+    const-string/jumbo v0, "27227"
+    const-string/jumbo v0, "27228"
+    const-string/jumbo v0, "27229"
+    const-string/jumbo v0, "27230"
+    const-string/jumbo v0, "27231"
+    const-string/jumbo v0, "27232"
+    const-string/jumbo v0, "27233"
+    const-string/jumbo v0, "27234"
+    const-string/jumbo v0, "27235"
+    const-string/jumbo v0, "27236"
+    const-string/jumbo v0, "27237"
+    const-string/jumbo v0, "27238"
+    const-string/jumbo v0, "27239"
+    const-string/jumbo v0, "27240"
+    const-string/jumbo v0, "27241"
+    const-string/jumbo v0, "27242"
+    const-string/jumbo v0, "27243"
+    const-string/jumbo v0, "27244"
+    const-string/jumbo v0, "27245"
+    const-string/jumbo v0, "27246"
+    const-string/jumbo v0, "27247"
+    const-string/jumbo v0, "27248"
+    const-string/jumbo v0, "27249"
+    const-string/jumbo v0, "27250"
+    const-string/jumbo v0, "27251"
+    const-string/jumbo v0, "27252"
+    const-string/jumbo v0, "27253"
+    const-string/jumbo v0, "27254"
+    const-string/jumbo v0, "27255"
+    const-string/jumbo v0, "27256"
+    const-string/jumbo v0, "27257"
+    const-string/jumbo v0, "27258"
+    const-string/jumbo v0, "27259"
+    const-string/jumbo v0, "27260"
+    const-string/jumbo v0, "27261"
+    const-string/jumbo v0, "27262"
+    const-string/jumbo v0, "27263"
+    const-string/jumbo v0, "27264"
+    const-string/jumbo v0, "27265"
+    const-string/jumbo v0, "27266"
+    const-string/jumbo v0, "27267"
+    const-string/jumbo v0, "27268"
+    const-string/jumbo v0, "27269"
+    const-string/jumbo v0, "27270"
+    const-string/jumbo v0, "27271"
+    const-string/jumbo v0, "27272"
+    const-string/jumbo v0, "27273"
+    const-string/jumbo v0, "27274"
+    const-string/jumbo v0, "27275"
+    const-string/jumbo v0, "27276"
+    const-string/jumbo v0, "27277"
+    const-string/jumbo v0, "27278"
+    const-string/jumbo v0, "27279"
+    const-string/jumbo v0, "27280"
+    const-string/jumbo v0, "27281"
+    const-string/jumbo v0, "27282"
+    const-string/jumbo v0, "27283"
+    const-string/jumbo v0, "27284"
+    const-string/jumbo v0, "27285"
+    const-string/jumbo v0, "27286"
+    const-string/jumbo v0, "27287"
+    const-string/jumbo v0, "27288"
+    const-string/jumbo v0, "27289"
+    const-string/jumbo v0, "27290"
+    const-string/jumbo v0, "27291"
+    const-string/jumbo v0, "27292"
+    const-string/jumbo v0, "27293"
+    const-string/jumbo v0, "27294"
+    const-string/jumbo v0, "27295"
+    const-string/jumbo v0, "27296"
+    const-string/jumbo v0, "27297"
+    const-string/jumbo v0, "27298"
+    const-string/jumbo v0, "27299"
+    const-string/jumbo v0, "27300"
+    const-string/jumbo v0, "27301"
+    const-string/jumbo v0, "27302"
+    const-string/jumbo v0, "27303"
+    const-string/jumbo v0, "27304"
+    const-string/jumbo v0, "27305"
+    const-string/jumbo v0, "27306"
+    const-string/jumbo v0, "27307"
+    const-string/jumbo v0, "27308"
+    const-string/jumbo v0, "27309"
+    const-string/jumbo v0, "27310"
+    const-string/jumbo v0, "27311"
+    const-string/jumbo v0, "27312"
+    const-string/jumbo v0, "27313"
+    const-string/jumbo v0, "27314"
+    const-string/jumbo v0, "27315"
+    const-string/jumbo v0, "27316"
+    const-string/jumbo v0, "27317"
+    const-string/jumbo v0, "27318"
+    const-string/jumbo v0, "27319"
+    const-string/jumbo v0, "27320"
+    const-string/jumbo v0, "27321"
+    const-string/jumbo v0, "27322"
+    const-string/jumbo v0, "27323"
+    const-string/jumbo v0, "27324"
+    const-string/jumbo v0, "27325"
+    const-string/jumbo v0, "27326"
+    const-string/jumbo v0, "27327"
+    const-string/jumbo v0, "27328"
+    const-string/jumbo v0, "27329"
+    const-string/jumbo v0, "27330"
+    const-string/jumbo v0, "27331"
+    const-string/jumbo v0, "27332"
+    const-string/jumbo v0, "27333"
+    const-string/jumbo v0, "27334"
+    const-string/jumbo v0, "27335"
+    const-string/jumbo v0, "27336"
+    const-string/jumbo v0, "27337"
+    const-string/jumbo v0, "27338"
+    const-string/jumbo v0, "27339"
+    const-string/jumbo v0, "27340"
+    const-string/jumbo v0, "27341"
+    const-string/jumbo v0, "27342"
+    const-string/jumbo v0, "27343"
+    const-string/jumbo v0, "27344"
+    const-string/jumbo v0, "27345"
+    const-string/jumbo v0, "27346"
+    const-string/jumbo v0, "27347"
+    const-string/jumbo v0, "27348"
+    const-string/jumbo v0, "27349"
+    const-string/jumbo v0, "27350"
+    const-string/jumbo v0, "27351"
+    const-string/jumbo v0, "27352"
+    const-string/jumbo v0, "27353"
+    const-string/jumbo v0, "27354"
+    const-string/jumbo v0, "27355"
+    const-string/jumbo v0, "27356"
+    const-string/jumbo v0, "27357"
+    const-string/jumbo v0, "27358"
+    const-string/jumbo v0, "27359"
+    const-string/jumbo v0, "27360"
+    const-string/jumbo v0, "27361"
+    const-string/jumbo v0, "27362"
+    const-string/jumbo v0, "27363"
+    const-string/jumbo v0, "27364"
+    const-string/jumbo v0, "27365"
+    const-string/jumbo v0, "27366"
+    const-string/jumbo v0, "27367"
+    const-string/jumbo v0, "27368"
+    const-string/jumbo v0, "27369"
+    const-string/jumbo v0, "27370"
+    const-string/jumbo v0, "27371"
+    const-string/jumbo v0, "27372"
+    const-string/jumbo v0, "27373"
+    const-string/jumbo v0, "27374"
+    const-string/jumbo v0, "27375"
+    const-string/jumbo v0, "27376"
+    const-string/jumbo v0, "27377"
+    const-string/jumbo v0, "27378"
+    const-string/jumbo v0, "27379"
+    const-string/jumbo v0, "27380"
+    const-string/jumbo v0, "27381"
+    const-string/jumbo v0, "27382"
+    const-string/jumbo v0, "27383"
+    const-string/jumbo v0, "27384"
+    const-string/jumbo v0, "27385"
+    const-string/jumbo v0, "27386"
+    const-string/jumbo v0, "27387"
+    const-string/jumbo v0, "27388"
+    const-string/jumbo v0, "27389"
+    const-string/jumbo v0, "27390"
+    const-string/jumbo v0, "27391"
+    const-string/jumbo v0, "27392"
+    const-string/jumbo v0, "27393"
+    const-string/jumbo v0, "27394"
+    const-string/jumbo v0, "27395"
+    const-string/jumbo v0, "27396"
+    const-string/jumbo v0, "27397"
+    const-string/jumbo v0, "27398"
+    const-string/jumbo v0, "27399"
+    const-string/jumbo v0, "27400"
+    const-string/jumbo v0, "27401"
+    const-string/jumbo v0, "27402"
+    const-string/jumbo v0, "27403"
+    const-string/jumbo v0, "27404"
+    const-string/jumbo v0, "27405"
+    const-string/jumbo v0, "27406"
+    const-string/jumbo v0, "27407"
+    const-string/jumbo v0, "27408"
+    const-string/jumbo v0, "27409"
+    const-string/jumbo v0, "27410"
+    const-string/jumbo v0, "27411"
+    const-string/jumbo v0, "27412"
+    const-string/jumbo v0, "27413"
+    const-string/jumbo v0, "27414"
+    const-string/jumbo v0, "27415"
+    const-string/jumbo v0, "27416"
+    const-string/jumbo v0, "27417"
+    const-string/jumbo v0, "27418"
+    const-string/jumbo v0, "27419"
+    const-string/jumbo v0, "27420"
+    const-string/jumbo v0, "27421"
+    const-string/jumbo v0, "27422"
+    const-string/jumbo v0, "27423"
+    const-string/jumbo v0, "27424"
+    const-string/jumbo v0, "27425"
+    const-string/jumbo v0, "27426"
+    const-string/jumbo v0, "27427"
+    const-string/jumbo v0, "27428"
+    const-string/jumbo v0, "27429"
+    const-string/jumbo v0, "27430"
+    const-string/jumbo v0, "27431"
+    const-string/jumbo v0, "27432"
+    const-string/jumbo v0, "27433"
+    const-string/jumbo v0, "27434"
+    const-string/jumbo v0, "27435"
+    const-string/jumbo v0, "27436"
+    const-string/jumbo v0, "27437"
+    const-string/jumbo v0, "27438"
+    const-string/jumbo v0, "27439"
+    const-string/jumbo v0, "27440"
+    const-string/jumbo v0, "27441"
+    const-string/jumbo v0, "27442"
+    const-string/jumbo v0, "27443"
+    const-string/jumbo v0, "27444"
+    const-string/jumbo v0, "27445"
+    const-string/jumbo v0, "27446"
+    const-string/jumbo v0, "27447"
+    const-string/jumbo v0, "27448"
+    const-string/jumbo v0, "27449"
+    const-string/jumbo v0, "27450"
+    const-string/jumbo v0, "27451"
+    const-string/jumbo v0, "27452"
+    const-string/jumbo v0, "27453"
+    const-string/jumbo v0, "27454"
+    const-string/jumbo v0, "27455"
+    const-string/jumbo v0, "27456"
+    const-string/jumbo v0, "27457"
+    const-string/jumbo v0, "27458"
+    const-string/jumbo v0, "27459"
+    const-string/jumbo v0, "27460"
+    const-string/jumbo v0, "27461"
+    const-string/jumbo v0, "27462"
+    const-string/jumbo v0, "27463"
+    const-string/jumbo v0, "27464"
+    const-string/jumbo v0, "27465"
+    const-string/jumbo v0, "27466"
+    const-string/jumbo v0, "27467"
+    const-string/jumbo v0, "27468"
+    const-string/jumbo v0, "27469"
+    const-string/jumbo v0, "27470"
+    const-string/jumbo v0, "27471"
+    const-string/jumbo v0, "27472"
+    const-string/jumbo v0, "27473"
+    const-string/jumbo v0, "27474"
+    const-string/jumbo v0, "27475"
+    const-string/jumbo v0, "27476"
+    const-string/jumbo v0, "27477"
+    const-string/jumbo v0, "27478"
+    const-string/jumbo v0, "27479"
+    const-string/jumbo v0, "27480"
+    const-string/jumbo v0, "27481"
+    const-string/jumbo v0, "27482"
+    const-string/jumbo v0, "27483"
+    const-string/jumbo v0, "27484"
+    const-string/jumbo v0, "27485"
+    const-string/jumbo v0, "27486"
+    const-string/jumbo v0, "27487"
+    const-string/jumbo v0, "27488"
+    const-string/jumbo v0, "27489"
+    const-string/jumbo v0, "27490"
+    const-string/jumbo v0, "27491"
+    const-string/jumbo v0, "27492"
+    const-string/jumbo v0, "27493"
+    const-string/jumbo v0, "27494"
+    const-string/jumbo v0, "27495"
+    const-string/jumbo v0, "27496"
+    const-string/jumbo v0, "27497"
+    const-string/jumbo v0, "27498"
+    const-string/jumbo v0, "27499"
+    const-string/jumbo v0, "27500"
+    const-string/jumbo v0, "27501"
+    const-string/jumbo v0, "27502"
+    const-string/jumbo v0, "27503"
+    const-string/jumbo v0, "27504"
+    const-string/jumbo v0, "27505"
+    const-string/jumbo v0, "27506"
+    const-string/jumbo v0, "27507"
+    const-string/jumbo v0, "27508"
+    const-string/jumbo v0, "27509"
+    const-string/jumbo v0, "27510"
+    const-string/jumbo v0, "27511"
+    const-string/jumbo v0, "27512"
+    const-string/jumbo v0, "27513"
+    const-string/jumbo v0, "27514"
+    const-string/jumbo v0, "27515"
+    const-string/jumbo v0, "27516"
+    const-string/jumbo v0, "27517"
+    const-string/jumbo v0, "27518"
+    const-string/jumbo v0, "27519"
+    const-string/jumbo v0, "27520"
+    const-string/jumbo v0, "27521"
+    const-string/jumbo v0, "27522"
+    const-string/jumbo v0, "27523"
+    const-string/jumbo v0, "27524"
+    const-string/jumbo v0, "27525"
+    const-string/jumbo v0, "27526"
+    const-string/jumbo v0, "27527"
+    const-string/jumbo v0, "27528"
+    const-string/jumbo v0, "27529"
+    const-string/jumbo v0, "27530"
+    const-string/jumbo v0, "27531"
+    const-string/jumbo v0, "27532"
+    const-string/jumbo v0, "27533"
+    const-string/jumbo v0, "27534"
+    const-string/jumbo v0, "27535"
+    const-string/jumbo v0, "27536"
+    const-string/jumbo v0, "27537"
+    const-string/jumbo v0, "27538"
+    const-string/jumbo v0, "27539"
+    const-string/jumbo v0, "27540"
+    const-string/jumbo v0, "27541"
+    const-string/jumbo v0, "27542"
+    const-string/jumbo v0, "27543"
+    const-string/jumbo v0, "27544"
+    const-string/jumbo v0, "27545"
+    const-string/jumbo v0, "27546"
+    const-string/jumbo v0, "27547"
+    const-string/jumbo v0, "27548"
+    const-string/jumbo v0, "27549"
+    const-string/jumbo v0, "27550"
+    const-string/jumbo v0, "27551"
+    const-string/jumbo v0, "27552"
+    const-string/jumbo v0, "27553"
+    const-string/jumbo v0, "27554"
+    const-string/jumbo v0, "27555"
+    const-string/jumbo v0, "27556"
+    const-string/jumbo v0, "27557"
+    const-string/jumbo v0, "27558"
+    const-string/jumbo v0, "27559"
+    const-string/jumbo v0, "27560"
+    const-string/jumbo v0, "27561"
+    const-string/jumbo v0, "27562"
+    const-string/jumbo v0, "27563"
+    const-string/jumbo v0, "27564"
+    const-string/jumbo v0, "27565"
+    const-string/jumbo v0, "27566"
+    const-string/jumbo v0, "27567"
+    const-string/jumbo v0, "27568"
+    const-string/jumbo v0, "27569"
+    const-string/jumbo v0, "27570"
+    const-string/jumbo v0, "27571"
+    const-string/jumbo v0, "27572"
+    const-string/jumbo v0, "27573"
+    const-string/jumbo v0, "27574"
+    const-string/jumbo v0, "27575"
+    const-string/jumbo v0, "27576"
+    const-string/jumbo v0, "27577"
+    const-string/jumbo v0, "27578"
+    const-string/jumbo v0, "27579"
+    const-string/jumbo v0, "27580"
+    const-string/jumbo v0, "27581"
+    const-string/jumbo v0, "27582"
+    const-string/jumbo v0, "27583"
+    const-string/jumbo v0, "27584"
+    const-string/jumbo v0, "27585"
+    const-string/jumbo v0, "27586"
+    const-string/jumbo v0, "27587"
+    const-string/jumbo v0, "27588"
+    const-string/jumbo v0, "27589"
+    const-string/jumbo v0, "27590"
+    const-string/jumbo v0, "27591"
+    const-string/jumbo v0, "27592"
+    const-string/jumbo v0, "27593"
+    const-string/jumbo v0, "27594"
+    const-string/jumbo v0, "27595"
+    const-string/jumbo v0, "27596"
+    const-string/jumbo v0, "27597"
+    const-string/jumbo v0, "27598"
+    const-string/jumbo v0, "27599"
+    const-string/jumbo v0, "27600"
+    const-string/jumbo v0, "27601"
+    const-string/jumbo v0, "27602"
+    const-string/jumbo v0, "27603"
+    const-string/jumbo v0, "27604"
+    const-string/jumbo v0, "27605"
+    const-string/jumbo v0, "27606"
+    const-string/jumbo v0, "27607"
+    const-string/jumbo v0, "27608"
+    const-string/jumbo v0, "27609"
+    const-string/jumbo v0, "27610"
+    const-string/jumbo v0, "27611"
+    const-string/jumbo v0, "27612"
+    const-string/jumbo v0, "27613"
+    const-string/jumbo v0, "27614"
+    const-string/jumbo v0, "27615"
+    const-string/jumbo v0, "27616"
+    const-string/jumbo v0, "27617"
+    const-string/jumbo v0, "27618"
+    const-string/jumbo v0, "27619"
+    const-string/jumbo v0, "27620"
+    const-string/jumbo v0, "27621"
+    const-string/jumbo v0, "27622"
+    const-string/jumbo v0, "27623"
+    const-string/jumbo v0, "27624"
+    const-string/jumbo v0, "27625"
+    const-string/jumbo v0, "27626"
+    const-string/jumbo v0, "27627"
+    const-string/jumbo v0, "27628"
+    const-string/jumbo v0, "27629"
+    const-string/jumbo v0, "27630"
+    const-string/jumbo v0, "27631"
+    const-string/jumbo v0, "27632"
+    const-string/jumbo v0, "27633"
+    const-string/jumbo v0, "27634"
+    const-string/jumbo v0, "27635"
+    const-string/jumbo v0, "27636"
+    const-string/jumbo v0, "27637"
+    const-string/jumbo v0, "27638"
+    const-string/jumbo v0, "27639"
+    const-string/jumbo v0, "27640"
+    const-string/jumbo v0, "27641"
+    const-string/jumbo v0, "27642"
+    const-string/jumbo v0, "27643"
+    const-string/jumbo v0, "27644"
+    const-string/jumbo v0, "27645"
+    const-string/jumbo v0, "27646"
+    const-string/jumbo v0, "27647"
+    const-string/jumbo v0, "27648"
+    const-string/jumbo v0, "27649"
+    const-string/jumbo v0, "27650"
+    const-string/jumbo v0, "27651"
+    const-string/jumbo v0, "27652"
+    const-string/jumbo v0, "27653"
+    const-string/jumbo v0, "27654"
+    const-string/jumbo v0, "27655"
+    const-string/jumbo v0, "27656"
+    const-string/jumbo v0, "27657"
+    const-string/jumbo v0, "27658"
+    const-string/jumbo v0, "27659"
+    const-string/jumbo v0, "27660"
+    const-string/jumbo v0, "27661"
+    const-string/jumbo v0, "27662"
+    const-string/jumbo v0, "27663"
+    const-string/jumbo v0, "27664"
+    const-string/jumbo v0, "27665"
+    const-string/jumbo v0, "27666"
+    const-string/jumbo v0, "27667"
+    const-string/jumbo v0, "27668"
+    const-string/jumbo v0, "27669"
+    const-string/jumbo v0, "27670"
+    const-string/jumbo v0, "27671"
+    const-string/jumbo v0, "27672"
+    const-string/jumbo v0, "27673"
+    const-string/jumbo v0, "27674"
+    const-string/jumbo v0, "27675"
+    const-string/jumbo v0, "27676"
+    const-string/jumbo v0, "27677"
+    const-string/jumbo v0, "27678"
+    const-string/jumbo v0, "27679"
+    const-string/jumbo v0, "27680"
+    const-string/jumbo v0, "27681"
+    const-string/jumbo v0, "27682"
+    const-string/jumbo v0, "27683"
+    const-string/jumbo v0, "27684"
+    const-string/jumbo v0, "27685"
+    const-string/jumbo v0, "27686"
+    const-string/jumbo v0, "27687"
+    const-string/jumbo v0, "27688"
+    const-string/jumbo v0, "27689"
+    const-string/jumbo v0, "27690"
+    const-string/jumbo v0, "27691"
+    const-string/jumbo v0, "27692"
+    const-string/jumbo v0, "27693"
+    const-string/jumbo v0, "27694"
+    const-string/jumbo v0, "27695"
+    const-string/jumbo v0, "27696"
+    const-string/jumbo v0, "27697"
+    const-string/jumbo v0, "27698"
+    const-string/jumbo v0, "27699"
+    const-string/jumbo v0, "27700"
+    const-string/jumbo v0, "27701"
+    const-string/jumbo v0, "27702"
+    const-string/jumbo v0, "27703"
+    const-string/jumbo v0, "27704"
+    const-string/jumbo v0, "27705"
+    const-string/jumbo v0, "27706"
+    const-string/jumbo v0, "27707"
+    const-string/jumbo v0, "27708"
+    const-string/jumbo v0, "27709"
+    const-string/jumbo v0, "27710"
+    const-string/jumbo v0, "27711"
+    const-string/jumbo v0, "27712"
+    const-string/jumbo v0, "27713"
+    const-string/jumbo v0, "27714"
+    const-string/jumbo v0, "27715"
+    const-string/jumbo v0, "27716"
+    const-string/jumbo v0, "27717"
+    const-string/jumbo v0, "27718"
+    const-string/jumbo v0, "27719"
+    const-string/jumbo v0, "27720"
+    const-string/jumbo v0, "27721"
+    const-string/jumbo v0, "27722"
+    const-string/jumbo v0, "27723"
+    const-string/jumbo v0, "27724"
+    const-string/jumbo v0, "27725"
+    const-string/jumbo v0, "27726"
+    const-string/jumbo v0, "27727"
+    const-string/jumbo v0, "27728"
+    const-string/jumbo v0, "27729"
+    const-string/jumbo v0, "27730"
+    const-string/jumbo v0, "27731"
+    const-string/jumbo v0, "27732"
+    const-string/jumbo v0, "27733"
+    const-string/jumbo v0, "27734"
+    const-string/jumbo v0, "27735"
+    const-string/jumbo v0, "27736"
+    const-string/jumbo v0, "27737"
+    const-string/jumbo v0, "27738"
+    const-string/jumbo v0, "27739"
+    const-string/jumbo v0, "27740"
+    const-string/jumbo v0, "27741"
+    const-string/jumbo v0, "27742"
+    const-string/jumbo v0, "27743"
+    const-string/jumbo v0, "27744"
+    const-string/jumbo v0, "27745"
+    const-string/jumbo v0, "27746"
+    const-string/jumbo v0, "27747"
+    const-string/jumbo v0, "27748"
+    const-string/jumbo v0, "27749"
+    const-string/jumbo v0, "27750"
+    const-string/jumbo v0, "27751"
+    const-string/jumbo v0, "27752"
+    const-string/jumbo v0, "27753"
+    const-string/jumbo v0, "27754"
+    const-string/jumbo v0, "27755"
+    const-string/jumbo v0, "27756"
+    const-string/jumbo v0, "27757"
+    const-string/jumbo v0, "27758"
+    const-string/jumbo v0, "27759"
+    const-string/jumbo v0, "27760"
+    const-string/jumbo v0, "27761"
+    const-string/jumbo v0, "27762"
+    const-string/jumbo v0, "27763"
+    const-string/jumbo v0, "27764"
+    const-string/jumbo v0, "27765"
+    const-string/jumbo v0, "27766"
+    const-string/jumbo v0, "27767"
+    const-string/jumbo v0, "27768"
+    const-string/jumbo v0, "27769"
+    const-string/jumbo v0, "27770"
+    const-string/jumbo v0, "27771"
+    const-string/jumbo v0, "27772"
+    const-string/jumbo v0, "27773"
+    const-string/jumbo v0, "27774"
+    const-string/jumbo v0, "27775"
+    const-string/jumbo v0, "27776"
+    const-string/jumbo v0, "27777"
+    const-string/jumbo v0, "27778"
+    const-string/jumbo v0, "27779"
+    const-string/jumbo v0, "27780"
+    const-string/jumbo v0, "27781"
+    const-string/jumbo v0, "27782"
+    const-string/jumbo v0, "27783"
+    const-string/jumbo v0, "27784"
+    const-string/jumbo v0, "27785"
+    const-string/jumbo v0, "27786"
+    const-string/jumbo v0, "27787"
+    const-string/jumbo v0, "27788"
+    const-string/jumbo v0, "27789"
+    const-string/jumbo v0, "27790"
+    const-string/jumbo v0, "27791"
+    const-string/jumbo v0, "27792"
+    const-string/jumbo v0, "27793"
+    const-string/jumbo v0, "27794"
+    const-string/jumbo v0, "27795"
+    const-string/jumbo v0, "27796"
+    const-string/jumbo v0, "27797"
+    const-string/jumbo v0, "27798"
+    const-string/jumbo v0, "27799"
+    const-string/jumbo v0, "27800"
+    const-string/jumbo v0, "27801"
+    const-string/jumbo v0, "27802"
+    const-string/jumbo v0, "27803"
+    const-string/jumbo v0, "27804"
+    const-string/jumbo v0, "27805"
+    const-string/jumbo v0, "27806"
+    const-string/jumbo v0, "27807"
+    const-string/jumbo v0, "27808"
+    const-string/jumbo v0, "27809"
+    const-string/jumbo v0, "27810"
+    const-string/jumbo v0, "27811"
+    const-string/jumbo v0, "27812"
+    const-string/jumbo v0, "27813"
+    const-string/jumbo v0, "27814"
+    const-string/jumbo v0, "27815"
+    const-string/jumbo v0, "27816"
+    const-string/jumbo v0, "27817"
+    const-string/jumbo v0, "27818"
+    const-string/jumbo v0, "27819"
+    const-string/jumbo v0, "27820"
+    const-string/jumbo v0, "27821"
+    const-string/jumbo v0, "27822"
+    const-string/jumbo v0, "27823"
+    const-string/jumbo v0, "27824"
+    const-string/jumbo v0, "27825"
+    const-string/jumbo v0, "27826"
+    const-string/jumbo v0, "27827"
+    const-string/jumbo v0, "27828"
+    const-string/jumbo v0, "27829"
+    const-string/jumbo v0, "27830"
+    const-string/jumbo v0, "27831"
+    const-string/jumbo v0, "27832"
+    const-string/jumbo v0, "27833"
+    const-string/jumbo v0, "27834"
+    const-string/jumbo v0, "27835"
+    const-string/jumbo v0, "27836"
+    const-string/jumbo v0, "27837"
+    const-string/jumbo v0, "27838"
+    const-string/jumbo v0, "27839"
+    const-string/jumbo v0, "27840"
+    const-string/jumbo v0, "27841"
+    const-string/jumbo v0, "27842"
+    const-string/jumbo v0, "27843"
+    const-string/jumbo v0, "27844"
+    const-string/jumbo v0, "27845"
+    const-string/jumbo v0, "27846"
+    const-string/jumbo v0, "27847"
+    const-string/jumbo v0, "27848"
+    const-string/jumbo v0, "27849"
+    const-string/jumbo v0, "27850"
+    const-string/jumbo v0, "27851"
+    const-string/jumbo v0, "27852"
+    const-string/jumbo v0, "27853"
+    const-string/jumbo v0, "27854"
+    const-string/jumbo v0, "27855"
+    const-string/jumbo v0, "27856"
+    const-string/jumbo v0, "27857"
+    const-string/jumbo v0, "27858"
+    const-string/jumbo v0, "27859"
+    const-string/jumbo v0, "27860"
+    const-string/jumbo v0, "27861"
+    const-string/jumbo v0, "27862"
+    const-string/jumbo v0, "27863"
+    const-string/jumbo v0, "27864"
+    const-string/jumbo v0, "27865"
+    const-string/jumbo v0, "27866"
+    const-string/jumbo v0, "27867"
+    const-string/jumbo v0, "27868"
+    const-string/jumbo v0, "27869"
+    const-string/jumbo v0, "27870"
+    const-string/jumbo v0, "27871"
+    const-string/jumbo v0, "27872"
+    const-string/jumbo v0, "27873"
+    const-string/jumbo v0, "27874"
+    const-string/jumbo v0, "27875"
+    const-string/jumbo v0, "27876"
+    const-string/jumbo v0, "27877"
+    const-string/jumbo v0, "27878"
+    const-string/jumbo v0, "27879"
+    const-string/jumbo v0, "27880"
+    const-string/jumbo v0, "27881"
+    const-string/jumbo v0, "27882"
+    const-string/jumbo v0, "27883"
+    const-string/jumbo v0, "27884"
+    const-string/jumbo v0, "27885"
+    const-string/jumbo v0, "27886"
+    const-string/jumbo v0, "27887"
+    const-string/jumbo v0, "27888"
+    const-string/jumbo v0, "27889"
+    const-string/jumbo v0, "27890"
+    const-string/jumbo v0, "27891"
+    const-string/jumbo v0, "27892"
+    const-string/jumbo v0, "27893"
+    const-string/jumbo v0, "27894"
+    const-string/jumbo v0, "27895"
+    const-string/jumbo v0, "27896"
+    const-string/jumbo v0, "27897"
+    const-string/jumbo v0, "27898"
+    const-string/jumbo v0, "27899"
+    const-string/jumbo v0, "27900"
+    const-string/jumbo v0, "27901"
+    const-string/jumbo v0, "27902"
+    const-string/jumbo v0, "27903"
+    const-string/jumbo v0, "27904"
+    const-string/jumbo v0, "27905"
+    const-string/jumbo v0, "27906"
+    const-string/jumbo v0, "27907"
+    const-string/jumbo v0, "27908"
+    const-string/jumbo v0, "27909"
+    const-string/jumbo v0, "27910"
+    const-string/jumbo v0, "27911"
+    const-string/jumbo v0, "27912"
+    const-string/jumbo v0, "27913"
+    const-string/jumbo v0, "27914"
+    const-string/jumbo v0, "27915"
+    const-string/jumbo v0, "27916"
+    const-string/jumbo v0, "27917"
+    const-string/jumbo v0, "27918"
+    const-string/jumbo v0, "27919"
+    const-string/jumbo v0, "27920"
+    const-string/jumbo v0, "27921"
+    const-string/jumbo v0, "27922"
+    const-string/jumbo v0, "27923"
+    const-string/jumbo v0, "27924"
+    const-string/jumbo v0, "27925"
+    const-string/jumbo v0, "27926"
+    const-string/jumbo v0, "27927"
+    const-string/jumbo v0, "27928"
+    const-string/jumbo v0, "27929"
+    const-string/jumbo v0, "27930"
+    const-string/jumbo v0, "27931"
+    const-string/jumbo v0, "27932"
+    const-string/jumbo v0, "27933"
+    const-string/jumbo v0, "27934"
+    const-string/jumbo v0, "27935"
+    const-string/jumbo v0, "27936"
+    const-string/jumbo v0, "27937"
+    const-string/jumbo v0, "27938"
+    const-string/jumbo v0, "27939"
+    const-string/jumbo v0, "27940"
+    const-string/jumbo v0, "27941"
+    const-string/jumbo v0, "27942"
+    const-string/jumbo v0, "27943"
+    const-string/jumbo v0, "27944"
+    const-string/jumbo v0, "27945"
+    const-string/jumbo v0, "27946"
+    const-string/jumbo v0, "27947"
+    const-string/jumbo v0, "27948"
+    const-string/jumbo v0, "27949"
+    const-string/jumbo v0, "27950"
+    const-string/jumbo v0, "27951"
+    const-string/jumbo v0, "27952"
+    const-string/jumbo v0, "27953"
+    const-string/jumbo v0, "27954"
+    const-string/jumbo v0, "27955"
+    const-string/jumbo v0, "27956"
+    const-string/jumbo v0, "27957"
+    const-string/jumbo v0, "27958"
+    const-string/jumbo v0, "27959"
+    const-string/jumbo v0, "27960"
+    const-string/jumbo v0, "27961"
+    const-string/jumbo v0, "27962"
+    const-string/jumbo v0, "27963"
+    const-string/jumbo v0, "27964"
+    const-string/jumbo v0, "27965"
+    const-string/jumbo v0, "27966"
+    const-string/jumbo v0, "27967"
+    const-string/jumbo v0, "27968"
+    const-string/jumbo v0, "27969"
+    const-string/jumbo v0, "27970"
+    const-string/jumbo v0, "27971"
+    const-string/jumbo v0, "27972"
+    const-string/jumbo v0, "27973"
+    const-string/jumbo v0, "27974"
+    const-string/jumbo v0, "27975"
+    const-string/jumbo v0, "27976"
+    const-string/jumbo v0, "27977"
+    const-string/jumbo v0, "27978"
+    const-string/jumbo v0, "27979"
+    const-string/jumbo v0, "27980"
+    const-string/jumbo v0, "27981"
+    const-string/jumbo v0, "27982"
+    const-string/jumbo v0, "27983"
+    const-string/jumbo v0, "27984"
+    const-string/jumbo v0, "27985"
+    const-string/jumbo v0, "27986"
+    const-string/jumbo v0, "27987"
+    const-string/jumbo v0, "27988"
+    const-string/jumbo v0, "27989"
+    const-string/jumbo v0, "27990"
+    const-string/jumbo v0, "27991"
+    const-string/jumbo v0, "27992"
+    const-string/jumbo v0, "27993"
+    const-string/jumbo v0, "27994"
+    const-string/jumbo v0, "27995"
+    const-string/jumbo v0, "27996"
+    const-string/jumbo v0, "27997"
+    const-string/jumbo v0, "27998"
+    const-string/jumbo v0, "27999"
+    const-string/jumbo v0, "28000"
+    const-string/jumbo v0, "28001"
+    const-string/jumbo v0, "28002"
+    const-string/jumbo v0, "28003"
+    const-string/jumbo v0, "28004"
+    const-string/jumbo v0, "28005"
+    const-string/jumbo v0, "28006"
+    const-string/jumbo v0, "28007"
+    const-string/jumbo v0, "28008"
+    const-string/jumbo v0, "28009"
+    const-string/jumbo v0, "28010"
+    const-string/jumbo v0, "28011"
+    const-string/jumbo v0, "28012"
+    const-string/jumbo v0, "28013"
+    const-string/jumbo v0, "28014"
+    const-string/jumbo v0, "28015"
+    const-string/jumbo v0, "28016"
+    const-string/jumbo v0, "28017"
+    const-string/jumbo v0, "28018"
+    const-string/jumbo v0, "28019"
+    const-string/jumbo v0, "28020"
+    const-string/jumbo v0, "28021"
+    const-string/jumbo v0, "28022"
+    const-string/jumbo v0, "28023"
+    const-string/jumbo v0, "28024"
+    const-string/jumbo v0, "28025"
+    const-string/jumbo v0, "28026"
+    const-string/jumbo v0, "28027"
+    const-string/jumbo v0, "28028"
+    const-string/jumbo v0, "28029"
+    const-string/jumbo v0, "28030"
+    const-string/jumbo v0, "28031"
+    const-string/jumbo v0, "28032"
+    const-string/jumbo v0, "28033"
+    const-string/jumbo v0, "28034"
+    const-string/jumbo v0, "28035"
+    const-string/jumbo v0, "28036"
+    const-string/jumbo v0, "28037"
+    const-string/jumbo v0, "28038"
+    const-string/jumbo v0, "28039"
+    const-string/jumbo v0, "28040"
+    const-string/jumbo v0, "28041"
+    const-string/jumbo v0, "28042"
+    const-string/jumbo v0, "28043"
+    const-string/jumbo v0, "28044"
+    const-string/jumbo v0, "28045"
+    const-string/jumbo v0, "28046"
+    const-string/jumbo v0, "28047"
+    const-string/jumbo v0, "28048"
+    const-string/jumbo v0, "28049"
+    const-string/jumbo v0, "28050"
+    const-string/jumbo v0, "28051"
+    const-string/jumbo v0, "28052"
+    const-string/jumbo v0, "28053"
+    const-string/jumbo v0, "28054"
+    const-string/jumbo v0, "28055"
+    const-string/jumbo v0, "28056"
+    const-string/jumbo v0, "28057"
+    const-string/jumbo v0, "28058"
+    const-string/jumbo v0, "28059"
+    const-string/jumbo v0, "28060"
+    const-string/jumbo v0, "28061"
+    const-string/jumbo v0, "28062"
+    const-string/jumbo v0, "28063"
+    const-string/jumbo v0, "28064"
+    const-string/jumbo v0, "28065"
+    const-string/jumbo v0, "28066"
+    const-string/jumbo v0, "28067"
+    const-string/jumbo v0, "28068"
+    const-string/jumbo v0, "28069"
+    const-string/jumbo v0, "28070"
+    const-string/jumbo v0, "28071"
+    const-string/jumbo v0, "28072"
+    const-string/jumbo v0, "28073"
+    const-string/jumbo v0, "28074"
+    const-string/jumbo v0, "28075"
+    const-string/jumbo v0, "28076"
+    const-string/jumbo v0, "28077"
+    const-string/jumbo v0, "28078"
+    const-string/jumbo v0, "28079"
+    const-string/jumbo v0, "28080"
+    const-string/jumbo v0, "28081"
+    const-string/jumbo v0, "28082"
+    const-string/jumbo v0, "28083"
+    const-string/jumbo v0, "28084"
+    const-string/jumbo v0, "28085"
+    const-string/jumbo v0, "28086"
+    const-string/jumbo v0, "28087"
+    const-string/jumbo v0, "28088"
+    const-string/jumbo v0, "28089"
+    const-string/jumbo v0, "28090"
+    const-string/jumbo v0, "28091"
+    const-string/jumbo v0, "28092"
+    const-string/jumbo v0, "28093"
+    const-string/jumbo v0, "28094"
+    const-string/jumbo v0, "28095"
+    const-string/jumbo v0, "28096"
+    const-string/jumbo v0, "28097"
+    const-string/jumbo v0, "28098"
+    const-string/jumbo v0, "28099"
+    const-string/jumbo v0, "28100"
+    const-string/jumbo v0, "28101"
+    const-string/jumbo v0, "28102"
+    const-string/jumbo v0, "28103"
+    const-string/jumbo v0, "28104"
+    const-string/jumbo v0, "28105"
+    const-string/jumbo v0, "28106"
+    const-string/jumbo v0, "28107"
+    const-string/jumbo v0, "28108"
+    const-string/jumbo v0, "28109"
+    const-string/jumbo v0, "28110"
+    const-string/jumbo v0, "28111"
+    const-string/jumbo v0, "28112"
+    const-string/jumbo v0, "28113"
+    const-string/jumbo v0, "28114"
+    const-string/jumbo v0, "28115"
+    const-string/jumbo v0, "28116"
+    const-string/jumbo v0, "28117"
+    const-string/jumbo v0, "28118"
+    const-string/jumbo v0, "28119"
+    const-string/jumbo v0, "28120"
+    const-string/jumbo v0, "28121"
+    const-string/jumbo v0, "28122"
+    const-string/jumbo v0, "28123"
+    const-string/jumbo v0, "28124"
+    const-string/jumbo v0, "28125"
+    const-string/jumbo v0, "28126"
+    const-string/jumbo v0, "28127"
+    const-string/jumbo v0, "28128"
+    const-string/jumbo v0, "28129"
+    const-string/jumbo v0, "28130"
+    const-string/jumbo v0, "28131"
+    const-string/jumbo v0, "28132"
+    const-string/jumbo v0, "28133"
+    const-string/jumbo v0, "28134"
+    const-string/jumbo v0, "28135"
+    const-string/jumbo v0, "28136"
+    const-string/jumbo v0, "28137"
+    const-string/jumbo v0, "28138"
+    const-string/jumbo v0, "28139"
+    const-string/jumbo v0, "28140"
+    const-string/jumbo v0, "28141"
+    const-string/jumbo v0, "28142"
+    const-string/jumbo v0, "28143"
+    const-string/jumbo v0, "28144"
+    const-string/jumbo v0, "28145"
+    const-string/jumbo v0, "28146"
+    const-string/jumbo v0, "28147"
+    const-string/jumbo v0, "28148"
+    const-string/jumbo v0, "28149"
+    const-string/jumbo v0, "28150"
+    const-string/jumbo v0, "28151"
+    const-string/jumbo v0, "28152"
+    const-string/jumbo v0, "28153"
+    const-string/jumbo v0, "28154"
+    const-string/jumbo v0, "28155"
+    const-string/jumbo v0, "28156"
+    const-string/jumbo v0, "28157"
+    const-string/jumbo v0, "28158"
+    const-string/jumbo v0, "28159"
+    const-string/jumbo v0, "28160"
+    const-string/jumbo v0, "28161"
+    const-string/jumbo v0, "28162"
+    const-string/jumbo v0, "28163"
+    const-string/jumbo v0, "28164"
+    const-string/jumbo v0, "28165"
+    const-string/jumbo v0, "28166"
+    const-string/jumbo v0, "28167"
+    const-string/jumbo v0, "28168"
+    const-string/jumbo v0, "28169"
+    const-string/jumbo v0, "28170"
+    const-string/jumbo v0, "28171"
+    const-string/jumbo v0, "28172"
+    const-string/jumbo v0, "28173"
+    const-string/jumbo v0, "28174"
+    const-string/jumbo v0, "28175"
+    const-string/jumbo v0, "28176"
+    const-string/jumbo v0, "28177"
+    const-string/jumbo v0, "28178"
+    const-string/jumbo v0, "28179"
+    const-string/jumbo v0, "28180"
+    const-string/jumbo v0, "28181"
+    const-string/jumbo v0, "28182"
+    const-string/jumbo v0, "28183"
+    const-string/jumbo v0, "28184"
+    const-string/jumbo v0, "28185"
+    const-string/jumbo v0, "28186"
+    const-string/jumbo v0, "28187"
+    const-string/jumbo v0, "28188"
+    const-string/jumbo v0, "28189"
+    const-string/jumbo v0, "28190"
+    const-string/jumbo v0, "28191"
+    const-string/jumbo v0, "28192"
+    const-string/jumbo v0, "28193"
+    const-string/jumbo v0, "28194"
+    const-string/jumbo v0, "28195"
+    const-string/jumbo v0, "28196"
+    const-string/jumbo v0, "28197"
+    const-string/jumbo v0, "28198"
+    const-string/jumbo v0, "28199"
+    const-string/jumbo v0, "28200"
+    const-string/jumbo v0, "28201"
+    const-string/jumbo v0, "28202"
+    const-string/jumbo v0, "28203"
+    const-string/jumbo v0, "28204"
+    const-string/jumbo v0, "28205"
+    const-string/jumbo v0, "28206"
+    const-string/jumbo v0, "28207"
+    const-string/jumbo v0, "28208"
+    const-string/jumbo v0, "28209"
+    const-string/jumbo v0, "28210"
+    const-string/jumbo v0, "28211"
+    const-string/jumbo v0, "28212"
+    const-string/jumbo v0, "28213"
+    const-string/jumbo v0, "28214"
+    const-string/jumbo v0, "28215"
+    const-string/jumbo v0, "28216"
+    const-string/jumbo v0, "28217"
+    const-string/jumbo v0, "28218"
+    const-string/jumbo v0, "28219"
+    const-string/jumbo v0, "28220"
+    const-string/jumbo v0, "28221"
+    const-string/jumbo v0, "28222"
+    const-string/jumbo v0, "28223"
+    const-string/jumbo v0, "28224"
+    const-string/jumbo v0, "28225"
+    const-string/jumbo v0, "28226"
+    const-string/jumbo v0, "28227"
+    const-string/jumbo v0, "28228"
+    const-string/jumbo v0, "28229"
+    const-string/jumbo v0, "28230"
+    const-string/jumbo v0, "28231"
+    const-string/jumbo v0, "28232"
+    const-string/jumbo v0, "28233"
+    const-string/jumbo v0, "28234"
+    const-string/jumbo v0, "28235"
+    const-string/jumbo v0, "28236"
+    const-string/jumbo v0, "28237"
+    const-string/jumbo v0, "28238"
+    const-string/jumbo v0, "28239"
+    const-string/jumbo v0, "28240"
+    const-string/jumbo v0, "28241"
+    const-string/jumbo v0, "28242"
+    const-string/jumbo v0, "28243"
+    const-string/jumbo v0, "28244"
+    const-string/jumbo v0, "28245"
+    const-string/jumbo v0, "28246"
+    const-string/jumbo v0, "28247"
+    const-string/jumbo v0, "28248"
+    const-string/jumbo v0, "28249"
+    const-string/jumbo v0, "28250"
+    const-string/jumbo v0, "28251"
+    const-string/jumbo v0, "28252"
+    const-string/jumbo v0, "28253"
+    const-string/jumbo v0, "28254"
+    const-string/jumbo v0, "28255"
+    const-string/jumbo v0, "28256"
+    const-string/jumbo v0, "28257"
+    const-string/jumbo v0, "28258"
+    const-string/jumbo v0, "28259"
+    const-string/jumbo v0, "28260"
+    const-string/jumbo v0, "28261"
+    const-string/jumbo v0, "28262"
+    const-string/jumbo v0, "28263"
+    const-string/jumbo v0, "28264"
+    const-string/jumbo v0, "28265"
+    const-string/jumbo v0, "28266"
+    const-string/jumbo v0, "28267"
+    const-string/jumbo v0, "28268"
+    const-string/jumbo v0, "28269"
+    const-string/jumbo v0, "28270"
+    const-string/jumbo v0, "28271"
+    const-string/jumbo v0, "28272"
+    const-string/jumbo v0, "28273"
+    const-string/jumbo v0, "28274"
+    const-string/jumbo v0, "28275"
+    const-string/jumbo v0, "28276"
+    const-string/jumbo v0, "28277"
+    const-string/jumbo v0, "28278"
+    const-string/jumbo v0, "28279"
+    const-string/jumbo v0, "28280"
+    const-string/jumbo v0, "28281"
+    const-string/jumbo v0, "28282"
+    const-string/jumbo v0, "28283"
+    const-string/jumbo v0, "28284"
+    const-string/jumbo v0, "28285"
+    const-string/jumbo v0, "28286"
+    const-string/jumbo v0, "28287"
+    const-string/jumbo v0, "28288"
+    const-string/jumbo v0, "28289"
+    const-string/jumbo v0, "28290"
+    const-string/jumbo v0, "28291"
+    const-string/jumbo v0, "28292"
+    const-string/jumbo v0, "28293"
+    const-string/jumbo v0, "28294"
+    const-string/jumbo v0, "28295"
+    const-string/jumbo v0, "28296"
+    const-string/jumbo v0, "28297"
+    const-string/jumbo v0, "28298"
+    const-string/jumbo v0, "28299"
+    const-string/jumbo v0, "28300"
+    const-string/jumbo v0, "28301"
+    const-string/jumbo v0, "28302"
+    const-string/jumbo v0, "28303"
+    const-string/jumbo v0, "28304"
+    const-string/jumbo v0, "28305"
+    const-string/jumbo v0, "28306"
+    const-string/jumbo v0, "28307"
+    const-string/jumbo v0, "28308"
+    const-string/jumbo v0, "28309"
+    const-string/jumbo v0, "28310"
+    const-string/jumbo v0, "28311"
+    const-string/jumbo v0, "28312"
+    const-string/jumbo v0, "28313"
+    const-string/jumbo v0, "28314"
+    const-string/jumbo v0, "28315"
+    const-string/jumbo v0, "28316"
+    const-string/jumbo v0, "28317"
+    const-string/jumbo v0, "28318"
+    const-string/jumbo v0, "28319"
+    const-string/jumbo v0, "28320"
+    const-string/jumbo v0, "28321"
+    const-string/jumbo v0, "28322"
+    const-string/jumbo v0, "28323"
+    const-string/jumbo v0, "28324"
+    const-string/jumbo v0, "28325"
+    const-string/jumbo v0, "28326"
+    const-string/jumbo v0, "28327"
+    const-string/jumbo v0, "28328"
+    const-string/jumbo v0, "28329"
+    const-string/jumbo v0, "28330"
+    const-string/jumbo v0, "28331"
+    const-string/jumbo v0, "28332"
+    const-string/jumbo v0, "28333"
+    const-string/jumbo v0, "28334"
+    const-string/jumbo v0, "28335"
+    const-string/jumbo v0, "28336"
+    const-string/jumbo v0, "28337"
+    const-string/jumbo v0, "28338"
+    const-string/jumbo v0, "28339"
+    const-string/jumbo v0, "28340"
+    const-string/jumbo v0, "28341"
+    const-string/jumbo v0, "28342"
+    const-string/jumbo v0, "28343"
+    const-string/jumbo v0, "28344"
+    const-string/jumbo v0, "28345"
+    const-string/jumbo v0, "28346"
+    const-string/jumbo v0, "28347"
+    const-string/jumbo v0, "28348"
+    const-string/jumbo v0, "28349"
+    const-string/jumbo v0, "28350"
+    const-string/jumbo v0, "28351"
+    const-string/jumbo v0, "28352"
+    const-string/jumbo v0, "28353"
+    const-string/jumbo v0, "28354"
+    const-string/jumbo v0, "28355"
+    const-string/jumbo v0, "28356"
+    const-string/jumbo v0, "28357"
+    const-string/jumbo v0, "28358"
+    const-string/jumbo v0, "28359"
+    const-string/jumbo v0, "28360"
+    const-string/jumbo v0, "28361"
+    const-string/jumbo v0, "28362"
+    const-string/jumbo v0, "28363"
+    const-string/jumbo v0, "28364"
+    const-string/jumbo v0, "28365"
+    const-string/jumbo v0, "28366"
+    const-string/jumbo v0, "28367"
+    const-string/jumbo v0, "28368"
+    const-string/jumbo v0, "28369"
+    const-string/jumbo v0, "28370"
+    const-string/jumbo v0, "28371"
+    const-string/jumbo v0, "28372"
+    const-string/jumbo v0, "28373"
+    const-string/jumbo v0, "28374"
+    const-string/jumbo v0, "28375"
+    const-string/jumbo v0, "28376"
+    const-string/jumbo v0, "28377"
+    const-string/jumbo v0, "28378"
+    const-string/jumbo v0, "28379"
+    const-string/jumbo v0, "28380"
+    const-string/jumbo v0, "28381"
+    const-string/jumbo v0, "28382"
+    const-string/jumbo v0, "28383"
+    const-string/jumbo v0, "28384"
+    const-string/jumbo v0, "28385"
+    const-string/jumbo v0, "28386"
+    const-string/jumbo v0, "28387"
+    const-string/jumbo v0, "28388"
+    const-string/jumbo v0, "28389"
+    const-string/jumbo v0, "28390"
+    const-string/jumbo v0, "28391"
+    const-string/jumbo v0, "28392"
+    const-string/jumbo v0, "28393"
+    const-string/jumbo v0, "28394"
+    const-string/jumbo v0, "28395"
+    const-string/jumbo v0, "28396"
+    const-string/jumbo v0, "28397"
+    const-string/jumbo v0, "28398"
+    const-string/jumbo v0, "28399"
+    const-string/jumbo v0, "28400"
+    const-string/jumbo v0, "28401"
+    const-string/jumbo v0, "28402"
+    const-string/jumbo v0, "28403"
+    const-string/jumbo v0, "28404"
+    const-string/jumbo v0, "28405"
+    const-string/jumbo v0, "28406"
+    const-string/jumbo v0, "28407"
+    const-string/jumbo v0, "28408"
+    const-string/jumbo v0, "28409"
+    const-string/jumbo v0, "28410"
+    const-string/jumbo v0, "28411"
+    const-string/jumbo v0, "28412"
+    const-string/jumbo v0, "28413"
+    const-string/jumbo v0, "28414"
+    const-string/jumbo v0, "28415"
+    const-string/jumbo v0, "28416"
+    const-string/jumbo v0, "28417"
+    const-string/jumbo v0, "28418"
+    const-string/jumbo v0, "28419"
+    const-string/jumbo v0, "28420"
+    const-string/jumbo v0, "28421"
+    const-string/jumbo v0, "28422"
+    const-string/jumbo v0, "28423"
+    const-string/jumbo v0, "28424"
+    const-string/jumbo v0, "28425"
+    const-string/jumbo v0, "28426"
+    const-string/jumbo v0, "28427"
+    const-string/jumbo v0, "28428"
+    const-string/jumbo v0, "28429"
+    const-string/jumbo v0, "28430"
+    const-string/jumbo v0, "28431"
+    const-string/jumbo v0, "28432"
+    const-string/jumbo v0, "28433"
+    const-string/jumbo v0, "28434"
+    const-string/jumbo v0, "28435"
+    const-string/jumbo v0, "28436"
+    const-string/jumbo v0, "28437"
+    const-string/jumbo v0, "28438"
+    const-string/jumbo v0, "28439"
+    const-string/jumbo v0, "28440"
+    const-string/jumbo v0, "28441"
+    const-string/jumbo v0, "28442"
+    const-string/jumbo v0, "28443"
+    const-string/jumbo v0, "28444"
+    const-string/jumbo v0, "28445"
+    const-string/jumbo v0, "28446"
+    const-string/jumbo v0, "28447"
+    const-string/jumbo v0, "28448"
+    const-string/jumbo v0, "28449"
+    const-string/jumbo v0, "28450"
+    const-string/jumbo v0, "28451"
+    const-string/jumbo v0, "28452"
+    const-string/jumbo v0, "28453"
+    const-string/jumbo v0, "28454"
+    const-string/jumbo v0, "28455"
+    const-string/jumbo v0, "28456"
+    const-string/jumbo v0, "28457"
+    const-string/jumbo v0, "28458"
+    const-string/jumbo v0, "28459"
+    const-string/jumbo v0, "28460"
+    const-string/jumbo v0, "28461"
+    const-string/jumbo v0, "28462"
+    const-string/jumbo v0, "28463"
+    const-string/jumbo v0, "28464"
+    const-string/jumbo v0, "28465"
+    const-string/jumbo v0, "28466"
+    const-string/jumbo v0, "28467"
+    const-string/jumbo v0, "28468"
+    const-string/jumbo v0, "28469"
+    const-string/jumbo v0, "28470"
+    const-string/jumbo v0, "28471"
+    const-string/jumbo v0, "28472"
+    const-string/jumbo v0, "28473"
+    const-string/jumbo v0, "28474"
+    const-string/jumbo v0, "28475"
+    const-string/jumbo v0, "28476"
+    const-string/jumbo v0, "28477"
+    const-string/jumbo v0, "28478"
+    const-string/jumbo v0, "28479"
+    const-string/jumbo v0, "28480"
+    const-string/jumbo v0, "28481"
+    const-string/jumbo v0, "28482"
+    const-string/jumbo v0, "28483"
+    const-string/jumbo v0, "28484"
+    const-string/jumbo v0, "28485"
+    const-string/jumbo v0, "28486"
+    const-string/jumbo v0, "28487"
+    const-string/jumbo v0, "28488"
+    const-string/jumbo v0, "28489"
+    const-string/jumbo v0, "28490"
+    const-string/jumbo v0, "28491"
+    const-string/jumbo v0, "28492"
+    const-string/jumbo v0, "28493"
+    const-string/jumbo v0, "28494"
+    const-string/jumbo v0, "28495"
+    const-string/jumbo v0, "28496"
+    const-string/jumbo v0, "28497"
+    const-string/jumbo v0, "28498"
+    const-string/jumbo v0, "28499"
+    const-string/jumbo v0, "28500"
+    const-string/jumbo v0, "28501"
+    const-string/jumbo v0, "28502"
+    const-string/jumbo v0, "28503"
+    const-string/jumbo v0, "28504"
+    const-string/jumbo v0, "28505"
+    const-string/jumbo v0, "28506"
+    const-string/jumbo v0, "28507"
+    const-string/jumbo v0, "28508"
+    const-string/jumbo v0, "28509"
+    const-string/jumbo v0, "28510"
+    const-string/jumbo v0, "28511"
+    const-string/jumbo v0, "28512"
+    const-string/jumbo v0, "28513"
+    const-string/jumbo v0, "28514"
+    const-string/jumbo v0, "28515"
+    const-string/jumbo v0, "28516"
+    const-string/jumbo v0, "28517"
+    const-string/jumbo v0, "28518"
+    const-string/jumbo v0, "28519"
+    const-string/jumbo v0, "28520"
+    const-string/jumbo v0, "28521"
+    const-string/jumbo v0, "28522"
+    const-string/jumbo v0, "28523"
+    const-string/jumbo v0, "28524"
+    const-string/jumbo v0, "28525"
+    const-string/jumbo v0, "28526"
+    const-string/jumbo v0, "28527"
+    const-string/jumbo v0, "28528"
+    const-string/jumbo v0, "28529"
+    const-string/jumbo v0, "28530"
+    const-string/jumbo v0, "28531"
+    const-string/jumbo v0, "28532"
+    const-string/jumbo v0, "28533"
+    const-string/jumbo v0, "28534"
+    const-string/jumbo v0, "28535"
+    const-string/jumbo v0, "28536"
+    const-string/jumbo v0, "28537"
+    const-string/jumbo v0, "28538"
+    const-string/jumbo v0, "28539"
+    const-string/jumbo v0, "28540"
+    const-string/jumbo v0, "28541"
+    const-string/jumbo v0, "28542"
+    const-string/jumbo v0, "28543"
+    const-string/jumbo v0, "28544"
+    const-string/jumbo v0, "28545"
+    const-string/jumbo v0, "28546"
+    const-string/jumbo v0, "28547"
+    const-string/jumbo v0, "28548"
+    const-string/jumbo v0, "28549"
+    const-string/jumbo v0, "28550"
+    const-string/jumbo v0, "28551"
+    const-string/jumbo v0, "28552"
+    const-string/jumbo v0, "28553"
+    const-string/jumbo v0, "28554"
+    const-string/jumbo v0, "28555"
+    const-string/jumbo v0, "28556"
+    const-string/jumbo v0, "28557"
+    const-string/jumbo v0, "28558"
+    const-string/jumbo v0, "28559"
+    const-string/jumbo v0, "28560"
+    const-string/jumbo v0, "28561"
+    const-string/jumbo v0, "28562"
+    const-string/jumbo v0, "28563"
+    const-string/jumbo v0, "28564"
+    const-string/jumbo v0, "28565"
+    const-string/jumbo v0, "28566"
+    const-string/jumbo v0, "28567"
+    const-string/jumbo v0, "28568"
+    const-string/jumbo v0, "28569"
+    const-string/jumbo v0, "28570"
+    const-string/jumbo v0, "28571"
+    const-string/jumbo v0, "28572"
+    const-string/jumbo v0, "28573"
+    const-string/jumbo v0, "28574"
+    const-string/jumbo v0, "28575"
+    const-string/jumbo v0, "28576"
+    const-string/jumbo v0, "28577"
+    const-string/jumbo v0, "28578"
+    const-string/jumbo v0, "28579"
+    const-string/jumbo v0, "28580"
+    const-string/jumbo v0, "28581"
+    const-string/jumbo v0, "28582"
+    const-string/jumbo v0, "28583"
+    const-string/jumbo v0, "28584"
+    const-string/jumbo v0, "28585"
+    const-string/jumbo v0, "28586"
+    const-string/jumbo v0, "28587"
+    const-string/jumbo v0, "28588"
+    const-string/jumbo v0, "28589"
+    const-string/jumbo v0, "28590"
+    const-string/jumbo v0, "28591"
+    const-string/jumbo v0, "28592"
+    const-string/jumbo v0, "28593"
+    const-string/jumbo v0, "28594"
+    const-string/jumbo v0, "28595"
+    const-string/jumbo v0, "28596"
+    const-string/jumbo v0, "28597"
+    const-string/jumbo v0, "28598"
+    const-string/jumbo v0, "28599"
+    const-string/jumbo v0, "28600"
+    const-string/jumbo v0, "28601"
+    const-string/jumbo v0, "28602"
+    const-string/jumbo v0, "28603"
+    const-string/jumbo v0, "28604"
+    const-string/jumbo v0, "28605"
+    const-string/jumbo v0, "28606"
+    const-string/jumbo v0, "28607"
+    const-string/jumbo v0, "28608"
+    const-string/jumbo v0, "28609"
+    const-string/jumbo v0, "28610"
+    const-string/jumbo v0, "28611"
+    const-string/jumbo v0, "28612"
+    const-string/jumbo v0, "28613"
+    const-string/jumbo v0, "28614"
+    const-string/jumbo v0, "28615"
+    const-string/jumbo v0, "28616"
+    const-string/jumbo v0, "28617"
+    const-string/jumbo v0, "28618"
+    const-string/jumbo v0, "28619"
+    const-string/jumbo v0, "28620"
+    const-string/jumbo v0, "28621"
+    const-string/jumbo v0, "28622"
+    const-string/jumbo v0, "28623"
+    const-string/jumbo v0, "28624"
+    const-string/jumbo v0, "28625"
+    const-string/jumbo v0, "28626"
+    const-string/jumbo v0, "28627"
+    const-string/jumbo v0, "28628"
+    const-string/jumbo v0, "28629"
+    const-string/jumbo v0, "28630"
+    const-string/jumbo v0, "28631"
+    const-string/jumbo v0, "28632"
+    const-string/jumbo v0, "28633"
+    const-string/jumbo v0, "28634"
+    const-string/jumbo v0, "28635"
+    const-string/jumbo v0, "28636"
+    const-string/jumbo v0, "28637"
+    const-string/jumbo v0, "28638"
+    const-string/jumbo v0, "28639"
+    const-string/jumbo v0, "28640"
+    const-string/jumbo v0, "28641"
+    const-string/jumbo v0, "28642"
+    const-string/jumbo v0, "28643"
+    const-string/jumbo v0, "28644"
+    const-string/jumbo v0, "28645"
+    const-string/jumbo v0, "28646"
+    const-string/jumbo v0, "28647"
+    const-string/jumbo v0, "28648"
+    const-string/jumbo v0, "28649"
+    const-string/jumbo v0, "28650"
+    const-string/jumbo v0, "28651"
+    const-string/jumbo v0, "28652"
+    const-string/jumbo v0, "28653"
+    const-string/jumbo v0, "28654"
+    const-string/jumbo v0, "28655"
+    const-string/jumbo v0, "28656"
+    const-string/jumbo v0, "28657"
+    const-string/jumbo v0, "28658"
+    const-string/jumbo v0, "28659"
+    const-string/jumbo v0, "28660"
+    const-string/jumbo v0, "28661"
+    const-string/jumbo v0, "28662"
+    const-string/jumbo v0, "28663"
+    const-string/jumbo v0, "28664"
+    const-string/jumbo v0, "28665"
+    const-string/jumbo v0, "28666"
+    const-string/jumbo v0, "28667"
+    const-string/jumbo v0, "28668"
+    const-string/jumbo v0, "28669"
+    const-string/jumbo v0, "28670"
+    const-string/jumbo v0, "28671"
+    const-string/jumbo v0, "28672"
+    const-string/jumbo v0, "28673"
+    const-string/jumbo v0, "28674"
+    const-string/jumbo v0, "28675"
+    const-string/jumbo v0, "28676"
+    const-string/jumbo v0, "28677"
+    const-string/jumbo v0, "28678"
+    const-string/jumbo v0, "28679"
+    const-string/jumbo v0, "28680"
+    const-string/jumbo v0, "28681"
+    const-string/jumbo v0, "28682"
+    const-string/jumbo v0, "28683"
+    const-string/jumbo v0, "28684"
+    const-string/jumbo v0, "28685"
+    const-string/jumbo v0, "28686"
+    const-string/jumbo v0, "28687"
+    const-string/jumbo v0, "28688"
+    const-string/jumbo v0, "28689"
+    const-string/jumbo v0, "28690"
+    const-string/jumbo v0, "28691"
+    const-string/jumbo v0, "28692"
+    const-string/jumbo v0, "28693"
+    const-string/jumbo v0, "28694"
+    const-string/jumbo v0, "28695"
+    const-string/jumbo v0, "28696"
+    const-string/jumbo v0, "28697"
+    const-string/jumbo v0, "28698"
+    const-string/jumbo v0, "28699"
+    const-string/jumbo v0, "28700"
+    const-string/jumbo v0, "28701"
+    const-string/jumbo v0, "28702"
+    const-string/jumbo v0, "28703"
+    const-string/jumbo v0, "28704"
+    const-string/jumbo v0, "28705"
+    const-string/jumbo v0, "28706"
+    const-string/jumbo v0, "28707"
+    const-string/jumbo v0, "28708"
+    const-string/jumbo v0, "28709"
+    const-string/jumbo v0, "28710"
+    const-string/jumbo v0, "28711"
+    const-string/jumbo v0, "28712"
+    const-string/jumbo v0, "28713"
+    const-string/jumbo v0, "28714"
+    const-string/jumbo v0, "28715"
+    const-string/jumbo v0, "28716"
+    const-string/jumbo v0, "28717"
+    const-string/jumbo v0, "28718"
+    const-string/jumbo v0, "28719"
+    const-string/jumbo v0, "28720"
+    const-string/jumbo v0, "28721"
+    const-string/jumbo v0, "28722"
+    const-string/jumbo v0, "28723"
+    const-string/jumbo v0, "28724"
+    const-string/jumbo v0, "28725"
+    const-string/jumbo v0, "28726"
+    const-string/jumbo v0, "28727"
+    const-string/jumbo v0, "28728"
+    const-string/jumbo v0, "28729"
+    const-string/jumbo v0, "28730"
+    const-string/jumbo v0, "28731"
+    const-string/jumbo v0, "28732"
+    const-string/jumbo v0, "28733"
+    const-string/jumbo v0, "28734"
+    const-string/jumbo v0, "28735"
+    const-string/jumbo v0, "28736"
+    const-string/jumbo v0, "28737"
+    const-string/jumbo v0, "28738"
+    const-string/jumbo v0, "28739"
+    const-string/jumbo v0, "28740"
+    const-string/jumbo v0, "28741"
+    const-string/jumbo v0, "28742"
+    const-string/jumbo v0, "28743"
+    const-string/jumbo v0, "28744"
+    const-string/jumbo v0, "28745"
+    const-string/jumbo v0, "28746"
+    const-string/jumbo v0, "28747"
+    const-string/jumbo v0, "28748"
+    const-string/jumbo v0, "28749"
+    const-string/jumbo v0, "28750"
+    const-string/jumbo v0, "28751"
+    const-string/jumbo v0, "28752"
+    const-string/jumbo v0, "28753"
+    const-string/jumbo v0, "28754"
+    const-string/jumbo v0, "28755"
+    const-string/jumbo v0, "28756"
+    const-string/jumbo v0, "28757"
+    const-string/jumbo v0, "28758"
+    const-string/jumbo v0, "28759"
+    const-string/jumbo v0, "28760"
+    const-string/jumbo v0, "28761"
+    const-string/jumbo v0, "28762"
+    const-string/jumbo v0, "28763"
+    const-string/jumbo v0, "28764"
+    const-string/jumbo v0, "28765"
+    const-string/jumbo v0, "28766"
+    const-string/jumbo v0, "28767"
+    const-string/jumbo v0, "28768"
+    const-string/jumbo v0, "28769"
+    const-string/jumbo v0, "28770"
+    const-string/jumbo v0, "28771"
+    const-string/jumbo v0, "28772"
+    const-string/jumbo v0, "28773"
+    const-string/jumbo v0, "28774"
+    const-string/jumbo v0, "28775"
+    const-string/jumbo v0, "28776"
+    const-string/jumbo v0, "28777"
+    const-string/jumbo v0, "28778"
+    const-string/jumbo v0, "28779"
+    const-string/jumbo v0, "28780"
+    const-string/jumbo v0, "28781"
+    const-string/jumbo v0, "28782"
+    const-string/jumbo v0, "28783"
+    const-string/jumbo v0, "28784"
+    const-string/jumbo v0, "28785"
+    const-string/jumbo v0, "28786"
+    const-string/jumbo v0, "28787"
+    const-string/jumbo v0, "28788"
+    const-string/jumbo v0, "28789"
+    const-string/jumbo v0, "28790"
+    const-string/jumbo v0, "28791"
+    const-string/jumbo v0, "28792"
+    const-string/jumbo v0, "28793"
+    const-string/jumbo v0, "28794"
+    const-string/jumbo v0, "28795"
+    const-string/jumbo v0, "28796"
+    const-string/jumbo v0, "28797"
+    const-string/jumbo v0, "28798"
+    const-string/jumbo v0, "28799"
+    const-string/jumbo v0, "28800"
+    const-string/jumbo v0, "28801"
+    const-string/jumbo v0, "28802"
+    const-string/jumbo v0, "28803"
+    const-string/jumbo v0, "28804"
+    const-string/jumbo v0, "28805"
+    const-string/jumbo v0, "28806"
+    const-string/jumbo v0, "28807"
+    const-string/jumbo v0, "28808"
+    const-string/jumbo v0, "28809"
+    const-string/jumbo v0, "28810"
+    const-string/jumbo v0, "28811"
+    const-string/jumbo v0, "28812"
+    const-string/jumbo v0, "28813"
+    const-string/jumbo v0, "28814"
+    const-string/jumbo v0, "28815"
+    const-string/jumbo v0, "28816"
+    const-string/jumbo v0, "28817"
+    const-string/jumbo v0, "28818"
+    const-string/jumbo v0, "28819"
+    const-string/jumbo v0, "28820"
+    const-string/jumbo v0, "28821"
+    const-string/jumbo v0, "28822"
+    const-string/jumbo v0, "28823"
+    const-string/jumbo v0, "28824"
+    const-string/jumbo v0, "28825"
+    const-string/jumbo v0, "28826"
+    const-string/jumbo v0, "28827"
+    const-string/jumbo v0, "28828"
+    const-string/jumbo v0, "28829"
+    const-string/jumbo v0, "28830"
+    const-string/jumbo v0, "28831"
+    const-string/jumbo v0, "28832"
+    const-string/jumbo v0, "28833"
+    const-string/jumbo v0, "28834"
+    const-string/jumbo v0, "28835"
+    const-string/jumbo v0, "28836"
+    const-string/jumbo v0, "28837"
+    const-string/jumbo v0, "28838"
+    const-string/jumbo v0, "28839"
+    const-string/jumbo v0, "28840"
+    const-string/jumbo v0, "28841"
+    const-string/jumbo v0, "28842"
+    const-string/jumbo v0, "28843"
+    const-string/jumbo v0, "28844"
+    const-string/jumbo v0, "28845"
+    const-string/jumbo v0, "28846"
+    const-string/jumbo v0, "28847"
+    const-string/jumbo v0, "28848"
+    const-string/jumbo v0, "28849"
+    const-string/jumbo v0, "28850"
+    const-string/jumbo v0, "28851"
+    const-string/jumbo v0, "28852"
+    const-string/jumbo v0, "28853"
+    const-string/jumbo v0, "28854"
+    const-string/jumbo v0, "28855"
+    const-string/jumbo v0, "28856"
+    const-string/jumbo v0, "28857"
+    const-string/jumbo v0, "28858"
+    const-string/jumbo v0, "28859"
+    const-string/jumbo v0, "28860"
+    const-string/jumbo v0, "28861"
+    const-string/jumbo v0, "28862"
+    const-string/jumbo v0, "28863"
+    const-string/jumbo v0, "28864"
+    const-string/jumbo v0, "28865"
+    const-string/jumbo v0, "28866"
+    const-string/jumbo v0, "28867"
+    const-string/jumbo v0, "28868"
+    const-string/jumbo v0, "28869"
+    const-string/jumbo v0, "28870"
+    const-string/jumbo v0, "28871"
+    const-string/jumbo v0, "28872"
+    const-string/jumbo v0, "28873"
+    const-string/jumbo v0, "28874"
+    const-string/jumbo v0, "28875"
+    const-string/jumbo v0, "28876"
+    const-string/jumbo v0, "28877"
+    const-string/jumbo v0, "28878"
+    const-string/jumbo v0, "28879"
+    const-string/jumbo v0, "28880"
+    const-string/jumbo v0, "28881"
+    const-string/jumbo v0, "28882"
+    const-string/jumbo v0, "28883"
+    const-string/jumbo v0, "28884"
+    const-string/jumbo v0, "28885"
+    const-string/jumbo v0, "28886"
+    const-string/jumbo v0, "28887"
+    const-string/jumbo v0, "28888"
+    const-string/jumbo v0, "28889"
+    const-string/jumbo v0, "28890"
+    const-string/jumbo v0, "28891"
+    const-string/jumbo v0, "28892"
+    const-string/jumbo v0, "28893"
+    const-string/jumbo v0, "28894"
+    const-string/jumbo v0, "28895"
+    const-string/jumbo v0, "28896"
+    const-string/jumbo v0, "28897"
+    const-string/jumbo v0, "28898"
+    const-string/jumbo v0, "28899"
+    const-string/jumbo v0, "28900"
+    const-string/jumbo v0, "28901"
+    const-string/jumbo v0, "28902"
+    const-string/jumbo v0, "28903"
+    const-string/jumbo v0, "28904"
+    const-string/jumbo v0, "28905"
+    const-string/jumbo v0, "28906"
+    const-string/jumbo v0, "28907"
+    const-string/jumbo v0, "28908"
+    const-string/jumbo v0, "28909"
+    const-string/jumbo v0, "28910"
+    const-string/jumbo v0, "28911"
+    const-string/jumbo v0, "28912"
+    const-string/jumbo v0, "28913"
+    const-string/jumbo v0, "28914"
+    const-string/jumbo v0, "28915"
+    const-string/jumbo v0, "28916"
+    const-string/jumbo v0, "28917"
+    const-string/jumbo v0, "28918"
+    const-string/jumbo v0, "28919"
+    const-string/jumbo v0, "28920"
+    const-string/jumbo v0, "28921"
+    const-string/jumbo v0, "28922"
+    const-string/jumbo v0, "28923"
+    const-string/jumbo v0, "28924"
+    const-string/jumbo v0, "28925"
+    const-string/jumbo v0, "28926"
+    const-string/jumbo v0, "28927"
+    const-string/jumbo v0, "28928"
+    const-string/jumbo v0, "28929"
+    const-string/jumbo v0, "28930"
+    const-string/jumbo v0, "28931"
+    const-string/jumbo v0, "28932"
+    const-string/jumbo v0, "28933"
+    const-string/jumbo v0, "28934"
+    const-string/jumbo v0, "28935"
+    const-string/jumbo v0, "28936"
+    const-string/jumbo v0, "28937"
+    const-string/jumbo v0, "28938"
+    const-string/jumbo v0, "28939"
+    const-string/jumbo v0, "28940"
+    const-string/jumbo v0, "28941"
+    const-string/jumbo v0, "28942"
+    const-string/jumbo v0, "28943"
+    const-string/jumbo v0, "28944"
+    const-string/jumbo v0, "28945"
+    const-string/jumbo v0, "28946"
+    const-string/jumbo v0, "28947"
+    const-string/jumbo v0, "28948"
+    const-string/jumbo v0, "28949"
+    const-string/jumbo v0, "28950"
+    const-string/jumbo v0, "28951"
+    const-string/jumbo v0, "28952"
+    const-string/jumbo v0, "28953"
+    const-string/jumbo v0, "28954"
+    const-string/jumbo v0, "28955"
+    const-string/jumbo v0, "28956"
+    const-string/jumbo v0, "28957"
+    const-string/jumbo v0, "28958"
+    const-string/jumbo v0, "28959"
+    const-string/jumbo v0, "28960"
+    const-string/jumbo v0, "28961"
+    const-string/jumbo v0, "28962"
+    const-string/jumbo v0, "28963"
+    const-string/jumbo v0, "28964"
+    const-string/jumbo v0, "28965"
+    const-string/jumbo v0, "28966"
+    const-string/jumbo v0, "28967"
+    const-string/jumbo v0, "28968"
+    const-string/jumbo v0, "28969"
+    const-string/jumbo v0, "28970"
+    const-string/jumbo v0, "28971"
+    const-string/jumbo v0, "28972"
+    const-string/jumbo v0, "28973"
+    const-string/jumbo v0, "28974"
+    const-string/jumbo v0, "28975"
+    const-string/jumbo v0, "28976"
+    const-string/jumbo v0, "28977"
+    const-string/jumbo v0, "28978"
+    const-string/jumbo v0, "28979"
+    const-string/jumbo v0, "28980"
+    const-string/jumbo v0, "28981"
+    const-string/jumbo v0, "28982"
+    const-string/jumbo v0, "28983"
+    const-string/jumbo v0, "28984"
+    const-string/jumbo v0, "28985"
+    const-string/jumbo v0, "28986"
+    const-string/jumbo v0, "28987"
+    const-string/jumbo v0, "28988"
+    const-string/jumbo v0, "28989"
+    const-string/jumbo v0, "28990"
+    const-string/jumbo v0, "28991"
+    const-string/jumbo v0, "28992"
+    const-string/jumbo v0, "28993"
+    const-string/jumbo v0, "28994"
+    const-string/jumbo v0, "28995"
+    const-string/jumbo v0, "28996"
+    const-string/jumbo v0, "28997"
+    const-string/jumbo v0, "28998"
+    const-string/jumbo v0, "28999"
+    const-string/jumbo v0, "29000"
+    const-string/jumbo v0, "29001"
+    const-string/jumbo v0, "29002"
+    const-string/jumbo v0, "29003"
+    const-string/jumbo v0, "29004"
+    const-string/jumbo v0, "29005"
+    const-string/jumbo v0, "29006"
+    const-string/jumbo v0, "29007"
+    const-string/jumbo v0, "29008"
+    const-string/jumbo v0, "29009"
+    const-string/jumbo v0, "29010"
+    const-string/jumbo v0, "29011"
+    const-string/jumbo v0, "29012"
+    const-string/jumbo v0, "29013"
+    const-string/jumbo v0, "29014"
+    const-string/jumbo v0, "29015"
+    const-string/jumbo v0, "29016"
+    const-string/jumbo v0, "29017"
+    const-string/jumbo v0, "29018"
+    const-string/jumbo v0, "29019"
+    const-string/jumbo v0, "29020"
+    const-string/jumbo v0, "29021"
+    const-string/jumbo v0, "29022"
+    const-string/jumbo v0, "29023"
+    const-string/jumbo v0, "29024"
+    const-string/jumbo v0, "29025"
+    const-string/jumbo v0, "29026"
+    const-string/jumbo v0, "29027"
+    const-string/jumbo v0, "29028"
+    const-string/jumbo v0, "29029"
+    const-string/jumbo v0, "29030"
+    const-string/jumbo v0, "29031"
+    const-string/jumbo v0, "29032"
+    const-string/jumbo v0, "29033"
+    const-string/jumbo v0, "29034"
+    const-string/jumbo v0, "29035"
+    const-string/jumbo v0, "29036"
+    const-string/jumbo v0, "29037"
+    const-string/jumbo v0, "29038"
+    const-string/jumbo v0, "29039"
+    const-string/jumbo v0, "29040"
+    const-string/jumbo v0, "29041"
+    const-string/jumbo v0, "29042"
+    const-string/jumbo v0, "29043"
+    const-string/jumbo v0, "29044"
+    const-string/jumbo v0, "29045"
+    const-string/jumbo v0, "29046"
+    const-string/jumbo v0, "29047"
+    const-string/jumbo v0, "29048"
+    const-string/jumbo v0, "29049"
+    const-string/jumbo v0, "29050"
+    const-string/jumbo v0, "29051"
+    const-string/jumbo v0, "29052"
+    const-string/jumbo v0, "29053"
+    const-string/jumbo v0, "29054"
+    const-string/jumbo v0, "29055"
+    const-string/jumbo v0, "29056"
+    const-string/jumbo v0, "29057"
+    const-string/jumbo v0, "29058"
+    const-string/jumbo v0, "29059"
+    const-string/jumbo v0, "29060"
+    const-string/jumbo v0, "29061"
+    const-string/jumbo v0, "29062"
+    const-string/jumbo v0, "29063"
+    const-string/jumbo v0, "29064"
+    const-string/jumbo v0, "29065"
+    const-string/jumbo v0, "29066"
+    const-string/jumbo v0, "29067"
+    const-string/jumbo v0, "29068"
+    const-string/jumbo v0, "29069"
+    const-string/jumbo v0, "29070"
+    const-string/jumbo v0, "29071"
+    const-string/jumbo v0, "29072"
+    const-string/jumbo v0, "29073"
+    const-string/jumbo v0, "29074"
+    const-string/jumbo v0, "29075"
+    const-string/jumbo v0, "29076"
+    const-string/jumbo v0, "29077"
+    const-string/jumbo v0, "29078"
+    const-string/jumbo v0, "29079"
+    const-string/jumbo v0, "29080"
+    const-string/jumbo v0, "29081"
+    const-string/jumbo v0, "29082"
+    const-string/jumbo v0, "29083"
+    const-string/jumbo v0, "29084"
+    const-string/jumbo v0, "29085"
+    const-string/jumbo v0, "29086"
+    const-string/jumbo v0, "29087"
+    const-string/jumbo v0, "29088"
+    const-string/jumbo v0, "29089"
+    const-string/jumbo v0, "29090"
+    const-string/jumbo v0, "29091"
+    const-string/jumbo v0, "29092"
+    const-string/jumbo v0, "29093"
+    const-string/jumbo v0, "29094"
+    const-string/jumbo v0, "29095"
+    const-string/jumbo v0, "29096"
+    const-string/jumbo v0, "29097"
+    const-string/jumbo v0, "29098"
+    const-string/jumbo v0, "29099"
+    const-string/jumbo v0, "29100"
+    const-string/jumbo v0, "29101"
+    const-string/jumbo v0, "29102"
+    const-string/jumbo v0, "29103"
+    const-string/jumbo v0, "29104"
+    const-string/jumbo v0, "29105"
+    const-string/jumbo v0, "29106"
+    const-string/jumbo v0, "29107"
+    const-string/jumbo v0, "29108"
+    const-string/jumbo v0, "29109"
+    const-string/jumbo v0, "29110"
+    const-string/jumbo v0, "29111"
+    const-string/jumbo v0, "29112"
+    const-string/jumbo v0, "29113"
+    const-string/jumbo v0, "29114"
+    const-string/jumbo v0, "29115"
+    const-string/jumbo v0, "29116"
+    const-string/jumbo v0, "29117"
+    const-string/jumbo v0, "29118"
+    const-string/jumbo v0, "29119"
+    const-string/jumbo v0, "29120"
+    const-string/jumbo v0, "29121"
+    const-string/jumbo v0, "29122"
+    const-string/jumbo v0, "29123"
+    const-string/jumbo v0, "29124"
+    const-string/jumbo v0, "29125"
+    const-string/jumbo v0, "29126"
+    const-string/jumbo v0, "29127"
+    const-string/jumbo v0, "29128"
+    const-string/jumbo v0, "29129"
+    const-string/jumbo v0, "29130"
+    const-string/jumbo v0, "29131"
+    const-string/jumbo v0, "29132"
+    const-string/jumbo v0, "29133"
+    const-string/jumbo v0, "29134"
+    const-string/jumbo v0, "29135"
+    const-string/jumbo v0, "29136"
+    const-string/jumbo v0, "29137"
+    const-string/jumbo v0, "29138"
+    const-string/jumbo v0, "29139"
+    const-string/jumbo v0, "29140"
+    const-string/jumbo v0, "29141"
+    const-string/jumbo v0, "29142"
+    const-string/jumbo v0, "29143"
+    const-string/jumbo v0, "29144"
+    const-string/jumbo v0, "29145"
+    const-string/jumbo v0, "29146"
+    const-string/jumbo v0, "29147"
+    const-string/jumbo v0, "29148"
+    const-string/jumbo v0, "29149"
+    const-string/jumbo v0, "29150"
+    const-string/jumbo v0, "29151"
+    const-string/jumbo v0, "29152"
+    const-string/jumbo v0, "29153"
+    const-string/jumbo v0, "29154"
+    const-string/jumbo v0, "29155"
+    const-string/jumbo v0, "29156"
+    const-string/jumbo v0, "29157"
+    const-string/jumbo v0, "29158"
+    const-string/jumbo v0, "29159"
+    const-string/jumbo v0, "29160"
+    const-string/jumbo v0, "29161"
+    const-string/jumbo v0, "29162"
+    const-string/jumbo v0, "29163"
+    const-string/jumbo v0, "29164"
+    const-string/jumbo v0, "29165"
+    const-string/jumbo v0, "29166"
+    const-string/jumbo v0, "29167"
+    const-string/jumbo v0, "29168"
+    const-string/jumbo v0, "29169"
+    const-string/jumbo v0, "29170"
+    const-string/jumbo v0, "29171"
+    const-string/jumbo v0, "29172"
+    const-string/jumbo v0, "29173"
+    const-string/jumbo v0, "29174"
+    const-string/jumbo v0, "29175"
+    const-string/jumbo v0, "29176"
+    const-string/jumbo v0, "29177"
+    const-string/jumbo v0, "29178"
+    const-string/jumbo v0, "29179"
+    const-string/jumbo v0, "29180"
+    const-string/jumbo v0, "29181"
+    const-string/jumbo v0, "29182"
+    const-string/jumbo v0, "29183"
+    const-string/jumbo v0, "29184"
+    const-string/jumbo v0, "29185"
+    const-string/jumbo v0, "29186"
+    const-string/jumbo v0, "29187"
+    const-string/jumbo v0, "29188"
+    const-string/jumbo v0, "29189"
+    const-string/jumbo v0, "29190"
+    const-string/jumbo v0, "29191"
+    const-string/jumbo v0, "29192"
+    const-string/jumbo v0, "29193"
+    const-string/jumbo v0, "29194"
+    const-string/jumbo v0, "29195"
+    const-string/jumbo v0, "29196"
+    const-string/jumbo v0, "29197"
+    const-string/jumbo v0, "29198"
+    const-string/jumbo v0, "29199"
+    const-string/jumbo v0, "29200"
+    const-string/jumbo v0, "29201"
+    const-string/jumbo v0, "29202"
+    const-string/jumbo v0, "29203"
+    const-string/jumbo v0, "29204"
+    const-string/jumbo v0, "29205"
+    const-string/jumbo v0, "29206"
+    const-string/jumbo v0, "29207"
+    const-string/jumbo v0, "29208"
+    const-string/jumbo v0, "29209"
+    const-string/jumbo v0, "29210"
+    const-string/jumbo v0, "29211"
+    const-string/jumbo v0, "29212"
+    const-string/jumbo v0, "29213"
+    const-string/jumbo v0, "29214"
+    const-string/jumbo v0, "29215"
+    const-string/jumbo v0, "29216"
+    const-string/jumbo v0, "29217"
+    const-string/jumbo v0, "29218"
+    const-string/jumbo v0, "29219"
+    const-string/jumbo v0, "29220"
+    const-string/jumbo v0, "29221"
+    const-string/jumbo v0, "29222"
+    const-string/jumbo v0, "29223"
+    const-string/jumbo v0, "29224"
+    const-string/jumbo v0, "29225"
+    const-string/jumbo v0, "29226"
+    const-string/jumbo v0, "29227"
+    const-string/jumbo v0, "29228"
+    const-string/jumbo v0, "29229"
+    const-string/jumbo v0, "29230"
+    const-string/jumbo v0, "29231"
+    const-string/jumbo v0, "29232"
+    const-string/jumbo v0, "29233"
+    const-string/jumbo v0, "29234"
+    const-string/jumbo v0, "29235"
+    const-string/jumbo v0, "29236"
+    const-string/jumbo v0, "29237"
+    const-string/jumbo v0, "29238"
+    const-string/jumbo v0, "29239"
+    const-string/jumbo v0, "29240"
+    const-string/jumbo v0, "29241"
+    const-string/jumbo v0, "29242"
+    const-string/jumbo v0, "29243"
+    const-string/jumbo v0, "29244"
+    const-string/jumbo v0, "29245"
+    const-string/jumbo v0, "29246"
+    const-string/jumbo v0, "29247"
+    const-string/jumbo v0, "29248"
+    const-string/jumbo v0, "29249"
+    const-string/jumbo v0, "29250"
+    const-string/jumbo v0, "29251"
+    const-string/jumbo v0, "29252"
+    const-string/jumbo v0, "29253"
+    const-string/jumbo v0, "29254"
+    const-string/jumbo v0, "29255"
+    const-string/jumbo v0, "29256"
+    const-string/jumbo v0, "29257"
+    const-string/jumbo v0, "29258"
+    const-string/jumbo v0, "29259"
+    const-string/jumbo v0, "29260"
+    const-string/jumbo v0, "29261"
+    const-string/jumbo v0, "29262"
+    const-string/jumbo v0, "29263"
+    const-string/jumbo v0, "29264"
+    const-string/jumbo v0, "29265"
+    const-string/jumbo v0, "29266"
+    const-string/jumbo v0, "29267"
+    const-string/jumbo v0, "29268"
+    const-string/jumbo v0, "29269"
+    const-string/jumbo v0, "29270"
+    const-string/jumbo v0, "29271"
+    const-string/jumbo v0, "29272"
+    const-string/jumbo v0, "29273"
+    const-string/jumbo v0, "29274"
+    const-string/jumbo v0, "29275"
+    const-string/jumbo v0, "29276"
+    const-string/jumbo v0, "29277"
+    const-string/jumbo v0, "29278"
+    const-string/jumbo v0, "29279"
+    const-string/jumbo v0, "29280"
+    const-string/jumbo v0, "29281"
+    const-string/jumbo v0, "29282"
+    const-string/jumbo v0, "29283"
+    const-string/jumbo v0, "29284"
+    const-string/jumbo v0, "29285"
+    const-string/jumbo v0, "29286"
+    const-string/jumbo v0, "29287"
+    const-string/jumbo v0, "29288"
+    const-string/jumbo v0, "29289"
+    const-string/jumbo v0, "29290"
+    const-string/jumbo v0, "29291"
+    const-string/jumbo v0, "29292"
+    const-string/jumbo v0, "29293"
+    const-string/jumbo v0, "29294"
+    const-string/jumbo v0, "29295"
+    const-string/jumbo v0, "29296"
+    const-string/jumbo v0, "29297"
+    const-string/jumbo v0, "29298"
+    const-string/jumbo v0, "29299"
+    const-string/jumbo v0, "29300"
+    const-string/jumbo v0, "29301"
+    const-string/jumbo v0, "29302"
+    const-string/jumbo v0, "29303"
+    const-string/jumbo v0, "29304"
+    const-string/jumbo v0, "29305"
+    const-string/jumbo v0, "29306"
+    const-string/jumbo v0, "29307"
+    const-string/jumbo v0, "29308"
+    const-string/jumbo v0, "29309"
+    const-string/jumbo v0, "29310"
+    const-string/jumbo v0, "29311"
+    const-string/jumbo v0, "29312"
+    const-string/jumbo v0, "29313"
+    const-string/jumbo v0, "29314"
+    const-string/jumbo v0, "29315"
+    const-string/jumbo v0, "29316"
+    const-string/jumbo v0, "29317"
+    const-string/jumbo v0, "29318"
+    const-string/jumbo v0, "29319"
+    const-string/jumbo v0, "29320"
+    const-string/jumbo v0, "29321"
+    const-string/jumbo v0, "29322"
+    const-string/jumbo v0, "29323"
+    const-string/jumbo v0, "29324"
+    const-string/jumbo v0, "29325"
+    const-string/jumbo v0, "29326"
+    const-string/jumbo v0, "29327"
+    const-string/jumbo v0, "29328"
+    const-string/jumbo v0, "29329"
+    const-string/jumbo v0, "29330"
+    const-string/jumbo v0, "29331"
+    const-string/jumbo v0, "29332"
+    const-string/jumbo v0, "29333"
+    const-string/jumbo v0, "29334"
+    const-string/jumbo v0, "29335"
+    const-string/jumbo v0, "29336"
+    const-string/jumbo v0, "29337"
+    const-string/jumbo v0, "29338"
+    const-string/jumbo v0, "29339"
+    const-string/jumbo v0, "29340"
+    const-string/jumbo v0, "29341"
+    const-string/jumbo v0, "29342"
+    const-string/jumbo v0, "29343"
+    const-string/jumbo v0, "29344"
+    const-string/jumbo v0, "29345"
+    const-string/jumbo v0, "29346"
+    const-string/jumbo v0, "29347"
+    const-string/jumbo v0, "29348"
+    const-string/jumbo v0, "29349"
+    const-string/jumbo v0, "29350"
+    const-string/jumbo v0, "29351"
+    const-string/jumbo v0, "29352"
+    const-string/jumbo v0, "29353"
+    const-string/jumbo v0, "29354"
+    const-string/jumbo v0, "29355"
+    const-string/jumbo v0, "29356"
+    const-string/jumbo v0, "29357"
+    const-string/jumbo v0, "29358"
+    const-string/jumbo v0, "29359"
+    const-string/jumbo v0, "29360"
+    const-string/jumbo v0, "29361"
+    const-string/jumbo v0, "29362"
+    const-string/jumbo v0, "29363"
+    const-string/jumbo v0, "29364"
+    const-string/jumbo v0, "29365"
+    const-string/jumbo v0, "29366"
+    const-string/jumbo v0, "29367"
+    const-string/jumbo v0, "29368"
+    const-string/jumbo v0, "29369"
+    const-string/jumbo v0, "29370"
+    const-string/jumbo v0, "29371"
+    const-string/jumbo v0, "29372"
+    const-string/jumbo v0, "29373"
+    const-string/jumbo v0, "29374"
+    const-string/jumbo v0, "29375"
+    const-string/jumbo v0, "29376"
+    const-string/jumbo v0, "29377"
+    const-string/jumbo v0, "29378"
+    const-string/jumbo v0, "29379"
+    const-string/jumbo v0, "29380"
+    const-string/jumbo v0, "29381"
+    const-string/jumbo v0, "29382"
+    const-string/jumbo v0, "29383"
+    const-string/jumbo v0, "29384"
+    const-string/jumbo v0, "29385"
+    const-string/jumbo v0, "29386"
+    const-string/jumbo v0, "29387"
+    const-string/jumbo v0, "29388"
+    const-string/jumbo v0, "29389"
+    const-string/jumbo v0, "29390"
+    const-string/jumbo v0, "29391"
+    const-string/jumbo v0, "29392"
+    const-string/jumbo v0, "29393"
+    const-string/jumbo v0, "29394"
+    const-string/jumbo v0, "29395"
+    const-string/jumbo v0, "29396"
+    const-string/jumbo v0, "29397"
+    const-string/jumbo v0, "29398"
+    const-string/jumbo v0, "29399"
+    const-string/jumbo v0, "29400"
+    const-string/jumbo v0, "29401"
+    const-string/jumbo v0, "29402"
+    const-string/jumbo v0, "29403"
+    const-string/jumbo v0, "29404"
+    const-string/jumbo v0, "29405"
+    const-string/jumbo v0, "29406"
+    const-string/jumbo v0, "29407"
+    const-string/jumbo v0, "29408"
+    const-string/jumbo v0, "29409"
+    const-string/jumbo v0, "29410"
+    const-string/jumbo v0, "29411"
+    const-string/jumbo v0, "29412"
+    const-string/jumbo v0, "29413"
+    const-string/jumbo v0, "29414"
+    const-string/jumbo v0, "29415"
+    const-string/jumbo v0, "29416"
+    const-string/jumbo v0, "29417"
+    const-string/jumbo v0, "29418"
+    const-string/jumbo v0, "29419"
+    const-string/jumbo v0, "29420"
+    const-string/jumbo v0, "29421"
+    const-string/jumbo v0, "29422"
+    const-string/jumbo v0, "29423"
+    const-string/jumbo v0, "29424"
+    const-string/jumbo v0, "29425"
+    const-string/jumbo v0, "29426"
+    const-string/jumbo v0, "29427"
+    const-string/jumbo v0, "29428"
+    const-string/jumbo v0, "29429"
+    const-string/jumbo v0, "29430"
+    const-string/jumbo v0, "29431"
+    const-string/jumbo v0, "29432"
+    const-string/jumbo v0, "29433"
+    const-string/jumbo v0, "29434"
+    const-string/jumbo v0, "29435"
+    const-string/jumbo v0, "29436"
+    const-string/jumbo v0, "29437"
+    const-string/jumbo v0, "29438"
+    const-string/jumbo v0, "29439"
+    const-string/jumbo v0, "29440"
+    const-string/jumbo v0, "29441"
+    const-string/jumbo v0, "29442"
+    const-string/jumbo v0, "29443"
+    const-string/jumbo v0, "29444"
+    const-string/jumbo v0, "29445"
+    const-string/jumbo v0, "29446"
+    const-string/jumbo v0, "29447"
+    const-string/jumbo v0, "29448"
+    const-string/jumbo v0, "29449"
+    const-string/jumbo v0, "29450"
+    const-string/jumbo v0, "29451"
+    const-string/jumbo v0, "29452"
+    const-string/jumbo v0, "29453"
+    const-string/jumbo v0, "29454"
+    const-string/jumbo v0, "29455"
+    const-string/jumbo v0, "29456"
+    const-string/jumbo v0, "29457"
+    const-string/jumbo v0, "29458"
+    const-string/jumbo v0, "29459"
+    const-string/jumbo v0, "29460"
+    const-string/jumbo v0, "29461"
+    const-string/jumbo v0, "29462"
+    const-string/jumbo v0, "29463"
+    const-string/jumbo v0, "29464"
+    const-string/jumbo v0, "29465"
+    const-string/jumbo v0, "29466"
+    const-string/jumbo v0, "29467"
+    const-string/jumbo v0, "29468"
+    const-string/jumbo v0, "29469"
+    const-string/jumbo v0, "29470"
+    const-string/jumbo v0, "29471"
+    const-string/jumbo v0, "29472"
+    const-string/jumbo v0, "29473"
+    const-string/jumbo v0, "29474"
+    const-string/jumbo v0, "29475"
+    const-string/jumbo v0, "29476"
+    const-string/jumbo v0, "29477"
+    const-string/jumbo v0, "29478"
+    const-string/jumbo v0, "29479"
+    const-string/jumbo v0, "29480"
+    const-string/jumbo v0, "29481"
+    const-string/jumbo v0, "29482"
+    const-string/jumbo v0, "29483"
+    const-string/jumbo v0, "29484"
+    const-string/jumbo v0, "29485"
+    const-string/jumbo v0, "29486"
+    const-string/jumbo v0, "29487"
+    const-string/jumbo v0, "29488"
+    const-string/jumbo v0, "29489"
+    const-string/jumbo v0, "29490"
+    const-string/jumbo v0, "29491"
+    const-string/jumbo v0, "29492"
+    const-string/jumbo v0, "29493"
+    const-string/jumbo v0, "29494"
+    const-string/jumbo v0, "29495"
+    const-string/jumbo v0, "29496"
+    const-string/jumbo v0, "29497"
+    const-string/jumbo v0, "29498"
+    const-string/jumbo v0, "29499"
+    const-string/jumbo v0, "29500"
+    const-string/jumbo v0, "29501"
+    const-string/jumbo v0, "29502"
+    const-string/jumbo v0, "29503"
+    const-string/jumbo v0, "29504"
+    const-string/jumbo v0, "29505"
+    const-string/jumbo v0, "29506"
+    const-string/jumbo v0, "29507"
+    const-string/jumbo v0, "29508"
+    const-string/jumbo v0, "29509"
+    const-string/jumbo v0, "29510"
+    const-string/jumbo v0, "29511"
+    const-string/jumbo v0, "29512"
+    const-string/jumbo v0, "29513"
+    const-string/jumbo v0, "29514"
+    const-string/jumbo v0, "29515"
+    const-string/jumbo v0, "29516"
+    const-string/jumbo v0, "29517"
+    const-string/jumbo v0, "29518"
+    const-string/jumbo v0, "29519"
+    const-string/jumbo v0, "29520"
+    const-string/jumbo v0, "29521"
+    const-string/jumbo v0, "29522"
+    const-string/jumbo v0, "29523"
+    const-string/jumbo v0, "29524"
+    const-string/jumbo v0, "29525"
+    const-string/jumbo v0, "29526"
+    const-string/jumbo v0, "29527"
+    const-string/jumbo v0, "29528"
+    const-string/jumbo v0, "29529"
+    const-string/jumbo v0, "29530"
+    const-string/jumbo v0, "29531"
+    const-string/jumbo v0, "29532"
+    const-string/jumbo v0, "29533"
+    const-string/jumbo v0, "29534"
+    const-string/jumbo v0, "29535"
+    const-string/jumbo v0, "29536"
+    const-string/jumbo v0, "29537"
+    const-string/jumbo v0, "29538"
+    const-string/jumbo v0, "29539"
+    const-string/jumbo v0, "29540"
+    const-string/jumbo v0, "29541"
+    const-string/jumbo v0, "29542"
+    const-string/jumbo v0, "29543"
+    const-string/jumbo v0, "29544"
+    const-string/jumbo v0, "29545"
+    const-string/jumbo v0, "29546"
+    const-string/jumbo v0, "29547"
+    const-string/jumbo v0, "29548"
+    const-string/jumbo v0, "29549"
+    const-string/jumbo v0, "29550"
+    const-string/jumbo v0, "29551"
+    const-string/jumbo v0, "29552"
+    const-string/jumbo v0, "29553"
+    const-string/jumbo v0, "29554"
+    const-string/jumbo v0, "29555"
+    const-string/jumbo v0, "29556"
+    const-string/jumbo v0, "29557"
+    const-string/jumbo v0, "29558"
+    const-string/jumbo v0, "29559"
+    const-string/jumbo v0, "29560"
+    const-string/jumbo v0, "29561"
+    const-string/jumbo v0, "29562"
+    const-string/jumbo v0, "29563"
+    const-string/jumbo v0, "29564"
+    const-string/jumbo v0, "29565"
+    const-string/jumbo v0, "29566"
+    const-string/jumbo v0, "29567"
+    const-string/jumbo v0, "29568"
+    const-string/jumbo v0, "29569"
+    const-string/jumbo v0, "29570"
+    const-string/jumbo v0, "29571"
+    const-string/jumbo v0, "29572"
+    const-string/jumbo v0, "29573"
+    const-string/jumbo v0, "29574"
+    const-string/jumbo v0, "29575"
+    const-string/jumbo v0, "29576"
+    const-string/jumbo v0, "29577"
+    const-string/jumbo v0, "29578"
+    const-string/jumbo v0, "29579"
+    const-string/jumbo v0, "29580"
+    const-string/jumbo v0, "29581"
+    const-string/jumbo v0, "29582"
+    const-string/jumbo v0, "29583"
+    const-string/jumbo v0, "29584"
+    const-string/jumbo v0, "29585"
+    const-string/jumbo v0, "29586"
+    const-string/jumbo v0, "29587"
+    const-string/jumbo v0, "29588"
+    const-string/jumbo v0, "29589"
+    const-string/jumbo v0, "29590"
+    const-string/jumbo v0, "29591"
+    const-string/jumbo v0, "29592"
+    const-string/jumbo v0, "29593"
+    const-string/jumbo v0, "29594"
+    const-string/jumbo v0, "29595"
+    const-string/jumbo v0, "29596"
+    const-string/jumbo v0, "29597"
+    const-string/jumbo v0, "29598"
+    const-string/jumbo v0, "29599"
+    const-string/jumbo v0, "29600"
+    const-string/jumbo v0, "29601"
+    const-string/jumbo v0, "29602"
+    const-string/jumbo v0, "29603"
+    const-string/jumbo v0, "29604"
+    const-string/jumbo v0, "29605"
+    const-string/jumbo v0, "29606"
+    const-string/jumbo v0, "29607"
+    const-string/jumbo v0, "29608"
+    const-string/jumbo v0, "29609"
+    const-string/jumbo v0, "29610"
+    const-string/jumbo v0, "29611"
+    const-string/jumbo v0, "29612"
+    const-string/jumbo v0, "29613"
+    const-string/jumbo v0, "29614"
+    const-string/jumbo v0, "29615"
+    const-string/jumbo v0, "29616"
+    const-string/jumbo v0, "29617"
+    const-string/jumbo v0, "29618"
+    const-string/jumbo v0, "29619"
+    const-string/jumbo v0, "29620"
+    const-string/jumbo v0, "29621"
+    const-string/jumbo v0, "29622"
+    const-string/jumbo v0, "29623"
+    const-string/jumbo v0, "29624"
+    const-string/jumbo v0, "29625"
+    const-string/jumbo v0, "29626"
+    const-string/jumbo v0, "29627"
+    const-string/jumbo v0, "29628"
+    const-string/jumbo v0, "29629"
+    const-string/jumbo v0, "29630"
+    const-string/jumbo v0, "29631"
+    const-string/jumbo v0, "29632"
+    const-string/jumbo v0, "29633"
+    const-string/jumbo v0, "29634"
+    const-string/jumbo v0, "29635"
+    const-string/jumbo v0, "29636"
+    const-string/jumbo v0, "29637"
+    const-string/jumbo v0, "29638"
+    const-string/jumbo v0, "29639"
+    const-string/jumbo v0, "29640"
+    const-string/jumbo v0, "29641"
+    const-string/jumbo v0, "29642"
+    const-string/jumbo v0, "29643"
+    const-string/jumbo v0, "29644"
+    const-string/jumbo v0, "29645"
+    const-string/jumbo v0, "29646"
+    const-string/jumbo v0, "29647"
+    const-string/jumbo v0, "29648"
+    const-string/jumbo v0, "29649"
+    const-string/jumbo v0, "29650"
+    const-string/jumbo v0, "29651"
+    const-string/jumbo v0, "29652"
+    const-string/jumbo v0, "29653"
+    const-string/jumbo v0, "29654"
+    const-string/jumbo v0, "29655"
+    const-string/jumbo v0, "29656"
+    const-string/jumbo v0, "29657"
+    const-string/jumbo v0, "29658"
+    const-string/jumbo v0, "29659"
+    const-string/jumbo v0, "29660"
+    const-string/jumbo v0, "29661"
+    const-string/jumbo v0, "29662"
+    const-string/jumbo v0, "29663"
+    const-string/jumbo v0, "29664"
+    const-string/jumbo v0, "29665"
+    const-string/jumbo v0, "29666"
+    const-string/jumbo v0, "29667"
+    const-string/jumbo v0, "29668"
+    const-string/jumbo v0, "29669"
+    const-string/jumbo v0, "29670"
+    const-string/jumbo v0, "29671"
+    const-string/jumbo v0, "29672"
+    const-string/jumbo v0, "29673"
+    const-string/jumbo v0, "29674"
+    const-string/jumbo v0, "29675"
+    const-string/jumbo v0, "29676"
+    const-string/jumbo v0, "29677"
+    const-string/jumbo v0, "29678"
+    const-string/jumbo v0, "29679"
+    const-string/jumbo v0, "29680"
+    const-string/jumbo v0, "29681"
+    const-string/jumbo v0, "29682"
+    const-string/jumbo v0, "29683"
+    const-string/jumbo v0, "29684"
+    const-string/jumbo v0, "29685"
+    const-string/jumbo v0, "29686"
+    const-string/jumbo v0, "29687"
+    const-string/jumbo v0, "29688"
+    const-string/jumbo v0, "29689"
+    const-string/jumbo v0, "29690"
+    const-string/jumbo v0, "29691"
+    const-string/jumbo v0, "29692"
+    const-string/jumbo v0, "29693"
+    const-string/jumbo v0, "29694"
+    const-string/jumbo v0, "29695"
+    const-string/jumbo v0, "29696"
+    const-string/jumbo v0, "29697"
+    const-string/jumbo v0, "29698"
+    const-string/jumbo v0, "29699"
+    const-string/jumbo v0, "29700"
+    const-string/jumbo v0, "29701"
+    const-string/jumbo v0, "29702"
+    const-string/jumbo v0, "29703"
+    const-string/jumbo v0, "29704"
+    const-string/jumbo v0, "29705"
+    const-string/jumbo v0, "29706"
+    const-string/jumbo v0, "29707"
+    const-string/jumbo v0, "29708"
+    const-string/jumbo v0, "29709"
+    const-string/jumbo v0, "29710"
+    const-string/jumbo v0, "29711"
+    const-string/jumbo v0, "29712"
+    const-string/jumbo v0, "29713"
+    const-string/jumbo v0, "29714"
+    const-string/jumbo v0, "29715"
+    const-string/jumbo v0, "29716"
+    const-string/jumbo v0, "29717"
+    const-string/jumbo v0, "29718"
+    const-string/jumbo v0, "29719"
+    const-string/jumbo v0, "29720"
+    const-string/jumbo v0, "29721"
+    const-string/jumbo v0, "29722"
+    const-string/jumbo v0, "29723"
+    const-string/jumbo v0, "29724"
+    const-string/jumbo v0, "29725"
+    const-string/jumbo v0, "29726"
+    const-string/jumbo v0, "29727"
+    const-string/jumbo v0, "29728"
+    const-string/jumbo v0, "29729"
+    const-string/jumbo v0, "29730"
+    const-string/jumbo v0, "29731"
+    const-string/jumbo v0, "29732"
+    const-string/jumbo v0, "29733"
+    const-string/jumbo v0, "29734"
+    const-string/jumbo v0, "29735"
+    const-string/jumbo v0, "29736"
+    const-string/jumbo v0, "29737"
+    const-string/jumbo v0, "29738"
+    const-string/jumbo v0, "29739"
+    const-string/jumbo v0, "29740"
+    const-string/jumbo v0, "29741"
+    const-string/jumbo v0, "29742"
+    const-string/jumbo v0, "29743"
+    const-string/jumbo v0, "29744"
+    const-string/jumbo v0, "29745"
+    const-string/jumbo v0, "29746"
+    const-string/jumbo v0, "29747"
+    const-string/jumbo v0, "29748"
+    const-string/jumbo v0, "29749"
+    const-string/jumbo v0, "29750"
+    const-string/jumbo v0, "29751"
+    const-string/jumbo v0, "29752"
+    const-string/jumbo v0, "29753"
+    const-string/jumbo v0, "29754"
+    const-string/jumbo v0, "29755"
+    const-string/jumbo v0, "29756"
+    const-string/jumbo v0, "29757"
+    const-string/jumbo v0, "29758"
+    const-string/jumbo v0, "29759"
+    const-string/jumbo v0, "29760"
+    const-string/jumbo v0, "29761"
+    const-string/jumbo v0, "29762"
+    const-string/jumbo v0, "29763"
+    const-string/jumbo v0, "29764"
+    const-string/jumbo v0, "29765"
+    const-string/jumbo v0, "29766"
+    const-string/jumbo v0, "29767"
+    const-string/jumbo v0, "29768"
+    const-string/jumbo v0, "29769"
+    const-string/jumbo v0, "29770"
+    const-string/jumbo v0, "29771"
+    const-string/jumbo v0, "29772"
+    const-string/jumbo v0, "29773"
+    const-string/jumbo v0, "29774"
+    const-string/jumbo v0, "29775"
+    const-string/jumbo v0, "29776"
+    const-string/jumbo v0, "29777"
+    const-string/jumbo v0, "29778"
+    const-string/jumbo v0, "29779"
+    const-string/jumbo v0, "29780"
+    const-string/jumbo v0, "29781"
+    const-string/jumbo v0, "29782"
+    const-string/jumbo v0, "29783"
+    const-string/jumbo v0, "29784"
+    const-string/jumbo v0, "29785"
+    const-string/jumbo v0, "29786"
+    const-string/jumbo v0, "29787"
+    const-string/jumbo v0, "29788"
+    const-string/jumbo v0, "29789"
+    const-string/jumbo v0, "29790"
+    const-string/jumbo v0, "29791"
+    const-string/jumbo v0, "29792"
+    const-string/jumbo v0, "29793"
+    const-string/jumbo v0, "29794"
+    const-string/jumbo v0, "29795"
+    const-string/jumbo v0, "29796"
+    const-string/jumbo v0, "29797"
+    const-string/jumbo v0, "29798"
+    const-string/jumbo v0, "29799"
+    const-string/jumbo v0, "29800"
+    const-string/jumbo v0, "29801"
+    const-string/jumbo v0, "29802"
+    const-string/jumbo v0, "29803"
+    const-string/jumbo v0, "29804"
+    const-string/jumbo v0, "29805"
+    const-string/jumbo v0, "29806"
+    const-string/jumbo v0, "29807"
+    const-string/jumbo v0, "29808"
+    const-string/jumbo v0, "29809"
+    const-string/jumbo v0, "29810"
+    const-string/jumbo v0, "29811"
+    const-string/jumbo v0, "29812"
+    const-string/jumbo v0, "29813"
+    const-string/jumbo v0, "29814"
+    const-string/jumbo v0, "29815"
+    const-string/jumbo v0, "29816"
+    const-string/jumbo v0, "29817"
+    const-string/jumbo v0, "29818"
+    const-string/jumbo v0, "29819"
+    const-string/jumbo v0, "29820"
+    const-string/jumbo v0, "29821"
+    const-string/jumbo v0, "29822"
+    const-string/jumbo v0, "29823"
+    const-string/jumbo v0, "29824"
+    const-string/jumbo v0, "29825"
+    const-string/jumbo v0, "29826"
+    const-string/jumbo v0, "29827"
+    const-string/jumbo v0, "29828"
+    const-string/jumbo v0, "29829"
+    const-string/jumbo v0, "29830"
+    const-string/jumbo v0, "29831"
+    const-string/jumbo v0, "29832"
+    const-string/jumbo v0, "29833"
+    const-string/jumbo v0, "29834"
+    const-string/jumbo v0, "29835"
+    const-string/jumbo v0, "29836"
+    const-string/jumbo v0, "29837"
+    const-string/jumbo v0, "29838"
+    const-string/jumbo v0, "29839"
+    const-string/jumbo v0, "29840"
+    const-string/jumbo v0, "29841"
+    const-string/jumbo v0, "29842"
+    const-string/jumbo v0, "29843"
+    const-string/jumbo v0, "29844"
+    const-string/jumbo v0, "29845"
+    const-string/jumbo v0, "29846"
+    const-string/jumbo v0, "29847"
+    const-string/jumbo v0, "29848"
+    const-string/jumbo v0, "29849"
+    const-string/jumbo v0, "29850"
+    const-string/jumbo v0, "29851"
+    const-string/jumbo v0, "29852"
+    const-string/jumbo v0, "29853"
+    const-string/jumbo v0, "29854"
+    const-string/jumbo v0, "29855"
+    const-string/jumbo v0, "29856"
+    const-string/jumbo v0, "29857"
+    const-string/jumbo v0, "29858"
+    const-string/jumbo v0, "29859"
+    const-string/jumbo v0, "29860"
+    const-string/jumbo v0, "29861"
+    const-string/jumbo v0, "29862"
+    const-string/jumbo v0, "29863"
+    const-string/jumbo v0, "29864"
+    const-string/jumbo v0, "29865"
+    const-string/jumbo v0, "29866"
+    const-string/jumbo v0, "29867"
+    const-string/jumbo v0, "29868"
+    const-string/jumbo v0, "29869"
+    const-string/jumbo v0, "29870"
+    const-string/jumbo v0, "29871"
+    const-string/jumbo v0, "29872"
+    const-string/jumbo v0, "29873"
+    const-string/jumbo v0, "29874"
+    const-string/jumbo v0, "29875"
+    const-string/jumbo v0, "29876"
+    const-string/jumbo v0, "29877"
+    const-string/jumbo v0, "29878"
+    const-string/jumbo v0, "29879"
+    const-string/jumbo v0, "29880"
+    const-string/jumbo v0, "29881"
+    const-string/jumbo v0, "29882"
+    const-string/jumbo v0, "29883"
+    const-string/jumbo v0, "29884"
+    const-string/jumbo v0, "29885"
+    const-string/jumbo v0, "29886"
+    const-string/jumbo v0, "29887"
+    const-string/jumbo v0, "29888"
+    const-string/jumbo v0, "29889"
+    const-string/jumbo v0, "29890"
+    const-string/jumbo v0, "29891"
+    const-string/jumbo v0, "29892"
+    const-string/jumbo v0, "29893"
+    const-string/jumbo v0, "29894"
+    const-string/jumbo v0, "29895"
+    const-string/jumbo v0, "29896"
+    const-string/jumbo v0, "29897"
+    const-string/jumbo v0, "29898"
+    const-string/jumbo v0, "29899"
+    const-string/jumbo v0, "29900"
+    const-string/jumbo v0, "29901"
+    const-string/jumbo v0, "29902"
+    const-string/jumbo v0, "29903"
+    const-string/jumbo v0, "29904"
+    const-string/jumbo v0, "29905"
+    const-string/jumbo v0, "29906"
+    const-string/jumbo v0, "29907"
+    const-string/jumbo v0, "29908"
+    const-string/jumbo v0, "29909"
+    const-string/jumbo v0, "29910"
+    const-string/jumbo v0, "29911"
+    const-string/jumbo v0, "29912"
+    const-string/jumbo v0, "29913"
+    const-string/jumbo v0, "29914"
+    const-string/jumbo v0, "29915"
+    const-string/jumbo v0, "29916"
+    const-string/jumbo v0, "29917"
+    const-string/jumbo v0, "29918"
+    const-string/jumbo v0, "29919"
+    const-string/jumbo v0, "29920"
+    const-string/jumbo v0, "29921"
+    const-string/jumbo v0, "29922"
+    const-string/jumbo v0, "29923"
+    const-string/jumbo v0, "29924"
+    const-string/jumbo v0, "29925"
+    const-string/jumbo v0, "29926"
+    const-string/jumbo v0, "29927"
+    const-string/jumbo v0, "29928"
+    const-string/jumbo v0, "29929"
+    const-string/jumbo v0, "29930"
+    const-string/jumbo v0, "29931"
+    const-string/jumbo v0, "29932"
+    const-string/jumbo v0, "29933"
+    const-string/jumbo v0, "29934"
+    const-string/jumbo v0, "29935"
+    const-string/jumbo v0, "29936"
+    const-string/jumbo v0, "29937"
+    const-string/jumbo v0, "29938"
+    const-string/jumbo v0, "29939"
+    const-string/jumbo v0, "29940"
+    const-string/jumbo v0, "29941"
+    const-string/jumbo v0, "29942"
+    const-string/jumbo v0, "29943"
+    const-string/jumbo v0, "29944"
+    const-string/jumbo v0, "29945"
+    const-string/jumbo v0, "29946"
+    const-string/jumbo v0, "29947"
+    const-string/jumbo v0, "29948"
+    const-string/jumbo v0, "29949"
+    const-string/jumbo v0, "29950"
+    const-string/jumbo v0, "29951"
+    const-string/jumbo v0, "29952"
+    const-string/jumbo v0, "29953"
+    const-string/jumbo v0, "29954"
+    const-string/jumbo v0, "29955"
+    const-string/jumbo v0, "29956"
+    const-string/jumbo v0, "29957"
+    const-string/jumbo v0, "29958"
+    const-string/jumbo v0, "29959"
+    const-string/jumbo v0, "29960"
+    const-string/jumbo v0, "29961"
+    const-string/jumbo v0, "29962"
+    const-string/jumbo v0, "29963"
+    const-string/jumbo v0, "29964"
+    const-string/jumbo v0, "29965"
+    const-string/jumbo v0, "29966"
+    const-string/jumbo v0, "29967"
+    const-string/jumbo v0, "29968"
+    const-string/jumbo v0, "29969"
+    const-string/jumbo v0, "29970"
+    const-string/jumbo v0, "29971"
+    const-string/jumbo v0, "29972"
+    const-string/jumbo v0, "29973"
+    const-string/jumbo v0, "29974"
+    const-string/jumbo v0, "29975"
+    const-string/jumbo v0, "29976"
+    const-string/jumbo v0, "29977"
+    const-string/jumbo v0, "29978"
+    const-string/jumbo v0, "29979"
+    const-string/jumbo v0, "29980"
+    const-string/jumbo v0, "29981"
+    const-string/jumbo v0, "29982"
+    const-string/jumbo v0, "29983"
+    const-string/jumbo v0, "29984"
+    const-string/jumbo v0, "29985"
+    const-string/jumbo v0, "29986"
+    const-string/jumbo v0, "29987"
+    const-string/jumbo v0, "29988"
+    const-string/jumbo v0, "29989"
+    const-string/jumbo v0, "29990"
+    const-string/jumbo v0, "29991"
+    const-string/jumbo v0, "29992"
+    const-string/jumbo v0, "29993"
+    const-string/jumbo v0, "29994"
+    const-string/jumbo v0, "29995"
+    const-string/jumbo v0, "29996"
+    const-string/jumbo v0, "29997"
+    const-string/jumbo v0, "29998"
+    const-string/jumbo v0, "29999"
+    const-string/jumbo v0, "30000"
+    const-string/jumbo v0, "30001"
+    const-string/jumbo v0, "30002"
+    const-string/jumbo v0, "30003"
+    const-string/jumbo v0, "30004"
+    const-string/jumbo v0, "30005"
+    const-string/jumbo v0, "30006"
+    const-string/jumbo v0, "30007"
+    const-string/jumbo v0, "30008"
+    const-string/jumbo v0, "30009"
+    const-string/jumbo v0, "30010"
+    const-string/jumbo v0, "30011"
+    const-string/jumbo v0, "30012"
+    const-string/jumbo v0, "30013"
+    const-string/jumbo v0, "30014"
+    const-string/jumbo v0, "30015"
+    const-string/jumbo v0, "30016"
+    const-string/jumbo v0, "30017"
+    const-string/jumbo v0, "30018"
+    const-string/jumbo v0, "30019"
+    const-string/jumbo v0, "30020"
+    const-string/jumbo v0, "30021"
+    const-string/jumbo v0, "30022"
+    const-string/jumbo v0, "30023"
+    const-string/jumbo v0, "30024"
+    const-string/jumbo v0, "30025"
+    const-string/jumbo v0, "30026"
+    const-string/jumbo v0, "30027"
+    const-string/jumbo v0, "30028"
+    const-string/jumbo v0, "30029"
+    const-string/jumbo v0, "30030"
+    const-string/jumbo v0, "30031"
+    const-string/jumbo v0, "30032"
+    const-string/jumbo v0, "30033"
+    const-string/jumbo v0, "30034"
+    const-string/jumbo v0, "30035"
+    const-string/jumbo v0, "30036"
+    const-string/jumbo v0, "30037"
+    const-string/jumbo v0, "30038"
+    const-string/jumbo v0, "30039"
+    const-string/jumbo v0, "30040"
+    const-string/jumbo v0, "30041"
+    const-string/jumbo v0, "30042"
+    const-string/jumbo v0, "30043"
+    const-string/jumbo v0, "30044"
+    const-string/jumbo v0, "30045"
+    const-string/jumbo v0, "30046"
+    const-string/jumbo v0, "30047"
+    const-string/jumbo v0, "30048"
+    const-string/jumbo v0, "30049"
+    const-string/jumbo v0, "30050"
+    const-string/jumbo v0, "30051"
+    const-string/jumbo v0, "30052"
+    const-string/jumbo v0, "30053"
+    const-string/jumbo v0, "30054"
+    const-string/jumbo v0, "30055"
+    const-string/jumbo v0, "30056"
+    const-string/jumbo v0, "30057"
+    const-string/jumbo v0, "30058"
+    const-string/jumbo v0, "30059"
+    const-string/jumbo v0, "30060"
+    const-string/jumbo v0, "30061"
+    const-string/jumbo v0, "30062"
+    const-string/jumbo v0, "30063"
+    const-string/jumbo v0, "30064"
+    const-string/jumbo v0, "30065"
+    const-string/jumbo v0, "30066"
+    const-string/jumbo v0, "30067"
+    const-string/jumbo v0, "30068"
+    const-string/jumbo v0, "30069"
+    const-string/jumbo v0, "30070"
+    const-string/jumbo v0, "30071"
+    const-string/jumbo v0, "30072"
+    const-string/jumbo v0, "30073"
+    const-string/jumbo v0, "30074"
+    const-string/jumbo v0, "30075"
+    const-string/jumbo v0, "30076"
+    const-string/jumbo v0, "30077"
+    const-string/jumbo v0, "30078"
+    const-string/jumbo v0, "30079"
+    const-string/jumbo v0, "30080"
+    const-string/jumbo v0, "30081"
+    const-string/jumbo v0, "30082"
+    const-string/jumbo v0, "30083"
+    const-string/jumbo v0, "30084"
+    const-string/jumbo v0, "30085"
+    const-string/jumbo v0, "30086"
+    const-string/jumbo v0, "30087"
+    const-string/jumbo v0, "30088"
+    const-string/jumbo v0, "30089"
+    const-string/jumbo v0, "30090"
+    const-string/jumbo v0, "30091"
+    const-string/jumbo v0, "30092"
+    const-string/jumbo v0, "30093"
+    const-string/jumbo v0, "30094"
+    const-string/jumbo v0, "30095"
+    const-string/jumbo v0, "30096"
+    const-string/jumbo v0, "30097"
+    const-string/jumbo v0, "30098"
+    const-string/jumbo v0, "30099"
+    const-string/jumbo v0, "30100"
+    const-string/jumbo v0, "30101"
+    const-string/jumbo v0, "30102"
+    const-string/jumbo v0, "30103"
+    const-string/jumbo v0, "30104"
+    const-string/jumbo v0, "30105"
+    const-string/jumbo v0, "30106"
+    const-string/jumbo v0, "30107"
+    const-string/jumbo v0, "30108"
+    const-string/jumbo v0, "30109"
+    const-string/jumbo v0, "30110"
+    const-string/jumbo v0, "30111"
+    const-string/jumbo v0, "30112"
+    const-string/jumbo v0, "30113"
+    const-string/jumbo v0, "30114"
+    const-string/jumbo v0, "30115"
+    const-string/jumbo v0, "30116"
+    const-string/jumbo v0, "30117"
+    const-string/jumbo v0, "30118"
+    const-string/jumbo v0, "30119"
+    const-string/jumbo v0, "30120"
+    const-string/jumbo v0, "30121"
+    const-string/jumbo v0, "30122"
+    const-string/jumbo v0, "30123"
+    const-string/jumbo v0, "30124"
+    const-string/jumbo v0, "30125"
+    const-string/jumbo v0, "30126"
+    const-string/jumbo v0, "30127"
+    const-string/jumbo v0, "30128"
+    const-string/jumbo v0, "30129"
+    const-string/jumbo v0, "30130"
+    const-string/jumbo v0, "30131"
+    const-string/jumbo v0, "30132"
+    const-string/jumbo v0, "30133"
+    const-string/jumbo v0, "30134"
+    const-string/jumbo v0, "30135"
+    const-string/jumbo v0, "30136"
+    const-string/jumbo v0, "30137"
+    const-string/jumbo v0, "30138"
+    const-string/jumbo v0, "30139"
+    const-string/jumbo v0, "30140"
+    const-string/jumbo v0, "30141"
+    const-string/jumbo v0, "30142"
+    const-string/jumbo v0, "30143"
+    const-string/jumbo v0, "30144"
+    const-string/jumbo v0, "30145"
+    const-string/jumbo v0, "30146"
+    const-string/jumbo v0, "30147"
+    const-string/jumbo v0, "30148"
+    const-string/jumbo v0, "30149"
+    const-string/jumbo v0, "30150"
+    const-string/jumbo v0, "30151"
+    const-string/jumbo v0, "30152"
+    const-string/jumbo v0, "30153"
+    const-string/jumbo v0, "30154"
+    const-string/jumbo v0, "30155"
+    const-string/jumbo v0, "30156"
+    const-string/jumbo v0, "30157"
+    const-string/jumbo v0, "30158"
+    const-string/jumbo v0, "30159"
+    const-string/jumbo v0, "30160"
+    const-string/jumbo v0, "30161"
+    const-string/jumbo v0, "30162"
+    const-string/jumbo v0, "30163"
+    const-string/jumbo v0, "30164"
+    const-string/jumbo v0, "30165"
+    const-string/jumbo v0, "30166"
+    const-string/jumbo v0, "30167"
+    const-string/jumbo v0, "30168"
+    const-string/jumbo v0, "30169"
+    const-string/jumbo v0, "30170"
+    const-string/jumbo v0, "30171"
+    const-string/jumbo v0, "30172"
+    const-string/jumbo v0, "30173"
+    const-string/jumbo v0, "30174"
+    const-string/jumbo v0, "30175"
+    const-string/jumbo v0, "30176"
+    const-string/jumbo v0, "30177"
+    const-string/jumbo v0, "30178"
+    const-string/jumbo v0, "30179"
+    const-string/jumbo v0, "30180"
+    const-string/jumbo v0, "30181"
+    const-string/jumbo v0, "30182"
+    const-string/jumbo v0, "30183"
+    const-string/jumbo v0, "30184"
+    const-string/jumbo v0, "30185"
+    const-string/jumbo v0, "30186"
+    const-string/jumbo v0, "30187"
+    const-string/jumbo v0, "30188"
+    const-string/jumbo v0, "30189"
+    const-string/jumbo v0, "30190"
+    const-string/jumbo v0, "30191"
+    const-string/jumbo v0, "30192"
+    const-string/jumbo v0, "30193"
+    const-string/jumbo v0, "30194"
+    const-string/jumbo v0, "30195"
+    const-string/jumbo v0, "30196"
+    const-string/jumbo v0, "30197"
+    const-string/jumbo v0, "30198"
+    const-string/jumbo v0, "30199"
+    const-string/jumbo v0, "30200"
+    const-string/jumbo v0, "30201"
+    const-string/jumbo v0, "30202"
+    const-string/jumbo v0, "30203"
+    const-string/jumbo v0, "30204"
+    const-string/jumbo v0, "30205"
+    const-string/jumbo v0, "30206"
+    const-string/jumbo v0, "30207"
+    const-string/jumbo v0, "30208"
+    const-string/jumbo v0, "30209"
+    const-string/jumbo v0, "30210"
+    const-string/jumbo v0, "30211"
+    const-string/jumbo v0, "30212"
+    const-string/jumbo v0, "30213"
+    const-string/jumbo v0, "30214"
+    const-string/jumbo v0, "30215"
+    const-string/jumbo v0, "30216"
+    const-string/jumbo v0, "30217"
+    const-string/jumbo v0, "30218"
+    const-string/jumbo v0, "30219"
+    const-string/jumbo v0, "30220"
+    const-string/jumbo v0, "30221"
+    const-string/jumbo v0, "30222"
+    const-string/jumbo v0, "30223"
+    const-string/jumbo v0, "30224"
+    const-string/jumbo v0, "30225"
+    const-string/jumbo v0, "30226"
+    const-string/jumbo v0, "30227"
+    const-string/jumbo v0, "30228"
+    const-string/jumbo v0, "30229"
+    const-string/jumbo v0, "30230"
+    const-string/jumbo v0, "30231"
+    const-string/jumbo v0, "30232"
+    const-string/jumbo v0, "30233"
+    const-string/jumbo v0, "30234"
+    const-string/jumbo v0, "30235"
+    const-string/jumbo v0, "30236"
+    const-string/jumbo v0, "30237"
+    const-string/jumbo v0, "30238"
+    const-string/jumbo v0, "30239"
+    const-string/jumbo v0, "30240"
+    const-string/jumbo v0, "30241"
+    const-string/jumbo v0, "30242"
+    const-string/jumbo v0, "30243"
+    const-string/jumbo v0, "30244"
+    const-string/jumbo v0, "30245"
+    const-string/jumbo v0, "30246"
+    const-string/jumbo v0, "30247"
+    const-string/jumbo v0, "30248"
+    const-string/jumbo v0, "30249"
+    const-string/jumbo v0, "30250"
+    const-string/jumbo v0, "30251"
+    const-string/jumbo v0, "30252"
+    const-string/jumbo v0, "30253"
+    const-string/jumbo v0, "30254"
+    const-string/jumbo v0, "30255"
+    const-string/jumbo v0, "30256"
+    const-string/jumbo v0, "30257"
+    const-string/jumbo v0, "30258"
+    const-string/jumbo v0, "30259"
+    const-string/jumbo v0, "30260"
+    const-string/jumbo v0, "30261"
+    const-string/jumbo v0, "30262"
+    const-string/jumbo v0, "30263"
+    const-string/jumbo v0, "30264"
+    const-string/jumbo v0, "30265"
+    const-string/jumbo v0, "30266"
+    const-string/jumbo v0, "30267"
+    const-string/jumbo v0, "30268"
+    const-string/jumbo v0, "30269"
+    const-string/jumbo v0, "30270"
+    const-string/jumbo v0, "30271"
+    const-string/jumbo v0, "30272"
+    const-string/jumbo v0, "30273"
+    const-string/jumbo v0, "30274"
+    const-string/jumbo v0, "30275"
+    const-string/jumbo v0, "30276"
+    const-string/jumbo v0, "30277"
+    const-string/jumbo v0, "30278"
+    const-string/jumbo v0, "30279"
+    const-string/jumbo v0, "30280"
+    const-string/jumbo v0, "30281"
+    const-string/jumbo v0, "30282"
+    const-string/jumbo v0, "30283"
+    const-string/jumbo v0, "30284"
+    const-string/jumbo v0, "30285"
+    const-string/jumbo v0, "30286"
+    const-string/jumbo v0, "30287"
+    const-string/jumbo v0, "30288"
+    const-string/jumbo v0, "30289"
+    const-string/jumbo v0, "30290"
+    const-string/jumbo v0, "30291"
+    const-string/jumbo v0, "30292"
+    const-string/jumbo v0, "30293"
+    const-string/jumbo v0, "30294"
+    const-string/jumbo v0, "30295"
+    const-string/jumbo v0, "30296"
+    const-string/jumbo v0, "30297"
+    const-string/jumbo v0, "30298"
+    const-string/jumbo v0, "30299"
+    const-string/jumbo v0, "30300"
+    const-string/jumbo v0, "30301"
+    const-string/jumbo v0, "30302"
+    const-string/jumbo v0, "30303"
+    const-string/jumbo v0, "30304"
+    const-string/jumbo v0, "30305"
+    const-string/jumbo v0, "30306"
+    const-string/jumbo v0, "30307"
+    const-string/jumbo v0, "30308"
+    const-string/jumbo v0, "30309"
+    const-string/jumbo v0, "30310"
+    const-string/jumbo v0, "30311"
+    const-string/jumbo v0, "30312"
+    const-string/jumbo v0, "30313"
+    const-string/jumbo v0, "30314"
+    const-string/jumbo v0, "30315"
+    const-string/jumbo v0, "30316"
+    const-string/jumbo v0, "30317"
+    const-string/jumbo v0, "30318"
+    const-string/jumbo v0, "30319"
+    const-string/jumbo v0, "30320"
+    const-string/jumbo v0, "30321"
+    const-string/jumbo v0, "30322"
+    const-string/jumbo v0, "30323"
+    const-string/jumbo v0, "30324"
+    const-string/jumbo v0, "30325"
+    const-string/jumbo v0, "30326"
+    const-string/jumbo v0, "30327"
+    const-string/jumbo v0, "30328"
+    const-string/jumbo v0, "30329"
+    const-string/jumbo v0, "30330"
+    const-string/jumbo v0, "30331"
+    const-string/jumbo v0, "30332"
+    const-string/jumbo v0, "30333"
+    const-string/jumbo v0, "30334"
+    const-string/jumbo v0, "30335"
+    const-string/jumbo v0, "30336"
+    const-string/jumbo v0, "30337"
+    const-string/jumbo v0, "30338"
+    const-string/jumbo v0, "30339"
+    const-string/jumbo v0, "30340"
+    const-string/jumbo v0, "30341"
+    const-string/jumbo v0, "30342"
+    const-string/jumbo v0, "30343"
+    const-string/jumbo v0, "30344"
+    const-string/jumbo v0, "30345"
+    const-string/jumbo v0, "30346"
+    const-string/jumbo v0, "30347"
+    const-string/jumbo v0, "30348"
+    const-string/jumbo v0, "30349"
+    const-string/jumbo v0, "30350"
+    const-string/jumbo v0, "30351"
+    const-string/jumbo v0, "30352"
+    const-string/jumbo v0, "30353"
+    const-string/jumbo v0, "30354"
+    const-string/jumbo v0, "30355"
+    const-string/jumbo v0, "30356"
+    const-string/jumbo v0, "30357"
+    const-string/jumbo v0, "30358"
+    const-string/jumbo v0, "30359"
+    const-string/jumbo v0, "30360"
+    const-string/jumbo v0, "30361"
+    const-string/jumbo v0, "30362"
+    const-string/jumbo v0, "30363"
+    const-string/jumbo v0, "30364"
+    const-string/jumbo v0, "30365"
+    const-string/jumbo v0, "30366"
+    const-string/jumbo v0, "30367"
+    const-string/jumbo v0, "30368"
+    const-string/jumbo v0, "30369"
+    const-string/jumbo v0, "30370"
+    const-string/jumbo v0, "30371"
+    const-string/jumbo v0, "30372"
+    const-string/jumbo v0, "30373"
+    const-string/jumbo v0, "30374"
+    const-string/jumbo v0, "30375"
+    const-string/jumbo v0, "30376"
+    const-string/jumbo v0, "30377"
+    const-string/jumbo v0, "30378"
+    const-string/jumbo v0, "30379"
+    const-string/jumbo v0, "30380"
+    const-string/jumbo v0, "30381"
+    const-string/jumbo v0, "30382"
+    const-string/jumbo v0, "30383"
+    const-string/jumbo v0, "30384"
+    const-string/jumbo v0, "30385"
+    const-string/jumbo v0, "30386"
+    const-string/jumbo v0, "30387"
+    const-string/jumbo v0, "30388"
+    const-string/jumbo v0, "30389"
+    const-string/jumbo v0, "30390"
+    const-string/jumbo v0, "30391"
+    const-string/jumbo v0, "30392"
+    const-string/jumbo v0, "30393"
+    const-string/jumbo v0, "30394"
+    const-string/jumbo v0, "30395"
+    const-string/jumbo v0, "30396"
+    const-string/jumbo v0, "30397"
+    const-string/jumbo v0, "30398"
+    const-string/jumbo v0, "30399"
+    const-string/jumbo v0, "30400"
+    const-string/jumbo v0, "30401"
+    const-string/jumbo v0, "30402"
+    const-string/jumbo v0, "30403"
+    const-string/jumbo v0, "30404"
+    const-string/jumbo v0, "30405"
+    const-string/jumbo v0, "30406"
+    const-string/jumbo v0, "30407"
+    const-string/jumbo v0, "30408"
+    const-string/jumbo v0, "30409"
+    const-string/jumbo v0, "30410"
+    const-string/jumbo v0, "30411"
+    const-string/jumbo v0, "30412"
+    const-string/jumbo v0, "30413"
+    const-string/jumbo v0, "30414"
+    const-string/jumbo v0, "30415"
+    const-string/jumbo v0, "30416"
+    const-string/jumbo v0, "30417"
+    const-string/jumbo v0, "30418"
+    const-string/jumbo v0, "30419"
+    const-string/jumbo v0, "30420"
+    const-string/jumbo v0, "30421"
+    const-string/jumbo v0, "30422"
+    const-string/jumbo v0, "30423"
+    const-string/jumbo v0, "30424"
+    const-string/jumbo v0, "30425"
+    const-string/jumbo v0, "30426"
+    const-string/jumbo v0, "30427"
+    const-string/jumbo v0, "30428"
+    const-string/jumbo v0, "30429"
+    const-string/jumbo v0, "30430"
+    const-string/jumbo v0, "30431"
+    const-string/jumbo v0, "30432"
+    const-string/jumbo v0, "30433"
+    const-string/jumbo v0, "30434"
+    const-string/jumbo v0, "30435"
+    const-string/jumbo v0, "30436"
+    const-string/jumbo v0, "30437"
+    const-string/jumbo v0, "30438"
+    const-string/jumbo v0, "30439"
+    const-string/jumbo v0, "30440"
+    const-string/jumbo v0, "30441"
+    const-string/jumbo v0, "30442"
+    const-string/jumbo v0, "30443"
+    const-string/jumbo v0, "30444"
+    const-string/jumbo v0, "30445"
+    const-string/jumbo v0, "30446"
+    const-string/jumbo v0, "30447"
+    const-string/jumbo v0, "30448"
+    const-string/jumbo v0, "30449"
+    const-string/jumbo v0, "30450"
+    const-string/jumbo v0, "30451"
+    const-string/jumbo v0, "30452"
+    const-string/jumbo v0, "30453"
+    const-string/jumbo v0, "30454"
+    const-string/jumbo v0, "30455"
+    const-string/jumbo v0, "30456"
+    const-string/jumbo v0, "30457"
+    const-string/jumbo v0, "30458"
+    const-string/jumbo v0, "30459"
+    const-string/jumbo v0, "30460"
+    const-string/jumbo v0, "30461"
+    const-string/jumbo v0, "30462"
+    const-string/jumbo v0, "30463"
+    const-string/jumbo v0, "30464"
+    const-string/jumbo v0, "30465"
+    const-string/jumbo v0, "30466"
+    const-string/jumbo v0, "30467"
+    const-string/jumbo v0, "30468"
+    const-string/jumbo v0, "30469"
+    const-string/jumbo v0, "30470"
+    const-string/jumbo v0, "30471"
+    const-string/jumbo v0, "30472"
+    const-string/jumbo v0, "30473"
+    const-string/jumbo v0, "30474"
+    const-string/jumbo v0, "30475"
+    const-string/jumbo v0, "30476"
+    const-string/jumbo v0, "30477"
+    const-string/jumbo v0, "30478"
+    const-string/jumbo v0, "30479"
+    const-string/jumbo v0, "30480"
+    const-string/jumbo v0, "30481"
+    const-string/jumbo v0, "30482"
+    const-string/jumbo v0, "30483"
+    const-string/jumbo v0, "30484"
+    const-string/jumbo v0, "30485"
+    const-string/jumbo v0, "30486"
+    const-string/jumbo v0, "30487"
+    const-string/jumbo v0, "30488"
+    const-string/jumbo v0, "30489"
+    const-string/jumbo v0, "30490"
+    const-string/jumbo v0, "30491"
+    const-string/jumbo v0, "30492"
+    const-string/jumbo v0, "30493"
+    const-string/jumbo v0, "30494"
+    const-string/jumbo v0, "30495"
+    const-string/jumbo v0, "30496"
+    const-string/jumbo v0, "30497"
+    const-string/jumbo v0, "30498"
+    const-string/jumbo v0, "30499"
+    const-string/jumbo v0, "30500"
+    const-string/jumbo v0, "30501"
+    const-string/jumbo v0, "30502"
+    const-string/jumbo v0, "30503"
+    const-string/jumbo v0, "30504"
+    const-string/jumbo v0, "30505"
+    const-string/jumbo v0, "30506"
+    const-string/jumbo v0, "30507"
+    const-string/jumbo v0, "30508"
+    const-string/jumbo v0, "30509"
+    const-string/jumbo v0, "30510"
+    const-string/jumbo v0, "30511"
+    const-string/jumbo v0, "30512"
+    const-string/jumbo v0, "30513"
+    const-string/jumbo v0, "30514"
+    const-string/jumbo v0, "30515"
+    const-string/jumbo v0, "30516"
+    const-string/jumbo v0, "30517"
+    const-string/jumbo v0, "30518"
+    const-string/jumbo v0, "30519"
+    const-string/jumbo v0, "30520"
+    const-string/jumbo v0, "30521"
+    const-string/jumbo v0, "30522"
+    const-string/jumbo v0, "30523"
+    const-string/jumbo v0, "30524"
+    const-string/jumbo v0, "30525"
+    const-string/jumbo v0, "30526"
+    const-string/jumbo v0, "30527"
+    const-string/jumbo v0, "30528"
+    const-string/jumbo v0, "30529"
+    const-string/jumbo v0, "30530"
+    const-string/jumbo v0, "30531"
+    const-string/jumbo v0, "30532"
+    const-string/jumbo v0, "30533"
+    const-string/jumbo v0, "30534"
+    const-string/jumbo v0, "30535"
+    const-string/jumbo v0, "30536"
+    const-string/jumbo v0, "30537"
+    const-string/jumbo v0, "30538"
+    const-string/jumbo v0, "30539"
+    const-string/jumbo v0, "30540"
+    const-string/jumbo v0, "30541"
+    const-string/jumbo v0, "30542"
+    const-string/jumbo v0, "30543"
+    const-string/jumbo v0, "30544"
+    const-string/jumbo v0, "30545"
+    const-string/jumbo v0, "30546"
+    const-string/jumbo v0, "30547"
+    const-string/jumbo v0, "30548"
+    const-string/jumbo v0, "30549"
+    const-string/jumbo v0, "30550"
+    const-string/jumbo v0, "30551"
+    const-string/jumbo v0, "30552"
+    const-string/jumbo v0, "30553"
+    const-string/jumbo v0, "30554"
+    const-string/jumbo v0, "30555"
+    const-string/jumbo v0, "30556"
+    const-string/jumbo v0, "30557"
+    const-string/jumbo v0, "30558"
+    const-string/jumbo v0, "30559"
+    const-string/jumbo v0, "30560"
+    const-string/jumbo v0, "30561"
+    const-string/jumbo v0, "30562"
+    const-string/jumbo v0, "30563"
+    const-string/jumbo v0, "30564"
+    const-string/jumbo v0, "30565"
+    const-string/jumbo v0, "30566"
+    const-string/jumbo v0, "30567"
+    const-string/jumbo v0, "30568"
+    const-string/jumbo v0, "30569"
+    const-string/jumbo v0, "30570"
+    const-string/jumbo v0, "30571"
+    const-string/jumbo v0, "30572"
+    const-string/jumbo v0, "30573"
+    const-string/jumbo v0, "30574"
+    const-string/jumbo v0, "30575"
+    const-string/jumbo v0, "30576"
+    const-string/jumbo v0, "30577"
+    const-string/jumbo v0, "30578"
+    const-string/jumbo v0, "30579"
+    const-string/jumbo v0, "30580"
+    const-string/jumbo v0, "30581"
+    const-string/jumbo v0, "30582"
+    const-string/jumbo v0, "30583"
+    const-string/jumbo v0, "30584"
+    const-string/jumbo v0, "30585"
+    const-string/jumbo v0, "30586"
+    const-string/jumbo v0, "30587"
+    const-string/jumbo v0, "30588"
+    const-string/jumbo v0, "30589"
+    const-string/jumbo v0, "30590"
+    const-string/jumbo v0, "30591"
+    const-string/jumbo v0, "30592"
+    const-string/jumbo v0, "30593"
+    const-string/jumbo v0, "30594"
+    const-string/jumbo v0, "30595"
+    const-string/jumbo v0, "30596"
+    const-string/jumbo v0, "30597"
+    const-string/jumbo v0, "30598"
+    const-string/jumbo v0, "30599"
+    const-string/jumbo v0, "30600"
+    const-string/jumbo v0, "30601"
+    const-string/jumbo v0, "30602"
+    const-string/jumbo v0, "30603"
+    const-string/jumbo v0, "30604"
+    const-string/jumbo v0, "30605"
+    const-string/jumbo v0, "30606"
+    const-string/jumbo v0, "30607"
+    const-string/jumbo v0, "30608"
+    const-string/jumbo v0, "30609"
+    const-string/jumbo v0, "30610"
+    const-string/jumbo v0, "30611"
+    const-string/jumbo v0, "30612"
+    const-string/jumbo v0, "30613"
+    const-string/jumbo v0, "30614"
+    const-string/jumbo v0, "30615"
+    const-string/jumbo v0, "30616"
+    const-string/jumbo v0, "30617"
+    const-string/jumbo v0, "30618"
+    const-string/jumbo v0, "30619"
+    const-string/jumbo v0, "30620"
+    const-string/jumbo v0, "30621"
+    const-string/jumbo v0, "30622"
+    const-string/jumbo v0, "30623"
+    const-string/jumbo v0, "30624"
+    const-string/jumbo v0, "30625"
+    const-string/jumbo v0, "30626"
+    const-string/jumbo v0, "30627"
+    const-string/jumbo v0, "30628"
+    const-string/jumbo v0, "30629"
+    const-string/jumbo v0, "30630"
+    const-string/jumbo v0, "30631"
+    const-string/jumbo v0, "30632"
+    const-string/jumbo v0, "30633"
+    const-string/jumbo v0, "30634"
+    const-string/jumbo v0, "30635"
+    const-string/jumbo v0, "30636"
+    const-string/jumbo v0, "30637"
+    const-string/jumbo v0, "30638"
+    const-string/jumbo v0, "30639"
+    const-string/jumbo v0, "30640"
+    const-string/jumbo v0, "30641"
+    const-string/jumbo v0, "30642"
+    const-string/jumbo v0, "30643"
+    const-string/jumbo v0, "30644"
+    const-string/jumbo v0, "30645"
+    const-string/jumbo v0, "30646"
+    const-string/jumbo v0, "30647"
+    const-string/jumbo v0, "30648"
+    const-string/jumbo v0, "30649"
+    const-string/jumbo v0, "30650"
+    const-string/jumbo v0, "30651"
+    const-string/jumbo v0, "30652"
+    const-string/jumbo v0, "30653"
+    const-string/jumbo v0, "30654"
+    const-string/jumbo v0, "30655"
+    const-string/jumbo v0, "30656"
+    const-string/jumbo v0, "30657"
+    const-string/jumbo v0, "30658"
+    const-string/jumbo v0, "30659"
+    const-string/jumbo v0, "30660"
+    const-string/jumbo v0, "30661"
+    const-string/jumbo v0, "30662"
+    const-string/jumbo v0, "30663"
+    const-string/jumbo v0, "30664"
+    const-string/jumbo v0, "30665"
+    const-string/jumbo v0, "30666"
+    const-string/jumbo v0, "30667"
+    const-string/jumbo v0, "30668"
+    const-string/jumbo v0, "30669"
+    const-string/jumbo v0, "30670"
+    const-string/jumbo v0, "30671"
+    const-string/jumbo v0, "30672"
+    const-string/jumbo v0, "30673"
+    const-string/jumbo v0, "30674"
+    const-string/jumbo v0, "30675"
+    const-string/jumbo v0, "30676"
+    const-string/jumbo v0, "30677"
+    const-string/jumbo v0, "30678"
+    const-string/jumbo v0, "30679"
+    const-string/jumbo v0, "30680"
+    const-string/jumbo v0, "30681"
+    const-string/jumbo v0, "30682"
+    const-string/jumbo v0, "30683"
+    const-string/jumbo v0, "30684"
+    const-string/jumbo v0, "30685"
+    const-string/jumbo v0, "30686"
+    const-string/jumbo v0, "30687"
+    const-string/jumbo v0, "30688"
+    const-string/jumbo v0, "30689"
+    const-string/jumbo v0, "30690"
+    const-string/jumbo v0, "30691"
+    const-string/jumbo v0, "30692"
+    const-string/jumbo v0, "30693"
+    const-string/jumbo v0, "30694"
+    const-string/jumbo v0, "30695"
+    const-string/jumbo v0, "30696"
+    const-string/jumbo v0, "30697"
+    const-string/jumbo v0, "30698"
+    const-string/jumbo v0, "30699"
+    const-string/jumbo v0, "30700"
+    const-string/jumbo v0, "30701"
+    const-string/jumbo v0, "30702"
+    const-string/jumbo v0, "30703"
+    const-string/jumbo v0, "30704"
+    const-string/jumbo v0, "30705"
+    const-string/jumbo v0, "30706"
+    const-string/jumbo v0, "30707"
+    const-string/jumbo v0, "30708"
+    const-string/jumbo v0, "30709"
+    const-string/jumbo v0, "30710"
+    const-string/jumbo v0, "30711"
+    const-string/jumbo v0, "30712"
+    const-string/jumbo v0, "30713"
+    const-string/jumbo v0, "30714"
+    const-string/jumbo v0, "30715"
+    const-string/jumbo v0, "30716"
+    const-string/jumbo v0, "30717"
+    const-string/jumbo v0, "30718"
+    const-string/jumbo v0, "30719"
+    const-string/jumbo v0, "30720"
+    const-string/jumbo v0, "30721"
+    const-string/jumbo v0, "30722"
+    const-string/jumbo v0, "30723"
+    const-string/jumbo v0, "30724"
+    const-string/jumbo v0, "30725"
+    const-string/jumbo v0, "30726"
+    const-string/jumbo v0, "30727"
+    const-string/jumbo v0, "30728"
+    const-string/jumbo v0, "30729"
+    const-string/jumbo v0, "30730"
+    const-string/jumbo v0, "30731"
+    const-string/jumbo v0, "30732"
+    const-string/jumbo v0, "30733"
+    const-string/jumbo v0, "30734"
+    const-string/jumbo v0, "30735"
+    const-string/jumbo v0, "30736"
+    const-string/jumbo v0, "30737"
+    const-string/jumbo v0, "30738"
+    const-string/jumbo v0, "30739"
+    const-string/jumbo v0, "30740"
+    const-string/jumbo v0, "30741"
+    const-string/jumbo v0, "30742"
+    const-string/jumbo v0, "30743"
+    const-string/jumbo v0, "30744"
+    const-string/jumbo v0, "30745"
+    const-string/jumbo v0, "30746"
+    const-string/jumbo v0, "30747"
+    const-string/jumbo v0, "30748"
+    const-string/jumbo v0, "30749"
+    const-string/jumbo v0, "30750"
+    const-string/jumbo v0, "30751"
+    const-string/jumbo v0, "30752"
+    const-string/jumbo v0, "30753"
+    const-string/jumbo v0, "30754"
+    const-string/jumbo v0, "30755"
+    const-string/jumbo v0, "30756"
+    const-string/jumbo v0, "30757"
+    const-string/jumbo v0, "30758"
+    const-string/jumbo v0, "30759"
+    const-string/jumbo v0, "30760"
+    const-string/jumbo v0, "30761"
+    const-string/jumbo v0, "30762"
+    const-string/jumbo v0, "30763"
+    const-string/jumbo v0, "30764"
+    const-string/jumbo v0, "30765"
+    const-string/jumbo v0, "30766"
+    const-string/jumbo v0, "30767"
+    const-string/jumbo v0, "30768"
+    const-string/jumbo v0, "30769"
+    const-string/jumbo v0, "30770"
+    const-string/jumbo v0, "30771"
+    const-string/jumbo v0, "30772"
+    const-string/jumbo v0, "30773"
+    const-string/jumbo v0, "30774"
+    const-string/jumbo v0, "30775"
+    const-string/jumbo v0, "30776"
+    const-string/jumbo v0, "30777"
+    const-string/jumbo v0, "30778"
+    const-string/jumbo v0, "30779"
+    const-string/jumbo v0, "30780"
+    const-string/jumbo v0, "30781"
+    const-string/jumbo v0, "30782"
+    const-string/jumbo v0, "30783"
+    const-string/jumbo v0, "30784"
+    const-string/jumbo v0, "30785"
+    const-string/jumbo v0, "30786"
+    const-string/jumbo v0, "30787"
+    const-string/jumbo v0, "30788"
+    const-string/jumbo v0, "30789"
+    const-string/jumbo v0, "30790"
+    const-string/jumbo v0, "30791"
+    const-string/jumbo v0, "30792"
+    const-string/jumbo v0, "30793"
+    const-string/jumbo v0, "30794"
+    const-string/jumbo v0, "30795"
+    const-string/jumbo v0, "30796"
+    const-string/jumbo v0, "30797"
+    const-string/jumbo v0, "30798"
+    const-string/jumbo v0, "30799"
+    const-string/jumbo v0, "30800"
+    const-string/jumbo v0, "30801"
+    const-string/jumbo v0, "30802"
+    const-string/jumbo v0, "30803"
+    const-string/jumbo v0, "30804"
+    const-string/jumbo v0, "30805"
+    const-string/jumbo v0, "30806"
+    const-string/jumbo v0, "30807"
+    const-string/jumbo v0, "30808"
+    const-string/jumbo v0, "30809"
+    const-string/jumbo v0, "30810"
+    const-string/jumbo v0, "30811"
+    const-string/jumbo v0, "30812"
+    const-string/jumbo v0, "30813"
+    const-string/jumbo v0, "30814"
+    const-string/jumbo v0, "30815"
+    const-string/jumbo v0, "30816"
+    const-string/jumbo v0, "30817"
+    const-string/jumbo v0, "30818"
+    const-string/jumbo v0, "30819"
+    const-string/jumbo v0, "30820"
+    const-string/jumbo v0, "30821"
+    const-string/jumbo v0, "30822"
+    const-string/jumbo v0, "30823"
+    const-string/jumbo v0, "30824"
+    const-string/jumbo v0, "30825"
+    const-string/jumbo v0, "30826"
+    const-string/jumbo v0, "30827"
+    const-string/jumbo v0, "30828"
+    const-string/jumbo v0, "30829"
+    const-string/jumbo v0, "30830"
+    const-string/jumbo v0, "30831"
+    const-string/jumbo v0, "30832"
+    const-string/jumbo v0, "30833"
+    const-string/jumbo v0, "30834"
+    const-string/jumbo v0, "30835"
+    const-string/jumbo v0, "30836"
+    const-string/jumbo v0, "30837"
+    const-string/jumbo v0, "30838"
+    const-string/jumbo v0, "30839"
+    const-string/jumbo v0, "30840"
+    const-string/jumbo v0, "30841"
+    const-string/jumbo v0, "30842"
+    const-string/jumbo v0, "30843"
+    const-string/jumbo v0, "30844"
+    const-string/jumbo v0, "30845"
+    const-string/jumbo v0, "30846"
+    const-string/jumbo v0, "30847"
+    const-string/jumbo v0, "30848"
+    const-string/jumbo v0, "30849"
+    const-string/jumbo v0, "30850"
+    const-string/jumbo v0, "30851"
+    const-string/jumbo v0, "30852"
+    const-string/jumbo v0, "30853"
+    const-string/jumbo v0, "30854"
+    const-string/jumbo v0, "30855"
+    const-string/jumbo v0, "30856"
+    const-string/jumbo v0, "30857"
+    const-string/jumbo v0, "30858"
+    const-string/jumbo v0, "30859"
+    const-string/jumbo v0, "30860"
+    const-string/jumbo v0, "30861"
+    const-string/jumbo v0, "30862"
+    const-string/jumbo v0, "30863"
+    const-string/jumbo v0, "30864"
+    const-string/jumbo v0, "30865"
+    const-string/jumbo v0, "30866"
+    const-string/jumbo v0, "30867"
+    const-string/jumbo v0, "30868"
+    const-string/jumbo v0, "30869"
+    const-string/jumbo v0, "30870"
+    const-string/jumbo v0, "30871"
+    const-string/jumbo v0, "30872"
+    const-string/jumbo v0, "30873"
+    const-string/jumbo v0, "30874"
+    const-string/jumbo v0, "30875"
+    const-string/jumbo v0, "30876"
+    const-string/jumbo v0, "30877"
+    const-string/jumbo v0, "30878"
+    const-string/jumbo v0, "30879"
+    const-string/jumbo v0, "30880"
+    const-string/jumbo v0, "30881"
+    const-string/jumbo v0, "30882"
+    const-string/jumbo v0, "30883"
+    const-string/jumbo v0, "30884"
+    const-string/jumbo v0, "30885"
+    const-string/jumbo v0, "30886"
+    const-string/jumbo v0, "30887"
+    const-string/jumbo v0, "30888"
+    const-string/jumbo v0, "30889"
+    const-string/jumbo v0, "30890"
+    const-string/jumbo v0, "30891"
+    const-string/jumbo v0, "30892"
+    const-string/jumbo v0, "30893"
+    const-string/jumbo v0, "30894"
+    const-string/jumbo v0, "30895"
+    const-string/jumbo v0, "30896"
+    const-string/jumbo v0, "30897"
+    const-string/jumbo v0, "30898"
+    const-string/jumbo v0, "30899"
+    const-string/jumbo v0, "30900"
+    const-string/jumbo v0, "30901"
+    const-string/jumbo v0, "30902"
+    const-string/jumbo v0, "30903"
+    const-string/jumbo v0, "30904"
+    const-string/jumbo v0, "30905"
+    const-string/jumbo v0, "30906"
+    const-string/jumbo v0, "30907"
+    const-string/jumbo v0, "30908"
+    const-string/jumbo v0, "30909"
+    const-string/jumbo v0, "30910"
+    const-string/jumbo v0, "30911"
+    const-string/jumbo v0, "30912"
+    const-string/jumbo v0, "30913"
+    const-string/jumbo v0, "30914"
+    const-string/jumbo v0, "30915"
+    const-string/jumbo v0, "30916"
+    const-string/jumbo v0, "30917"
+    const-string/jumbo v0, "30918"
+    const-string/jumbo v0, "30919"
+    const-string/jumbo v0, "30920"
+    const-string/jumbo v0, "30921"
+    const-string/jumbo v0, "30922"
+    const-string/jumbo v0, "30923"
+    const-string/jumbo v0, "30924"
+    const-string/jumbo v0, "30925"
+    const-string/jumbo v0, "30926"
+    const-string/jumbo v0, "30927"
+    const-string/jumbo v0, "30928"
+    const-string/jumbo v0, "30929"
+    const-string/jumbo v0, "30930"
+    const-string/jumbo v0, "30931"
+    const-string/jumbo v0, "30932"
+    const-string/jumbo v0, "30933"
+    const-string/jumbo v0, "30934"
+    const-string/jumbo v0, "30935"
+    const-string/jumbo v0, "30936"
+    const-string/jumbo v0, "30937"
+    const-string/jumbo v0, "30938"
+    const-string/jumbo v0, "30939"
+    const-string/jumbo v0, "30940"
+    const-string/jumbo v0, "30941"
+    const-string/jumbo v0, "30942"
+    const-string/jumbo v0, "30943"
+    const-string/jumbo v0, "30944"
+    const-string/jumbo v0, "30945"
+    const-string/jumbo v0, "30946"
+    const-string/jumbo v0, "30947"
+    const-string/jumbo v0, "30948"
+    const-string/jumbo v0, "30949"
+    const-string/jumbo v0, "30950"
+    const-string/jumbo v0, "30951"
+    const-string/jumbo v0, "30952"
+    const-string/jumbo v0, "30953"
+    const-string/jumbo v0, "30954"
+    const-string/jumbo v0, "30955"
+    const-string/jumbo v0, "30956"
+    const-string/jumbo v0, "30957"
+    const-string/jumbo v0, "30958"
+    const-string/jumbo v0, "30959"
+    const-string/jumbo v0, "30960"
+    const-string/jumbo v0, "30961"
+    const-string/jumbo v0, "30962"
+    const-string/jumbo v0, "30963"
+    const-string/jumbo v0, "30964"
+    const-string/jumbo v0, "30965"
+    const-string/jumbo v0, "30966"
+    const-string/jumbo v0, "30967"
+    const-string/jumbo v0, "30968"
+    const-string/jumbo v0, "30969"
+    const-string/jumbo v0, "30970"
+    const-string/jumbo v0, "30971"
+    const-string/jumbo v0, "30972"
+    const-string/jumbo v0, "30973"
+    const-string/jumbo v0, "30974"
+    const-string/jumbo v0, "30975"
+    const-string/jumbo v0, "30976"
+    const-string/jumbo v0, "30977"
+    const-string/jumbo v0, "30978"
+    const-string/jumbo v0, "30979"
+    const-string/jumbo v0, "30980"
+    const-string/jumbo v0, "30981"
+    const-string/jumbo v0, "30982"
+    const-string/jumbo v0, "30983"
+    const-string/jumbo v0, "30984"
+    const-string/jumbo v0, "30985"
+    const-string/jumbo v0, "30986"
+    const-string/jumbo v0, "30987"
+    const-string/jumbo v0, "30988"
+    const-string/jumbo v0, "30989"
+    const-string/jumbo v0, "30990"
+    const-string/jumbo v0, "30991"
+    const-string/jumbo v0, "30992"
+    const-string/jumbo v0, "30993"
+    const-string/jumbo v0, "30994"
+    const-string/jumbo v0, "30995"
+    const-string/jumbo v0, "30996"
+    const-string/jumbo v0, "30997"
+    const-string/jumbo v0, "30998"
+    const-string/jumbo v0, "30999"
+    const-string/jumbo v0, "31000"
+    const-string/jumbo v0, "31001"
+    const-string/jumbo v0, "31002"
+    const-string/jumbo v0, "31003"
+    const-string/jumbo v0, "31004"
+    const-string/jumbo v0, "31005"
+    const-string/jumbo v0, "31006"
+    const-string/jumbo v0, "31007"
+    const-string/jumbo v0, "31008"
+    const-string/jumbo v0, "31009"
+    const-string/jumbo v0, "31010"
+    const-string/jumbo v0, "31011"
+    const-string/jumbo v0, "31012"
+    const-string/jumbo v0, "31013"
+    const-string/jumbo v0, "31014"
+    const-string/jumbo v0, "31015"
+    const-string/jumbo v0, "31016"
+    const-string/jumbo v0, "31017"
+    const-string/jumbo v0, "31018"
+    const-string/jumbo v0, "31019"
+    const-string/jumbo v0, "31020"
+    const-string/jumbo v0, "31021"
+    const-string/jumbo v0, "31022"
+    const-string/jumbo v0, "31023"
+    const-string/jumbo v0, "31024"
+    const-string/jumbo v0, "31025"
+    const-string/jumbo v0, "31026"
+    const-string/jumbo v0, "31027"
+    const-string/jumbo v0, "31028"
+    const-string/jumbo v0, "31029"
+    const-string/jumbo v0, "31030"
+    const-string/jumbo v0, "31031"
+    const-string/jumbo v0, "31032"
+    const-string/jumbo v0, "31033"
+    const-string/jumbo v0, "31034"
+    const-string/jumbo v0, "31035"
+    const-string/jumbo v0, "31036"
+    const-string/jumbo v0, "31037"
+    const-string/jumbo v0, "31038"
+    const-string/jumbo v0, "31039"
+    const-string/jumbo v0, "31040"
+    const-string/jumbo v0, "31041"
+    const-string/jumbo v0, "31042"
+    const-string/jumbo v0, "31043"
+    const-string/jumbo v0, "31044"
+    const-string/jumbo v0, "31045"
+    const-string/jumbo v0, "31046"
+    const-string/jumbo v0, "31047"
+    const-string/jumbo v0, "31048"
+    const-string/jumbo v0, "31049"
+    const-string/jumbo v0, "31050"
+    const-string/jumbo v0, "31051"
+    const-string/jumbo v0, "31052"
+    const-string/jumbo v0, "31053"
+    const-string/jumbo v0, "31054"
+    const-string/jumbo v0, "31055"
+    const-string/jumbo v0, "31056"
+    const-string/jumbo v0, "31057"
+    const-string/jumbo v0, "31058"
+    const-string/jumbo v0, "31059"
+    const-string/jumbo v0, "31060"
+    const-string/jumbo v0, "31061"
+    const-string/jumbo v0, "31062"
+    const-string/jumbo v0, "31063"
+    const-string/jumbo v0, "31064"
+    const-string/jumbo v0, "31065"
+    const-string/jumbo v0, "31066"
+    const-string/jumbo v0, "31067"
+    const-string/jumbo v0, "31068"
+    const-string/jumbo v0, "31069"
+    const-string/jumbo v0, "31070"
+    const-string/jumbo v0, "31071"
+    const-string/jumbo v0, "31072"
+    const-string/jumbo v0, "31073"
+    const-string/jumbo v0, "31074"
+    const-string/jumbo v0, "31075"
+    const-string/jumbo v0, "31076"
+    const-string/jumbo v0, "31077"
+    const-string/jumbo v0, "31078"
+    const-string/jumbo v0, "31079"
+    const-string/jumbo v0, "31080"
+    const-string/jumbo v0, "31081"
+    const-string/jumbo v0, "31082"
+    const-string/jumbo v0, "31083"
+    const-string/jumbo v0, "31084"
+    const-string/jumbo v0, "31085"
+    const-string/jumbo v0, "31086"
+    const-string/jumbo v0, "31087"
+    const-string/jumbo v0, "31088"
+    const-string/jumbo v0, "31089"
+    const-string/jumbo v0, "31090"
+    const-string/jumbo v0, "31091"
+    const-string/jumbo v0, "31092"
+    const-string/jumbo v0, "31093"
+    const-string/jumbo v0, "31094"
+    const-string/jumbo v0, "31095"
+    const-string/jumbo v0, "31096"
+    const-string/jumbo v0, "31097"
+    const-string/jumbo v0, "31098"
+    const-string/jumbo v0, "31099"
+    const-string/jumbo v0, "31100"
+    const-string/jumbo v0, "31101"
+    const-string/jumbo v0, "31102"
+    const-string/jumbo v0, "31103"
+    const-string/jumbo v0, "31104"
+    const-string/jumbo v0, "31105"
+    const-string/jumbo v0, "31106"
+    const-string/jumbo v0, "31107"
+    const-string/jumbo v0, "31108"
+    const-string/jumbo v0, "31109"
+    const-string/jumbo v0, "31110"
+    const-string/jumbo v0, "31111"
+    const-string/jumbo v0, "31112"
+    const-string/jumbo v0, "31113"
+    const-string/jumbo v0, "31114"
+    const-string/jumbo v0, "31115"
+    const-string/jumbo v0, "31116"
+    const-string/jumbo v0, "31117"
+    const-string/jumbo v0, "31118"
+    const-string/jumbo v0, "31119"
+    const-string/jumbo v0, "31120"
+    const-string/jumbo v0, "31121"
+    const-string/jumbo v0, "31122"
+    const-string/jumbo v0, "31123"
+    const-string/jumbo v0, "31124"
+    const-string/jumbo v0, "31125"
+    const-string/jumbo v0, "31126"
+    const-string/jumbo v0, "31127"
+    const-string/jumbo v0, "31128"
+    const-string/jumbo v0, "31129"
+    const-string/jumbo v0, "31130"
+    const-string/jumbo v0, "31131"
+    const-string/jumbo v0, "31132"
+    const-string/jumbo v0, "31133"
+    const-string/jumbo v0, "31134"
+    const-string/jumbo v0, "31135"
+    const-string/jumbo v0, "31136"
+    const-string/jumbo v0, "31137"
+    const-string/jumbo v0, "31138"
+    const-string/jumbo v0, "31139"
+    const-string/jumbo v0, "31140"
+    const-string/jumbo v0, "31141"
+    const-string/jumbo v0, "31142"
+    const-string/jumbo v0, "31143"
+    const-string/jumbo v0, "31144"
+    const-string/jumbo v0, "31145"
+    const-string/jumbo v0, "31146"
+    const-string/jumbo v0, "31147"
+    const-string/jumbo v0, "31148"
+    const-string/jumbo v0, "31149"
+    const-string/jumbo v0, "31150"
+    const-string/jumbo v0, "31151"
+    const-string/jumbo v0, "31152"
+    const-string/jumbo v0, "31153"
+    const-string/jumbo v0, "31154"
+    const-string/jumbo v0, "31155"
+    const-string/jumbo v0, "31156"
+    const-string/jumbo v0, "31157"
+    const-string/jumbo v0, "31158"
+    const-string/jumbo v0, "31159"
+    const-string/jumbo v0, "31160"
+    const-string/jumbo v0, "31161"
+    const-string/jumbo v0, "31162"
+    const-string/jumbo v0, "31163"
+    const-string/jumbo v0, "31164"
+    const-string/jumbo v0, "31165"
+    const-string/jumbo v0, "31166"
+    const-string/jumbo v0, "31167"
+    const-string/jumbo v0, "31168"
+    const-string/jumbo v0, "31169"
+    const-string/jumbo v0, "31170"
+    const-string/jumbo v0, "31171"
+    const-string/jumbo v0, "31172"
+    const-string/jumbo v0, "31173"
+    const-string/jumbo v0, "31174"
+    const-string/jumbo v0, "31175"
+    const-string/jumbo v0, "31176"
+    const-string/jumbo v0, "31177"
+    const-string/jumbo v0, "31178"
+    const-string/jumbo v0, "31179"
+    const-string/jumbo v0, "31180"
+    const-string/jumbo v0, "31181"
+    const-string/jumbo v0, "31182"
+    const-string/jumbo v0, "31183"
+    const-string/jumbo v0, "31184"
+    const-string/jumbo v0, "31185"
+    const-string/jumbo v0, "31186"
+    const-string/jumbo v0, "31187"
+    const-string/jumbo v0, "31188"
+    const-string/jumbo v0, "31189"
+    const-string/jumbo v0, "31190"
+    const-string/jumbo v0, "31191"
+    const-string/jumbo v0, "31192"
+    const-string/jumbo v0, "31193"
+    const-string/jumbo v0, "31194"
+    const-string/jumbo v0, "31195"
+    const-string/jumbo v0, "31196"
+    const-string/jumbo v0, "31197"
+    const-string/jumbo v0, "31198"
+    const-string/jumbo v0, "31199"
+    const-string/jumbo v0, "31200"
+    const-string/jumbo v0, "31201"
+    const-string/jumbo v0, "31202"
+    const-string/jumbo v0, "31203"
+    const-string/jumbo v0, "31204"
+    const-string/jumbo v0, "31205"
+    const-string/jumbo v0, "31206"
+    const-string/jumbo v0, "31207"
+    const-string/jumbo v0, "31208"
+    const-string/jumbo v0, "31209"
+    const-string/jumbo v0, "31210"
+    const-string/jumbo v0, "31211"
+    const-string/jumbo v0, "31212"
+    const-string/jumbo v0, "31213"
+    const-string/jumbo v0, "31214"
+    const-string/jumbo v0, "31215"
+    const-string/jumbo v0, "31216"
+    const-string/jumbo v0, "31217"
+    const-string/jumbo v0, "31218"
+    const-string/jumbo v0, "31219"
+    const-string/jumbo v0, "31220"
+    const-string/jumbo v0, "31221"
+    const-string/jumbo v0, "31222"
+    const-string/jumbo v0, "31223"
+    const-string/jumbo v0, "31224"
+    const-string/jumbo v0, "31225"
+    const-string/jumbo v0, "31226"
+    const-string/jumbo v0, "31227"
+    const-string/jumbo v0, "31228"
+    const-string/jumbo v0, "31229"
+    const-string/jumbo v0, "31230"
+    const-string/jumbo v0, "31231"
+    const-string/jumbo v0, "31232"
+    const-string/jumbo v0, "31233"
+    const-string/jumbo v0, "31234"
+    const-string/jumbo v0, "31235"
+    const-string/jumbo v0, "31236"
+    const-string/jumbo v0, "31237"
+    const-string/jumbo v0, "31238"
+    const-string/jumbo v0, "31239"
+    const-string/jumbo v0, "31240"
+    const-string/jumbo v0, "31241"
+    const-string/jumbo v0, "31242"
+    const-string/jumbo v0, "31243"
+    const-string/jumbo v0, "31244"
+    const-string/jumbo v0, "31245"
+    const-string/jumbo v0, "31246"
+    const-string/jumbo v0, "31247"
+    const-string/jumbo v0, "31248"
+    const-string/jumbo v0, "31249"
+    const-string/jumbo v0, "31250"
+    const-string/jumbo v0, "31251"
+    const-string/jumbo v0, "31252"
+    const-string/jumbo v0, "31253"
+    const-string/jumbo v0, "31254"
+    const-string/jumbo v0, "31255"
+    const-string/jumbo v0, "31256"
+    const-string/jumbo v0, "31257"
+    const-string/jumbo v0, "31258"
+    const-string/jumbo v0, "31259"
+    const-string/jumbo v0, "31260"
+    const-string/jumbo v0, "31261"
+    const-string/jumbo v0, "31262"
+    const-string/jumbo v0, "31263"
+    const-string/jumbo v0, "31264"
+    const-string/jumbo v0, "31265"
+    const-string/jumbo v0, "31266"
+    const-string/jumbo v0, "31267"
+    const-string/jumbo v0, "31268"
+    const-string/jumbo v0, "31269"
+    const-string/jumbo v0, "31270"
+    const-string/jumbo v0, "31271"
+    const-string/jumbo v0, "31272"
+    const-string/jumbo v0, "31273"
+    const-string/jumbo v0, "31274"
+    const-string/jumbo v0, "31275"
+    const-string/jumbo v0, "31276"
+    const-string/jumbo v0, "31277"
+    const-string/jumbo v0, "31278"
+    const-string/jumbo v0, "31279"
+    const-string/jumbo v0, "31280"
+    const-string/jumbo v0, "31281"
+    const-string/jumbo v0, "31282"
+    const-string/jumbo v0, "31283"
+    const-string/jumbo v0, "31284"
+    const-string/jumbo v0, "31285"
+    const-string/jumbo v0, "31286"
+    const-string/jumbo v0, "31287"
+    const-string/jumbo v0, "31288"
+    const-string/jumbo v0, "31289"
+    const-string/jumbo v0, "31290"
+    const-string/jumbo v0, "31291"
+    const-string/jumbo v0, "31292"
+    const-string/jumbo v0, "31293"
+    const-string/jumbo v0, "31294"
+    const-string/jumbo v0, "31295"
+    const-string/jumbo v0, "31296"
+    const-string/jumbo v0, "31297"
+    const-string/jumbo v0, "31298"
+    const-string/jumbo v0, "31299"
+    const-string/jumbo v0, "31300"
+    const-string/jumbo v0, "31301"
+    const-string/jumbo v0, "31302"
+    const-string/jumbo v0, "31303"
+    const-string/jumbo v0, "31304"
+    const-string/jumbo v0, "31305"
+    const-string/jumbo v0, "31306"
+    const-string/jumbo v0, "31307"
+    const-string/jumbo v0, "31308"
+    const-string/jumbo v0, "31309"
+    const-string/jumbo v0, "31310"
+    const-string/jumbo v0, "31311"
+    const-string/jumbo v0, "31312"
+    const-string/jumbo v0, "31313"
+    const-string/jumbo v0, "31314"
+    const-string/jumbo v0, "31315"
+    const-string/jumbo v0, "31316"
+    const-string/jumbo v0, "31317"
+    const-string/jumbo v0, "31318"
+    const-string/jumbo v0, "31319"
+    const-string/jumbo v0, "31320"
+    const-string/jumbo v0, "31321"
+    const-string/jumbo v0, "31322"
+    const-string/jumbo v0, "31323"
+    const-string/jumbo v0, "31324"
+    const-string/jumbo v0, "31325"
+    const-string/jumbo v0, "31326"
+    const-string/jumbo v0, "31327"
+    const-string/jumbo v0, "31328"
+    const-string/jumbo v0, "31329"
+    const-string/jumbo v0, "31330"
+    const-string/jumbo v0, "31331"
+    const-string/jumbo v0, "31332"
+    const-string/jumbo v0, "31333"
+    const-string/jumbo v0, "31334"
+    const-string/jumbo v0, "31335"
+    const-string/jumbo v0, "31336"
+    const-string/jumbo v0, "31337"
+    const-string/jumbo v0, "31338"
+    const-string/jumbo v0, "31339"
+    const-string/jumbo v0, "31340"
+    const-string/jumbo v0, "31341"
+    const-string/jumbo v0, "31342"
+    const-string/jumbo v0, "31343"
+    const-string/jumbo v0, "31344"
+    const-string/jumbo v0, "31345"
+    const-string/jumbo v0, "31346"
+    const-string/jumbo v0, "31347"
+    const-string/jumbo v0, "31348"
+    const-string/jumbo v0, "31349"
+    const-string/jumbo v0, "31350"
+    const-string/jumbo v0, "31351"
+    const-string/jumbo v0, "31352"
+    const-string/jumbo v0, "31353"
+    const-string/jumbo v0, "31354"
+    const-string/jumbo v0, "31355"
+    const-string/jumbo v0, "31356"
+    const-string/jumbo v0, "31357"
+    const-string/jumbo v0, "31358"
+    const-string/jumbo v0, "31359"
+    const-string/jumbo v0, "31360"
+    const-string/jumbo v0, "31361"
+    const-string/jumbo v0, "31362"
+    const-string/jumbo v0, "31363"
+    const-string/jumbo v0, "31364"
+    const-string/jumbo v0, "31365"
+    const-string/jumbo v0, "31366"
+    const-string/jumbo v0, "31367"
+    const-string/jumbo v0, "31368"
+    const-string/jumbo v0, "31369"
+    const-string/jumbo v0, "31370"
+    const-string/jumbo v0, "31371"
+    const-string/jumbo v0, "31372"
+    const-string/jumbo v0, "31373"
+    const-string/jumbo v0, "31374"
+    const-string/jumbo v0, "31375"
+    const-string/jumbo v0, "31376"
+    const-string/jumbo v0, "31377"
+    const-string/jumbo v0, "31378"
+    const-string/jumbo v0, "31379"
+    const-string/jumbo v0, "31380"
+    const-string/jumbo v0, "31381"
+    const-string/jumbo v0, "31382"
+    const-string/jumbo v0, "31383"
+    const-string/jumbo v0, "31384"
+    const-string/jumbo v0, "31385"
+    const-string/jumbo v0, "31386"
+    const-string/jumbo v0, "31387"
+    const-string/jumbo v0, "31388"
+    const-string/jumbo v0, "31389"
+    const-string/jumbo v0, "31390"
+    const-string/jumbo v0, "31391"
+    const-string/jumbo v0, "31392"
+    const-string/jumbo v0, "31393"
+    const-string/jumbo v0, "31394"
+    const-string/jumbo v0, "31395"
+    const-string/jumbo v0, "31396"
+    const-string/jumbo v0, "31397"
+    const-string/jumbo v0, "31398"
+    const-string/jumbo v0, "31399"
+    const-string/jumbo v0, "31400"
+    const-string/jumbo v0, "31401"
+    const-string/jumbo v0, "31402"
+    const-string/jumbo v0, "31403"
+    const-string/jumbo v0, "31404"
+    const-string/jumbo v0, "31405"
+    const-string/jumbo v0, "31406"
+    const-string/jumbo v0, "31407"
+    const-string/jumbo v0, "31408"
+    const-string/jumbo v0, "31409"
+    const-string/jumbo v0, "31410"
+    const-string/jumbo v0, "31411"
+    const-string/jumbo v0, "31412"
+    const-string/jumbo v0, "31413"
+    const-string/jumbo v0, "31414"
+    const-string/jumbo v0, "31415"
+    const-string/jumbo v0, "31416"
+    const-string/jumbo v0, "31417"
+    const-string/jumbo v0, "31418"
+    const-string/jumbo v0, "31419"
+    const-string/jumbo v0, "31420"
+    const-string/jumbo v0, "31421"
+    const-string/jumbo v0, "31422"
+    const-string/jumbo v0, "31423"
+    const-string/jumbo v0, "31424"
+    const-string/jumbo v0, "31425"
+    const-string/jumbo v0, "31426"
+    const-string/jumbo v0, "31427"
+    const-string/jumbo v0, "31428"
+    const-string/jumbo v0, "31429"
+    const-string/jumbo v0, "31430"
+    const-string/jumbo v0, "31431"
+    const-string/jumbo v0, "31432"
+    const-string/jumbo v0, "31433"
+    const-string/jumbo v0, "31434"
+    const-string/jumbo v0, "31435"
+    const-string/jumbo v0, "31436"
+    const-string/jumbo v0, "31437"
+    const-string/jumbo v0, "31438"
+    const-string/jumbo v0, "31439"
+    const-string/jumbo v0, "31440"
+    const-string/jumbo v0, "31441"
+    const-string/jumbo v0, "31442"
+    const-string/jumbo v0, "31443"
+    const-string/jumbo v0, "31444"
+    const-string/jumbo v0, "31445"
+    const-string/jumbo v0, "31446"
+    const-string/jumbo v0, "31447"
+    const-string/jumbo v0, "31448"
+    const-string/jumbo v0, "31449"
+    const-string/jumbo v0, "31450"
+    const-string/jumbo v0, "31451"
+    const-string/jumbo v0, "31452"
+    const-string/jumbo v0, "31453"
+    const-string/jumbo v0, "31454"
+    const-string/jumbo v0, "31455"
+    const-string/jumbo v0, "31456"
+    const-string/jumbo v0, "31457"
+    const-string/jumbo v0, "31458"
+    const-string/jumbo v0, "31459"
+    const-string/jumbo v0, "31460"
+    const-string/jumbo v0, "31461"
+    const-string/jumbo v0, "31462"
+    const-string/jumbo v0, "31463"
+    const-string/jumbo v0, "31464"
+    const-string/jumbo v0, "31465"
+    const-string/jumbo v0, "31466"
+    const-string/jumbo v0, "31467"
+    const-string/jumbo v0, "31468"
+    const-string/jumbo v0, "31469"
+    const-string/jumbo v0, "31470"
+    const-string/jumbo v0, "31471"
+    const-string/jumbo v0, "31472"
+    const-string/jumbo v0, "31473"
+    const-string/jumbo v0, "31474"
+    const-string/jumbo v0, "31475"
+    const-string/jumbo v0, "31476"
+    const-string/jumbo v0, "31477"
+    const-string/jumbo v0, "31478"
+    const-string/jumbo v0, "31479"
+    const-string/jumbo v0, "31480"
+    const-string/jumbo v0, "31481"
+    const-string/jumbo v0, "31482"
+    const-string/jumbo v0, "31483"
+    const-string/jumbo v0, "31484"
+    const-string/jumbo v0, "31485"
+    const-string/jumbo v0, "31486"
+    const-string/jumbo v0, "31487"
+    const-string/jumbo v0, "31488"
+    const-string/jumbo v0, "31489"
+    const-string/jumbo v0, "31490"
+    const-string/jumbo v0, "31491"
+    const-string/jumbo v0, "31492"
+    const-string/jumbo v0, "31493"
+    const-string/jumbo v0, "31494"
+    const-string/jumbo v0, "31495"
+    const-string/jumbo v0, "31496"
+    const-string/jumbo v0, "31497"
+    const-string/jumbo v0, "31498"
+    const-string/jumbo v0, "31499"
+    const-string/jumbo v0, "31500"
+    const-string/jumbo v0, "31501"
+    const-string/jumbo v0, "31502"
+    const-string/jumbo v0, "31503"
+    const-string/jumbo v0, "31504"
+    const-string/jumbo v0, "31505"
+    const-string/jumbo v0, "31506"
+    const-string/jumbo v0, "31507"
+    const-string/jumbo v0, "31508"
+    const-string/jumbo v0, "31509"
+    const-string/jumbo v0, "31510"
+    const-string/jumbo v0, "31511"
+    const-string/jumbo v0, "31512"
+    const-string/jumbo v0, "31513"
+    const-string/jumbo v0, "31514"
+    const-string/jumbo v0, "31515"
+    const-string/jumbo v0, "31516"
+    const-string/jumbo v0, "31517"
+    const-string/jumbo v0, "31518"
+    const-string/jumbo v0, "31519"
+    const-string/jumbo v0, "31520"
+    const-string/jumbo v0, "31521"
+    const-string/jumbo v0, "31522"
+    const-string/jumbo v0, "31523"
+    const-string/jumbo v0, "31524"
+    const-string/jumbo v0, "31525"
+    const-string/jumbo v0, "31526"
+    const-string/jumbo v0, "31527"
+    const-string/jumbo v0, "31528"
+    const-string/jumbo v0, "31529"
+    const-string/jumbo v0, "31530"
+    const-string/jumbo v0, "31531"
+    const-string/jumbo v0, "31532"
+    const-string/jumbo v0, "31533"
+    const-string/jumbo v0, "31534"
+    const-string/jumbo v0, "31535"
+    const-string/jumbo v0, "31536"
+    const-string/jumbo v0, "31537"
+    const-string/jumbo v0, "31538"
+    const-string/jumbo v0, "31539"
+    const-string/jumbo v0, "31540"
+    const-string/jumbo v0, "31541"
+    const-string/jumbo v0, "31542"
+    const-string/jumbo v0, "31543"
+    const-string/jumbo v0, "31544"
+    const-string/jumbo v0, "31545"
+    const-string/jumbo v0, "31546"
+    const-string/jumbo v0, "31547"
+    const-string/jumbo v0, "31548"
+    const-string/jumbo v0, "31549"
+    const-string/jumbo v0, "31550"
+    const-string/jumbo v0, "31551"
+    const-string/jumbo v0, "31552"
+    const-string/jumbo v0, "31553"
+    const-string/jumbo v0, "31554"
+    const-string/jumbo v0, "31555"
+    const-string/jumbo v0, "31556"
+    const-string/jumbo v0, "31557"
+    const-string/jumbo v0, "31558"
+    const-string/jumbo v0, "31559"
+    const-string/jumbo v0, "31560"
+    const-string/jumbo v0, "31561"
+    const-string/jumbo v0, "31562"
+    const-string/jumbo v0, "31563"
+    const-string/jumbo v0, "31564"
+    const-string/jumbo v0, "31565"
+    const-string/jumbo v0, "31566"
+    const-string/jumbo v0, "31567"
+    const-string/jumbo v0, "31568"
+    const-string/jumbo v0, "31569"
+    const-string/jumbo v0, "31570"
+    const-string/jumbo v0, "31571"
+    const-string/jumbo v0, "31572"
+    const-string/jumbo v0, "31573"
+    const-string/jumbo v0, "31574"
+    const-string/jumbo v0, "31575"
+    const-string/jumbo v0, "31576"
+    const-string/jumbo v0, "31577"
+    const-string/jumbo v0, "31578"
+    const-string/jumbo v0, "31579"
+    const-string/jumbo v0, "31580"
+    const-string/jumbo v0, "31581"
+    const-string/jumbo v0, "31582"
+    const-string/jumbo v0, "31583"
+    const-string/jumbo v0, "31584"
+    const-string/jumbo v0, "31585"
+    const-string/jumbo v0, "31586"
+    const-string/jumbo v0, "31587"
+    const-string/jumbo v0, "31588"
+    const-string/jumbo v0, "31589"
+    const-string/jumbo v0, "31590"
+    const-string/jumbo v0, "31591"
+    const-string/jumbo v0, "31592"
+    const-string/jumbo v0, "31593"
+    const-string/jumbo v0, "31594"
+    const-string/jumbo v0, "31595"
+    const-string/jumbo v0, "31596"
+    const-string/jumbo v0, "31597"
+    const-string/jumbo v0, "31598"
+    const-string/jumbo v0, "31599"
+    const-string/jumbo v0, "31600"
+    const-string/jumbo v0, "31601"
+    const-string/jumbo v0, "31602"
+    const-string/jumbo v0, "31603"
+    const-string/jumbo v0, "31604"
+    const-string/jumbo v0, "31605"
+    const-string/jumbo v0, "31606"
+    const-string/jumbo v0, "31607"
+    const-string/jumbo v0, "31608"
+    const-string/jumbo v0, "31609"
+    const-string/jumbo v0, "31610"
+    const-string/jumbo v0, "31611"
+    const-string/jumbo v0, "31612"
+    const-string/jumbo v0, "31613"
+    const-string/jumbo v0, "31614"
+    const-string/jumbo v0, "31615"
+    const-string/jumbo v0, "31616"
+    const-string/jumbo v0, "31617"
+    const-string/jumbo v0, "31618"
+    const-string/jumbo v0, "31619"
+    const-string/jumbo v0, "31620"
+    const-string/jumbo v0, "31621"
+    const-string/jumbo v0, "31622"
+    const-string/jumbo v0, "31623"
+    const-string/jumbo v0, "31624"
+    const-string/jumbo v0, "31625"
+    const-string/jumbo v0, "31626"
+    const-string/jumbo v0, "31627"
+    const-string/jumbo v0, "31628"
+    const-string/jumbo v0, "31629"
+    const-string/jumbo v0, "31630"
+    const-string/jumbo v0, "31631"
+    const-string/jumbo v0, "31632"
+    const-string/jumbo v0, "31633"
+    const-string/jumbo v0, "31634"
+    const-string/jumbo v0, "31635"
+    const-string/jumbo v0, "31636"
+    const-string/jumbo v0, "31637"
+    const-string/jumbo v0, "31638"
+    const-string/jumbo v0, "31639"
+    const-string/jumbo v0, "31640"
+    const-string/jumbo v0, "31641"
+    const-string/jumbo v0, "31642"
+    const-string/jumbo v0, "31643"
+    const-string/jumbo v0, "31644"
+    const-string/jumbo v0, "31645"
+    const-string/jumbo v0, "31646"
+    const-string/jumbo v0, "31647"
+    const-string/jumbo v0, "31648"
+    const-string/jumbo v0, "31649"
+    const-string/jumbo v0, "31650"
+    const-string/jumbo v0, "31651"
+    const-string/jumbo v0, "31652"
+    const-string/jumbo v0, "31653"
+    const-string/jumbo v0, "31654"
+    const-string/jumbo v0, "31655"
+    const-string/jumbo v0, "31656"
+    const-string/jumbo v0, "31657"
+    const-string/jumbo v0, "31658"
+    const-string/jumbo v0, "31659"
+    const-string/jumbo v0, "31660"
+    const-string/jumbo v0, "31661"
+    const-string/jumbo v0, "31662"
+    const-string/jumbo v0, "31663"
+    const-string/jumbo v0, "31664"
+    const-string/jumbo v0, "31665"
+    const-string/jumbo v0, "31666"
+    const-string/jumbo v0, "31667"
+    const-string/jumbo v0, "31668"
+    const-string/jumbo v0, "31669"
+    const-string/jumbo v0, "31670"
+    const-string/jumbo v0, "31671"
+    const-string/jumbo v0, "31672"
+    const-string/jumbo v0, "31673"
+    const-string/jumbo v0, "31674"
+    const-string/jumbo v0, "31675"
+    const-string/jumbo v0, "31676"
+    const-string/jumbo v0, "31677"
+    const-string/jumbo v0, "31678"
+    const-string/jumbo v0, "31679"
+    const-string/jumbo v0, "31680"
+    const-string/jumbo v0, "31681"
+    const-string/jumbo v0, "31682"
+    const-string/jumbo v0, "31683"
+    const-string/jumbo v0, "31684"
+    const-string/jumbo v0, "31685"
+    const-string/jumbo v0, "31686"
+    const-string/jumbo v0, "31687"
+    const-string/jumbo v0, "31688"
+    const-string/jumbo v0, "31689"
+    const-string/jumbo v0, "31690"
+    const-string/jumbo v0, "31691"
+    const-string/jumbo v0, "31692"
+    const-string/jumbo v0, "31693"
+    const-string/jumbo v0, "31694"
+    const-string/jumbo v0, "31695"
+    const-string/jumbo v0, "31696"
+    const-string/jumbo v0, "31697"
+    const-string/jumbo v0, "31698"
+    const-string/jumbo v0, "31699"
+    const-string/jumbo v0, "31700"
+    const-string/jumbo v0, "31701"
+    const-string/jumbo v0, "31702"
+    const-string/jumbo v0, "31703"
+    const-string/jumbo v0, "31704"
+    const-string/jumbo v0, "31705"
+    const-string/jumbo v0, "31706"
+    const-string/jumbo v0, "31707"
+    const-string/jumbo v0, "31708"
+    const-string/jumbo v0, "31709"
+    const-string/jumbo v0, "31710"
+    const-string/jumbo v0, "31711"
+    const-string/jumbo v0, "31712"
+    const-string/jumbo v0, "31713"
+    const-string/jumbo v0, "31714"
+    const-string/jumbo v0, "31715"
+    const-string/jumbo v0, "31716"
+    const-string/jumbo v0, "31717"
+    const-string/jumbo v0, "31718"
+    const-string/jumbo v0, "31719"
+    const-string/jumbo v0, "31720"
+    const-string/jumbo v0, "31721"
+    const-string/jumbo v0, "31722"
+    const-string/jumbo v0, "31723"
+    const-string/jumbo v0, "31724"
+    const-string/jumbo v0, "31725"
+    const-string/jumbo v0, "31726"
+    const-string/jumbo v0, "31727"
+    const-string/jumbo v0, "31728"
+    const-string/jumbo v0, "31729"
+    const-string/jumbo v0, "31730"
+    const-string/jumbo v0, "31731"
+    const-string/jumbo v0, "31732"
+    const-string/jumbo v0, "31733"
+    const-string/jumbo v0, "31734"
+    const-string/jumbo v0, "31735"
+    const-string/jumbo v0, "31736"
+    const-string/jumbo v0, "31737"
+    const-string/jumbo v0, "31738"
+    const-string/jumbo v0, "31739"
+    const-string/jumbo v0, "31740"
+    const-string/jumbo v0, "31741"
+    const-string/jumbo v0, "31742"
+    const-string/jumbo v0, "31743"
+    const-string/jumbo v0, "31744"
+    const-string/jumbo v0, "31745"
+    const-string/jumbo v0, "31746"
+    const-string/jumbo v0, "31747"
+    const-string/jumbo v0, "31748"
+    const-string/jumbo v0, "31749"
+    const-string/jumbo v0, "31750"
+    const-string/jumbo v0, "31751"
+    const-string/jumbo v0, "31752"
+    const-string/jumbo v0, "31753"
+    const-string/jumbo v0, "31754"
+    const-string/jumbo v0, "31755"
+    const-string/jumbo v0, "31756"
+    const-string/jumbo v0, "31757"
+    const-string/jumbo v0, "31758"
+    const-string/jumbo v0, "31759"
+    const-string/jumbo v0, "31760"
+    const-string/jumbo v0, "31761"
+    const-string/jumbo v0, "31762"
+    const-string/jumbo v0, "31763"
+    const-string/jumbo v0, "31764"
+    const-string/jumbo v0, "31765"
+    const-string/jumbo v0, "31766"
+    const-string/jumbo v0, "31767"
+    const-string/jumbo v0, "31768"
+    const-string/jumbo v0, "31769"
+    const-string/jumbo v0, "31770"
+    const-string/jumbo v0, "31771"
+    const-string/jumbo v0, "31772"
+    const-string/jumbo v0, "31773"
+    const-string/jumbo v0, "31774"
+    const-string/jumbo v0, "31775"
+    const-string/jumbo v0, "31776"
+    const-string/jumbo v0, "31777"
+    const-string/jumbo v0, "31778"
+    const-string/jumbo v0, "31779"
+    const-string/jumbo v0, "31780"
+    const-string/jumbo v0, "31781"
+    const-string/jumbo v0, "31782"
+    const-string/jumbo v0, "31783"
+    const-string/jumbo v0, "31784"
+    const-string/jumbo v0, "31785"
+    const-string/jumbo v0, "31786"
+    const-string/jumbo v0, "31787"
+    const-string/jumbo v0, "31788"
+    const-string/jumbo v0, "31789"
+    const-string/jumbo v0, "31790"
+    const-string/jumbo v0, "31791"
+    const-string/jumbo v0, "31792"
+    const-string/jumbo v0, "31793"
+    const-string/jumbo v0, "31794"
+    const-string/jumbo v0, "31795"
+    const-string/jumbo v0, "31796"
+    const-string/jumbo v0, "31797"
+    const-string/jumbo v0, "31798"
+    const-string/jumbo v0, "31799"
+    const-string/jumbo v0, "31800"
+    const-string/jumbo v0, "31801"
+    const-string/jumbo v0, "31802"
+    const-string/jumbo v0, "31803"
+    const-string/jumbo v0, "31804"
+    const-string/jumbo v0, "31805"
+    const-string/jumbo v0, "31806"
+    const-string/jumbo v0, "31807"
+    const-string/jumbo v0, "31808"
+    const-string/jumbo v0, "31809"
+    const-string/jumbo v0, "31810"
+    const-string/jumbo v0, "31811"
+    const-string/jumbo v0, "31812"
+    const-string/jumbo v0, "31813"
+    const-string/jumbo v0, "31814"
+    const-string/jumbo v0, "31815"
+    const-string/jumbo v0, "31816"
+    const-string/jumbo v0, "31817"
+    const-string/jumbo v0, "31818"
+    const-string/jumbo v0, "31819"
+    const-string/jumbo v0, "31820"
+    const-string/jumbo v0, "31821"
+    const-string/jumbo v0, "31822"
+    const-string/jumbo v0, "31823"
+    const-string/jumbo v0, "31824"
+    const-string/jumbo v0, "31825"
+    const-string/jumbo v0, "31826"
+    const-string/jumbo v0, "31827"
+    const-string/jumbo v0, "31828"
+    const-string/jumbo v0, "31829"
+    const-string/jumbo v0, "31830"
+    const-string/jumbo v0, "31831"
+    const-string/jumbo v0, "31832"
+    const-string/jumbo v0, "31833"
+    const-string/jumbo v0, "31834"
+    const-string/jumbo v0, "31835"
+    const-string/jumbo v0, "31836"
+    const-string/jumbo v0, "31837"
+    const-string/jumbo v0, "31838"
+    const-string/jumbo v0, "31839"
+    const-string/jumbo v0, "31840"
+    const-string/jumbo v0, "31841"
+    const-string/jumbo v0, "31842"
+    const-string/jumbo v0, "31843"
+    const-string/jumbo v0, "31844"
+    const-string/jumbo v0, "31845"
+    const-string/jumbo v0, "31846"
+    const-string/jumbo v0, "31847"
+    const-string/jumbo v0, "31848"
+    const-string/jumbo v0, "31849"
+    const-string/jumbo v0, "31850"
+    const-string/jumbo v0, "31851"
+    const-string/jumbo v0, "31852"
+    const-string/jumbo v0, "31853"
+    const-string/jumbo v0, "31854"
+    const-string/jumbo v0, "31855"
+    const-string/jumbo v0, "31856"
+    const-string/jumbo v0, "31857"
+    const-string/jumbo v0, "31858"
+    const-string/jumbo v0, "31859"
+    const-string/jumbo v0, "31860"
+    const-string/jumbo v0, "31861"
+    const-string/jumbo v0, "31862"
+    const-string/jumbo v0, "31863"
+    const-string/jumbo v0, "31864"
+    const-string/jumbo v0, "31865"
+    const-string/jumbo v0, "31866"
+    const-string/jumbo v0, "31867"
+    const-string/jumbo v0, "31868"
+    const-string/jumbo v0, "31869"
+    const-string/jumbo v0, "31870"
+    const-string/jumbo v0, "31871"
+    const-string/jumbo v0, "31872"
+    const-string/jumbo v0, "31873"
+    const-string/jumbo v0, "31874"
+    const-string/jumbo v0, "31875"
+    const-string/jumbo v0, "31876"
+    const-string/jumbo v0, "31877"
+    const-string/jumbo v0, "31878"
+    const-string/jumbo v0, "31879"
+    const-string/jumbo v0, "31880"
+    const-string/jumbo v0, "31881"
+    const-string/jumbo v0, "31882"
+    const-string/jumbo v0, "31883"
+    const-string/jumbo v0, "31884"
+    const-string/jumbo v0, "31885"
+    const-string/jumbo v0, "31886"
+    const-string/jumbo v0, "31887"
+    const-string/jumbo v0, "31888"
+    const-string/jumbo v0, "31889"
+    const-string/jumbo v0, "31890"
+    const-string/jumbo v0, "31891"
+    const-string/jumbo v0, "31892"
+    const-string/jumbo v0, "31893"
+    const-string/jumbo v0, "31894"
+    const-string/jumbo v0, "31895"
+    const-string/jumbo v0, "31896"
+    const-string/jumbo v0, "31897"
+    const-string/jumbo v0, "31898"
+    const-string/jumbo v0, "31899"
+    const-string/jumbo v0, "31900"
+    const-string/jumbo v0, "31901"
+    const-string/jumbo v0, "31902"
+    const-string/jumbo v0, "31903"
+    const-string/jumbo v0, "31904"
+    const-string/jumbo v0, "31905"
+    const-string/jumbo v0, "31906"
+    const-string/jumbo v0, "31907"
+    const-string/jumbo v0, "31908"
+    const-string/jumbo v0, "31909"
+    const-string/jumbo v0, "31910"
+    const-string/jumbo v0, "31911"
+    const-string/jumbo v0, "31912"
+    const-string/jumbo v0, "31913"
+    const-string/jumbo v0, "31914"
+    const-string/jumbo v0, "31915"
+    const-string/jumbo v0, "31916"
+    const-string/jumbo v0, "31917"
+    const-string/jumbo v0, "31918"
+    const-string/jumbo v0, "31919"
+    const-string/jumbo v0, "31920"
+    const-string/jumbo v0, "31921"
+    const-string/jumbo v0, "31922"
+    const-string/jumbo v0, "31923"
+    const-string/jumbo v0, "31924"
+    const-string/jumbo v0, "31925"
+    const-string/jumbo v0, "31926"
+    const-string/jumbo v0, "31927"
+    const-string/jumbo v0, "31928"
+    const-string/jumbo v0, "31929"
+    const-string/jumbo v0, "31930"
+    const-string/jumbo v0, "31931"
+    const-string/jumbo v0, "31932"
+    const-string/jumbo v0, "31933"
+    const-string/jumbo v0, "31934"
+    const-string/jumbo v0, "31935"
+    const-string/jumbo v0, "31936"
+    const-string/jumbo v0, "31937"
+    const-string/jumbo v0, "31938"
+    const-string/jumbo v0, "31939"
+    const-string/jumbo v0, "31940"
+    const-string/jumbo v0, "31941"
+    const-string/jumbo v0, "31942"
+    const-string/jumbo v0, "31943"
+    const-string/jumbo v0, "31944"
+    const-string/jumbo v0, "31945"
+    const-string/jumbo v0, "31946"
+    const-string/jumbo v0, "31947"
+    const-string/jumbo v0, "31948"
+    const-string/jumbo v0, "31949"
+    const-string/jumbo v0, "31950"
+    const-string/jumbo v0, "31951"
+    const-string/jumbo v0, "31952"
+    const-string/jumbo v0, "31953"
+    const-string/jumbo v0, "31954"
+    const-string/jumbo v0, "31955"
+    const-string/jumbo v0, "31956"
+    const-string/jumbo v0, "31957"
+    const-string/jumbo v0, "31958"
+    const-string/jumbo v0, "31959"
+    const-string/jumbo v0, "31960"
+    const-string/jumbo v0, "31961"
+    const-string/jumbo v0, "31962"
+    const-string/jumbo v0, "31963"
+    const-string/jumbo v0, "31964"
+    const-string/jumbo v0, "31965"
+    const-string/jumbo v0, "31966"
+    const-string/jumbo v0, "31967"
+    const-string/jumbo v0, "31968"
+    const-string/jumbo v0, "31969"
+    const-string/jumbo v0, "31970"
+    const-string/jumbo v0, "31971"
+    const-string/jumbo v0, "31972"
+    const-string/jumbo v0, "31973"
+    const-string/jumbo v0, "31974"
+    const-string/jumbo v0, "31975"
+    const-string/jumbo v0, "31976"
+    const-string/jumbo v0, "31977"
+    const-string/jumbo v0, "31978"
+    const-string/jumbo v0, "31979"
+    const-string/jumbo v0, "31980"
+    const-string/jumbo v0, "31981"
+    const-string/jumbo v0, "31982"
+    const-string/jumbo v0, "31983"
+    const-string/jumbo v0, "31984"
+    const-string/jumbo v0, "31985"
+    const-string/jumbo v0, "31986"
+    const-string/jumbo v0, "31987"
+    const-string/jumbo v0, "31988"
+    const-string/jumbo v0, "31989"
+    const-string/jumbo v0, "31990"
+    const-string/jumbo v0, "31991"
+    const-string/jumbo v0, "31992"
+    const-string/jumbo v0, "31993"
+    const-string/jumbo v0, "31994"
+    const-string/jumbo v0, "31995"
+    const-string/jumbo v0, "31996"
+    const-string/jumbo v0, "31997"
+    const-string/jumbo v0, "31998"
+    const-string/jumbo v0, "31999"
+    const-string/jumbo v0, "32000"
+    const-string/jumbo v0, "32001"
+    const-string/jumbo v0, "32002"
+    const-string/jumbo v0, "32003"
+    const-string/jumbo v0, "32004"
+    const-string/jumbo v0, "32005"
+    const-string/jumbo v0, "32006"
+    const-string/jumbo v0, "32007"
+    const-string/jumbo v0, "32008"
+    const-string/jumbo v0, "32009"
+    const-string/jumbo v0, "32010"
+    const-string/jumbo v0, "32011"
+    const-string/jumbo v0, "32012"
+    const-string/jumbo v0, "32013"
+    const-string/jumbo v0, "32014"
+    const-string/jumbo v0, "32015"
+    const-string/jumbo v0, "32016"
+    const-string/jumbo v0, "32017"
+    const-string/jumbo v0, "32018"
+    const-string/jumbo v0, "32019"
+    const-string/jumbo v0, "32020"
+    const-string/jumbo v0, "32021"
+    const-string/jumbo v0, "32022"
+    const-string/jumbo v0, "32023"
+    const-string/jumbo v0, "32024"
+    const-string/jumbo v0, "32025"
+    const-string/jumbo v0, "32026"
+    const-string/jumbo v0, "32027"
+    const-string/jumbo v0, "32028"
+    const-string/jumbo v0, "32029"
+    const-string/jumbo v0, "32030"
+    const-string/jumbo v0, "32031"
+    const-string/jumbo v0, "32032"
+    const-string/jumbo v0, "32033"
+    const-string/jumbo v0, "32034"
+    const-string/jumbo v0, "32035"
+    const-string/jumbo v0, "32036"
+    const-string/jumbo v0, "32037"
+    const-string/jumbo v0, "32038"
+    const-string/jumbo v0, "32039"
+    const-string/jumbo v0, "32040"
+    const-string/jumbo v0, "32041"
+    const-string/jumbo v0, "32042"
+    const-string/jumbo v0, "32043"
+    const-string/jumbo v0, "32044"
+    const-string/jumbo v0, "32045"
+    const-string/jumbo v0, "32046"
+    const-string/jumbo v0, "32047"
+    const-string/jumbo v0, "32048"
+    const-string/jumbo v0, "32049"
+    const-string/jumbo v0, "32050"
+    const-string/jumbo v0, "32051"
+    const-string/jumbo v0, "32052"
+    const-string/jumbo v0, "32053"
+    const-string/jumbo v0, "32054"
+    const-string/jumbo v0, "32055"
+    const-string/jumbo v0, "32056"
+    const-string/jumbo v0, "32057"
+    const-string/jumbo v0, "32058"
+    const-string/jumbo v0, "32059"
+    const-string/jumbo v0, "32060"
+    const-string/jumbo v0, "32061"
+    const-string/jumbo v0, "32062"
+    const-string/jumbo v0, "32063"
+    const-string/jumbo v0, "32064"
+    const-string/jumbo v0, "32065"
+    const-string/jumbo v0, "32066"
+    const-string/jumbo v0, "32067"
+    const-string/jumbo v0, "32068"
+    const-string/jumbo v0, "32069"
+    const-string/jumbo v0, "32070"
+    const-string/jumbo v0, "32071"
+    const-string/jumbo v0, "32072"
+    const-string/jumbo v0, "32073"
+    const-string/jumbo v0, "32074"
+    const-string/jumbo v0, "32075"
+    const-string/jumbo v0, "32076"
+    const-string/jumbo v0, "32077"
+    const-string/jumbo v0, "32078"
+    const-string/jumbo v0, "32079"
+    const-string/jumbo v0, "32080"
+    const-string/jumbo v0, "32081"
+    const-string/jumbo v0, "32082"
+    const-string/jumbo v0, "32083"
+    const-string/jumbo v0, "32084"
+    const-string/jumbo v0, "32085"
+    const-string/jumbo v0, "32086"
+    const-string/jumbo v0, "32087"
+    const-string/jumbo v0, "32088"
+    const-string/jumbo v0, "32089"
+    const-string/jumbo v0, "32090"
+    const-string/jumbo v0, "32091"
+    const-string/jumbo v0, "32092"
+    const-string/jumbo v0, "32093"
+    const-string/jumbo v0, "32094"
+    const-string/jumbo v0, "32095"
+    const-string/jumbo v0, "32096"
+    const-string/jumbo v0, "32097"
+    const-string/jumbo v0, "32098"
+    const-string/jumbo v0, "32099"
+    const-string/jumbo v0, "32100"
+    const-string/jumbo v0, "32101"
+    const-string/jumbo v0, "32102"
+    const-string/jumbo v0, "32103"
+    const-string/jumbo v0, "32104"
+    const-string/jumbo v0, "32105"
+    const-string/jumbo v0, "32106"
+    const-string/jumbo v0, "32107"
+    const-string/jumbo v0, "32108"
+    const-string/jumbo v0, "32109"
+    const-string/jumbo v0, "32110"
+    const-string/jumbo v0, "32111"
+    const-string/jumbo v0, "32112"
+    const-string/jumbo v0, "32113"
+    const-string/jumbo v0, "32114"
+    const-string/jumbo v0, "32115"
+    const-string/jumbo v0, "32116"
+    const-string/jumbo v0, "32117"
+    const-string/jumbo v0, "32118"
+    const-string/jumbo v0, "32119"
+    const-string/jumbo v0, "32120"
+    const-string/jumbo v0, "32121"
+    const-string/jumbo v0, "32122"
+    const-string/jumbo v0, "32123"
+    const-string/jumbo v0, "32124"
+    const-string/jumbo v0, "32125"
+    const-string/jumbo v0, "32126"
+    const-string/jumbo v0, "32127"
+    const-string/jumbo v0, "32128"
+    const-string/jumbo v0, "32129"
+    const-string/jumbo v0, "32130"
+    const-string/jumbo v0, "32131"
+    const-string/jumbo v0, "32132"
+    const-string/jumbo v0, "32133"
+    const-string/jumbo v0, "32134"
+    const-string/jumbo v0, "32135"
+    const-string/jumbo v0, "32136"
+    const-string/jumbo v0, "32137"
+    const-string/jumbo v0, "32138"
+    const-string/jumbo v0, "32139"
+    const-string/jumbo v0, "32140"
+    const-string/jumbo v0, "32141"
+    const-string/jumbo v0, "32142"
+    const-string/jumbo v0, "32143"
+    const-string/jumbo v0, "32144"
+    const-string/jumbo v0, "32145"
+    const-string/jumbo v0, "32146"
+    const-string/jumbo v0, "32147"
+    const-string/jumbo v0, "32148"
+    const-string/jumbo v0, "32149"
+    const-string/jumbo v0, "32150"
+    const-string/jumbo v0, "32151"
+    const-string/jumbo v0, "32152"
+    const-string/jumbo v0, "32153"
+    const-string/jumbo v0, "32154"
+    const-string/jumbo v0, "32155"
+    const-string/jumbo v0, "32156"
+    const-string/jumbo v0, "32157"
+    const-string/jumbo v0, "32158"
+    const-string/jumbo v0, "32159"
+    const-string/jumbo v0, "32160"
+    const-string/jumbo v0, "32161"
+    const-string/jumbo v0, "32162"
+    const-string/jumbo v0, "32163"
+    const-string/jumbo v0, "32164"
+    const-string/jumbo v0, "32165"
+    const-string/jumbo v0, "32166"
+    const-string/jumbo v0, "32167"
+    const-string/jumbo v0, "32168"
+    const-string/jumbo v0, "32169"
+    const-string/jumbo v0, "32170"
+    const-string/jumbo v0, "32171"
+    const-string/jumbo v0, "32172"
+    const-string/jumbo v0, "32173"
+    const-string/jumbo v0, "32174"
+    const-string/jumbo v0, "32175"
+    const-string/jumbo v0, "32176"
+    const-string/jumbo v0, "32177"
+    const-string/jumbo v0, "32178"
+    const-string/jumbo v0, "32179"
+    const-string/jumbo v0, "32180"
+    const-string/jumbo v0, "32181"
+    const-string/jumbo v0, "32182"
+    const-string/jumbo v0, "32183"
+    const-string/jumbo v0, "32184"
+    const-string/jumbo v0, "32185"
+    const-string/jumbo v0, "32186"
+    const-string/jumbo v0, "32187"
+    const-string/jumbo v0, "32188"
+    const-string/jumbo v0, "32189"
+    const-string/jumbo v0, "32190"
+    const-string/jumbo v0, "32191"
+    const-string/jumbo v0, "32192"
+    const-string/jumbo v0, "32193"
+    const-string/jumbo v0, "32194"
+    const-string/jumbo v0, "32195"
+    const-string/jumbo v0, "32196"
+    const-string/jumbo v0, "32197"
+    const-string/jumbo v0, "32198"
+    const-string/jumbo v0, "32199"
+    const-string/jumbo v0, "32200"
+    const-string/jumbo v0, "32201"
+    const-string/jumbo v0, "32202"
+    const-string/jumbo v0, "32203"
+    const-string/jumbo v0, "32204"
+    const-string/jumbo v0, "32205"
+    const-string/jumbo v0, "32206"
+    const-string/jumbo v0, "32207"
+    const-string/jumbo v0, "32208"
+    const-string/jumbo v0, "32209"
+    const-string/jumbo v0, "32210"
+    const-string/jumbo v0, "32211"
+    const-string/jumbo v0, "32212"
+    const-string/jumbo v0, "32213"
+    const-string/jumbo v0, "32214"
+    const-string/jumbo v0, "32215"
+    const-string/jumbo v0, "32216"
+    const-string/jumbo v0, "32217"
+    const-string/jumbo v0, "32218"
+    const-string/jumbo v0, "32219"
+    const-string/jumbo v0, "32220"
+    const-string/jumbo v0, "32221"
+    const-string/jumbo v0, "32222"
+    const-string/jumbo v0, "32223"
+    const-string/jumbo v0, "32224"
+    const-string/jumbo v0, "32225"
+    const-string/jumbo v0, "32226"
+    const-string/jumbo v0, "32227"
+    const-string/jumbo v0, "32228"
+    const-string/jumbo v0, "32229"
+    const-string/jumbo v0, "32230"
+    const-string/jumbo v0, "32231"
+    const-string/jumbo v0, "32232"
+    const-string/jumbo v0, "32233"
+    const-string/jumbo v0, "32234"
+    const-string/jumbo v0, "32235"
+    const-string/jumbo v0, "32236"
+    const-string/jumbo v0, "32237"
+    const-string/jumbo v0, "32238"
+    const-string/jumbo v0, "32239"
+    const-string/jumbo v0, "32240"
+    const-string/jumbo v0, "32241"
+    const-string/jumbo v0, "32242"
+    const-string/jumbo v0, "32243"
+    const-string/jumbo v0, "32244"
+    const-string/jumbo v0, "32245"
+    const-string/jumbo v0, "32246"
+    const-string/jumbo v0, "32247"
+    const-string/jumbo v0, "32248"
+    const-string/jumbo v0, "32249"
+    const-string/jumbo v0, "32250"
+    const-string/jumbo v0, "32251"
+    const-string/jumbo v0, "32252"
+    const-string/jumbo v0, "32253"
+    const-string/jumbo v0, "32254"
+    const-string/jumbo v0, "32255"
+    const-string/jumbo v0, "32256"
+    const-string/jumbo v0, "32257"
+    const-string/jumbo v0, "32258"
+    const-string/jumbo v0, "32259"
+    const-string/jumbo v0, "32260"
+    const-string/jumbo v0, "32261"
+    const-string/jumbo v0, "32262"
+    const-string/jumbo v0, "32263"
+    const-string/jumbo v0, "32264"
+    const-string/jumbo v0, "32265"
+    const-string/jumbo v0, "32266"
+    const-string/jumbo v0, "32267"
+    const-string/jumbo v0, "32268"
+    const-string/jumbo v0, "32269"
+    const-string/jumbo v0, "32270"
+    const-string/jumbo v0, "32271"
+    const-string/jumbo v0, "32272"
+    const-string/jumbo v0, "32273"
+    const-string/jumbo v0, "32274"
+    const-string/jumbo v0, "32275"
+    const-string/jumbo v0, "32276"
+    const-string/jumbo v0, "32277"
+    const-string/jumbo v0, "32278"
+    const-string/jumbo v0, "32279"
+    const-string/jumbo v0, "32280"
+    const-string/jumbo v0, "32281"
+    const-string/jumbo v0, "32282"
+    const-string/jumbo v0, "32283"
+    const-string/jumbo v0, "32284"
+    const-string/jumbo v0, "32285"
+    const-string/jumbo v0, "32286"
+    const-string/jumbo v0, "32287"
+    const-string/jumbo v0, "32288"
+    const-string/jumbo v0, "32289"
+    const-string/jumbo v0, "32290"
+    const-string/jumbo v0, "32291"
+    const-string/jumbo v0, "32292"
+    const-string/jumbo v0, "32293"
+    const-string/jumbo v0, "32294"
+    const-string/jumbo v0, "32295"
+    const-string/jumbo v0, "32296"
+    const-string/jumbo v0, "32297"
+    const-string/jumbo v0, "32298"
+    const-string/jumbo v0, "32299"
+    const-string/jumbo v0, "32300"
+    const-string/jumbo v0, "32301"
+    const-string/jumbo v0, "32302"
+    const-string/jumbo v0, "32303"
+    const-string/jumbo v0, "32304"
+    const-string/jumbo v0, "32305"
+    const-string/jumbo v0, "32306"
+    const-string/jumbo v0, "32307"
+    const-string/jumbo v0, "32308"
+    const-string/jumbo v0, "32309"
+    const-string/jumbo v0, "32310"
+    const-string/jumbo v0, "32311"
+    const-string/jumbo v0, "32312"
+    const-string/jumbo v0, "32313"
+    const-string/jumbo v0, "32314"
+    const-string/jumbo v0, "32315"
+    const-string/jumbo v0, "32316"
+    const-string/jumbo v0, "32317"
+    const-string/jumbo v0, "32318"
+    const-string/jumbo v0, "32319"
+    const-string/jumbo v0, "32320"
+    const-string/jumbo v0, "32321"
+    const-string/jumbo v0, "32322"
+    const-string/jumbo v0, "32323"
+    const-string/jumbo v0, "32324"
+    const-string/jumbo v0, "32325"
+    const-string/jumbo v0, "32326"
+    const-string/jumbo v0, "32327"
+    const-string/jumbo v0, "32328"
+    const-string/jumbo v0, "32329"
+    const-string/jumbo v0, "32330"
+    const-string/jumbo v0, "32331"
+    const-string/jumbo v0, "32332"
+    const-string/jumbo v0, "32333"
+    const-string/jumbo v0, "32334"
+    const-string/jumbo v0, "32335"
+    const-string/jumbo v0, "32336"
+    const-string/jumbo v0, "32337"
+    const-string/jumbo v0, "32338"
+    const-string/jumbo v0, "32339"
+    const-string/jumbo v0, "32340"
+    const-string/jumbo v0, "32341"
+    const-string/jumbo v0, "32342"
+    const-string/jumbo v0, "32343"
+    const-string/jumbo v0, "32344"
+    const-string/jumbo v0, "32345"
+    const-string/jumbo v0, "32346"
+    const-string/jumbo v0, "32347"
+    const-string/jumbo v0, "32348"
+    const-string/jumbo v0, "32349"
+    const-string/jumbo v0, "32350"
+    const-string/jumbo v0, "32351"
+    const-string/jumbo v0, "32352"
+    const-string/jumbo v0, "32353"
+    const-string/jumbo v0, "32354"
+    const-string/jumbo v0, "32355"
+    const-string/jumbo v0, "32356"
+    const-string/jumbo v0, "32357"
+    const-string/jumbo v0, "32358"
+    const-string/jumbo v0, "32359"
+    const-string/jumbo v0, "32360"
+    const-string/jumbo v0, "32361"
+    const-string/jumbo v0, "32362"
+    const-string/jumbo v0, "32363"
+    const-string/jumbo v0, "32364"
+    const-string/jumbo v0, "32365"
+    const-string/jumbo v0, "32366"
+    const-string/jumbo v0, "32367"
+    const-string/jumbo v0, "32368"
+    const-string/jumbo v0, "32369"
+    const-string/jumbo v0, "32370"
+    const-string/jumbo v0, "32371"
+    const-string/jumbo v0, "32372"
+    const-string/jumbo v0, "32373"
+    const-string/jumbo v0, "32374"
+    const-string/jumbo v0, "32375"
+    const-string/jumbo v0, "32376"
+    const-string/jumbo v0, "32377"
+    const-string/jumbo v0, "32378"
+    const-string/jumbo v0, "32379"
+    const-string/jumbo v0, "32380"
+    const-string/jumbo v0, "32381"
+    const-string/jumbo v0, "32382"
+    const-string/jumbo v0, "32383"
+    const-string/jumbo v0, "32384"
+    const-string/jumbo v0, "32385"
+    const-string/jumbo v0, "32386"
+    const-string/jumbo v0, "32387"
+    const-string/jumbo v0, "32388"
+    const-string/jumbo v0, "32389"
+    const-string/jumbo v0, "32390"
+    const-string/jumbo v0, "32391"
+    const-string/jumbo v0, "32392"
+    const-string/jumbo v0, "32393"
+    const-string/jumbo v0, "32394"
+    const-string/jumbo v0, "32395"
+    const-string/jumbo v0, "32396"
+    const-string/jumbo v0, "32397"
+    const-string/jumbo v0, "32398"
+    const-string/jumbo v0, "32399"
+    const-string/jumbo v0, "32400"
+    const-string/jumbo v0, "32401"
+    const-string/jumbo v0, "32402"
+    const-string/jumbo v0, "32403"
+    const-string/jumbo v0, "32404"
+    const-string/jumbo v0, "32405"
+    const-string/jumbo v0, "32406"
+    const-string/jumbo v0, "32407"
+    const-string/jumbo v0, "32408"
+    const-string/jumbo v0, "32409"
+    const-string/jumbo v0, "32410"
+    const-string/jumbo v0, "32411"
+    const-string/jumbo v0, "32412"
+    const-string/jumbo v0, "32413"
+    const-string/jumbo v0, "32414"
+    const-string/jumbo v0, "32415"
+    const-string/jumbo v0, "32416"
+    const-string/jumbo v0, "32417"
+    const-string/jumbo v0, "32418"
+    const-string/jumbo v0, "32419"
+    const-string/jumbo v0, "32420"
+    const-string/jumbo v0, "32421"
+    const-string/jumbo v0, "32422"
+    const-string/jumbo v0, "32423"
+    const-string/jumbo v0, "32424"
+    const-string/jumbo v0, "32425"
+    const-string/jumbo v0, "32426"
+    const-string/jumbo v0, "32427"
+    const-string/jumbo v0, "32428"
+    const-string/jumbo v0, "32429"
+    const-string/jumbo v0, "32430"
+    const-string/jumbo v0, "32431"
+    const-string/jumbo v0, "32432"
+    const-string/jumbo v0, "32433"
+    const-string/jumbo v0, "32434"
+    const-string/jumbo v0, "32435"
+    const-string/jumbo v0, "32436"
+    const-string/jumbo v0, "32437"
+    const-string/jumbo v0, "32438"
+    const-string/jumbo v0, "32439"
+    const-string/jumbo v0, "32440"
+    const-string/jumbo v0, "32441"
+    const-string/jumbo v0, "32442"
+    const-string/jumbo v0, "32443"
+    const-string/jumbo v0, "32444"
+    const-string/jumbo v0, "32445"
+    const-string/jumbo v0, "32446"
+    const-string/jumbo v0, "32447"
+    const-string/jumbo v0, "32448"
+    const-string/jumbo v0, "32449"
+    const-string/jumbo v0, "32450"
+    const-string/jumbo v0, "32451"
+    const-string/jumbo v0, "32452"
+    const-string/jumbo v0, "32453"
+    const-string/jumbo v0, "32454"
+    const-string/jumbo v0, "32455"
+    const-string/jumbo v0, "32456"
+    const-string/jumbo v0, "32457"
+    const-string/jumbo v0, "32458"
+    const-string/jumbo v0, "32459"
+    const-string/jumbo v0, "32460"
+    const-string/jumbo v0, "32461"
+    const-string/jumbo v0, "32462"
+    const-string/jumbo v0, "32463"
+    const-string/jumbo v0, "32464"
+    const-string/jumbo v0, "32465"
+    const-string/jumbo v0, "32466"
+    const-string/jumbo v0, "32467"
+    const-string/jumbo v0, "32468"
+    const-string/jumbo v0, "32469"
+    const-string/jumbo v0, "32470"
+    const-string/jumbo v0, "32471"
+    const-string/jumbo v0, "32472"
+    const-string/jumbo v0, "32473"
+    const-string/jumbo v0, "32474"
+    const-string/jumbo v0, "32475"
+    const-string/jumbo v0, "32476"
+    const-string/jumbo v0, "32477"
+    const-string/jumbo v0, "32478"
+    const-string/jumbo v0, "32479"
+    const-string/jumbo v0, "32480"
+    const-string/jumbo v0, "32481"
+    const-string/jumbo v0, "32482"
+    const-string/jumbo v0, "32483"
+    const-string/jumbo v0, "32484"
+    const-string/jumbo v0, "32485"
+    const-string/jumbo v0, "32486"
+    const-string/jumbo v0, "32487"
+    const-string/jumbo v0, "32488"
+    const-string/jumbo v0, "32489"
+    const-string/jumbo v0, "32490"
+    const-string/jumbo v0, "32491"
+    const-string/jumbo v0, "32492"
+    const-string/jumbo v0, "32493"
+    const-string/jumbo v0, "32494"
+    const-string/jumbo v0, "32495"
+    const-string/jumbo v0, "32496"
+    const-string/jumbo v0, "32497"
+    const-string/jumbo v0, "32498"
+    const-string/jumbo v0, "32499"
+    const-string/jumbo v0, "32500"
+    const-string/jumbo v0, "32501"
+    const-string/jumbo v0, "32502"
+    const-string/jumbo v0, "32503"
+    const-string/jumbo v0, "32504"
+    const-string/jumbo v0, "32505"
+    const-string/jumbo v0, "32506"
+    const-string/jumbo v0, "32507"
+    const-string/jumbo v0, "32508"
+    const-string/jumbo v0, "32509"
+    const-string/jumbo v0, "32510"
+    const-string/jumbo v0, "32511"
+    const-string/jumbo v0, "32512"
+    const-string/jumbo v0, "32513"
+    const-string/jumbo v0, "32514"
+    const-string/jumbo v0, "32515"
+    const-string/jumbo v0, "32516"
+    const-string/jumbo v0, "32517"
+    const-string/jumbo v0, "32518"
+    const-string/jumbo v0, "32519"
+    const-string/jumbo v0, "32520"
+    const-string/jumbo v0, "32521"
+    const-string/jumbo v0, "32522"
+    const-string/jumbo v0, "32523"
+    const-string/jumbo v0, "32524"
+    const-string/jumbo v0, "32525"
+    const-string/jumbo v0, "32526"
+    const-string/jumbo v0, "32527"
+    const-string/jumbo v0, "32528"
+    const-string/jumbo v0, "32529"
+    const-string/jumbo v0, "32530"
+    const-string/jumbo v0, "32531"
+    const-string/jumbo v0, "32532"
+    const-string/jumbo v0, "32533"
+    const-string/jumbo v0, "32534"
+    const-string/jumbo v0, "32535"
+    const-string/jumbo v0, "32536"
+    const-string/jumbo v0, "32537"
+    const-string/jumbo v0, "32538"
+    const-string/jumbo v0, "32539"
+    const-string/jumbo v0, "32540"
+    const-string/jumbo v0, "32541"
+    const-string/jumbo v0, "32542"
+    const-string/jumbo v0, "32543"
+    const-string/jumbo v0, "32544"
+    const-string/jumbo v0, "32545"
+    const-string/jumbo v0, "32546"
+    const-string/jumbo v0, "32547"
+    const-string/jumbo v0, "32548"
+    const-string/jumbo v0, "32549"
+    const-string/jumbo v0, "32550"
+    const-string/jumbo v0, "32551"
+    const-string/jumbo v0, "32552"
+    const-string/jumbo v0, "32553"
+    const-string/jumbo v0, "32554"
+    const-string/jumbo v0, "32555"
+    const-string/jumbo v0, "32556"
+    const-string/jumbo v0, "32557"
+    const-string/jumbo v0, "32558"
+    const-string/jumbo v0, "32559"
+    const-string/jumbo v0, "32560"
+    const-string/jumbo v0, "32561"
+    const-string/jumbo v0, "32562"
+    const-string/jumbo v0, "32563"
+    const-string/jumbo v0, "32564"
+    const-string/jumbo v0, "32565"
+    const-string/jumbo v0, "32566"
+    const-string/jumbo v0, "32567"
+    const-string/jumbo v0, "32568"
+    const-string/jumbo v0, "32569"
+    const-string/jumbo v0, "32570"
+    const-string/jumbo v0, "32571"
+    const-string/jumbo v0, "32572"
+    const-string/jumbo v0, "32573"
+    const-string/jumbo v0, "32574"
+    const-string/jumbo v0, "32575"
+    const-string/jumbo v0, "32576"
+    const-string/jumbo v0, "32577"
+    const-string/jumbo v0, "32578"
+    const-string/jumbo v0, "32579"
+    const-string/jumbo v0, "32580"
+    const-string/jumbo v0, "32581"
+    const-string/jumbo v0, "32582"
+    const-string/jumbo v0, "32583"
+    const-string/jumbo v0, "32584"
+    const-string/jumbo v0, "32585"
+    const-string/jumbo v0, "32586"
+    const-string/jumbo v0, "32587"
+    const-string/jumbo v0, "32588"
+    const-string/jumbo v0, "32589"
+    const-string/jumbo v0, "32590"
+    const-string/jumbo v0, "32591"
+    const-string/jumbo v0, "32592"
+    const-string/jumbo v0, "32593"
+    const-string/jumbo v0, "32594"
+    const-string/jumbo v0, "32595"
+    const-string/jumbo v0, "32596"
+    const-string/jumbo v0, "32597"
+    const-string/jumbo v0, "32598"
+    const-string/jumbo v0, "32599"
+    const-string/jumbo v0, "32600"
+    const-string/jumbo v0, "32601"
+    const-string/jumbo v0, "32602"
+    const-string/jumbo v0, "32603"
+    const-string/jumbo v0, "32604"
+    const-string/jumbo v0, "32605"
+    const-string/jumbo v0, "32606"
+    const-string/jumbo v0, "32607"
+    const-string/jumbo v0, "32608"
+    const-string/jumbo v0, "32609"
+    const-string/jumbo v0, "32610"
+    const-string/jumbo v0, "32611"
+    const-string/jumbo v0, "32612"
+    const-string/jumbo v0, "32613"
+    const-string/jumbo v0, "32614"
+    const-string/jumbo v0, "32615"
+    const-string/jumbo v0, "32616"
+    const-string/jumbo v0, "32617"
+    const-string/jumbo v0, "32618"
+    const-string/jumbo v0, "32619"
+    const-string/jumbo v0, "32620"
+    const-string/jumbo v0, "32621"
+    const-string/jumbo v0, "32622"
+    const-string/jumbo v0, "32623"
+    const-string/jumbo v0, "32624"
+    const-string/jumbo v0, "32625"
+    const-string/jumbo v0, "32626"
+    const-string/jumbo v0, "32627"
+    const-string/jumbo v0, "32628"
+    const-string/jumbo v0, "32629"
+    const-string/jumbo v0, "32630"
+    const-string/jumbo v0, "32631"
+    const-string/jumbo v0, "32632"
+    const-string/jumbo v0, "32633"
+    const-string/jumbo v0, "32634"
+    const-string/jumbo v0, "32635"
+    const-string/jumbo v0, "32636"
+    const-string/jumbo v0, "32637"
+    const-string/jumbo v0, "32638"
+    const-string/jumbo v0, "32639"
+    const-string/jumbo v0, "32640"
+    const-string/jumbo v0, "32641"
+    const-string/jumbo v0, "32642"
+    const-string/jumbo v0, "32643"
+    const-string/jumbo v0, "32644"
+    const-string/jumbo v0, "32645"
+    const-string/jumbo v0, "32646"
+    const-string/jumbo v0, "32647"
+    const-string/jumbo v0, "32648"
+    const-string/jumbo v0, "32649"
+    const-string/jumbo v0, "32650"
+    const-string/jumbo v0, "32651"
+    const-string/jumbo v0, "32652"
+    const-string/jumbo v0, "32653"
+    const-string/jumbo v0, "32654"
+    const-string/jumbo v0, "32655"
+    const-string/jumbo v0, "32656"
+    const-string/jumbo v0, "32657"
+    const-string/jumbo v0, "32658"
+    const-string/jumbo v0, "32659"
+    const-string/jumbo v0, "32660"
+    const-string/jumbo v0, "32661"
+    const-string/jumbo v0, "32662"
+    const-string/jumbo v0, "32663"
+    const-string/jumbo v0, "32664"
+    const-string/jumbo v0, "32665"
+    const-string/jumbo v0, "32666"
+    const-string/jumbo v0, "32667"
+    const-string/jumbo v0, "32668"
+    const-string/jumbo v0, "32669"
+    const-string/jumbo v0, "32670"
+    const-string/jumbo v0, "32671"
+    const-string/jumbo v0, "32672"
+    const-string/jumbo v0, "32673"
+    const-string/jumbo v0, "32674"
+    const-string/jumbo v0, "32675"
+    const-string/jumbo v0, "32676"
+    const-string/jumbo v0, "32677"
+    const-string/jumbo v0, "32678"
+    const-string/jumbo v0, "32679"
+    const-string/jumbo v0, "32680"
+    const-string/jumbo v0, "32681"
+    const-string/jumbo v0, "32682"
+    const-string/jumbo v0, "32683"
+    const-string/jumbo v0, "32684"
+    const-string/jumbo v0, "32685"
+    const-string/jumbo v0, "32686"
+    const-string/jumbo v0, "32687"
+    const-string/jumbo v0, "32688"
+    const-string/jumbo v0, "32689"
+    const-string/jumbo v0, "32690"
+    const-string/jumbo v0, "32691"
+    const-string/jumbo v0, "32692"
+    const-string/jumbo v0, "32693"
+    const-string/jumbo v0, "32694"
+    const-string/jumbo v0, "32695"
+    const-string/jumbo v0, "32696"
+    const-string/jumbo v0, "32697"
+    const-string/jumbo v0, "32698"
+    const-string/jumbo v0, "32699"
+    const-string/jumbo v0, "32700"
+    const-string/jumbo v0, "32701"
+    const-string/jumbo v0, "32702"
+    const-string/jumbo v0, "32703"
+    const-string/jumbo v0, "32704"
+    const-string/jumbo v0, "32705"
+    const-string/jumbo v0, "32706"
+    const-string/jumbo v0, "32707"
+    const-string/jumbo v0, "32708"
+    const-string/jumbo v0, "32709"
+    const-string/jumbo v0, "32710"
+    const-string/jumbo v0, "32711"
+    const-string/jumbo v0, "32712"
+    const-string/jumbo v0, "32713"
+    const-string/jumbo v0, "32714"
+    const-string/jumbo v0, "32715"
+    const-string/jumbo v0, "32716"
+    const-string/jumbo v0, "32717"
+    const-string/jumbo v0, "32718"
+    const-string/jumbo v0, "32719"
+    const-string/jumbo v0, "32720"
+    const-string/jumbo v0, "32721"
+    const-string/jumbo v0, "32722"
+    const-string/jumbo v0, "32723"
+    const-string/jumbo v0, "32724"
+    const-string/jumbo v0, "32725"
+    const-string/jumbo v0, "32726"
+    const-string/jumbo v0, "32727"
+    const-string/jumbo v0, "32728"
+    const-string/jumbo v0, "32729"
+    const-string/jumbo v0, "32730"
+    const-string/jumbo v0, "32731"
+    const-string/jumbo v0, "32732"
+    const-string/jumbo v0, "32733"
+    const-string/jumbo v0, "32734"
+    const-string/jumbo v0, "32735"
+    const-string/jumbo v0, "32736"
+    const-string/jumbo v0, "32737"
+    const-string/jumbo v0, "32738"
+    const-string/jumbo v0, "32739"
+    const-string/jumbo v0, "32740"
+    const-string/jumbo v0, "32741"
+    const-string/jumbo v0, "32742"
+    const-string/jumbo v0, "32743"
+    const-string/jumbo v0, "32744"
+    const-string/jumbo v0, "32745"
+    const-string/jumbo v0, "32746"
+    const-string/jumbo v0, "32747"
+    const-string/jumbo v0, "32748"
+    const-string/jumbo v0, "32749"
+    const-string/jumbo v0, "32750"
+    const-string/jumbo v0, "32751"
+    const-string/jumbo v0, "32752"
+    const-string/jumbo v0, "32753"
+    const-string/jumbo v0, "32754"
+    const-string/jumbo v0, "32755"
+    const-string/jumbo v0, "32756"
+    const-string/jumbo v0, "32757"
+    const-string/jumbo v0, "32758"
+    const-string/jumbo v0, "32759"
+    const-string/jumbo v0, "32760"
+    const-string/jumbo v0, "32761"
+    const-string/jumbo v0, "32762"
+    const-string/jumbo v0, "32763"
+    const-string/jumbo v0, "32764"
+    const-string/jumbo v0, "32765"
+    const-string/jumbo v0, "32766"
+    const-string/jumbo v0, "32767"
+    const-string/jumbo v0, "32768"
+
+    return-void
+.end method
+
+#this method is not directly used in any of the tests. It's purpose is to fill out the type table past 64k entries
+.method public not-used-2()V
+    .registers 1
+
+    const-string/jumbo v0, "32769"
+    const-string/jumbo v0, "32770"
+    const-string/jumbo v0, "32771"
+    const-string/jumbo v0, "32772"
+    const-string/jumbo v0, "32773"
+    const-string/jumbo v0, "32774"
+    const-string/jumbo v0, "32775"
+    const-string/jumbo v0, "32776"
+    const-string/jumbo v0, "32777"
+    const-string/jumbo v0, "32778"
+    const-string/jumbo v0, "32779"
+    const-string/jumbo v0, "32780"
+    const-string/jumbo v0, "32781"
+    const-string/jumbo v0, "32782"
+    const-string/jumbo v0, "32783"
+    const-string/jumbo v0, "32784"
+    const-string/jumbo v0, "32785"
+    const-string/jumbo v0, "32786"
+    const-string/jumbo v0, "32787"
+    const-string/jumbo v0, "32788"
+    const-string/jumbo v0, "32789"
+    const-string/jumbo v0, "32790"
+    const-string/jumbo v0, "32791"
+    const-string/jumbo v0, "32792"
+    const-string/jumbo v0, "32793"
+    const-string/jumbo v0, "32794"
+    const-string/jumbo v0, "32795"
+    const-string/jumbo v0, "32796"
+    const-string/jumbo v0, "32797"
+    const-string/jumbo v0, "32798"
+    const-string/jumbo v0, "32799"
+    const-string/jumbo v0, "32800"
+    const-string/jumbo v0, "32801"
+    const-string/jumbo v0, "32802"
+    const-string/jumbo v0, "32803"
+    const-string/jumbo v0, "32804"
+    const-string/jumbo v0, "32805"
+    const-string/jumbo v0, "32806"
+    const-string/jumbo v0, "32807"
+    const-string/jumbo v0, "32808"
+    const-string/jumbo v0, "32809"
+    const-string/jumbo v0, "32810"
+    const-string/jumbo v0, "32811"
+    const-string/jumbo v0, "32812"
+    const-string/jumbo v0, "32813"
+    const-string/jumbo v0, "32814"
+    const-string/jumbo v0, "32815"
+    const-string/jumbo v0, "32816"
+    const-string/jumbo v0, "32817"
+    const-string/jumbo v0, "32818"
+    const-string/jumbo v0, "32819"
+    const-string/jumbo v0, "32820"
+    const-string/jumbo v0, "32821"
+    const-string/jumbo v0, "32822"
+    const-string/jumbo v0, "32823"
+    const-string/jumbo v0, "32824"
+    const-string/jumbo v0, "32825"
+    const-string/jumbo v0, "32826"
+    const-string/jumbo v0, "32827"
+    const-string/jumbo v0, "32828"
+    const-string/jumbo v0, "32829"
+    const-string/jumbo v0, "32830"
+    const-string/jumbo v0, "32831"
+    const-string/jumbo v0, "32832"
+    const-string/jumbo v0, "32833"
+    const-string/jumbo v0, "32834"
+    const-string/jumbo v0, "32835"
+    const-string/jumbo v0, "32836"
+    const-string/jumbo v0, "32837"
+    const-string/jumbo v0, "32838"
+    const-string/jumbo v0, "32839"
+    const-string/jumbo v0, "32840"
+    const-string/jumbo v0, "32841"
+    const-string/jumbo v0, "32842"
+    const-string/jumbo v0, "32843"
+    const-string/jumbo v0, "32844"
+    const-string/jumbo v0, "32845"
+    const-string/jumbo v0, "32846"
+    const-string/jumbo v0, "32847"
+    const-string/jumbo v0, "32848"
+    const-string/jumbo v0, "32849"
+    const-string/jumbo v0, "32850"
+    const-string/jumbo v0, "32851"
+    const-string/jumbo v0, "32852"
+    const-string/jumbo v0, "32853"
+    const-string/jumbo v0, "32854"
+    const-string/jumbo v0, "32855"
+    const-string/jumbo v0, "32856"
+    const-string/jumbo v0, "32857"
+    const-string/jumbo v0, "32858"
+    const-string/jumbo v0, "32859"
+    const-string/jumbo v0, "32860"
+    const-string/jumbo v0, "32861"
+    const-string/jumbo v0, "32862"
+    const-string/jumbo v0, "32863"
+    const-string/jumbo v0, "32864"
+    const-string/jumbo v0, "32865"
+    const-string/jumbo v0, "32866"
+    const-string/jumbo v0, "32867"
+    const-string/jumbo v0, "32868"
+    const-string/jumbo v0, "32869"
+    const-string/jumbo v0, "32870"
+    const-string/jumbo v0, "32871"
+    const-string/jumbo v0, "32872"
+    const-string/jumbo v0, "32873"
+    const-string/jumbo v0, "32874"
+    const-string/jumbo v0, "32875"
+    const-string/jumbo v0, "32876"
+    const-string/jumbo v0, "32877"
+    const-string/jumbo v0, "32878"
+    const-string/jumbo v0, "32879"
+    const-string/jumbo v0, "32880"
+    const-string/jumbo v0, "32881"
+    const-string/jumbo v0, "32882"
+    const-string/jumbo v0, "32883"
+    const-string/jumbo v0, "32884"
+    const-string/jumbo v0, "32885"
+    const-string/jumbo v0, "32886"
+    const-string/jumbo v0, "32887"
+    const-string/jumbo v0, "32888"
+    const-string/jumbo v0, "32889"
+    const-string/jumbo v0, "32890"
+    const-string/jumbo v0, "32891"
+    const-string/jumbo v0, "32892"
+    const-string/jumbo v0, "32893"
+    const-string/jumbo v0, "32894"
+    const-string/jumbo v0, "32895"
+    const-string/jumbo v0, "32896"
+    const-string/jumbo v0, "32897"
+    const-string/jumbo v0, "32898"
+    const-string/jumbo v0, "32899"
+    const-string/jumbo v0, "32900"
+    const-string/jumbo v0, "32901"
+    const-string/jumbo v0, "32902"
+    const-string/jumbo v0, "32903"
+    const-string/jumbo v0, "32904"
+    const-string/jumbo v0, "32905"
+    const-string/jumbo v0, "32906"
+    const-string/jumbo v0, "32907"
+    const-string/jumbo v0, "32908"
+    const-string/jumbo v0, "32909"
+    const-string/jumbo v0, "32910"
+    const-string/jumbo v0, "32911"
+    const-string/jumbo v0, "32912"
+    const-string/jumbo v0, "32913"
+    const-string/jumbo v0, "32914"
+    const-string/jumbo v0, "32915"
+    const-string/jumbo v0, "32916"
+    const-string/jumbo v0, "32917"
+    const-string/jumbo v0, "32918"
+    const-string/jumbo v0, "32919"
+    const-string/jumbo v0, "32920"
+    const-string/jumbo v0, "32921"
+    const-string/jumbo v0, "32922"
+    const-string/jumbo v0, "32923"
+    const-string/jumbo v0, "32924"
+    const-string/jumbo v0, "32925"
+    const-string/jumbo v0, "32926"
+    const-string/jumbo v0, "32927"
+    const-string/jumbo v0, "32928"
+    const-string/jumbo v0, "32929"
+    const-string/jumbo v0, "32930"
+    const-string/jumbo v0, "32931"
+    const-string/jumbo v0, "32932"
+    const-string/jumbo v0, "32933"
+    const-string/jumbo v0, "32934"
+    const-string/jumbo v0, "32935"
+    const-string/jumbo v0, "32936"
+    const-string/jumbo v0, "32937"
+    const-string/jumbo v0, "32938"
+    const-string/jumbo v0, "32939"
+    const-string/jumbo v0, "32940"
+    const-string/jumbo v0, "32941"
+    const-string/jumbo v0, "32942"
+    const-string/jumbo v0, "32943"
+    const-string/jumbo v0, "32944"
+    const-string/jumbo v0, "32945"
+    const-string/jumbo v0, "32946"
+    const-string/jumbo v0, "32947"
+    const-string/jumbo v0, "32948"
+    const-string/jumbo v0, "32949"
+    const-string/jumbo v0, "32950"
+    const-string/jumbo v0, "32951"
+    const-string/jumbo v0, "32952"
+    const-string/jumbo v0, "32953"
+    const-string/jumbo v0, "32954"
+    const-string/jumbo v0, "32955"
+    const-string/jumbo v0, "32956"
+    const-string/jumbo v0, "32957"
+    const-string/jumbo v0, "32958"
+    const-string/jumbo v0, "32959"
+    const-string/jumbo v0, "32960"
+    const-string/jumbo v0, "32961"
+    const-string/jumbo v0, "32962"
+    const-string/jumbo v0, "32963"
+    const-string/jumbo v0, "32964"
+    const-string/jumbo v0, "32965"
+    const-string/jumbo v0, "32966"
+    const-string/jumbo v0, "32967"
+    const-string/jumbo v0, "32968"
+    const-string/jumbo v0, "32969"
+    const-string/jumbo v0, "32970"
+    const-string/jumbo v0, "32971"
+    const-string/jumbo v0, "32972"
+    const-string/jumbo v0, "32973"
+    const-string/jumbo v0, "32974"
+    const-string/jumbo v0, "32975"
+    const-string/jumbo v0, "32976"
+    const-string/jumbo v0, "32977"
+    const-string/jumbo v0, "32978"
+    const-string/jumbo v0, "32979"
+    const-string/jumbo v0, "32980"
+    const-string/jumbo v0, "32981"
+    const-string/jumbo v0, "32982"
+    const-string/jumbo v0, "32983"
+    const-string/jumbo v0, "32984"
+    const-string/jumbo v0, "32985"
+    const-string/jumbo v0, "32986"
+    const-string/jumbo v0, "32987"
+    const-string/jumbo v0, "32988"
+    const-string/jumbo v0, "32989"
+    const-string/jumbo v0, "32990"
+    const-string/jumbo v0, "32991"
+    const-string/jumbo v0, "32992"
+    const-string/jumbo v0, "32993"
+    const-string/jumbo v0, "32994"
+    const-string/jumbo v0, "32995"
+    const-string/jumbo v0, "32996"
+    const-string/jumbo v0, "32997"
+    const-string/jumbo v0, "32998"
+    const-string/jumbo v0, "32999"
+    const-string/jumbo v0, "33000"
+    const-string/jumbo v0, "33001"
+    const-string/jumbo v0, "33002"
+    const-string/jumbo v0, "33003"
+    const-string/jumbo v0, "33004"
+    const-string/jumbo v0, "33005"
+    const-string/jumbo v0, "33006"
+    const-string/jumbo v0, "33007"
+    const-string/jumbo v0, "33008"
+    const-string/jumbo v0, "33009"
+    const-string/jumbo v0, "33010"
+    const-string/jumbo v0, "33011"
+    const-string/jumbo v0, "33012"
+    const-string/jumbo v0, "33013"
+    const-string/jumbo v0, "33014"
+    const-string/jumbo v0, "33015"
+    const-string/jumbo v0, "33016"
+    const-string/jumbo v0, "33017"
+    const-string/jumbo v0, "33018"
+    const-string/jumbo v0, "33019"
+    const-string/jumbo v0, "33020"
+    const-string/jumbo v0, "33021"
+    const-string/jumbo v0, "33022"
+    const-string/jumbo v0, "33023"
+    const-string/jumbo v0, "33024"
+    const-string/jumbo v0, "33025"
+    const-string/jumbo v0, "33026"
+    const-string/jumbo v0, "33027"
+    const-string/jumbo v0, "33028"
+    const-string/jumbo v0, "33029"
+    const-string/jumbo v0, "33030"
+    const-string/jumbo v0, "33031"
+    const-string/jumbo v0, "33032"
+    const-string/jumbo v0, "33033"
+    const-string/jumbo v0, "33034"
+    const-string/jumbo v0, "33035"
+    const-string/jumbo v0, "33036"
+    const-string/jumbo v0, "33037"
+    const-string/jumbo v0, "33038"
+    const-string/jumbo v0, "33039"
+    const-string/jumbo v0, "33040"
+    const-string/jumbo v0, "33041"
+    const-string/jumbo v0, "33042"
+    const-string/jumbo v0, "33043"
+    const-string/jumbo v0, "33044"
+    const-string/jumbo v0, "33045"
+    const-string/jumbo v0, "33046"
+    const-string/jumbo v0, "33047"
+    const-string/jumbo v0, "33048"
+    const-string/jumbo v0, "33049"
+    const-string/jumbo v0, "33050"
+    const-string/jumbo v0, "33051"
+    const-string/jumbo v0, "33052"
+    const-string/jumbo v0, "33053"
+    const-string/jumbo v0, "33054"
+    const-string/jumbo v0, "33055"
+    const-string/jumbo v0, "33056"
+    const-string/jumbo v0, "33057"
+    const-string/jumbo v0, "33058"
+    const-string/jumbo v0, "33059"
+    const-string/jumbo v0, "33060"
+    const-string/jumbo v0, "33061"
+    const-string/jumbo v0, "33062"
+    const-string/jumbo v0, "33063"
+    const-string/jumbo v0, "33064"
+    const-string/jumbo v0, "33065"
+    const-string/jumbo v0, "33066"
+    const-string/jumbo v0, "33067"
+    const-string/jumbo v0, "33068"
+    const-string/jumbo v0, "33069"
+    const-string/jumbo v0, "33070"
+    const-string/jumbo v0, "33071"
+    const-string/jumbo v0, "33072"
+    const-string/jumbo v0, "33073"
+    const-string/jumbo v0, "33074"
+    const-string/jumbo v0, "33075"
+    const-string/jumbo v0, "33076"
+    const-string/jumbo v0, "33077"
+    const-string/jumbo v0, "33078"
+    const-string/jumbo v0, "33079"
+    const-string/jumbo v0, "33080"
+    const-string/jumbo v0, "33081"
+    const-string/jumbo v0, "33082"
+    const-string/jumbo v0, "33083"
+    const-string/jumbo v0, "33084"
+    const-string/jumbo v0, "33085"
+    const-string/jumbo v0, "33086"
+    const-string/jumbo v0, "33087"
+    const-string/jumbo v0, "33088"
+    const-string/jumbo v0, "33089"
+    const-string/jumbo v0, "33090"
+    const-string/jumbo v0, "33091"
+    const-string/jumbo v0, "33092"
+    const-string/jumbo v0, "33093"
+    const-string/jumbo v0, "33094"
+    const-string/jumbo v0, "33095"
+    const-string/jumbo v0, "33096"
+    const-string/jumbo v0, "33097"
+    const-string/jumbo v0, "33098"
+    const-string/jumbo v0, "33099"
+    const-string/jumbo v0, "33100"
+    const-string/jumbo v0, "33101"
+    const-string/jumbo v0, "33102"
+    const-string/jumbo v0, "33103"
+    const-string/jumbo v0, "33104"
+    const-string/jumbo v0, "33105"
+    const-string/jumbo v0, "33106"
+    const-string/jumbo v0, "33107"
+    const-string/jumbo v0, "33108"
+    const-string/jumbo v0, "33109"
+    const-string/jumbo v0, "33110"
+    const-string/jumbo v0, "33111"
+    const-string/jumbo v0, "33112"
+    const-string/jumbo v0, "33113"
+    const-string/jumbo v0, "33114"
+    const-string/jumbo v0, "33115"
+    const-string/jumbo v0, "33116"
+    const-string/jumbo v0, "33117"
+    const-string/jumbo v0, "33118"
+    const-string/jumbo v0, "33119"
+    const-string/jumbo v0, "33120"
+    const-string/jumbo v0, "33121"
+    const-string/jumbo v0, "33122"
+    const-string/jumbo v0, "33123"
+    const-string/jumbo v0, "33124"
+    const-string/jumbo v0, "33125"
+    const-string/jumbo v0, "33126"
+    const-string/jumbo v0, "33127"
+    const-string/jumbo v0, "33128"
+    const-string/jumbo v0, "33129"
+    const-string/jumbo v0, "33130"
+    const-string/jumbo v0, "33131"
+    const-string/jumbo v0, "33132"
+    const-string/jumbo v0, "33133"
+    const-string/jumbo v0, "33134"
+    const-string/jumbo v0, "33135"
+    const-string/jumbo v0, "33136"
+    const-string/jumbo v0, "33137"
+    const-string/jumbo v0, "33138"
+    const-string/jumbo v0, "33139"
+    const-string/jumbo v0, "33140"
+    const-string/jumbo v0, "33141"
+    const-string/jumbo v0, "33142"
+    const-string/jumbo v0, "33143"
+    const-string/jumbo v0, "33144"
+    const-string/jumbo v0, "33145"
+    const-string/jumbo v0, "33146"
+    const-string/jumbo v0, "33147"
+    const-string/jumbo v0, "33148"
+    const-string/jumbo v0, "33149"
+    const-string/jumbo v0, "33150"
+    const-string/jumbo v0, "33151"
+    const-string/jumbo v0, "33152"
+    const-string/jumbo v0, "33153"
+    const-string/jumbo v0, "33154"
+    const-string/jumbo v0, "33155"
+    const-string/jumbo v0, "33156"
+    const-string/jumbo v0, "33157"
+    const-string/jumbo v0, "33158"
+    const-string/jumbo v0, "33159"
+    const-string/jumbo v0, "33160"
+    const-string/jumbo v0, "33161"
+    const-string/jumbo v0, "33162"
+    const-string/jumbo v0, "33163"
+    const-string/jumbo v0, "33164"
+    const-string/jumbo v0, "33165"
+    const-string/jumbo v0, "33166"
+    const-string/jumbo v0, "33167"
+    const-string/jumbo v0, "33168"
+    const-string/jumbo v0, "33169"
+    const-string/jumbo v0, "33170"
+    const-string/jumbo v0, "33171"
+    const-string/jumbo v0, "33172"
+    const-string/jumbo v0, "33173"
+    const-string/jumbo v0, "33174"
+    const-string/jumbo v0, "33175"
+    const-string/jumbo v0, "33176"
+    const-string/jumbo v0, "33177"
+    const-string/jumbo v0, "33178"
+    const-string/jumbo v0, "33179"
+    const-string/jumbo v0, "33180"
+    const-string/jumbo v0, "33181"
+    const-string/jumbo v0, "33182"
+    const-string/jumbo v0, "33183"
+    const-string/jumbo v0, "33184"
+    const-string/jumbo v0, "33185"
+    const-string/jumbo v0, "33186"
+    const-string/jumbo v0, "33187"
+    const-string/jumbo v0, "33188"
+    const-string/jumbo v0, "33189"
+    const-string/jumbo v0, "33190"
+    const-string/jumbo v0, "33191"
+    const-string/jumbo v0, "33192"
+    const-string/jumbo v0, "33193"
+    const-string/jumbo v0, "33194"
+    const-string/jumbo v0, "33195"
+    const-string/jumbo v0, "33196"
+    const-string/jumbo v0, "33197"
+    const-string/jumbo v0, "33198"
+    const-string/jumbo v0, "33199"
+    const-string/jumbo v0, "33200"
+    const-string/jumbo v0, "33201"
+    const-string/jumbo v0, "33202"
+    const-string/jumbo v0, "33203"
+    const-string/jumbo v0, "33204"
+    const-string/jumbo v0, "33205"
+    const-string/jumbo v0, "33206"
+    const-string/jumbo v0, "33207"
+    const-string/jumbo v0, "33208"
+    const-string/jumbo v0, "33209"
+    const-string/jumbo v0, "33210"
+    const-string/jumbo v0, "33211"
+    const-string/jumbo v0, "33212"
+    const-string/jumbo v0, "33213"
+    const-string/jumbo v0, "33214"
+    const-string/jumbo v0, "33215"
+    const-string/jumbo v0, "33216"
+    const-string/jumbo v0, "33217"
+    const-string/jumbo v0, "33218"
+    const-string/jumbo v0, "33219"
+    const-string/jumbo v0, "33220"
+    const-string/jumbo v0, "33221"
+    const-string/jumbo v0, "33222"
+    const-string/jumbo v0, "33223"
+    const-string/jumbo v0, "33224"
+    const-string/jumbo v0, "33225"
+    const-string/jumbo v0, "33226"
+    const-string/jumbo v0, "33227"
+    const-string/jumbo v0, "33228"
+    const-string/jumbo v0, "33229"
+    const-string/jumbo v0, "33230"
+    const-string/jumbo v0, "33231"
+    const-string/jumbo v0, "33232"
+    const-string/jumbo v0, "33233"
+    const-string/jumbo v0, "33234"
+    const-string/jumbo v0, "33235"
+    const-string/jumbo v0, "33236"
+    const-string/jumbo v0, "33237"
+    const-string/jumbo v0, "33238"
+    const-string/jumbo v0, "33239"
+    const-string/jumbo v0, "33240"
+    const-string/jumbo v0, "33241"
+    const-string/jumbo v0, "33242"
+    const-string/jumbo v0, "33243"
+    const-string/jumbo v0, "33244"
+    const-string/jumbo v0, "33245"
+    const-string/jumbo v0, "33246"
+    const-string/jumbo v0, "33247"
+    const-string/jumbo v0, "33248"
+    const-string/jumbo v0, "33249"
+    const-string/jumbo v0, "33250"
+    const-string/jumbo v0, "33251"
+    const-string/jumbo v0, "33252"
+    const-string/jumbo v0, "33253"
+    const-string/jumbo v0, "33254"
+    const-string/jumbo v0, "33255"
+    const-string/jumbo v0, "33256"
+    const-string/jumbo v0, "33257"
+    const-string/jumbo v0, "33258"
+    const-string/jumbo v0, "33259"
+    const-string/jumbo v0, "33260"
+    const-string/jumbo v0, "33261"
+    const-string/jumbo v0, "33262"
+    const-string/jumbo v0, "33263"
+    const-string/jumbo v0, "33264"
+    const-string/jumbo v0, "33265"
+    const-string/jumbo v0, "33266"
+    const-string/jumbo v0, "33267"
+    const-string/jumbo v0, "33268"
+    const-string/jumbo v0, "33269"
+    const-string/jumbo v0, "33270"
+    const-string/jumbo v0, "33271"
+    const-string/jumbo v0, "33272"
+    const-string/jumbo v0, "33273"
+    const-string/jumbo v0, "33274"
+    const-string/jumbo v0, "33275"
+    const-string/jumbo v0, "33276"
+    const-string/jumbo v0, "33277"
+    const-string/jumbo v0, "33278"
+    const-string/jumbo v0, "33279"
+    const-string/jumbo v0, "33280"
+    const-string/jumbo v0, "33281"
+    const-string/jumbo v0, "33282"
+    const-string/jumbo v0, "33283"
+    const-string/jumbo v0, "33284"
+    const-string/jumbo v0, "33285"
+    const-string/jumbo v0, "33286"
+    const-string/jumbo v0, "33287"
+    const-string/jumbo v0, "33288"
+    const-string/jumbo v0, "33289"
+    const-string/jumbo v0, "33290"
+    const-string/jumbo v0, "33291"
+    const-string/jumbo v0, "33292"
+    const-string/jumbo v0, "33293"
+    const-string/jumbo v0, "33294"
+    const-string/jumbo v0, "33295"
+    const-string/jumbo v0, "33296"
+    const-string/jumbo v0, "33297"
+    const-string/jumbo v0, "33298"
+    const-string/jumbo v0, "33299"
+    const-string/jumbo v0, "33300"
+    const-string/jumbo v0, "33301"
+    const-string/jumbo v0, "33302"
+    const-string/jumbo v0, "33303"
+    const-string/jumbo v0, "33304"
+    const-string/jumbo v0, "33305"
+    const-string/jumbo v0, "33306"
+    const-string/jumbo v0, "33307"
+    const-string/jumbo v0, "33308"
+    const-string/jumbo v0, "33309"
+    const-string/jumbo v0, "33310"
+    const-string/jumbo v0, "33311"
+    const-string/jumbo v0, "33312"
+    const-string/jumbo v0, "33313"
+    const-string/jumbo v0, "33314"
+    const-string/jumbo v0, "33315"
+    const-string/jumbo v0, "33316"
+    const-string/jumbo v0, "33317"
+    const-string/jumbo v0, "33318"
+    const-string/jumbo v0, "33319"
+    const-string/jumbo v0, "33320"
+    const-string/jumbo v0, "33321"
+    const-string/jumbo v0, "33322"
+    const-string/jumbo v0, "33323"
+    const-string/jumbo v0, "33324"
+    const-string/jumbo v0, "33325"
+    const-string/jumbo v0, "33326"
+    const-string/jumbo v0, "33327"
+    const-string/jumbo v0, "33328"
+    const-string/jumbo v0, "33329"
+    const-string/jumbo v0, "33330"
+    const-string/jumbo v0, "33331"
+    const-string/jumbo v0, "33332"
+    const-string/jumbo v0, "33333"
+    const-string/jumbo v0, "33334"
+    const-string/jumbo v0, "33335"
+    const-string/jumbo v0, "33336"
+    const-string/jumbo v0, "33337"
+    const-string/jumbo v0, "33338"
+    const-string/jumbo v0, "33339"
+    const-string/jumbo v0, "33340"
+    const-string/jumbo v0, "33341"
+    const-string/jumbo v0, "33342"
+    const-string/jumbo v0, "33343"
+    const-string/jumbo v0, "33344"
+    const-string/jumbo v0, "33345"
+    const-string/jumbo v0, "33346"
+    const-string/jumbo v0, "33347"
+    const-string/jumbo v0, "33348"
+    const-string/jumbo v0, "33349"
+    const-string/jumbo v0, "33350"
+    const-string/jumbo v0, "33351"
+    const-string/jumbo v0, "33352"
+    const-string/jumbo v0, "33353"
+    const-string/jumbo v0, "33354"
+    const-string/jumbo v0, "33355"
+    const-string/jumbo v0, "33356"
+    const-string/jumbo v0, "33357"
+    const-string/jumbo v0, "33358"
+    const-string/jumbo v0, "33359"
+    const-string/jumbo v0, "33360"
+    const-string/jumbo v0, "33361"
+    const-string/jumbo v0, "33362"
+    const-string/jumbo v0, "33363"
+    const-string/jumbo v0, "33364"
+    const-string/jumbo v0, "33365"
+    const-string/jumbo v0, "33366"
+    const-string/jumbo v0, "33367"
+    const-string/jumbo v0, "33368"
+    const-string/jumbo v0, "33369"
+    const-string/jumbo v0, "33370"
+    const-string/jumbo v0, "33371"
+    const-string/jumbo v0, "33372"
+    const-string/jumbo v0, "33373"
+    const-string/jumbo v0, "33374"
+    const-string/jumbo v0, "33375"
+    const-string/jumbo v0, "33376"
+    const-string/jumbo v0, "33377"
+    const-string/jumbo v0, "33378"
+    const-string/jumbo v0, "33379"
+    const-string/jumbo v0, "33380"
+    const-string/jumbo v0, "33381"
+    const-string/jumbo v0, "33382"
+    const-string/jumbo v0, "33383"
+    const-string/jumbo v0, "33384"
+    const-string/jumbo v0, "33385"
+    const-string/jumbo v0, "33386"
+    const-string/jumbo v0, "33387"
+    const-string/jumbo v0, "33388"
+    const-string/jumbo v0, "33389"
+    const-string/jumbo v0, "33390"
+    const-string/jumbo v0, "33391"
+    const-string/jumbo v0, "33392"
+    const-string/jumbo v0, "33393"
+    const-string/jumbo v0, "33394"
+    const-string/jumbo v0, "33395"
+    const-string/jumbo v0, "33396"
+    const-string/jumbo v0, "33397"
+    const-string/jumbo v0, "33398"
+    const-string/jumbo v0, "33399"
+    const-string/jumbo v0, "33400"
+    const-string/jumbo v0, "33401"
+    const-string/jumbo v0, "33402"
+    const-string/jumbo v0, "33403"
+    const-string/jumbo v0, "33404"
+    const-string/jumbo v0, "33405"
+    const-string/jumbo v0, "33406"
+    const-string/jumbo v0, "33407"
+    const-string/jumbo v0, "33408"
+    const-string/jumbo v0, "33409"
+    const-string/jumbo v0, "33410"
+    const-string/jumbo v0, "33411"
+    const-string/jumbo v0, "33412"
+    const-string/jumbo v0, "33413"
+    const-string/jumbo v0, "33414"
+    const-string/jumbo v0, "33415"
+    const-string/jumbo v0, "33416"
+    const-string/jumbo v0, "33417"
+    const-string/jumbo v0, "33418"
+    const-string/jumbo v0, "33419"
+    const-string/jumbo v0, "33420"
+    const-string/jumbo v0, "33421"
+    const-string/jumbo v0, "33422"
+    const-string/jumbo v0, "33423"
+    const-string/jumbo v0, "33424"
+    const-string/jumbo v0, "33425"
+    const-string/jumbo v0, "33426"
+    const-string/jumbo v0, "33427"
+    const-string/jumbo v0, "33428"
+    const-string/jumbo v0, "33429"
+    const-string/jumbo v0, "33430"
+    const-string/jumbo v0, "33431"
+    const-string/jumbo v0, "33432"
+    const-string/jumbo v0, "33433"
+    const-string/jumbo v0, "33434"
+    const-string/jumbo v0, "33435"
+    const-string/jumbo v0, "33436"
+    const-string/jumbo v0, "33437"
+    const-string/jumbo v0, "33438"
+    const-string/jumbo v0, "33439"
+    const-string/jumbo v0, "33440"
+    const-string/jumbo v0, "33441"
+    const-string/jumbo v0, "33442"
+    const-string/jumbo v0, "33443"
+    const-string/jumbo v0, "33444"
+    const-string/jumbo v0, "33445"
+    const-string/jumbo v0, "33446"
+    const-string/jumbo v0, "33447"
+    const-string/jumbo v0, "33448"
+    const-string/jumbo v0, "33449"
+    const-string/jumbo v0, "33450"
+    const-string/jumbo v0, "33451"
+    const-string/jumbo v0, "33452"
+    const-string/jumbo v0, "33453"
+    const-string/jumbo v0, "33454"
+    const-string/jumbo v0, "33455"
+    const-string/jumbo v0, "33456"
+    const-string/jumbo v0, "33457"
+    const-string/jumbo v0, "33458"
+    const-string/jumbo v0, "33459"
+    const-string/jumbo v0, "33460"
+    const-string/jumbo v0, "33461"
+    const-string/jumbo v0, "33462"
+    const-string/jumbo v0, "33463"
+    const-string/jumbo v0, "33464"
+    const-string/jumbo v0, "33465"
+    const-string/jumbo v0, "33466"
+    const-string/jumbo v0, "33467"
+    const-string/jumbo v0, "33468"
+    const-string/jumbo v0, "33469"
+    const-string/jumbo v0, "33470"
+    const-string/jumbo v0, "33471"
+    const-string/jumbo v0, "33472"
+    const-string/jumbo v0, "33473"
+    const-string/jumbo v0, "33474"
+    const-string/jumbo v0, "33475"
+    const-string/jumbo v0, "33476"
+    const-string/jumbo v0, "33477"
+    const-string/jumbo v0, "33478"
+    const-string/jumbo v0, "33479"
+    const-string/jumbo v0, "33480"
+    const-string/jumbo v0, "33481"
+    const-string/jumbo v0, "33482"
+    const-string/jumbo v0, "33483"
+    const-string/jumbo v0, "33484"
+    const-string/jumbo v0, "33485"
+    const-string/jumbo v0, "33486"
+    const-string/jumbo v0, "33487"
+    const-string/jumbo v0, "33488"
+    const-string/jumbo v0, "33489"
+    const-string/jumbo v0, "33490"
+    const-string/jumbo v0, "33491"
+    const-string/jumbo v0, "33492"
+    const-string/jumbo v0, "33493"
+    const-string/jumbo v0, "33494"
+    const-string/jumbo v0, "33495"
+    const-string/jumbo v0, "33496"
+    const-string/jumbo v0, "33497"
+    const-string/jumbo v0, "33498"
+    const-string/jumbo v0, "33499"
+    const-string/jumbo v0, "33500"
+    const-string/jumbo v0, "33501"
+    const-string/jumbo v0, "33502"
+    const-string/jumbo v0, "33503"
+    const-string/jumbo v0, "33504"
+    const-string/jumbo v0, "33505"
+    const-string/jumbo v0, "33506"
+    const-string/jumbo v0, "33507"
+    const-string/jumbo v0, "33508"
+    const-string/jumbo v0, "33509"
+    const-string/jumbo v0, "33510"
+    const-string/jumbo v0, "33511"
+    const-string/jumbo v0, "33512"
+    const-string/jumbo v0, "33513"
+    const-string/jumbo v0, "33514"
+    const-string/jumbo v0, "33515"
+    const-string/jumbo v0, "33516"
+    const-string/jumbo v0, "33517"
+    const-string/jumbo v0, "33518"
+    const-string/jumbo v0, "33519"
+    const-string/jumbo v0, "33520"
+    const-string/jumbo v0, "33521"
+    const-string/jumbo v0, "33522"
+    const-string/jumbo v0, "33523"
+    const-string/jumbo v0, "33524"
+    const-string/jumbo v0, "33525"
+    const-string/jumbo v0, "33526"
+    const-string/jumbo v0, "33527"
+    const-string/jumbo v0, "33528"
+    const-string/jumbo v0, "33529"
+    const-string/jumbo v0, "33530"
+    const-string/jumbo v0, "33531"
+    const-string/jumbo v0, "33532"
+    const-string/jumbo v0, "33533"
+    const-string/jumbo v0, "33534"
+    const-string/jumbo v0, "33535"
+    const-string/jumbo v0, "33536"
+    const-string/jumbo v0, "33537"
+    const-string/jumbo v0, "33538"
+    const-string/jumbo v0, "33539"
+    const-string/jumbo v0, "33540"
+    const-string/jumbo v0, "33541"
+    const-string/jumbo v0, "33542"
+    const-string/jumbo v0, "33543"
+    const-string/jumbo v0, "33544"
+    const-string/jumbo v0, "33545"
+    const-string/jumbo v0, "33546"
+    const-string/jumbo v0, "33547"
+    const-string/jumbo v0, "33548"
+    const-string/jumbo v0, "33549"
+    const-string/jumbo v0, "33550"
+    const-string/jumbo v0, "33551"
+    const-string/jumbo v0, "33552"
+    const-string/jumbo v0, "33553"
+    const-string/jumbo v0, "33554"
+    const-string/jumbo v0, "33555"
+    const-string/jumbo v0, "33556"
+    const-string/jumbo v0, "33557"
+    const-string/jumbo v0, "33558"
+    const-string/jumbo v0, "33559"
+    const-string/jumbo v0, "33560"
+    const-string/jumbo v0, "33561"
+    const-string/jumbo v0, "33562"
+    const-string/jumbo v0, "33563"
+    const-string/jumbo v0, "33564"
+    const-string/jumbo v0, "33565"
+    const-string/jumbo v0, "33566"
+    const-string/jumbo v0, "33567"
+    const-string/jumbo v0, "33568"
+    const-string/jumbo v0, "33569"
+    const-string/jumbo v0, "33570"
+    const-string/jumbo v0, "33571"
+    const-string/jumbo v0, "33572"
+    const-string/jumbo v0, "33573"
+    const-string/jumbo v0, "33574"
+    const-string/jumbo v0, "33575"
+    const-string/jumbo v0, "33576"
+    const-string/jumbo v0, "33577"
+    const-string/jumbo v0, "33578"
+    const-string/jumbo v0, "33579"
+    const-string/jumbo v0, "33580"
+    const-string/jumbo v0, "33581"
+    const-string/jumbo v0, "33582"
+    const-string/jumbo v0, "33583"
+    const-string/jumbo v0, "33584"
+    const-string/jumbo v0, "33585"
+    const-string/jumbo v0, "33586"
+    const-string/jumbo v0, "33587"
+    const-string/jumbo v0, "33588"
+    const-string/jumbo v0, "33589"
+    const-string/jumbo v0, "33590"
+    const-string/jumbo v0, "33591"
+    const-string/jumbo v0, "33592"
+    const-string/jumbo v0, "33593"
+    const-string/jumbo v0, "33594"
+    const-string/jumbo v0, "33595"
+    const-string/jumbo v0, "33596"
+    const-string/jumbo v0, "33597"
+    const-string/jumbo v0, "33598"
+    const-string/jumbo v0, "33599"
+    const-string/jumbo v0, "33600"
+    const-string/jumbo v0, "33601"
+    const-string/jumbo v0, "33602"
+    const-string/jumbo v0, "33603"
+    const-string/jumbo v0, "33604"
+    const-string/jumbo v0, "33605"
+    const-string/jumbo v0, "33606"
+    const-string/jumbo v0, "33607"
+    const-string/jumbo v0, "33608"
+    const-string/jumbo v0, "33609"
+    const-string/jumbo v0, "33610"
+    const-string/jumbo v0, "33611"
+    const-string/jumbo v0, "33612"
+    const-string/jumbo v0, "33613"
+    const-string/jumbo v0, "33614"
+    const-string/jumbo v0, "33615"
+    const-string/jumbo v0, "33616"
+    const-string/jumbo v0, "33617"
+    const-string/jumbo v0, "33618"
+    const-string/jumbo v0, "33619"
+    const-string/jumbo v0, "33620"
+    const-string/jumbo v0, "33621"
+    const-string/jumbo v0, "33622"
+    const-string/jumbo v0, "33623"
+    const-string/jumbo v0, "33624"
+    const-string/jumbo v0, "33625"
+    const-string/jumbo v0, "33626"
+    const-string/jumbo v0, "33627"
+    const-string/jumbo v0, "33628"
+    const-string/jumbo v0, "33629"
+    const-string/jumbo v0, "33630"
+    const-string/jumbo v0, "33631"
+    const-string/jumbo v0, "33632"
+    const-string/jumbo v0, "33633"
+    const-string/jumbo v0, "33634"
+    const-string/jumbo v0, "33635"
+    const-string/jumbo v0, "33636"
+    const-string/jumbo v0, "33637"
+    const-string/jumbo v0, "33638"
+    const-string/jumbo v0, "33639"
+    const-string/jumbo v0, "33640"
+    const-string/jumbo v0, "33641"
+    const-string/jumbo v0, "33642"
+    const-string/jumbo v0, "33643"
+    const-string/jumbo v0, "33644"
+    const-string/jumbo v0, "33645"
+    const-string/jumbo v0, "33646"
+    const-string/jumbo v0, "33647"
+    const-string/jumbo v0, "33648"
+    const-string/jumbo v0, "33649"
+    const-string/jumbo v0, "33650"
+    const-string/jumbo v0, "33651"
+    const-string/jumbo v0, "33652"
+    const-string/jumbo v0, "33653"
+    const-string/jumbo v0, "33654"
+    const-string/jumbo v0, "33655"
+    const-string/jumbo v0, "33656"
+    const-string/jumbo v0, "33657"
+    const-string/jumbo v0, "33658"
+    const-string/jumbo v0, "33659"
+    const-string/jumbo v0, "33660"
+    const-string/jumbo v0, "33661"
+    const-string/jumbo v0, "33662"
+    const-string/jumbo v0, "33663"
+    const-string/jumbo v0, "33664"
+    const-string/jumbo v0, "33665"
+    const-string/jumbo v0, "33666"
+    const-string/jumbo v0, "33667"
+    const-string/jumbo v0, "33668"
+    const-string/jumbo v0, "33669"
+    const-string/jumbo v0, "33670"
+    const-string/jumbo v0, "33671"
+    const-string/jumbo v0, "33672"
+    const-string/jumbo v0, "33673"
+    const-string/jumbo v0, "33674"
+    const-string/jumbo v0, "33675"
+    const-string/jumbo v0, "33676"
+    const-string/jumbo v0, "33677"
+    const-string/jumbo v0, "33678"
+    const-string/jumbo v0, "33679"
+    const-string/jumbo v0, "33680"
+    const-string/jumbo v0, "33681"
+    const-string/jumbo v0, "33682"
+    const-string/jumbo v0, "33683"
+    const-string/jumbo v0, "33684"
+    const-string/jumbo v0, "33685"
+    const-string/jumbo v0, "33686"
+    const-string/jumbo v0, "33687"
+    const-string/jumbo v0, "33688"
+    const-string/jumbo v0, "33689"
+    const-string/jumbo v0, "33690"
+    const-string/jumbo v0, "33691"
+    const-string/jumbo v0, "33692"
+    const-string/jumbo v0, "33693"
+    const-string/jumbo v0, "33694"
+    const-string/jumbo v0, "33695"
+    const-string/jumbo v0, "33696"
+    const-string/jumbo v0, "33697"
+    const-string/jumbo v0, "33698"
+    const-string/jumbo v0, "33699"
+    const-string/jumbo v0, "33700"
+    const-string/jumbo v0, "33701"
+    const-string/jumbo v0, "33702"
+    const-string/jumbo v0, "33703"
+    const-string/jumbo v0, "33704"
+    const-string/jumbo v0, "33705"
+    const-string/jumbo v0, "33706"
+    const-string/jumbo v0, "33707"
+    const-string/jumbo v0, "33708"
+    const-string/jumbo v0, "33709"
+    const-string/jumbo v0, "33710"
+    const-string/jumbo v0, "33711"
+    const-string/jumbo v0, "33712"
+    const-string/jumbo v0, "33713"
+    const-string/jumbo v0, "33714"
+    const-string/jumbo v0, "33715"
+    const-string/jumbo v0, "33716"
+    const-string/jumbo v0, "33717"
+    const-string/jumbo v0, "33718"
+    const-string/jumbo v0, "33719"
+    const-string/jumbo v0, "33720"
+    const-string/jumbo v0, "33721"
+    const-string/jumbo v0, "33722"
+    const-string/jumbo v0, "33723"
+    const-string/jumbo v0, "33724"
+    const-string/jumbo v0, "33725"
+    const-string/jumbo v0, "33726"
+    const-string/jumbo v0, "33727"
+    const-string/jumbo v0, "33728"
+    const-string/jumbo v0, "33729"
+    const-string/jumbo v0, "33730"
+    const-string/jumbo v0, "33731"
+    const-string/jumbo v0, "33732"
+    const-string/jumbo v0, "33733"
+    const-string/jumbo v0, "33734"
+    const-string/jumbo v0, "33735"
+    const-string/jumbo v0, "33736"
+    const-string/jumbo v0, "33737"
+    const-string/jumbo v0, "33738"
+    const-string/jumbo v0, "33739"
+    const-string/jumbo v0, "33740"
+    const-string/jumbo v0, "33741"
+    const-string/jumbo v0, "33742"
+    const-string/jumbo v0, "33743"
+    const-string/jumbo v0, "33744"
+    const-string/jumbo v0, "33745"
+    const-string/jumbo v0, "33746"
+    const-string/jumbo v0, "33747"
+    const-string/jumbo v0, "33748"
+    const-string/jumbo v0, "33749"
+    const-string/jumbo v0, "33750"
+    const-string/jumbo v0, "33751"
+    const-string/jumbo v0, "33752"
+    const-string/jumbo v0, "33753"
+    const-string/jumbo v0, "33754"
+    const-string/jumbo v0, "33755"
+    const-string/jumbo v0, "33756"
+    const-string/jumbo v0, "33757"
+    const-string/jumbo v0, "33758"
+    const-string/jumbo v0, "33759"
+    const-string/jumbo v0, "33760"
+    const-string/jumbo v0, "33761"
+    const-string/jumbo v0, "33762"
+    const-string/jumbo v0, "33763"
+    const-string/jumbo v0, "33764"
+    const-string/jumbo v0, "33765"
+    const-string/jumbo v0, "33766"
+    const-string/jumbo v0, "33767"
+    const-string/jumbo v0, "33768"
+    const-string/jumbo v0, "33769"
+    const-string/jumbo v0, "33770"
+    const-string/jumbo v0, "33771"
+    const-string/jumbo v0, "33772"
+    const-string/jumbo v0, "33773"
+    const-string/jumbo v0, "33774"
+    const-string/jumbo v0, "33775"
+    const-string/jumbo v0, "33776"
+    const-string/jumbo v0, "33777"
+    const-string/jumbo v0, "33778"
+    const-string/jumbo v0, "33779"
+    const-string/jumbo v0, "33780"
+    const-string/jumbo v0, "33781"
+    const-string/jumbo v0, "33782"
+    const-string/jumbo v0, "33783"
+    const-string/jumbo v0, "33784"
+    const-string/jumbo v0, "33785"
+    const-string/jumbo v0, "33786"
+    const-string/jumbo v0, "33787"
+    const-string/jumbo v0, "33788"
+    const-string/jumbo v0, "33789"
+    const-string/jumbo v0, "33790"
+    const-string/jumbo v0, "33791"
+    const-string/jumbo v0, "33792"
+    const-string/jumbo v0, "33793"
+    const-string/jumbo v0, "33794"
+    const-string/jumbo v0, "33795"
+    const-string/jumbo v0, "33796"
+    const-string/jumbo v0, "33797"
+    const-string/jumbo v0, "33798"
+    const-string/jumbo v0, "33799"
+    const-string/jumbo v0, "33800"
+    const-string/jumbo v0, "33801"
+    const-string/jumbo v0, "33802"
+    const-string/jumbo v0, "33803"
+    const-string/jumbo v0, "33804"
+    const-string/jumbo v0, "33805"
+    const-string/jumbo v0, "33806"
+    const-string/jumbo v0, "33807"
+    const-string/jumbo v0, "33808"
+    const-string/jumbo v0, "33809"
+    const-string/jumbo v0, "33810"
+    const-string/jumbo v0, "33811"
+    const-string/jumbo v0, "33812"
+    const-string/jumbo v0, "33813"
+    const-string/jumbo v0, "33814"
+    const-string/jumbo v0, "33815"
+    const-string/jumbo v0, "33816"
+    const-string/jumbo v0, "33817"
+    const-string/jumbo v0, "33818"
+    const-string/jumbo v0, "33819"
+    const-string/jumbo v0, "33820"
+    const-string/jumbo v0, "33821"
+    const-string/jumbo v0, "33822"
+    const-string/jumbo v0, "33823"
+    const-string/jumbo v0, "33824"
+    const-string/jumbo v0, "33825"
+    const-string/jumbo v0, "33826"
+    const-string/jumbo v0, "33827"
+    const-string/jumbo v0, "33828"
+    const-string/jumbo v0, "33829"
+    const-string/jumbo v0, "33830"
+    const-string/jumbo v0, "33831"
+    const-string/jumbo v0, "33832"
+    const-string/jumbo v0, "33833"
+    const-string/jumbo v0, "33834"
+    const-string/jumbo v0, "33835"
+    const-string/jumbo v0, "33836"
+    const-string/jumbo v0, "33837"
+    const-string/jumbo v0, "33838"
+    const-string/jumbo v0, "33839"
+    const-string/jumbo v0, "33840"
+    const-string/jumbo v0, "33841"
+    const-string/jumbo v0, "33842"
+    const-string/jumbo v0, "33843"
+    const-string/jumbo v0, "33844"
+    const-string/jumbo v0, "33845"
+    const-string/jumbo v0, "33846"
+    const-string/jumbo v0, "33847"
+    const-string/jumbo v0, "33848"
+    const-string/jumbo v0, "33849"
+    const-string/jumbo v0, "33850"
+    const-string/jumbo v0, "33851"
+    const-string/jumbo v0, "33852"
+    const-string/jumbo v0, "33853"
+    const-string/jumbo v0, "33854"
+    const-string/jumbo v0, "33855"
+    const-string/jumbo v0, "33856"
+    const-string/jumbo v0, "33857"
+    const-string/jumbo v0, "33858"
+    const-string/jumbo v0, "33859"
+    const-string/jumbo v0, "33860"
+    const-string/jumbo v0, "33861"
+    const-string/jumbo v0, "33862"
+    const-string/jumbo v0, "33863"
+    const-string/jumbo v0, "33864"
+    const-string/jumbo v0, "33865"
+    const-string/jumbo v0, "33866"
+    const-string/jumbo v0, "33867"
+    const-string/jumbo v0, "33868"
+    const-string/jumbo v0, "33869"
+    const-string/jumbo v0, "33870"
+    const-string/jumbo v0, "33871"
+    const-string/jumbo v0, "33872"
+    const-string/jumbo v0, "33873"
+    const-string/jumbo v0, "33874"
+    const-string/jumbo v0, "33875"
+    const-string/jumbo v0, "33876"
+    const-string/jumbo v0, "33877"
+    const-string/jumbo v0, "33878"
+    const-string/jumbo v0, "33879"
+    const-string/jumbo v0, "33880"
+    const-string/jumbo v0, "33881"
+    const-string/jumbo v0, "33882"
+    const-string/jumbo v0, "33883"
+    const-string/jumbo v0, "33884"
+    const-string/jumbo v0, "33885"
+    const-string/jumbo v0, "33886"
+    const-string/jumbo v0, "33887"
+    const-string/jumbo v0, "33888"
+    const-string/jumbo v0, "33889"
+    const-string/jumbo v0, "33890"
+    const-string/jumbo v0, "33891"
+    const-string/jumbo v0, "33892"
+    const-string/jumbo v0, "33893"
+    const-string/jumbo v0, "33894"
+    const-string/jumbo v0, "33895"
+    const-string/jumbo v0, "33896"
+    const-string/jumbo v0, "33897"
+    const-string/jumbo v0, "33898"
+    const-string/jumbo v0, "33899"
+    const-string/jumbo v0, "33900"
+    const-string/jumbo v0, "33901"
+    const-string/jumbo v0, "33902"
+    const-string/jumbo v0, "33903"
+    const-string/jumbo v0, "33904"
+    const-string/jumbo v0, "33905"
+    const-string/jumbo v0, "33906"
+    const-string/jumbo v0, "33907"
+    const-string/jumbo v0, "33908"
+    const-string/jumbo v0, "33909"
+    const-string/jumbo v0, "33910"
+    const-string/jumbo v0, "33911"
+    const-string/jumbo v0, "33912"
+    const-string/jumbo v0, "33913"
+    const-string/jumbo v0, "33914"
+    const-string/jumbo v0, "33915"
+    const-string/jumbo v0, "33916"
+    const-string/jumbo v0, "33917"
+    const-string/jumbo v0, "33918"
+    const-string/jumbo v0, "33919"
+    const-string/jumbo v0, "33920"
+    const-string/jumbo v0, "33921"
+    const-string/jumbo v0, "33922"
+    const-string/jumbo v0, "33923"
+    const-string/jumbo v0, "33924"
+    const-string/jumbo v0, "33925"
+    const-string/jumbo v0, "33926"
+    const-string/jumbo v0, "33927"
+    const-string/jumbo v0, "33928"
+    const-string/jumbo v0, "33929"
+    const-string/jumbo v0, "33930"
+    const-string/jumbo v0, "33931"
+    const-string/jumbo v0, "33932"
+    const-string/jumbo v0, "33933"
+    const-string/jumbo v0, "33934"
+    const-string/jumbo v0, "33935"
+    const-string/jumbo v0, "33936"
+    const-string/jumbo v0, "33937"
+    const-string/jumbo v0, "33938"
+    const-string/jumbo v0, "33939"
+    const-string/jumbo v0, "33940"
+    const-string/jumbo v0, "33941"
+    const-string/jumbo v0, "33942"
+    const-string/jumbo v0, "33943"
+    const-string/jumbo v0, "33944"
+    const-string/jumbo v0, "33945"
+    const-string/jumbo v0, "33946"
+    const-string/jumbo v0, "33947"
+    const-string/jumbo v0, "33948"
+    const-string/jumbo v0, "33949"
+    const-string/jumbo v0, "33950"
+    const-string/jumbo v0, "33951"
+    const-string/jumbo v0, "33952"
+    const-string/jumbo v0, "33953"
+    const-string/jumbo v0, "33954"
+    const-string/jumbo v0, "33955"
+    const-string/jumbo v0, "33956"
+    const-string/jumbo v0, "33957"
+    const-string/jumbo v0, "33958"
+    const-string/jumbo v0, "33959"
+    const-string/jumbo v0, "33960"
+    const-string/jumbo v0, "33961"
+    const-string/jumbo v0, "33962"
+    const-string/jumbo v0, "33963"
+    const-string/jumbo v0, "33964"
+    const-string/jumbo v0, "33965"
+    const-string/jumbo v0, "33966"
+    const-string/jumbo v0, "33967"
+    const-string/jumbo v0, "33968"
+    const-string/jumbo v0, "33969"
+    const-string/jumbo v0, "33970"
+    const-string/jumbo v0, "33971"
+    const-string/jumbo v0, "33972"
+    const-string/jumbo v0, "33973"
+    const-string/jumbo v0, "33974"
+    const-string/jumbo v0, "33975"
+    const-string/jumbo v0, "33976"
+    const-string/jumbo v0, "33977"
+    const-string/jumbo v0, "33978"
+    const-string/jumbo v0, "33979"
+    const-string/jumbo v0, "33980"
+    const-string/jumbo v0, "33981"
+    const-string/jumbo v0, "33982"
+    const-string/jumbo v0, "33983"
+    const-string/jumbo v0, "33984"
+    const-string/jumbo v0, "33985"
+    const-string/jumbo v0, "33986"
+    const-string/jumbo v0, "33987"
+    const-string/jumbo v0, "33988"
+    const-string/jumbo v0, "33989"
+    const-string/jumbo v0, "33990"
+    const-string/jumbo v0, "33991"
+    const-string/jumbo v0, "33992"
+    const-string/jumbo v0, "33993"
+    const-string/jumbo v0, "33994"
+    const-string/jumbo v0, "33995"
+    const-string/jumbo v0, "33996"
+    const-string/jumbo v0, "33997"
+    const-string/jumbo v0, "33998"
+    const-string/jumbo v0, "33999"
+    const-string/jumbo v0, "34000"
+    const-string/jumbo v0, "34001"
+    const-string/jumbo v0, "34002"
+    const-string/jumbo v0, "34003"
+    const-string/jumbo v0, "34004"
+    const-string/jumbo v0, "34005"
+    const-string/jumbo v0, "34006"
+    const-string/jumbo v0, "34007"
+    const-string/jumbo v0, "34008"
+    const-string/jumbo v0, "34009"
+    const-string/jumbo v0, "34010"
+    const-string/jumbo v0, "34011"
+    const-string/jumbo v0, "34012"
+    const-string/jumbo v0, "34013"
+    const-string/jumbo v0, "34014"
+    const-string/jumbo v0, "34015"
+    const-string/jumbo v0, "34016"
+    const-string/jumbo v0, "34017"
+    const-string/jumbo v0, "34018"
+    const-string/jumbo v0, "34019"
+    const-string/jumbo v0, "34020"
+    const-string/jumbo v0, "34021"
+    const-string/jumbo v0, "34022"
+    const-string/jumbo v0, "34023"
+    const-string/jumbo v0, "34024"
+    const-string/jumbo v0, "34025"
+    const-string/jumbo v0, "34026"
+    const-string/jumbo v0, "34027"
+    const-string/jumbo v0, "34028"
+    const-string/jumbo v0, "34029"
+    const-string/jumbo v0, "34030"
+    const-string/jumbo v0, "34031"
+    const-string/jumbo v0, "34032"
+    const-string/jumbo v0, "34033"
+    const-string/jumbo v0, "34034"
+    const-string/jumbo v0, "34035"
+    const-string/jumbo v0, "34036"
+    const-string/jumbo v0, "34037"
+    const-string/jumbo v0, "34038"
+    const-string/jumbo v0, "34039"
+    const-string/jumbo v0, "34040"
+    const-string/jumbo v0, "34041"
+    const-string/jumbo v0, "34042"
+    const-string/jumbo v0, "34043"
+    const-string/jumbo v0, "34044"
+    const-string/jumbo v0, "34045"
+    const-string/jumbo v0, "34046"
+    const-string/jumbo v0, "34047"
+    const-string/jumbo v0, "34048"
+    const-string/jumbo v0, "34049"
+    const-string/jumbo v0, "34050"
+    const-string/jumbo v0, "34051"
+    const-string/jumbo v0, "34052"
+    const-string/jumbo v0, "34053"
+    const-string/jumbo v0, "34054"
+    const-string/jumbo v0, "34055"
+    const-string/jumbo v0, "34056"
+    const-string/jumbo v0, "34057"
+    const-string/jumbo v0, "34058"
+    const-string/jumbo v0, "34059"
+    const-string/jumbo v0, "34060"
+    const-string/jumbo v0, "34061"
+    const-string/jumbo v0, "34062"
+    const-string/jumbo v0, "34063"
+    const-string/jumbo v0, "34064"
+    const-string/jumbo v0, "34065"
+    const-string/jumbo v0, "34066"
+    const-string/jumbo v0, "34067"
+    const-string/jumbo v0, "34068"
+    const-string/jumbo v0, "34069"
+    const-string/jumbo v0, "34070"
+    const-string/jumbo v0, "34071"
+    const-string/jumbo v0, "34072"
+    const-string/jumbo v0, "34073"
+    const-string/jumbo v0, "34074"
+    const-string/jumbo v0, "34075"
+    const-string/jumbo v0, "34076"
+    const-string/jumbo v0, "34077"
+    const-string/jumbo v0, "34078"
+    const-string/jumbo v0, "34079"
+    const-string/jumbo v0, "34080"
+    const-string/jumbo v0, "34081"
+    const-string/jumbo v0, "34082"
+    const-string/jumbo v0, "34083"
+    const-string/jumbo v0, "34084"
+    const-string/jumbo v0, "34085"
+    const-string/jumbo v0, "34086"
+    const-string/jumbo v0, "34087"
+    const-string/jumbo v0, "34088"
+    const-string/jumbo v0, "34089"
+    const-string/jumbo v0, "34090"
+    const-string/jumbo v0, "34091"
+    const-string/jumbo v0, "34092"
+    const-string/jumbo v0, "34093"
+    const-string/jumbo v0, "34094"
+    const-string/jumbo v0, "34095"
+    const-string/jumbo v0, "34096"
+    const-string/jumbo v0, "34097"
+    const-string/jumbo v0, "34098"
+    const-string/jumbo v0, "34099"
+    const-string/jumbo v0, "34100"
+    const-string/jumbo v0, "34101"
+    const-string/jumbo v0, "34102"
+    const-string/jumbo v0, "34103"
+    const-string/jumbo v0, "34104"
+    const-string/jumbo v0, "34105"
+    const-string/jumbo v0, "34106"
+    const-string/jumbo v0, "34107"
+    const-string/jumbo v0, "34108"
+    const-string/jumbo v0, "34109"
+    const-string/jumbo v0, "34110"
+    const-string/jumbo v0, "34111"
+    const-string/jumbo v0, "34112"
+    const-string/jumbo v0, "34113"
+    const-string/jumbo v0, "34114"
+    const-string/jumbo v0, "34115"
+    const-string/jumbo v0, "34116"
+    const-string/jumbo v0, "34117"
+    const-string/jumbo v0, "34118"
+    const-string/jumbo v0, "34119"
+    const-string/jumbo v0, "34120"
+    const-string/jumbo v0, "34121"
+    const-string/jumbo v0, "34122"
+    const-string/jumbo v0, "34123"
+    const-string/jumbo v0, "34124"
+    const-string/jumbo v0, "34125"
+    const-string/jumbo v0, "34126"
+    const-string/jumbo v0, "34127"
+    const-string/jumbo v0, "34128"
+    const-string/jumbo v0, "34129"
+    const-string/jumbo v0, "34130"
+    const-string/jumbo v0, "34131"
+    const-string/jumbo v0, "34132"
+    const-string/jumbo v0, "34133"
+    const-string/jumbo v0, "34134"
+    const-string/jumbo v0, "34135"
+    const-string/jumbo v0, "34136"
+    const-string/jumbo v0, "34137"
+    const-string/jumbo v0, "34138"
+    const-string/jumbo v0, "34139"
+    const-string/jumbo v0, "34140"
+    const-string/jumbo v0, "34141"
+    const-string/jumbo v0, "34142"
+    const-string/jumbo v0, "34143"
+    const-string/jumbo v0, "34144"
+    const-string/jumbo v0, "34145"
+    const-string/jumbo v0, "34146"
+    const-string/jumbo v0, "34147"
+    const-string/jumbo v0, "34148"
+    const-string/jumbo v0, "34149"
+    const-string/jumbo v0, "34150"
+    const-string/jumbo v0, "34151"
+    const-string/jumbo v0, "34152"
+    const-string/jumbo v0, "34153"
+    const-string/jumbo v0, "34154"
+    const-string/jumbo v0, "34155"
+    const-string/jumbo v0, "34156"
+    const-string/jumbo v0, "34157"
+    const-string/jumbo v0, "34158"
+    const-string/jumbo v0, "34159"
+    const-string/jumbo v0, "34160"
+    const-string/jumbo v0, "34161"
+    const-string/jumbo v0, "34162"
+    const-string/jumbo v0, "34163"
+    const-string/jumbo v0, "34164"
+    const-string/jumbo v0, "34165"
+    const-string/jumbo v0, "34166"
+    const-string/jumbo v0, "34167"
+    const-string/jumbo v0, "34168"
+    const-string/jumbo v0, "34169"
+    const-string/jumbo v0, "34170"
+    const-string/jumbo v0, "34171"
+    const-string/jumbo v0, "34172"
+    const-string/jumbo v0, "34173"
+    const-string/jumbo v0, "34174"
+    const-string/jumbo v0, "34175"
+    const-string/jumbo v0, "34176"
+    const-string/jumbo v0, "34177"
+    const-string/jumbo v0, "34178"
+    const-string/jumbo v0, "34179"
+    const-string/jumbo v0, "34180"
+    const-string/jumbo v0, "34181"
+    const-string/jumbo v0, "34182"
+    const-string/jumbo v0, "34183"
+    const-string/jumbo v0, "34184"
+    const-string/jumbo v0, "34185"
+    const-string/jumbo v0, "34186"
+    const-string/jumbo v0, "34187"
+    const-string/jumbo v0, "34188"
+    const-string/jumbo v0, "34189"
+    const-string/jumbo v0, "34190"
+    const-string/jumbo v0, "34191"
+    const-string/jumbo v0, "34192"
+    const-string/jumbo v0, "34193"
+    const-string/jumbo v0, "34194"
+    const-string/jumbo v0, "34195"
+    const-string/jumbo v0, "34196"
+    const-string/jumbo v0, "34197"
+    const-string/jumbo v0, "34198"
+    const-string/jumbo v0, "34199"
+    const-string/jumbo v0, "34200"
+    const-string/jumbo v0, "34201"
+    const-string/jumbo v0, "34202"
+    const-string/jumbo v0, "34203"
+    const-string/jumbo v0, "34204"
+    const-string/jumbo v0, "34205"
+    const-string/jumbo v0, "34206"
+    const-string/jumbo v0, "34207"
+    const-string/jumbo v0, "34208"
+    const-string/jumbo v0, "34209"
+    const-string/jumbo v0, "34210"
+    const-string/jumbo v0, "34211"
+    const-string/jumbo v0, "34212"
+    const-string/jumbo v0, "34213"
+    const-string/jumbo v0, "34214"
+    const-string/jumbo v0, "34215"
+    const-string/jumbo v0, "34216"
+    const-string/jumbo v0, "34217"
+    const-string/jumbo v0, "34218"
+    const-string/jumbo v0, "34219"
+    const-string/jumbo v0, "34220"
+    const-string/jumbo v0, "34221"
+    const-string/jumbo v0, "34222"
+    const-string/jumbo v0, "34223"
+    const-string/jumbo v0, "34224"
+    const-string/jumbo v0, "34225"
+    const-string/jumbo v0, "34226"
+    const-string/jumbo v0, "34227"
+    const-string/jumbo v0, "34228"
+    const-string/jumbo v0, "34229"
+    const-string/jumbo v0, "34230"
+    const-string/jumbo v0, "34231"
+    const-string/jumbo v0, "34232"
+    const-string/jumbo v0, "34233"
+    const-string/jumbo v0, "34234"
+    const-string/jumbo v0, "34235"
+    const-string/jumbo v0, "34236"
+    const-string/jumbo v0, "34237"
+    const-string/jumbo v0, "34238"
+    const-string/jumbo v0, "34239"
+    const-string/jumbo v0, "34240"
+    const-string/jumbo v0, "34241"
+    const-string/jumbo v0, "34242"
+    const-string/jumbo v0, "34243"
+    const-string/jumbo v0, "34244"
+    const-string/jumbo v0, "34245"
+    const-string/jumbo v0, "34246"
+    const-string/jumbo v0, "34247"
+    const-string/jumbo v0, "34248"
+    const-string/jumbo v0, "34249"
+    const-string/jumbo v0, "34250"
+    const-string/jumbo v0, "34251"
+    const-string/jumbo v0, "34252"
+    const-string/jumbo v0, "34253"
+    const-string/jumbo v0, "34254"
+    const-string/jumbo v0, "34255"
+    const-string/jumbo v0, "34256"
+    const-string/jumbo v0, "34257"
+    const-string/jumbo v0, "34258"
+    const-string/jumbo v0, "34259"
+    const-string/jumbo v0, "34260"
+    const-string/jumbo v0, "34261"
+    const-string/jumbo v0, "34262"
+    const-string/jumbo v0, "34263"
+    const-string/jumbo v0, "34264"
+    const-string/jumbo v0, "34265"
+    const-string/jumbo v0, "34266"
+    const-string/jumbo v0, "34267"
+    const-string/jumbo v0, "34268"
+    const-string/jumbo v0, "34269"
+    const-string/jumbo v0, "34270"
+    const-string/jumbo v0, "34271"
+    const-string/jumbo v0, "34272"
+    const-string/jumbo v0, "34273"
+    const-string/jumbo v0, "34274"
+    const-string/jumbo v0, "34275"
+    const-string/jumbo v0, "34276"
+    const-string/jumbo v0, "34277"
+    const-string/jumbo v0, "34278"
+    const-string/jumbo v0, "34279"
+    const-string/jumbo v0, "34280"
+    const-string/jumbo v0, "34281"
+    const-string/jumbo v0, "34282"
+    const-string/jumbo v0, "34283"
+    const-string/jumbo v0, "34284"
+    const-string/jumbo v0, "34285"
+    const-string/jumbo v0, "34286"
+    const-string/jumbo v0, "34287"
+    const-string/jumbo v0, "34288"
+    const-string/jumbo v0, "34289"
+    const-string/jumbo v0, "34290"
+    const-string/jumbo v0, "34291"
+    const-string/jumbo v0, "34292"
+    const-string/jumbo v0, "34293"
+    const-string/jumbo v0, "34294"
+    const-string/jumbo v0, "34295"
+    const-string/jumbo v0, "34296"
+    const-string/jumbo v0, "34297"
+    const-string/jumbo v0, "34298"
+    const-string/jumbo v0, "34299"
+    const-string/jumbo v0, "34300"
+    const-string/jumbo v0, "34301"
+    const-string/jumbo v0, "34302"
+    const-string/jumbo v0, "34303"
+    const-string/jumbo v0, "34304"
+    const-string/jumbo v0, "34305"
+    const-string/jumbo v0, "34306"
+    const-string/jumbo v0, "34307"
+    const-string/jumbo v0, "34308"
+    const-string/jumbo v0, "34309"
+    const-string/jumbo v0, "34310"
+    const-string/jumbo v0, "34311"
+    const-string/jumbo v0, "34312"
+    const-string/jumbo v0, "34313"
+    const-string/jumbo v0, "34314"
+    const-string/jumbo v0, "34315"
+    const-string/jumbo v0, "34316"
+    const-string/jumbo v0, "34317"
+    const-string/jumbo v0, "34318"
+    const-string/jumbo v0, "34319"
+    const-string/jumbo v0, "34320"
+    const-string/jumbo v0, "34321"
+    const-string/jumbo v0, "34322"
+    const-string/jumbo v0, "34323"
+    const-string/jumbo v0, "34324"
+    const-string/jumbo v0, "34325"
+    const-string/jumbo v0, "34326"
+    const-string/jumbo v0, "34327"
+    const-string/jumbo v0, "34328"
+    const-string/jumbo v0, "34329"
+    const-string/jumbo v0, "34330"
+    const-string/jumbo v0, "34331"
+    const-string/jumbo v0, "34332"
+    const-string/jumbo v0, "34333"
+    const-string/jumbo v0, "34334"
+    const-string/jumbo v0, "34335"
+    const-string/jumbo v0, "34336"
+    const-string/jumbo v0, "34337"
+    const-string/jumbo v0, "34338"
+    const-string/jumbo v0, "34339"
+    const-string/jumbo v0, "34340"
+    const-string/jumbo v0, "34341"
+    const-string/jumbo v0, "34342"
+    const-string/jumbo v0, "34343"
+    const-string/jumbo v0, "34344"
+    const-string/jumbo v0, "34345"
+    const-string/jumbo v0, "34346"
+    const-string/jumbo v0, "34347"
+    const-string/jumbo v0, "34348"
+    const-string/jumbo v0, "34349"
+    const-string/jumbo v0, "34350"
+    const-string/jumbo v0, "34351"
+    const-string/jumbo v0, "34352"
+    const-string/jumbo v0, "34353"
+    const-string/jumbo v0, "34354"
+    const-string/jumbo v0, "34355"
+    const-string/jumbo v0, "34356"
+    const-string/jumbo v0, "34357"
+    const-string/jumbo v0, "34358"
+    const-string/jumbo v0, "34359"
+    const-string/jumbo v0, "34360"
+    const-string/jumbo v0, "34361"
+    const-string/jumbo v0, "34362"
+    const-string/jumbo v0, "34363"
+    const-string/jumbo v0, "34364"
+    const-string/jumbo v0, "34365"
+    const-string/jumbo v0, "34366"
+    const-string/jumbo v0, "34367"
+    const-string/jumbo v0, "34368"
+    const-string/jumbo v0, "34369"
+    const-string/jumbo v0, "34370"
+    const-string/jumbo v0, "34371"
+    const-string/jumbo v0, "34372"
+    const-string/jumbo v0, "34373"
+    const-string/jumbo v0, "34374"
+    const-string/jumbo v0, "34375"
+    const-string/jumbo v0, "34376"
+    const-string/jumbo v0, "34377"
+    const-string/jumbo v0, "34378"
+    const-string/jumbo v0, "34379"
+    const-string/jumbo v0, "34380"
+    const-string/jumbo v0, "34381"
+    const-string/jumbo v0, "34382"
+    const-string/jumbo v0, "34383"
+    const-string/jumbo v0, "34384"
+    const-string/jumbo v0, "34385"
+    const-string/jumbo v0, "34386"
+    const-string/jumbo v0, "34387"
+    const-string/jumbo v0, "34388"
+    const-string/jumbo v0, "34389"
+    const-string/jumbo v0, "34390"
+    const-string/jumbo v0, "34391"
+    const-string/jumbo v0, "34392"
+    const-string/jumbo v0, "34393"
+    const-string/jumbo v0, "34394"
+    const-string/jumbo v0, "34395"
+    const-string/jumbo v0, "34396"
+    const-string/jumbo v0, "34397"
+    const-string/jumbo v0, "34398"
+    const-string/jumbo v0, "34399"
+    const-string/jumbo v0, "34400"
+    const-string/jumbo v0, "34401"
+    const-string/jumbo v0, "34402"
+    const-string/jumbo v0, "34403"
+    const-string/jumbo v0, "34404"
+    const-string/jumbo v0, "34405"
+    const-string/jumbo v0, "34406"
+    const-string/jumbo v0, "34407"
+    const-string/jumbo v0, "34408"
+    const-string/jumbo v0, "34409"
+    const-string/jumbo v0, "34410"
+    const-string/jumbo v0, "34411"
+    const-string/jumbo v0, "34412"
+    const-string/jumbo v0, "34413"
+    const-string/jumbo v0, "34414"
+    const-string/jumbo v0, "34415"
+    const-string/jumbo v0, "34416"
+    const-string/jumbo v0, "34417"
+    const-string/jumbo v0, "34418"
+    const-string/jumbo v0, "34419"
+    const-string/jumbo v0, "34420"
+    const-string/jumbo v0, "34421"
+    const-string/jumbo v0, "34422"
+    const-string/jumbo v0, "34423"
+    const-string/jumbo v0, "34424"
+    const-string/jumbo v0, "34425"
+    const-string/jumbo v0, "34426"
+    const-string/jumbo v0, "34427"
+    const-string/jumbo v0, "34428"
+    const-string/jumbo v0, "34429"
+    const-string/jumbo v0, "34430"
+    const-string/jumbo v0, "34431"
+    const-string/jumbo v0, "34432"
+    const-string/jumbo v0, "34433"
+    const-string/jumbo v0, "34434"
+    const-string/jumbo v0, "34435"
+    const-string/jumbo v0, "34436"
+    const-string/jumbo v0, "34437"
+    const-string/jumbo v0, "34438"
+    const-string/jumbo v0, "34439"
+    const-string/jumbo v0, "34440"
+    const-string/jumbo v0, "34441"
+    const-string/jumbo v0, "34442"
+    const-string/jumbo v0, "34443"
+    const-string/jumbo v0, "34444"
+    const-string/jumbo v0, "34445"
+    const-string/jumbo v0, "34446"
+    const-string/jumbo v0, "34447"
+    const-string/jumbo v0, "34448"
+    const-string/jumbo v0, "34449"
+    const-string/jumbo v0, "34450"
+    const-string/jumbo v0, "34451"
+    const-string/jumbo v0, "34452"
+    const-string/jumbo v0, "34453"
+    const-string/jumbo v0, "34454"
+    const-string/jumbo v0, "34455"
+    const-string/jumbo v0, "34456"
+    const-string/jumbo v0, "34457"
+    const-string/jumbo v0, "34458"
+    const-string/jumbo v0, "34459"
+    const-string/jumbo v0, "34460"
+    const-string/jumbo v0, "34461"
+    const-string/jumbo v0, "34462"
+    const-string/jumbo v0, "34463"
+    const-string/jumbo v0, "34464"
+    const-string/jumbo v0, "34465"
+    const-string/jumbo v0, "34466"
+    const-string/jumbo v0, "34467"
+    const-string/jumbo v0, "34468"
+    const-string/jumbo v0, "34469"
+    const-string/jumbo v0, "34470"
+    const-string/jumbo v0, "34471"
+    const-string/jumbo v0, "34472"
+    const-string/jumbo v0, "34473"
+    const-string/jumbo v0, "34474"
+    const-string/jumbo v0, "34475"
+    const-string/jumbo v0, "34476"
+    const-string/jumbo v0, "34477"
+    const-string/jumbo v0, "34478"
+    const-string/jumbo v0, "34479"
+    const-string/jumbo v0, "34480"
+    const-string/jumbo v0, "34481"
+    const-string/jumbo v0, "34482"
+    const-string/jumbo v0, "34483"
+    const-string/jumbo v0, "34484"
+    const-string/jumbo v0, "34485"
+    const-string/jumbo v0, "34486"
+    const-string/jumbo v0, "34487"
+    const-string/jumbo v0, "34488"
+    const-string/jumbo v0, "34489"
+    const-string/jumbo v0, "34490"
+    const-string/jumbo v0, "34491"
+    const-string/jumbo v0, "34492"
+    const-string/jumbo v0, "34493"
+    const-string/jumbo v0, "34494"
+    const-string/jumbo v0, "34495"
+    const-string/jumbo v0, "34496"
+    const-string/jumbo v0, "34497"
+    const-string/jumbo v0, "34498"
+    const-string/jumbo v0, "34499"
+    const-string/jumbo v0, "34500"
+    const-string/jumbo v0, "34501"
+    const-string/jumbo v0, "34502"
+    const-string/jumbo v0, "34503"
+    const-string/jumbo v0, "34504"
+    const-string/jumbo v0, "34505"
+    const-string/jumbo v0, "34506"
+    const-string/jumbo v0, "34507"
+    const-string/jumbo v0, "34508"
+    const-string/jumbo v0, "34509"
+    const-string/jumbo v0, "34510"
+    const-string/jumbo v0, "34511"
+    const-string/jumbo v0, "34512"
+    const-string/jumbo v0, "34513"
+    const-string/jumbo v0, "34514"
+    const-string/jumbo v0, "34515"
+    const-string/jumbo v0, "34516"
+    const-string/jumbo v0, "34517"
+    const-string/jumbo v0, "34518"
+    const-string/jumbo v0, "34519"
+    const-string/jumbo v0, "34520"
+    const-string/jumbo v0, "34521"
+    const-string/jumbo v0, "34522"
+    const-string/jumbo v0, "34523"
+    const-string/jumbo v0, "34524"
+    const-string/jumbo v0, "34525"
+    const-string/jumbo v0, "34526"
+    const-string/jumbo v0, "34527"
+    const-string/jumbo v0, "34528"
+    const-string/jumbo v0, "34529"
+    const-string/jumbo v0, "34530"
+    const-string/jumbo v0, "34531"
+    const-string/jumbo v0, "34532"
+    const-string/jumbo v0, "34533"
+    const-string/jumbo v0, "34534"
+    const-string/jumbo v0, "34535"
+    const-string/jumbo v0, "34536"
+    const-string/jumbo v0, "34537"
+    const-string/jumbo v0, "34538"
+    const-string/jumbo v0, "34539"
+    const-string/jumbo v0, "34540"
+    const-string/jumbo v0, "34541"
+    const-string/jumbo v0, "34542"
+    const-string/jumbo v0, "34543"
+    const-string/jumbo v0, "34544"
+    const-string/jumbo v0, "34545"
+    const-string/jumbo v0, "34546"
+    const-string/jumbo v0, "34547"
+    const-string/jumbo v0, "34548"
+    const-string/jumbo v0, "34549"
+    const-string/jumbo v0, "34550"
+    const-string/jumbo v0, "34551"
+    const-string/jumbo v0, "34552"
+    const-string/jumbo v0, "34553"
+    const-string/jumbo v0, "34554"
+    const-string/jumbo v0, "34555"
+    const-string/jumbo v0, "34556"
+    const-string/jumbo v0, "34557"
+    const-string/jumbo v0, "34558"
+    const-string/jumbo v0, "34559"
+    const-string/jumbo v0, "34560"
+    const-string/jumbo v0, "34561"
+    const-string/jumbo v0, "34562"
+    const-string/jumbo v0, "34563"
+    const-string/jumbo v0, "34564"
+    const-string/jumbo v0, "34565"
+    const-string/jumbo v0, "34566"
+    const-string/jumbo v0, "34567"
+    const-string/jumbo v0, "34568"
+    const-string/jumbo v0, "34569"
+    const-string/jumbo v0, "34570"
+    const-string/jumbo v0, "34571"
+    const-string/jumbo v0, "34572"
+    const-string/jumbo v0, "34573"
+    const-string/jumbo v0, "34574"
+    const-string/jumbo v0, "34575"
+    const-string/jumbo v0, "34576"
+    const-string/jumbo v0, "34577"
+    const-string/jumbo v0, "34578"
+    const-string/jumbo v0, "34579"
+    const-string/jumbo v0, "34580"
+    const-string/jumbo v0, "34581"
+    const-string/jumbo v0, "34582"
+    const-string/jumbo v0, "34583"
+    const-string/jumbo v0, "34584"
+    const-string/jumbo v0, "34585"
+    const-string/jumbo v0, "34586"
+    const-string/jumbo v0, "34587"
+    const-string/jumbo v0, "34588"
+    const-string/jumbo v0, "34589"
+    const-string/jumbo v0, "34590"
+    const-string/jumbo v0, "34591"
+    const-string/jumbo v0, "34592"
+    const-string/jumbo v0, "34593"
+    const-string/jumbo v0, "34594"
+    const-string/jumbo v0, "34595"
+    const-string/jumbo v0, "34596"
+    const-string/jumbo v0, "34597"
+    const-string/jumbo v0, "34598"
+    const-string/jumbo v0, "34599"
+    const-string/jumbo v0, "34600"
+    const-string/jumbo v0, "34601"
+    const-string/jumbo v0, "34602"
+    const-string/jumbo v0, "34603"
+    const-string/jumbo v0, "34604"
+    const-string/jumbo v0, "34605"
+    const-string/jumbo v0, "34606"
+    const-string/jumbo v0, "34607"
+    const-string/jumbo v0, "34608"
+    const-string/jumbo v0, "34609"
+    const-string/jumbo v0, "34610"
+    const-string/jumbo v0, "34611"
+    const-string/jumbo v0, "34612"
+    const-string/jumbo v0, "34613"
+    const-string/jumbo v0, "34614"
+    const-string/jumbo v0, "34615"
+    const-string/jumbo v0, "34616"
+    const-string/jumbo v0, "34617"
+    const-string/jumbo v0, "34618"
+    const-string/jumbo v0, "34619"
+    const-string/jumbo v0, "34620"
+    const-string/jumbo v0, "34621"
+    const-string/jumbo v0, "34622"
+    const-string/jumbo v0, "34623"
+    const-string/jumbo v0, "34624"
+    const-string/jumbo v0, "34625"
+    const-string/jumbo v0, "34626"
+    const-string/jumbo v0, "34627"
+    const-string/jumbo v0, "34628"
+    const-string/jumbo v0, "34629"
+    const-string/jumbo v0, "34630"
+    const-string/jumbo v0, "34631"
+    const-string/jumbo v0, "34632"
+    const-string/jumbo v0, "34633"
+    const-string/jumbo v0, "34634"
+    const-string/jumbo v0, "34635"
+    const-string/jumbo v0, "34636"
+    const-string/jumbo v0, "34637"
+    const-string/jumbo v0, "34638"
+    const-string/jumbo v0, "34639"
+    const-string/jumbo v0, "34640"
+    const-string/jumbo v0, "34641"
+    const-string/jumbo v0, "34642"
+    const-string/jumbo v0, "34643"
+    const-string/jumbo v0, "34644"
+    const-string/jumbo v0, "34645"
+    const-string/jumbo v0, "34646"
+    const-string/jumbo v0, "34647"
+    const-string/jumbo v0, "34648"
+    const-string/jumbo v0, "34649"
+    const-string/jumbo v0, "34650"
+    const-string/jumbo v0, "34651"
+    const-string/jumbo v0, "34652"
+    const-string/jumbo v0, "34653"
+    const-string/jumbo v0, "34654"
+    const-string/jumbo v0, "34655"
+    const-string/jumbo v0, "34656"
+    const-string/jumbo v0, "34657"
+    const-string/jumbo v0, "34658"
+    const-string/jumbo v0, "34659"
+    const-string/jumbo v0, "34660"
+    const-string/jumbo v0, "34661"
+    const-string/jumbo v0, "34662"
+    const-string/jumbo v0, "34663"
+    const-string/jumbo v0, "34664"
+    const-string/jumbo v0, "34665"
+    const-string/jumbo v0, "34666"
+    const-string/jumbo v0, "34667"
+    const-string/jumbo v0, "34668"
+    const-string/jumbo v0, "34669"
+    const-string/jumbo v0, "34670"
+    const-string/jumbo v0, "34671"
+    const-string/jumbo v0, "34672"
+    const-string/jumbo v0, "34673"
+    const-string/jumbo v0, "34674"
+    const-string/jumbo v0, "34675"
+    const-string/jumbo v0, "34676"
+    const-string/jumbo v0, "34677"
+    const-string/jumbo v0, "34678"
+    const-string/jumbo v0, "34679"
+    const-string/jumbo v0, "34680"
+    const-string/jumbo v0, "34681"
+    const-string/jumbo v0, "34682"
+    const-string/jumbo v0, "34683"
+    const-string/jumbo v0, "34684"
+    const-string/jumbo v0, "34685"
+    const-string/jumbo v0, "34686"
+    const-string/jumbo v0, "34687"
+    const-string/jumbo v0, "34688"
+    const-string/jumbo v0, "34689"
+    const-string/jumbo v0, "34690"
+    const-string/jumbo v0, "34691"
+    const-string/jumbo v0, "34692"
+    const-string/jumbo v0, "34693"
+    const-string/jumbo v0, "34694"
+    const-string/jumbo v0, "34695"
+    const-string/jumbo v0, "34696"
+    const-string/jumbo v0, "34697"
+    const-string/jumbo v0, "34698"
+    const-string/jumbo v0, "34699"
+    const-string/jumbo v0, "34700"
+    const-string/jumbo v0, "34701"
+    const-string/jumbo v0, "34702"
+    const-string/jumbo v0, "34703"
+    const-string/jumbo v0, "34704"
+    const-string/jumbo v0, "34705"
+    const-string/jumbo v0, "34706"
+    const-string/jumbo v0, "34707"
+    const-string/jumbo v0, "34708"
+    const-string/jumbo v0, "34709"
+    const-string/jumbo v0, "34710"
+    const-string/jumbo v0, "34711"
+    const-string/jumbo v0, "34712"
+    const-string/jumbo v0, "34713"
+    const-string/jumbo v0, "34714"
+    const-string/jumbo v0, "34715"
+    const-string/jumbo v0, "34716"
+    const-string/jumbo v0, "34717"
+    const-string/jumbo v0, "34718"
+    const-string/jumbo v0, "34719"
+    const-string/jumbo v0, "34720"
+    const-string/jumbo v0, "34721"
+    const-string/jumbo v0, "34722"
+    const-string/jumbo v0, "34723"
+    const-string/jumbo v0, "34724"
+    const-string/jumbo v0, "34725"
+    const-string/jumbo v0, "34726"
+    const-string/jumbo v0, "34727"
+    const-string/jumbo v0, "34728"
+    const-string/jumbo v0, "34729"
+    const-string/jumbo v0, "34730"
+    const-string/jumbo v0, "34731"
+    const-string/jumbo v0, "34732"
+    const-string/jumbo v0, "34733"
+    const-string/jumbo v0, "34734"
+    const-string/jumbo v0, "34735"
+    const-string/jumbo v0, "34736"
+    const-string/jumbo v0, "34737"
+    const-string/jumbo v0, "34738"
+    const-string/jumbo v0, "34739"
+    const-string/jumbo v0, "34740"
+    const-string/jumbo v0, "34741"
+    const-string/jumbo v0, "34742"
+    const-string/jumbo v0, "34743"
+    const-string/jumbo v0, "34744"
+    const-string/jumbo v0, "34745"
+    const-string/jumbo v0, "34746"
+    const-string/jumbo v0, "34747"
+    const-string/jumbo v0, "34748"
+    const-string/jumbo v0, "34749"
+    const-string/jumbo v0, "34750"
+    const-string/jumbo v0, "34751"
+    const-string/jumbo v0, "34752"
+    const-string/jumbo v0, "34753"
+    const-string/jumbo v0, "34754"
+    const-string/jumbo v0, "34755"
+    const-string/jumbo v0, "34756"
+    const-string/jumbo v0, "34757"
+    const-string/jumbo v0, "34758"
+    const-string/jumbo v0, "34759"
+    const-string/jumbo v0, "34760"
+    const-string/jumbo v0, "34761"
+    const-string/jumbo v0, "34762"
+    const-string/jumbo v0, "34763"
+    const-string/jumbo v0, "34764"
+    const-string/jumbo v0, "34765"
+    const-string/jumbo v0, "34766"
+    const-string/jumbo v0, "34767"
+    const-string/jumbo v0, "34768"
+    const-string/jumbo v0, "34769"
+    const-string/jumbo v0, "34770"
+    const-string/jumbo v0, "34771"
+    const-string/jumbo v0, "34772"
+    const-string/jumbo v0, "34773"
+    const-string/jumbo v0, "34774"
+    const-string/jumbo v0, "34775"
+    const-string/jumbo v0, "34776"
+    const-string/jumbo v0, "34777"
+    const-string/jumbo v0, "34778"
+    const-string/jumbo v0, "34779"
+    const-string/jumbo v0, "34780"
+    const-string/jumbo v0, "34781"
+    const-string/jumbo v0, "34782"
+    const-string/jumbo v0, "34783"
+    const-string/jumbo v0, "34784"
+    const-string/jumbo v0, "34785"
+    const-string/jumbo v0, "34786"
+    const-string/jumbo v0, "34787"
+    const-string/jumbo v0, "34788"
+    const-string/jumbo v0, "34789"
+    const-string/jumbo v0, "34790"
+    const-string/jumbo v0, "34791"
+    const-string/jumbo v0, "34792"
+    const-string/jumbo v0, "34793"
+    const-string/jumbo v0, "34794"
+    const-string/jumbo v0, "34795"
+    const-string/jumbo v0, "34796"
+    const-string/jumbo v0, "34797"
+    const-string/jumbo v0, "34798"
+    const-string/jumbo v0, "34799"
+    const-string/jumbo v0, "34800"
+    const-string/jumbo v0, "34801"
+    const-string/jumbo v0, "34802"
+    const-string/jumbo v0, "34803"
+    const-string/jumbo v0, "34804"
+    const-string/jumbo v0, "34805"
+    const-string/jumbo v0, "34806"
+    const-string/jumbo v0, "34807"
+    const-string/jumbo v0, "34808"
+    const-string/jumbo v0, "34809"
+    const-string/jumbo v0, "34810"
+    const-string/jumbo v0, "34811"
+    const-string/jumbo v0, "34812"
+    const-string/jumbo v0, "34813"
+    const-string/jumbo v0, "34814"
+    const-string/jumbo v0, "34815"
+    const-string/jumbo v0, "34816"
+    const-string/jumbo v0, "34817"
+    const-string/jumbo v0, "34818"
+    const-string/jumbo v0, "34819"
+    const-string/jumbo v0, "34820"
+    const-string/jumbo v0, "34821"
+    const-string/jumbo v0, "34822"
+    const-string/jumbo v0, "34823"
+    const-string/jumbo v0, "34824"
+    const-string/jumbo v0, "34825"
+    const-string/jumbo v0, "34826"
+    const-string/jumbo v0, "34827"
+    const-string/jumbo v0, "34828"
+    const-string/jumbo v0, "34829"
+    const-string/jumbo v0, "34830"
+    const-string/jumbo v0, "34831"
+    const-string/jumbo v0, "34832"
+    const-string/jumbo v0, "34833"
+    const-string/jumbo v0, "34834"
+    const-string/jumbo v0, "34835"
+    const-string/jumbo v0, "34836"
+    const-string/jumbo v0, "34837"
+    const-string/jumbo v0, "34838"
+    const-string/jumbo v0, "34839"
+    const-string/jumbo v0, "34840"
+    const-string/jumbo v0, "34841"
+    const-string/jumbo v0, "34842"
+    const-string/jumbo v0, "34843"
+    const-string/jumbo v0, "34844"
+    const-string/jumbo v0, "34845"
+    const-string/jumbo v0, "34846"
+    const-string/jumbo v0, "34847"
+    const-string/jumbo v0, "34848"
+    const-string/jumbo v0, "34849"
+    const-string/jumbo v0, "34850"
+    const-string/jumbo v0, "34851"
+    const-string/jumbo v0, "34852"
+    const-string/jumbo v0, "34853"
+    const-string/jumbo v0, "34854"
+    const-string/jumbo v0, "34855"
+    const-string/jumbo v0, "34856"
+    const-string/jumbo v0, "34857"
+    const-string/jumbo v0, "34858"
+    const-string/jumbo v0, "34859"
+    const-string/jumbo v0, "34860"
+    const-string/jumbo v0, "34861"
+    const-string/jumbo v0, "34862"
+    const-string/jumbo v0, "34863"
+    const-string/jumbo v0, "34864"
+    const-string/jumbo v0, "34865"
+    const-string/jumbo v0, "34866"
+    const-string/jumbo v0, "34867"
+    const-string/jumbo v0, "34868"
+    const-string/jumbo v0, "34869"
+    const-string/jumbo v0, "34870"
+    const-string/jumbo v0, "34871"
+    const-string/jumbo v0, "34872"
+    const-string/jumbo v0, "34873"
+    const-string/jumbo v0, "34874"
+    const-string/jumbo v0, "34875"
+    const-string/jumbo v0, "34876"
+    const-string/jumbo v0, "34877"
+    const-string/jumbo v0, "34878"
+    const-string/jumbo v0, "34879"
+    const-string/jumbo v0, "34880"
+    const-string/jumbo v0, "34881"
+    const-string/jumbo v0, "34882"
+    const-string/jumbo v0, "34883"
+    const-string/jumbo v0, "34884"
+    const-string/jumbo v0, "34885"
+    const-string/jumbo v0, "34886"
+    const-string/jumbo v0, "34887"
+    const-string/jumbo v0, "34888"
+    const-string/jumbo v0, "34889"
+    const-string/jumbo v0, "34890"
+    const-string/jumbo v0, "34891"
+    const-string/jumbo v0, "34892"
+    const-string/jumbo v0, "34893"
+    const-string/jumbo v0, "34894"
+    const-string/jumbo v0, "34895"
+    const-string/jumbo v0, "34896"
+    const-string/jumbo v0, "34897"
+    const-string/jumbo v0, "34898"
+    const-string/jumbo v0, "34899"
+    const-string/jumbo v0, "34900"
+    const-string/jumbo v0, "34901"
+    const-string/jumbo v0, "34902"
+    const-string/jumbo v0, "34903"
+    const-string/jumbo v0, "34904"
+    const-string/jumbo v0, "34905"
+    const-string/jumbo v0, "34906"
+    const-string/jumbo v0, "34907"
+    const-string/jumbo v0, "34908"
+    const-string/jumbo v0, "34909"
+    const-string/jumbo v0, "34910"
+    const-string/jumbo v0, "34911"
+    const-string/jumbo v0, "34912"
+    const-string/jumbo v0, "34913"
+    const-string/jumbo v0, "34914"
+    const-string/jumbo v0, "34915"
+    const-string/jumbo v0, "34916"
+    const-string/jumbo v0, "34917"
+    const-string/jumbo v0, "34918"
+    const-string/jumbo v0, "34919"
+    const-string/jumbo v0, "34920"
+    const-string/jumbo v0, "34921"
+    const-string/jumbo v0, "34922"
+    const-string/jumbo v0, "34923"
+    const-string/jumbo v0, "34924"
+    const-string/jumbo v0, "34925"
+    const-string/jumbo v0, "34926"
+    const-string/jumbo v0, "34927"
+    const-string/jumbo v0, "34928"
+    const-string/jumbo v0, "34929"
+    const-string/jumbo v0, "34930"
+    const-string/jumbo v0, "34931"
+    const-string/jumbo v0, "34932"
+    const-string/jumbo v0, "34933"
+    const-string/jumbo v0, "34934"
+    const-string/jumbo v0, "34935"
+    const-string/jumbo v0, "34936"
+    const-string/jumbo v0, "34937"
+    const-string/jumbo v0, "34938"
+    const-string/jumbo v0, "34939"
+    const-string/jumbo v0, "34940"
+    const-string/jumbo v0, "34941"
+    const-string/jumbo v0, "34942"
+    const-string/jumbo v0, "34943"
+    const-string/jumbo v0, "34944"
+    const-string/jumbo v0, "34945"
+    const-string/jumbo v0, "34946"
+    const-string/jumbo v0, "34947"
+    const-string/jumbo v0, "34948"
+    const-string/jumbo v0, "34949"
+    const-string/jumbo v0, "34950"
+    const-string/jumbo v0, "34951"
+    const-string/jumbo v0, "34952"
+    const-string/jumbo v0, "34953"
+    const-string/jumbo v0, "34954"
+    const-string/jumbo v0, "34955"
+    const-string/jumbo v0, "34956"
+    const-string/jumbo v0, "34957"
+    const-string/jumbo v0, "34958"
+    const-string/jumbo v0, "34959"
+    const-string/jumbo v0, "34960"
+    const-string/jumbo v0, "34961"
+    const-string/jumbo v0, "34962"
+    const-string/jumbo v0, "34963"
+    const-string/jumbo v0, "34964"
+    const-string/jumbo v0, "34965"
+    const-string/jumbo v0, "34966"
+    const-string/jumbo v0, "34967"
+    const-string/jumbo v0, "34968"
+    const-string/jumbo v0, "34969"
+    const-string/jumbo v0, "34970"
+    const-string/jumbo v0, "34971"
+    const-string/jumbo v0, "34972"
+    const-string/jumbo v0, "34973"
+    const-string/jumbo v0, "34974"
+    const-string/jumbo v0, "34975"
+    const-string/jumbo v0, "34976"
+    const-string/jumbo v0, "34977"
+    const-string/jumbo v0, "34978"
+    const-string/jumbo v0, "34979"
+    const-string/jumbo v0, "34980"
+    const-string/jumbo v0, "34981"
+    const-string/jumbo v0, "34982"
+    const-string/jumbo v0, "34983"
+    const-string/jumbo v0, "34984"
+    const-string/jumbo v0, "34985"
+    const-string/jumbo v0, "34986"
+    const-string/jumbo v0, "34987"
+    const-string/jumbo v0, "34988"
+    const-string/jumbo v0, "34989"
+    const-string/jumbo v0, "34990"
+    const-string/jumbo v0, "34991"
+    const-string/jumbo v0, "34992"
+    const-string/jumbo v0, "34993"
+    const-string/jumbo v0, "34994"
+    const-string/jumbo v0, "34995"
+    const-string/jumbo v0, "34996"
+    const-string/jumbo v0, "34997"
+    const-string/jumbo v0, "34998"
+    const-string/jumbo v0, "34999"
+    const-string/jumbo v0, "35000"
+    const-string/jumbo v0, "35001"
+    const-string/jumbo v0, "35002"
+    const-string/jumbo v0, "35003"
+    const-string/jumbo v0, "35004"
+    const-string/jumbo v0, "35005"
+    const-string/jumbo v0, "35006"
+    const-string/jumbo v0, "35007"
+    const-string/jumbo v0, "35008"
+    const-string/jumbo v0, "35009"
+    const-string/jumbo v0, "35010"
+    const-string/jumbo v0, "35011"
+    const-string/jumbo v0, "35012"
+    const-string/jumbo v0, "35013"
+    const-string/jumbo v0, "35014"
+    const-string/jumbo v0, "35015"
+    const-string/jumbo v0, "35016"
+    const-string/jumbo v0, "35017"
+    const-string/jumbo v0, "35018"
+    const-string/jumbo v0, "35019"
+    const-string/jumbo v0, "35020"
+    const-string/jumbo v0, "35021"
+    const-string/jumbo v0, "35022"
+    const-string/jumbo v0, "35023"
+    const-string/jumbo v0, "35024"
+    const-string/jumbo v0, "35025"
+    const-string/jumbo v0, "35026"
+    const-string/jumbo v0, "35027"
+    const-string/jumbo v0, "35028"
+    const-string/jumbo v0, "35029"
+    const-string/jumbo v0, "35030"
+    const-string/jumbo v0, "35031"
+    const-string/jumbo v0, "35032"
+    const-string/jumbo v0, "35033"
+    const-string/jumbo v0, "35034"
+    const-string/jumbo v0, "35035"
+    const-string/jumbo v0, "35036"
+    const-string/jumbo v0, "35037"
+    const-string/jumbo v0, "35038"
+    const-string/jumbo v0, "35039"
+    const-string/jumbo v0, "35040"
+    const-string/jumbo v0, "35041"
+    const-string/jumbo v0, "35042"
+    const-string/jumbo v0, "35043"
+    const-string/jumbo v0, "35044"
+    const-string/jumbo v0, "35045"
+    const-string/jumbo v0, "35046"
+    const-string/jumbo v0, "35047"
+    const-string/jumbo v0, "35048"
+    const-string/jumbo v0, "35049"
+    const-string/jumbo v0, "35050"
+    const-string/jumbo v0, "35051"
+    const-string/jumbo v0, "35052"
+    const-string/jumbo v0, "35053"
+    const-string/jumbo v0, "35054"
+    const-string/jumbo v0, "35055"
+    const-string/jumbo v0, "35056"
+    const-string/jumbo v0, "35057"
+    const-string/jumbo v0, "35058"
+    const-string/jumbo v0, "35059"
+    const-string/jumbo v0, "35060"
+    const-string/jumbo v0, "35061"
+    const-string/jumbo v0, "35062"
+    const-string/jumbo v0, "35063"
+    const-string/jumbo v0, "35064"
+    const-string/jumbo v0, "35065"
+    const-string/jumbo v0, "35066"
+    const-string/jumbo v0, "35067"
+    const-string/jumbo v0, "35068"
+    const-string/jumbo v0, "35069"
+    const-string/jumbo v0, "35070"
+    const-string/jumbo v0, "35071"
+    const-string/jumbo v0, "35072"
+    const-string/jumbo v0, "35073"
+    const-string/jumbo v0, "35074"
+    const-string/jumbo v0, "35075"
+    const-string/jumbo v0, "35076"
+    const-string/jumbo v0, "35077"
+    const-string/jumbo v0, "35078"
+    const-string/jumbo v0, "35079"
+    const-string/jumbo v0, "35080"
+    const-string/jumbo v0, "35081"
+    const-string/jumbo v0, "35082"
+    const-string/jumbo v0, "35083"
+    const-string/jumbo v0, "35084"
+    const-string/jumbo v0, "35085"
+    const-string/jumbo v0, "35086"
+    const-string/jumbo v0, "35087"
+    const-string/jumbo v0, "35088"
+    const-string/jumbo v0, "35089"
+    const-string/jumbo v0, "35090"
+    const-string/jumbo v0, "35091"
+    const-string/jumbo v0, "35092"
+    const-string/jumbo v0, "35093"
+    const-string/jumbo v0, "35094"
+    const-string/jumbo v0, "35095"
+    const-string/jumbo v0, "35096"
+    const-string/jumbo v0, "35097"
+    const-string/jumbo v0, "35098"
+    const-string/jumbo v0, "35099"
+    const-string/jumbo v0, "35100"
+    const-string/jumbo v0, "35101"
+    const-string/jumbo v0, "35102"
+    const-string/jumbo v0, "35103"
+    const-string/jumbo v0, "35104"
+    const-string/jumbo v0, "35105"
+    const-string/jumbo v0, "35106"
+    const-string/jumbo v0, "35107"
+    const-string/jumbo v0, "35108"
+    const-string/jumbo v0, "35109"
+    const-string/jumbo v0, "35110"
+    const-string/jumbo v0, "35111"
+    const-string/jumbo v0, "35112"
+    const-string/jumbo v0, "35113"
+    const-string/jumbo v0, "35114"
+    const-string/jumbo v0, "35115"
+    const-string/jumbo v0, "35116"
+    const-string/jumbo v0, "35117"
+    const-string/jumbo v0, "35118"
+    const-string/jumbo v0, "35119"
+    const-string/jumbo v0, "35120"
+    const-string/jumbo v0, "35121"
+    const-string/jumbo v0, "35122"
+    const-string/jumbo v0, "35123"
+    const-string/jumbo v0, "35124"
+    const-string/jumbo v0, "35125"
+    const-string/jumbo v0, "35126"
+    const-string/jumbo v0, "35127"
+    const-string/jumbo v0, "35128"
+    const-string/jumbo v0, "35129"
+    const-string/jumbo v0, "35130"
+    const-string/jumbo v0, "35131"
+    const-string/jumbo v0, "35132"
+    const-string/jumbo v0, "35133"
+    const-string/jumbo v0, "35134"
+    const-string/jumbo v0, "35135"
+    const-string/jumbo v0, "35136"
+    const-string/jumbo v0, "35137"
+    const-string/jumbo v0, "35138"
+    const-string/jumbo v0, "35139"
+    const-string/jumbo v0, "35140"
+    const-string/jumbo v0, "35141"
+    const-string/jumbo v0, "35142"
+    const-string/jumbo v0, "35143"
+    const-string/jumbo v0, "35144"
+    const-string/jumbo v0, "35145"
+    const-string/jumbo v0, "35146"
+    const-string/jumbo v0, "35147"
+    const-string/jumbo v0, "35148"
+    const-string/jumbo v0, "35149"
+    const-string/jumbo v0, "35150"
+    const-string/jumbo v0, "35151"
+    const-string/jumbo v0, "35152"
+    const-string/jumbo v0, "35153"
+    const-string/jumbo v0, "35154"
+    const-string/jumbo v0, "35155"
+    const-string/jumbo v0, "35156"
+    const-string/jumbo v0, "35157"
+    const-string/jumbo v0, "35158"
+    const-string/jumbo v0, "35159"
+    const-string/jumbo v0, "35160"
+    const-string/jumbo v0, "35161"
+    const-string/jumbo v0, "35162"
+    const-string/jumbo v0, "35163"
+    const-string/jumbo v0, "35164"
+    const-string/jumbo v0, "35165"
+    const-string/jumbo v0, "35166"
+    const-string/jumbo v0, "35167"
+    const-string/jumbo v0, "35168"
+    const-string/jumbo v0, "35169"
+    const-string/jumbo v0, "35170"
+    const-string/jumbo v0, "35171"
+    const-string/jumbo v0, "35172"
+    const-string/jumbo v0, "35173"
+    const-string/jumbo v0, "35174"
+    const-string/jumbo v0, "35175"
+    const-string/jumbo v0, "35176"
+    const-string/jumbo v0, "35177"
+    const-string/jumbo v0, "35178"
+    const-string/jumbo v0, "35179"
+    const-string/jumbo v0, "35180"
+    const-string/jumbo v0, "35181"
+    const-string/jumbo v0, "35182"
+    const-string/jumbo v0, "35183"
+    const-string/jumbo v0, "35184"
+    const-string/jumbo v0, "35185"
+    const-string/jumbo v0, "35186"
+    const-string/jumbo v0, "35187"
+    const-string/jumbo v0, "35188"
+    const-string/jumbo v0, "35189"
+    const-string/jumbo v0, "35190"
+    const-string/jumbo v0, "35191"
+    const-string/jumbo v0, "35192"
+    const-string/jumbo v0, "35193"
+    const-string/jumbo v0, "35194"
+    const-string/jumbo v0, "35195"
+    const-string/jumbo v0, "35196"
+    const-string/jumbo v0, "35197"
+    const-string/jumbo v0, "35198"
+    const-string/jumbo v0, "35199"
+    const-string/jumbo v0, "35200"
+    const-string/jumbo v0, "35201"
+    const-string/jumbo v0, "35202"
+    const-string/jumbo v0, "35203"
+    const-string/jumbo v0, "35204"
+    const-string/jumbo v0, "35205"
+    const-string/jumbo v0, "35206"
+    const-string/jumbo v0, "35207"
+    const-string/jumbo v0, "35208"
+    const-string/jumbo v0, "35209"
+    const-string/jumbo v0, "35210"
+    const-string/jumbo v0, "35211"
+    const-string/jumbo v0, "35212"
+    const-string/jumbo v0, "35213"
+    const-string/jumbo v0, "35214"
+    const-string/jumbo v0, "35215"
+    const-string/jumbo v0, "35216"
+    const-string/jumbo v0, "35217"
+    const-string/jumbo v0, "35218"
+    const-string/jumbo v0, "35219"
+    const-string/jumbo v0, "35220"
+    const-string/jumbo v0, "35221"
+    const-string/jumbo v0, "35222"
+    const-string/jumbo v0, "35223"
+    const-string/jumbo v0, "35224"
+    const-string/jumbo v0, "35225"
+    const-string/jumbo v0, "35226"
+    const-string/jumbo v0, "35227"
+    const-string/jumbo v0, "35228"
+    const-string/jumbo v0, "35229"
+    const-string/jumbo v0, "35230"
+    const-string/jumbo v0, "35231"
+    const-string/jumbo v0, "35232"
+    const-string/jumbo v0, "35233"
+    const-string/jumbo v0, "35234"
+    const-string/jumbo v0, "35235"
+    const-string/jumbo v0, "35236"
+    const-string/jumbo v0, "35237"
+    const-string/jumbo v0, "35238"
+    const-string/jumbo v0, "35239"
+    const-string/jumbo v0, "35240"
+    const-string/jumbo v0, "35241"
+    const-string/jumbo v0, "35242"
+    const-string/jumbo v0, "35243"
+    const-string/jumbo v0, "35244"
+    const-string/jumbo v0, "35245"
+    const-string/jumbo v0, "35246"
+    const-string/jumbo v0, "35247"
+    const-string/jumbo v0, "35248"
+    const-string/jumbo v0, "35249"
+    const-string/jumbo v0, "35250"
+    const-string/jumbo v0, "35251"
+    const-string/jumbo v0, "35252"
+    const-string/jumbo v0, "35253"
+    const-string/jumbo v0, "35254"
+    const-string/jumbo v0, "35255"
+    const-string/jumbo v0, "35256"
+    const-string/jumbo v0, "35257"
+    const-string/jumbo v0, "35258"
+    const-string/jumbo v0, "35259"
+    const-string/jumbo v0, "35260"
+    const-string/jumbo v0, "35261"
+    const-string/jumbo v0, "35262"
+    const-string/jumbo v0, "35263"
+    const-string/jumbo v0, "35264"
+    const-string/jumbo v0, "35265"
+    const-string/jumbo v0, "35266"
+    const-string/jumbo v0, "35267"
+    const-string/jumbo v0, "35268"
+    const-string/jumbo v0, "35269"
+    const-string/jumbo v0, "35270"
+    const-string/jumbo v0, "35271"
+    const-string/jumbo v0, "35272"
+    const-string/jumbo v0, "35273"
+    const-string/jumbo v0, "35274"
+    const-string/jumbo v0, "35275"
+    const-string/jumbo v0, "35276"
+    const-string/jumbo v0, "35277"
+    const-string/jumbo v0, "35278"
+    const-string/jumbo v0, "35279"
+    const-string/jumbo v0, "35280"
+    const-string/jumbo v0, "35281"
+    const-string/jumbo v0, "35282"
+    const-string/jumbo v0, "35283"
+    const-string/jumbo v0, "35284"
+    const-string/jumbo v0, "35285"
+    const-string/jumbo v0, "35286"
+    const-string/jumbo v0, "35287"
+    const-string/jumbo v0, "35288"
+    const-string/jumbo v0, "35289"
+    const-string/jumbo v0, "35290"
+    const-string/jumbo v0, "35291"
+    const-string/jumbo v0, "35292"
+    const-string/jumbo v0, "35293"
+    const-string/jumbo v0, "35294"
+    const-string/jumbo v0, "35295"
+    const-string/jumbo v0, "35296"
+    const-string/jumbo v0, "35297"
+    const-string/jumbo v0, "35298"
+    const-string/jumbo v0, "35299"
+    const-string/jumbo v0, "35300"
+    const-string/jumbo v0, "35301"
+    const-string/jumbo v0, "35302"
+    const-string/jumbo v0, "35303"
+    const-string/jumbo v0, "35304"
+    const-string/jumbo v0, "35305"
+    const-string/jumbo v0, "35306"
+    const-string/jumbo v0, "35307"
+    const-string/jumbo v0, "35308"
+    const-string/jumbo v0, "35309"
+    const-string/jumbo v0, "35310"
+    const-string/jumbo v0, "35311"
+    const-string/jumbo v0, "35312"
+    const-string/jumbo v0, "35313"
+    const-string/jumbo v0, "35314"
+    const-string/jumbo v0, "35315"
+    const-string/jumbo v0, "35316"
+    const-string/jumbo v0, "35317"
+    const-string/jumbo v0, "35318"
+    const-string/jumbo v0, "35319"
+    const-string/jumbo v0, "35320"
+    const-string/jumbo v0, "35321"
+    const-string/jumbo v0, "35322"
+    const-string/jumbo v0, "35323"
+    const-string/jumbo v0, "35324"
+    const-string/jumbo v0, "35325"
+    const-string/jumbo v0, "35326"
+    const-string/jumbo v0, "35327"
+    const-string/jumbo v0, "35328"
+    const-string/jumbo v0, "35329"
+    const-string/jumbo v0, "35330"
+    const-string/jumbo v0, "35331"
+    const-string/jumbo v0, "35332"
+    const-string/jumbo v0, "35333"
+    const-string/jumbo v0, "35334"
+    const-string/jumbo v0, "35335"
+    const-string/jumbo v0, "35336"
+    const-string/jumbo v0, "35337"
+    const-string/jumbo v0, "35338"
+    const-string/jumbo v0, "35339"
+    const-string/jumbo v0, "35340"
+    const-string/jumbo v0, "35341"
+    const-string/jumbo v0, "35342"
+    const-string/jumbo v0, "35343"
+    const-string/jumbo v0, "35344"
+    const-string/jumbo v0, "35345"
+    const-string/jumbo v0, "35346"
+    const-string/jumbo v0, "35347"
+    const-string/jumbo v0, "35348"
+    const-string/jumbo v0, "35349"
+    const-string/jumbo v0, "35350"
+    const-string/jumbo v0, "35351"
+    const-string/jumbo v0, "35352"
+    const-string/jumbo v0, "35353"
+    const-string/jumbo v0, "35354"
+    const-string/jumbo v0, "35355"
+    const-string/jumbo v0, "35356"
+    const-string/jumbo v0, "35357"
+    const-string/jumbo v0, "35358"
+    const-string/jumbo v0, "35359"
+    const-string/jumbo v0, "35360"
+    const-string/jumbo v0, "35361"
+    const-string/jumbo v0, "35362"
+    const-string/jumbo v0, "35363"
+    const-string/jumbo v0, "35364"
+    const-string/jumbo v0, "35365"
+    const-string/jumbo v0, "35366"
+    const-string/jumbo v0, "35367"
+    const-string/jumbo v0, "35368"
+    const-string/jumbo v0, "35369"
+    const-string/jumbo v0, "35370"
+    const-string/jumbo v0, "35371"
+    const-string/jumbo v0, "35372"
+    const-string/jumbo v0, "35373"
+    const-string/jumbo v0, "35374"
+    const-string/jumbo v0, "35375"
+    const-string/jumbo v0, "35376"
+    const-string/jumbo v0, "35377"
+    const-string/jumbo v0, "35378"
+    const-string/jumbo v0, "35379"
+    const-string/jumbo v0, "35380"
+    const-string/jumbo v0, "35381"
+    const-string/jumbo v0, "35382"
+    const-string/jumbo v0, "35383"
+    const-string/jumbo v0, "35384"
+    const-string/jumbo v0, "35385"
+    const-string/jumbo v0, "35386"
+    const-string/jumbo v0, "35387"
+    const-string/jumbo v0, "35388"
+    const-string/jumbo v0, "35389"
+    const-string/jumbo v0, "35390"
+    const-string/jumbo v0, "35391"
+    const-string/jumbo v0, "35392"
+    const-string/jumbo v0, "35393"
+    const-string/jumbo v0, "35394"
+    const-string/jumbo v0, "35395"
+    const-string/jumbo v0, "35396"
+    const-string/jumbo v0, "35397"
+    const-string/jumbo v0, "35398"
+    const-string/jumbo v0, "35399"
+    const-string/jumbo v0, "35400"
+    const-string/jumbo v0, "35401"
+    const-string/jumbo v0, "35402"
+    const-string/jumbo v0, "35403"
+    const-string/jumbo v0, "35404"
+    const-string/jumbo v0, "35405"
+    const-string/jumbo v0, "35406"
+    const-string/jumbo v0, "35407"
+    const-string/jumbo v0, "35408"
+    const-string/jumbo v0, "35409"
+    const-string/jumbo v0, "35410"
+    const-string/jumbo v0, "35411"
+    const-string/jumbo v0, "35412"
+    const-string/jumbo v0, "35413"
+    const-string/jumbo v0, "35414"
+    const-string/jumbo v0, "35415"
+    const-string/jumbo v0, "35416"
+    const-string/jumbo v0, "35417"
+    const-string/jumbo v0, "35418"
+    const-string/jumbo v0, "35419"
+    const-string/jumbo v0, "35420"
+    const-string/jumbo v0, "35421"
+    const-string/jumbo v0, "35422"
+    const-string/jumbo v0, "35423"
+    const-string/jumbo v0, "35424"
+    const-string/jumbo v0, "35425"
+    const-string/jumbo v0, "35426"
+    const-string/jumbo v0, "35427"
+    const-string/jumbo v0, "35428"
+    const-string/jumbo v0, "35429"
+    const-string/jumbo v0, "35430"
+    const-string/jumbo v0, "35431"
+    const-string/jumbo v0, "35432"
+    const-string/jumbo v0, "35433"
+    const-string/jumbo v0, "35434"
+    const-string/jumbo v0, "35435"
+    const-string/jumbo v0, "35436"
+    const-string/jumbo v0, "35437"
+    const-string/jumbo v0, "35438"
+    const-string/jumbo v0, "35439"
+    const-string/jumbo v0, "35440"
+    const-string/jumbo v0, "35441"
+    const-string/jumbo v0, "35442"
+    const-string/jumbo v0, "35443"
+    const-string/jumbo v0, "35444"
+    const-string/jumbo v0, "35445"
+    const-string/jumbo v0, "35446"
+    const-string/jumbo v0, "35447"
+    const-string/jumbo v0, "35448"
+    const-string/jumbo v0, "35449"
+    const-string/jumbo v0, "35450"
+    const-string/jumbo v0, "35451"
+    const-string/jumbo v0, "35452"
+    const-string/jumbo v0, "35453"
+    const-string/jumbo v0, "35454"
+    const-string/jumbo v0, "35455"
+    const-string/jumbo v0, "35456"
+    const-string/jumbo v0, "35457"
+    const-string/jumbo v0, "35458"
+    const-string/jumbo v0, "35459"
+    const-string/jumbo v0, "35460"
+    const-string/jumbo v0, "35461"
+    const-string/jumbo v0, "35462"
+    const-string/jumbo v0, "35463"
+    const-string/jumbo v0, "35464"
+    const-string/jumbo v0, "35465"
+    const-string/jumbo v0, "35466"
+    const-string/jumbo v0, "35467"
+    const-string/jumbo v0, "35468"
+    const-string/jumbo v0, "35469"
+    const-string/jumbo v0, "35470"
+    const-string/jumbo v0, "35471"
+    const-string/jumbo v0, "35472"
+    const-string/jumbo v0, "35473"
+    const-string/jumbo v0, "35474"
+    const-string/jumbo v0, "35475"
+    const-string/jumbo v0, "35476"
+    const-string/jumbo v0, "35477"
+    const-string/jumbo v0, "35478"
+    const-string/jumbo v0, "35479"
+    const-string/jumbo v0, "35480"
+    const-string/jumbo v0, "35481"
+    const-string/jumbo v0, "35482"
+    const-string/jumbo v0, "35483"
+    const-string/jumbo v0, "35484"
+    const-string/jumbo v0, "35485"
+    const-string/jumbo v0, "35486"
+    const-string/jumbo v0, "35487"
+    const-string/jumbo v0, "35488"
+    const-string/jumbo v0, "35489"
+    const-string/jumbo v0, "35490"
+    const-string/jumbo v0, "35491"
+    const-string/jumbo v0, "35492"
+    const-string/jumbo v0, "35493"
+    const-string/jumbo v0, "35494"
+    const-string/jumbo v0, "35495"
+    const-string/jumbo v0, "35496"
+    const-string/jumbo v0, "35497"
+    const-string/jumbo v0, "35498"
+    const-string/jumbo v0, "35499"
+    const-string/jumbo v0, "35500"
+    const-string/jumbo v0, "35501"
+    const-string/jumbo v0, "35502"
+    const-string/jumbo v0, "35503"
+    const-string/jumbo v0, "35504"
+    const-string/jumbo v0, "35505"
+    const-string/jumbo v0, "35506"
+    const-string/jumbo v0, "35507"
+    const-string/jumbo v0, "35508"
+    const-string/jumbo v0, "35509"
+    const-string/jumbo v0, "35510"
+    const-string/jumbo v0, "35511"
+    const-string/jumbo v0, "35512"
+    const-string/jumbo v0, "35513"
+    const-string/jumbo v0, "35514"
+    const-string/jumbo v0, "35515"
+    const-string/jumbo v0, "35516"
+    const-string/jumbo v0, "35517"
+    const-string/jumbo v0, "35518"
+    const-string/jumbo v0, "35519"
+    const-string/jumbo v0, "35520"
+    const-string/jumbo v0, "35521"
+    const-string/jumbo v0, "35522"
+    const-string/jumbo v0, "35523"
+    const-string/jumbo v0, "35524"
+    const-string/jumbo v0, "35525"
+    const-string/jumbo v0, "35526"
+    const-string/jumbo v0, "35527"
+    const-string/jumbo v0, "35528"
+    const-string/jumbo v0, "35529"
+    const-string/jumbo v0, "35530"
+    const-string/jumbo v0, "35531"
+    const-string/jumbo v0, "35532"
+    const-string/jumbo v0, "35533"
+    const-string/jumbo v0, "35534"
+    const-string/jumbo v0, "35535"
+    const-string/jumbo v0, "35536"
+    const-string/jumbo v0, "35537"
+    const-string/jumbo v0, "35538"
+    const-string/jumbo v0, "35539"
+    const-string/jumbo v0, "35540"
+    const-string/jumbo v0, "35541"
+    const-string/jumbo v0, "35542"
+    const-string/jumbo v0, "35543"
+    const-string/jumbo v0, "35544"
+    const-string/jumbo v0, "35545"
+    const-string/jumbo v0, "35546"
+    const-string/jumbo v0, "35547"
+    const-string/jumbo v0, "35548"
+    const-string/jumbo v0, "35549"
+    const-string/jumbo v0, "35550"
+    const-string/jumbo v0, "35551"
+    const-string/jumbo v0, "35552"
+    const-string/jumbo v0, "35553"
+    const-string/jumbo v0, "35554"
+    const-string/jumbo v0, "35555"
+    const-string/jumbo v0, "35556"
+    const-string/jumbo v0, "35557"
+    const-string/jumbo v0, "35558"
+    const-string/jumbo v0, "35559"
+    const-string/jumbo v0, "35560"
+    const-string/jumbo v0, "35561"
+    const-string/jumbo v0, "35562"
+    const-string/jumbo v0, "35563"
+    const-string/jumbo v0, "35564"
+    const-string/jumbo v0, "35565"
+    const-string/jumbo v0, "35566"
+    const-string/jumbo v0, "35567"
+    const-string/jumbo v0, "35568"
+    const-string/jumbo v0, "35569"
+    const-string/jumbo v0, "35570"
+    const-string/jumbo v0, "35571"
+    const-string/jumbo v0, "35572"
+    const-string/jumbo v0, "35573"
+    const-string/jumbo v0, "35574"
+    const-string/jumbo v0, "35575"
+    const-string/jumbo v0, "35576"
+    const-string/jumbo v0, "35577"
+    const-string/jumbo v0, "35578"
+    const-string/jumbo v0, "35579"
+    const-string/jumbo v0, "35580"
+    const-string/jumbo v0, "35581"
+    const-string/jumbo v0, "35582"
+    const-string/jumbo v0, "35583"
+    const-string/jumbo v0, "35584"
+    const-string/jumbo v0, "35585"
+    const-string/jumbo v0, "35586"
+    const-string/jumbo v0, "35587"
+    const-string/jumbo v0, "35588"
+    const-string/jumbo v0, "35589"
+    const-string/jumbo v0, "35590"
+    const-string/jumbo v0, "35591"
+    const-string/jumbo v0, "35592"
+    const-string/jumbo v0, "35593"
+    const-string/jumbo v0, "35594"
+    const-string/jumbo v0, "35595"
+    const-string/jumbo v0, "35596"
+    const-string/jumbo v0, "35597"
+    const-string/jumbo v0, "35598"
+    const-string/jumbo v0, "35599"
+    const-string/jumbo v0, "35600"
+    const-string/jumbo v0, "35601"
+    const-string/jumbo v0, "35602"
+    const-string/jumbo v0, "35603"
+    const-string/jumbo v0, "35604"
+    const-string/jumbo v0, "35605"
+    const-string/jumbo v0, "35606"
+    const-string/jumbo v0, "35607"
+    const-string/jumbo v0, "35608"
+    const-string/jumbo v0, "35609"
+    const-string/jumbo v0, "35610"
+    const-string/jumbo v0, "35611"
+    const-string/jumbo v0, "35612"
+    const-string/jumbo v0, "35613"
+    const-string/jumbo v0, "35614"
+    const-string/jumbo v0, "35615"
+    const-string/jumbo v0, "35616"
+    const-string/jumbo v0, "35617"
+    const-string/jumbo v0, "35618"
+    const-string/jumbo v0, "35619"
+    const-string/jumbo v0, "35620"
+    const-string/jumbo v0, "35621"
+    const-string/jumbo v0, "35622"
+    const-string/jumbo v0, "35623"
+    const-string/jumbo v0, "35624"
+    const-string/jumbo v0, "35625"
+    const-string/jumbo v0, "35626"
+    const-string/jumbo v0, "35627"
+    const-string/jumbo v0, "35628"
+    const-string/jumbo v0, "35629"
+    const-string/jumbo v0, "35630"
+    const-string/jumbo v0, "35631"
+    const-string/jumbo v0, "35632"
+    const-string/jumbo v0, "35633"
+    const-string/jumbo v0, "35634"
+    const-string/jumbo v0, "35635"
+    const-string/jumbo v0, "35636"
+    const-string/jumbo v0, "35637"
+    const-string/jumbo v0, "35638"
+    const-string/jumbo v0, "35639"
+    const-string/jumbo v0, "35640"
+    const-string/jumbo v0, "35641"
+    const-string/jumbo v0, "35642"
+    const-string/jumbo v0, "35643"
+    const-string/jumbo v0, "35644"
+    const-string/jumbo v0, "35645"
+    const-string/jumbo v0, "35646"
+    const-string/jumbo v0, "35647"
+    const-string/jumbo v0, "35648"
+    const-string/jumbo v0, "35649"
+    const-string/jumbo v0, "35650"
+    const-string/jumbo v0, "35651"
+    const-string/jumbo v0, "35652"
+    const-string/jumbo v0, "35653"
+    const-string/jumbo v0, "35654"
+    const-string/jumbo v0, "35655"
+    const-string/jumbo v0, "35656"
+    const-string/jumbo v0, "35657"
+    const-string/jumbo v0, "35658"
+    const-string/jumbo v0, "35659"
+    const-string/jumbo v0, "35660"
+    const-string/jumbo v0, "35661"
+    const-string/jumbo v0, "35662"
+    const-string/jumbo v0, "35663"
+    const-string/jumbo v0, "35664"
+    const-string/jumbo v0, "35665"
+    const-string/jumbo v0, "35666"
+    const-string/jumbo v0, "35667"
+    const-string/jumbo v0, "35668"
+    const-string/jumbo v0, "35669"
+    const-string/jumbo v0, "35670"
+    const-string/jumbo v0, "35671"
+    const-string/jumbo v0, "35672"
+    const-string/jumbo v0, "35673"
+    const-string/jumbo v0, "35674"
+    const-string/jumbo v0, "35675"
+    const-string/jumbo v0, "35676"
+    const-string/jumbo v0, "35677"
+    const-string/jumbo v0, "35678"
+    const-string/jumbo v0, "35679"
+    const-string/jumbo v0, "35680"
+    const-string/jumbo v0, "35681"
+    const-string/jumbo v0, "35682"
+    const-string/jumbo v0, "35683"
+    const-string/jumbo v0, "35684"
+    const-string/jumbo v0, "35685"
+    const-string/jumbo v0, "35686"
+    const-string/jumbo v0, "35687"
+    const-string/jumbo v0, "35688"
+    const-string/jumbo v0, "35689"
+    const-string/jumbo v0, "35690"
+    const-string/jumbo v0, "35691"
+    const-string/jumbo v0, "35692"
+    const-string/jumbo v0, "35693"
+    const-string/jumbo v0, "35694"
+    const-string/jumbo v0, "35695"
+    const-string/jumbo v0, "35696"
+    const-string/jumbo v0, "35697"
+    const-string/jumbo v0, "35698"
+    const-string/jumbo v0, "35699"
+    const-string/jumbo v0, "35700"
+    const-string/jumbo v0, "35701"
+    const-string/jumbo v0, "35702"
+    const-string/jumbo v0, "35703"
+    const-string/jumbo v0, "35704"
+    const-string/jumbo v0, "35705"
+    const-string/jumbo v0, "35706"
+    const-string/jumbo v0, "35707"
+    const-string/jumbo v0, "35708"
+    const-string/jumbo v0, "35709"
+    const-string/jumbo v0, "35710"
+    const-string/jumbo v0, "35711"
+    const-string/jumbo v0, "35712"
+    const-string/jumbo v0, "35713"
+    const-string/jumbo v0, "35714"
+    const-string/jumbo v0, "35715"
+    const-string/jumbo v0, "35716"
+    const-string/jumbo v0, "35717"
+    const-string/jumbo v0, "35718"
+    const-string/jumbo v0, "35719"
+    const-string/jumbo v0, "35720"
+    const-string/jumbo v0, "35721"
+    const-string/jumbo v0, "35722"
+    const-string/jumbo v0, "35723"
+    const-string/jumbo v0, "35724"
+    const-string/jumbo v0, "35725"
+    const-string/jumbo v0, "35726"
+    const-string/jumbo v0, "35727"
+    const-string/jumbo v0, "35728"
+    const-string/jumbo v0, "35729"
+    const-string/jumbo v0, "35730"
+    const-string/jumbo v0, "35731"
+    const-string/jumbo v0, "35732"
+    const-string/jumbo v0, "35733"
+    const-string/jumbo v0, "35734"
+    const-string/jumbo v0, "35735"
+    const-string/jumbo v0, "35736"
+    const-string/jumbo v0, "35737"
+    const-string/jumbo v0, "35738"
+    const-string/jumbo v0, "35739"
+    const-string/jumbo v0, "35740"
+    const-string/jumbo v0, "35741"
+    const-string/jumbo v0, "35742"
+    const-string/jumbo v0, "35743"
+    const-string/jumbo v0, "35744"
+    const-string/jumbo v0, "35745"
+    const-string/jumbo v0, "35746"
+    const-string/jumbo v0, "35747"
+    const-string/jumbo v0, "35748"
+    const-string/jumbo v0, "35749"
+    const-string/jumbo v0, "35750"
+    const-string/jumbo v0, "35751"
+    const-string/jumbo v0, "35752"
+    const-string/jumbo v0, "35753"
+    const-string/jumbo v0, "35754"
+    const-string/jumbo v0, "35755"
+    const-string/jumbo v0, "35756"
+    const-string/jumbo v0, "35757"
+    const-string/jumbo v0, "35758"
+    const-string/jumbo v0, "35759"
+    const-string/jumbo v0, "35760"
+    const-string/jumbo v0, "35761"
+    const-string/jumbo v0, "35762"
+    const-string/jumbo v0, "35763"
+    const-string/jumbo v0, "35764"
+    const-string/jumbo v0, "35765"
+    const-string/jumbo v0, "35766"
+    const-string/jumbo v0, "35767"
+    const-string/jumbo v0, "35768"
+    const-string/jumbo v0, "35769"
+    const-string/jumbo v0, "35770"
+    const-string/jumbo v0, "35771"
+    const-string/jumbo v0, "35772"
+    const-string/jumbo v0, "35773"
+    const-string/jumbo v0, "35774"
+    const-string/jumbo v0, "35775"
+    const-string/jumbo v0, "35776"
+    const-string/jumbo v0, "35777"
+    const-string/jumbo v0, "35778"
+    const-string/jumbo v0, "35779"
+    const-string/jumbo v0, "35780"
+    const-string/jumbo v0, "35781"
+    const-string/jumbo v0, "35782"
+    const-string/jumbo v0, "35783"
+    const-string/jumbo v0, "35784"
+    const-string/jumbo v0, "35785"
+    const-string/jumbo v0, "35786"
+    const-string/jumbo v0, "35787"
+    const-string/jumbo v0, "35788"
+    const-string/jumbo v0, "35789"
+    const-string/jumbo v0, "35790"
+    const-string/jumbo v0, "35791"
+    const-string/jumbo v0, "35792"
+    const-string/jumbo v0, "35793"
+    const-string/jumbo v0, "35794"
+    const-string/jumbo v0, "35795"
+    const-string/jumbo v0, "35796"
+    const-string/jumbo v0, "35797"
+    const-string/jumbo v0, "35798"
+    const-string/jumbo v0, "35799"
+    const-string/jumbo v0, "35800"
+    const-string/jumbo v0, "35801"
+    const-string/jumbo v0, "35802"
+    const-string/jumbo v0, "35803"
+    const-string/jumbo v0, "35804"
+    const-string/jumbo v0, "35805"
+    const-string/jumbo v0, "35806"
+    const-string/jumbo v0, "35807"
+    const-string/jumbo v0, "35808"
+    const-string/jumbo v0, "35809"
+    const-string/jumbo v0, "35810"
+    const-string/jumbo v0, "35811"
+    const-string/jumbo v0, "35812"
+    const-string/jumbo v0, "35813"
+    const-string/jumbo v0, "35814"
+    const-string/jumbo v0, "35815"
+    const-string/jumbo v0, "35816"
+    const-string/jumbo v0, "35817"
+    const-string/jumbo v0, "35818"
+    const-string/jumbo v0, "35819"
+    const-string/jumbo v0, "35820"
+    const-string/jumbo v0, "35821"
+    const-string/jumbo v0, "35822"
+    const-string/jumbo v0, "35823"
+    const-string/jumbo v0, "35824"
+    const-string/jumbo v0, "35825"
+    const-string/jumbo v0, "35826"
+    const-string/jumbo v0, "35827"
+    const-string/jumbo v0, "35828"
+    const-string/jumbo v0, "35829"
+    const-string/jumbo v0, "35830"
+    const-string/jumbo v0, "35831"
+    const-string/jumbo v0, "35832"
+    const-string/jumbo v0, "35833"
+    const-string/jumbo v0, "35834"
+    const-string/jumbo v0, "35835"
+    const-string/jumbo v0, "35836"
+    const-string/jumbo v0, "35837"
+    const-string/jumbo v0, "35838"
+    const-string/jumbo v0, "35839"
+    const-string/jumbo v0, "35840"
+    const-string/jumbo v0, "35841"
+    const-string/jumbo v0, "35842"
+    const-string/jumbo v0, "35843"
+    const-string/jumbo v0, "35844"
+    const-string/jumbo v0, "35845"
+    const-string/jumbo v0, "35846"
+    const-string/jumbo v0, "35847"
+    const-string/jumbo v0, "35848"
+    const-string/jumbo v0, "35849"
+    const-string/jumbo v0, "35850"
+    const-string/jumbo v0, "35851"
+    const-string/jumbo v0, "35852"
+    const-string/jumbo v0, "35853"
+    const-string/jumbo v0, "35854"
+    const-string/jumbo v0, "35855"
+    const-string/jumbo v0, "35856"
+    const-string/jumbo v0, "35857"
+    const-string/jumbo v0, "35858"
+    const-string/jumbo v0, "35859"
+    const-string/jumbo v0, "35860"
+    const-string/jumbo v0, "35861"
+    const-string/jumbo v0, "35862"
+    const-string/jumbo v0, "35863"
+    const-string/jumbo v0, "35864"
+    const-string/jumbo v0, "35865"
+    const-string/jumbo v0, "35866"
+    const-string/jumbo v0, "35867"
+    const-string/jumbo v0, "35868"
+    const-string/jumbo v0, "35869"
+    const-string/jumbo v0, "35870"
+    const-string/jumbo v0, "35871"
+    const-string/jumbo v0, "35872"
+    const-string/jumbo v0, "35873"
+    const-string/jumbo v0, "35874"
+    const-string/jumbo v0, "35875"
+    const-string/jumbo v0, "35876"
+    const-string/jumbo v0, "35877"
+    const-string/jumbo v0, "35878"
+    const-string/jumbo v0, "35879"
+    const-string/jumbo v0, "35880"
+    const-string/jumbo v0, "35881"
+    const-string/jumbo v0, "35882"
+    const-string/jumbo v0, "35883"
+    const-string/jumbo v0, "35884"
+    const-string/jumbo v0, "35885"
+    const-string/jumbo v0, "35886"
+    const-string/jumbo v0, "35887"
+    const-string/jumbo v0, "35888"
+    const-string/jumbo v0, "35889"
+    const-string/jumbo v0, "35890"
+    const-string/jumbo v0, "35891"
+    const-string/jumbo v0, "35892"
+    const-string/jumbo v0, "35893"
+    const-string/jumbo v0, "35894"
+    const-string/jumbo v0, "35895"
+    const-string/jumbo v0, "35896"
+    const-string/jumbo v0, "35897"
+    const-string/jumbo v0, "35898"
+    const-string/jumbo v0, "35899"
+    const-string/jumbo v0, "35900"
+    const-string/jumbo v0, "35901"
+    const-string/jumbo v0, "35902"
+    const-string/jumbo v0, "35903"
+    const-string/jumbo v0, "35904"
+    const-string/jumbo v0, "35905"
+    const-string/jumbo v0, "35906"
+    const-string/jumbo v0, "35907"
+    const-string/jumbo v0, "35908"
+    const-string/jumbo v0, "35909"
+    const-string/jumbo v0, "35910"
+    const-string/jumbo v0, "35911"
+    const-string/jumbo v0, "35912"
+    const-string/jumbo v0, "35913"
+    const-string/jumbo v0, "35914"
+    const-string/jumbo v0, "35915"
+    const-string/jumbo v0, "35916"
+    const-string/jumbo v0, "35917"
+    const-string/jumbo v0, "35918"
+    const-string/jumbo v0, "35919"
+    const-string/jumbo v0, "35920"
+    const-string/jumbo v0, "35921"
+    const-string/jumbo v0, "35922"
+    const-string/jumbo v0, "35923"
+    const-string/jumbo v0, "35924"
+    const-string/jumbo v0, "35925"
+    const-string/jumbo v0, "35926"
+    const-string/jumbo v0, "35927"
+    const-string/jumbo v0, "35928"
+    const-string/jumbo v0, "35929"
+    const-string/jumbo v0, "35930"
+    const-string/jumbo v0, "35931"
+    const-string/jumbo v0, "35932"
+    const-string/jumbo v0, "35933"
+    const-string/jumbo v0, "35934"
+    const-string/jumbo v0, "35935"
+    const-string/jumbo v0, "35936"
+    const-string/jumbo v0, "35937"
+    const-string/jumbo v0, "35938"
+    const-string/jumbo v0, "35939"
+    const-string/jumbo v0, "35940"
+    const-string/jumbo v0, "35941"
+    const-string/jumbo v0, "35942"
+    const-string/jumbo v0, "35943"
+    const-string/jumbo v0, "35944"
+    const-string/jumbo v0, "35945"
+    const-string/jumbo v0, "35946"
+    const-string/jumbo v0, "35947"
+    const-string/jumbo v0, "35948"
+    const-string/jumbo v0, "35949"
+    const-string/jumbo v0, "35950"
+    const-string/jumbo v0, "35951"
+    const-string/jumbo v0, "35952"
+    const-string/jumbo v0, "35953"
+    const-string/jumbo v0, "35954"
+    const-string/jumbo v0, "35955"
+    const-string/jumbo v0, "35956"
+    const-string/jumbo v0, "35957"
+    const-string/jumbo v0, "35958"
+    const-string/jumbo v0, "35959"
+    const-string/jumbo v0, "35960"
+    const-string/jumbo v0, "35961"
+    const-string/jumbo v0, "35962"
+    const-string/jumbo v0, "35963"
+    const-string/jumbo v0, "35964"
+    const-string/jumbo v0, "35965"
+    const-string/jumbo v0, "35966"
+    const-string/jumbo v0, "35967"
+    const-string/jumbo v0, "35968"
+    const-string/jumbo v0, "35969"
+    const-string/jumbo v0, "35970"
+    const-string/jumbo v0, "35971"
+    const-string/jumbo v0, "35972"
+    const-string/jumbo v0, "35973"
+    const-string/jumbo v0, "35974"
+    const-string/jumbo v0, "35975"
+    const-string/jumbo v0, "35976"
+    const-string/jumbo v0, "35977"
+    const-string/jumbo v0, "35978"
+    const-string/jumbo v0, "35979"
+    const-string/jumbo v0, "35980"
+    const-string/jumbo v0, "35981"
+    const-string/jumbo v0, "35982"
+    const-string/jumbo v0, "35983"
+    const-string/jumbo v0, "35984"
+    const-string/jumbo v0, "35985"
+    const-string/jumbo v0, "35986"
+    const-string/jumbo v0, "35987"
+    const-string/jumbo v0, "35988"
+    const-string/jumbo v0, "35989"
+    const-string/jumbo v0, "35990"
+    const-string/jumbo v0, "35991"
+    const-string/jumbo v0, "35992"
+    const-string/jumbo v0, "35993"
+    const-string/jumbo v0, "35994"
+    const-string/jumbo v0, "35995"
+    const-string/jumbo v0, "35996"
+    const-string/jumbo v0, "35997"
+    const-string/jumbo v0, "35998"
+    const-string/jumbo v0, "35999"
+    const-string/jumbo v0, "36000"
+    const-string/jumbo v0, "36001"
+    const-string/jumbo v0, "36002"
+    const-string/jumbo v0, "36003"
+    const-string/jumbo v0, "36004"
+    const-string/jumbo v0, "36005"
+    const-string/jumbo v0, "36006"
+    const-string/jumbo v0, "36007"
+    const-string/jumbo v0, "36008"
+    const-string/jumbo v0, "36009"
+    const-string/jumbo v0, "36010"
+    const-string/jumbo v0, "36011"
+    const-string/jumbo v0, "36012"
+    const-string/jumbo v0, "36013"
+    const-string/jumbo v0, "36014"
+    const-string/jumbo v0, "36015"
+    const-string/jumbo v0, "36016"
+    const-string/jumbo v0, "36017"
+    const-string/jumbo v0, "36018"
+    const-string/jumbo v0, "36019"
+    const-string/jumbo v0, "36020"
+    const-string/jumbo v0, "36021"
+    const-string/jumbo v0, "36022"
+    const-string/jumbo v0, "36023"
+    const-string/jumbo v0, "36024"
+    const-string/jumbo v0, "36025"
+    const-string/jumbo v0, "36026"
+    const-string/jumbo v0, "36027"
+    const-string/jumbo v0, "36028"
+    const-string/jumbo v0, "36029"
+    const-string/jumbo v0, "36030"
+    const-string/jumbo v0, "36031"
+    const-string/jumbo v0, "36032"
+    const-string/jumbo v0, "36033"
+    const-string/jumbo v0, "36034"
+    const-string/jumbo v0, "36035"
+    const-string/jumbo v0, "36036"
+    const-string/jumbo v0, "36037"
+    const-string/jumbo v0, "36038"
+    const-string/jumbo v0, "36039"
+    const-string/jumbo v0, "36040"
+    const-string/jumbo v0, "36041"
+    const-string/jumbo v0, "36042"
+    const-string/jumbo v0, "36043"
+    const-string/jumbo v0, "36044"
+    const-string/jumbo v0, "36045"
+    const-string/jumbo v0, "36046"
+    const-string/jumbo v0, "36047"
+    const-string/jumbo v0, "36048"
+    const-string/jumbo v0, "36049"
+    const-string/jumbo v0, "36050"
+    const-string/jumbo v0, "36051"
+    const-string/jumbo v0, "36052"
+    const-string/jumbo v0, "36053"
+    const-string/jumbo v0, "36054"
+    const-string/jumbo v0, "36055"
+    const-string/jumbo v0, "36056"
+    const-string/jumbo v0, "36057"
+    const-string/jumbo v0, "36058"
+    const-string/jumbo v0, "36059"
+    const-string/jumbo v0, "36060"
+    const-string/jumbo v0, "36061"
+    const-string/jumbo v0, "36062"
+    const-string/jumbo v0, "36063"
+    const-string/jumbo v0, "36064"
+    const-string/jumbo v0, "36065"
+    const-string/jumbo v0, "36066"
+    const-string/jumbo v0, "36067"
+    const-string/jumbo v0, "36068"
+    const-string/jumbo v0, "36069"
+    const-string/jumbo v0, "36070"
+    const-string/jumbo v0, "36071"
+    const-string/jumbo v0, "36072"
+    const-string/jumbo v0, "36073"
+    const-string/jumbo v0, "36074"
+    const-string/jumbo v0, "36075"
+    const-string/jumbo v0, "36076"
+    const-string/jumbo v0, "36077"
+    const-string/jumbo v0, "36078"
+    const-string/jumbo v0, "36079"
+    const-string/jumbo v0, "36080"
+    const-string/jumbo v0, "36081"
+    const-string/jumbo v0, "36082"
+    const-string/jumbo v0, "36083"
+    const-string/jumbo v0, "36084"
+    const-string/jumbo v0, "36085"
+    const-string/jumbo v0, "36086"
+    const-string/jumbo v0, "36087"
+    const-string/jumbo v0, "36088"
+    const-string/jumbo v0, "36089"
+    const-string/jumbo v0, "36090"
+    const-string/jumbo v0, "36091"
+    const-string/jumbo v0, "36092"
+    const-string/jumbo v0, "36093"
+    const-string/jumbo v0, "36094"
+    const-string/jumbo v0, "36095"
+    const-string/jumbo v0, "36096"
+    const-string/jumbo v0, "36097"
+    const-string/jumbo v0, "36098"
+    const-string/jumbo v0, "36099"
+    const-string/jumbo v0, "36100"
+    const-string/jumbo v0, "36101"
+    const-string/jumbo v0, "36102"
+    const-string/jumbo v0, "36103"
+    const-string/jumbo v0, "36104"
+    const-string/jumbo v0, "36105"
+    const-string/jumbo v0, "36106"
+    const-string/jumbo v0, "36107"
+    const-string/jumbo v0, "36108"
+    const-string/jumbo v0, "36109"
+    const-string/jumbo v0, "36110"
+    const-string/jumbo v0, "36111"
+    const-string/jumbo v0, "36112"
+    const-string/jumbo v0, "36113"
+    const-string/jumbo v0, "36114"
+    const-string/jumbo v0, "36115"
+    const-string/jumbo v0, "36116"
+    const-string/jumbo v0, "36117"
+    const-string/jumbo v0, "36118"
+    const-string/jumbo v0, "36119"
+    const-string/jumbo v0, "36120"
+    const-string/jumbo v0, "36121"
+    const-string/jumbo v0, "36122"
+    const-string/jumbo v0, "36123"
+    const-string/jumbo v0, "36124"
+    const-string/jumbo v0, "36125"
+    const-string/jumbo v0, "36126"
+    const-string/jumbo v0, "36127"
+    const-string/jumbo v0, "36128"
+    const-string/jumbo v0, "36129"
+    const-string/jumbo v0, "36130"
+    const-string/jumbo v0, "36131"
+    const-string/jumbo v0, "36132"
+    const-string/jumbo v0, "36133"
+    const-string/jumbo v0, "36134"
+    const-string/jumbo v0, "36135"
+    const-string/jumbo v0, "36136"
+    const-string/jumbo v0, "36137"
+    const-string/jumbo v0, "36138"
+    const-string/jumbo v0, "36139"
+    const-string/jumbo v0, "36140"
+    const-string/jumbo v0, "36141"
+    const-string/jumbo v0, "36142"
+    const-string/jumbo v0, "36143"
+    const-string/jumbo v0, "36144"
+    const-string/jumbo v0, "36145"
+    const-string/jumbo v0, "36146"
+    const-string/jumbo v0, "36147"
+    const-string/jumbo v0, "36148"
+    const-string/jumbo v0, "36149"
+    const-string/jumbo v0, "36150"
+    const-string/jumbo v0, "36151"
+    const-string/jumbo v0, "36152"
+    const-string/jumbo v0, "36153"
+    const-string/jumbo v0, "36154"
+    const-string/jumbo v0, "36155"
+    const-string/jumbo v0, "36156"
+    const-string/jumbo v0, "36157"
+    const-string/jumbo v0, "36158"
+    const-string/jumbo v0, "36159"
+    const-string/jumbo v0, "36160"
+    const-string/jumbo v0, "36161"
+    const-string/jumbo v0, "36162"
+    const-string/jumbo v0, "36163"
+    const-string/jumbo v0, "36164"
+    const-string/jumbo v0, "36165"
+    const-string/jumbo v0, "36166"
+    const-string/jumbo v0, "36167"
+    const-string/jumbo v0, "36168"
+    const-string/jumbo v0, "36169"
+    const-string/jumbo v0, "36170"
+    const-string/jumbo v0, "36171"
+    const-string/jumbo v0, "36172"
+    const-string/jumbo v0, "36173"
+    const-string/jumbo v0, "36174"
+    const-string/jumbo v0, "36175"
+    const-string/jumbo v0, "36176"
+    const-string/jumbo v0, "36177"
+    const-string/jumbo v0, "36178"
+    const-string/jumbo v0, "36179"
+    const-string/jumbo v0, "36180"
+    const-string/jumbo v0, "36181"
+    const-string/jumbo v0, "36182"
+    const-string/jumbo v0, "36183"
+    const-string/jumbo v0, "36184"
+    const-string/jumbo v0, "36185"
+    const-string/jumbo v0, "36186"
+    const-string/jumbo v0, "36187"
+    const-string/jumbo v0, "36188"
+    const-string/jumbo v0, "36189"
+    const-string/jumbo v0, "36190"
+    const-string/jumbo v0, "36191"
+    const-string/jumbo v0, "36192"
+    const-string/jumbo v0, "36193"
+    const-string/jumbo v0, "36194"
+    const-string/jumbo v0, "36195"
+    const-string/jumbo v0, "36196"
+    const-string/jumbo v0, "36197"
+    const-string/jumbo v0, "36198"
+    const-string/jumbo v0, "36199"
+    const-string/jumbo v0, "36200"
+    const-string/jumbo v0, "36201"
+    const-string/jumbo v0, "36202"
+    const-string/jumbo v0, "36203"
+    const-string/jumbo v0, "36204"
+    const-string/jumbo v0, "36205"
+    const-string/jumbo v0, "36206"
+    const-string/jumbo v0, "36207"
+    const-string/jumbo v0, "36208"
+    const-string/jumbo v0, "36209"
+    const-string/jumbo v0, "36210"
+    const-string/jumbo v0, "36211"
+    const-string/jumbo v0, "36212"
+    const-string/jumbo v0, "36213"
+    const-string/jumbo v0, "36214"
+    const-string/jumbo v0, "36215"
+    const-string/jumbo v0, "36216"
+    const-string/jumbo v0, "36217"
+    const-string/jumbo v0, "36218"
+    const-string/jumbo v0, "36219"
+    const-string/jumbo v0, "36220"
+    const-string/jumbo v0, "36221"
+    const-string/jumbo v0, "36222"
+    const-string/jumbo v0, "36223"
+    const-string/jumbo v0, "36224"
+    const-string/jumbo v0, "36225"
+    const-string/jumbo v0, "36226"
+    const-string/jumbo v0, "36227"
+    const-string/jumbo v0, "36228"
+    const-string/jumbo v0, "36229"
+    const-string/jumbo v0, "36230"
+    const-string/jumbo v0, "36231"
+    const-string/jumbo v0, "36232"
+    const-string/jumbo v0, "36233"
+    const-string/jumbo v0, "36234"
+    const-string/jumbo v0, "36235"
+    const-string/jumbo v0, "36236"
+    const-string/jumbo v0, "36237"
+    const-string/jumbo v0, "36238"
+    const-string/jumbo v0, "36239"
+    const-string/jumbo v0, "36240"
+    const-string/jumbo v0, "36241"
+    const-string/jumbo v0, "36242"
+    const-string/jumbo v0, "36243"
+    const-string/jumbo v0, "36244"
+    const-string/jumbo v0, "36245"
+    const-string/jumbo v0, "36246"
+    const-string/jumbo v0, "36247"
+    const-string/jumbo v0, "36248"
+    const-string/jumbo v0, "36249"
+    const-string/jumbo v0, "36250"
+    const-string/jumbo v0, "36251"
+    const-string/jumbo v0, "36252"
+    const-string/jumbo v0, "36253"
+    const-string/jumbo v0, "36254"
+    const-string/jumbo v0, "36255"
+    const-string/jumbo v0, "36256"
+    const-string/jumbo v0, "36257"
+    const-string/jumbo v0, "36258"
+    const-string/jumbo v0, "36259"
+    const-string/jumbo v0, "36260"
+    const-string/jumbo v0, "36261"
+    const-string/jumbo v0, "36262"
+    const-string/jumbo v0, "36263"
+    const-string/jumbo v0, "36264"
+    const-string/jumbo v0, "36265"
+    const-string/jumbo v0, "36266"
+    const-string/jumbo v0, "36267"
+    const-string/jumbo v0, "36268"
+    const-string/jumbo v0, "36269"
+    const-string/jumbo v0, "36270"
+    const-string/jumbo v0, "36271"
+    const-string/jumbo v0, "36272"
+    const-string/jumbo v0, "36273"
+    const-string/jumbo v0, "36274"
+    const-string/jumbo v0, "36275"
+    const-string/jumbo v0, "36276"
+    const-string/jumbo v0, "36277"
+    const-string/jumbo v0, "36278"
+    const-string/jumbo v0, "36279"
+    const-string/jumbo v0, "36280"
+    const-string/jumbo v0, "36281"
+    const-string/jumbo v0, "36282"
+    const-string/jumbo v0, "36283"
+    const-string/jumbo v0, "36284"
+    const-string/jumbo v0, "36285"
+    const-string/jumbo v0, "36286"
+    const-string/jumbo v0, "36287"
+    const-string/jumbo v0, "36288"
+    const-string/jumbo v0, "36289"
+    const-string/jumbo v0, "36290"
+    const-string/jumbo v0, "36291"
+    const-string/jumbo v0, "36292"
+    const-string/jumbo v0, "36293"
+    const-string/jumbo v0, "36294"
+    const-string/jumbo v0, "36295"
+    const-string/jumbo v0, "36296"
+    const-string/jumbo v0, "36297"
+    const-string/jumbo v0, "36298"
+    const-string/jumbo v0, "36299"
+    const-string/jumbo v0, "36300"
+    const-string/jumbo v0, "36301"
+    const-string/jumbo v0, "36302"
+    const-string/jumbo v0, "36303"
+    const-string/jumbo v0, "36304"
+    const-string/jumbo v0, "36305"
+    const-string/jumbo v0, "36306"
+    const-string/jumbo v0, "36307"
+    const-string/jumbo v0, "36308"
+    const-string/jumbo v0, "36309"
+    const-string/jumbo v0, "36310"
+    const-string/jumbo v0, "36311"
+    const-string/jumbo v0, "36312"
+    const-string/jumbo v0, "36313"
+    const-string/jumbo v0, "36314"
+    const-string/jumbo v0, "36315"
+    const-string/jumbo v0, "36316"
+    const-string/jumbo v0, "36317"
+    const-string/jumbo v0, "36318"
+    const-string/jumbo v0, "36319"
+    const-string/jumbo v0, "36320"
+    const-string/jumbo v0, "36321"
+    const-string/jumbo v0, "36322"
+    const-string/jumbo v0, "36323"
+    const-string/jumbo v0, "36324"
+    const-string/jumbo v0, "36325"
+    const-string/jumbo v0, "36326"
+    const-string/jumbo v0, "36327"
+    const-string/jumbo v0, "36328"
+    const-string/jumbo v0, "36329"
+    const-string/jumbo v0, "36330"
+    const-string/jumbo v0, "36331"
+    const-string/jumbo v0, "36332"
+    const-string/jumbo v0, "36333"
+    const-string/jumbo v0, "36334"
+    const-string/jumbo v0, "36335"
+    const-string/jumbo v0, "36336"
+    const-string/jumbo v0, "36337"
+    const-string/jumbo v0, "36338"
+    const-string/jumbo v0, "36339"
+    const-string/jumbo v0, "36340"
+    const-string/jumbo v0, "36341"
+    const-string/jumbo v0, "36342"
+    const-string/jumbo v0, "36343"
+    const-string/jumbo v0, "36344"
+    const-string/jumbo v0, "36345"
+    const-string/jumbo v0, "36346"
+    const-string/jumbo v0, "36347"
+    const-string/jumbo v0, "36348"
+    const-string/jumbo v0, "36349"
+    const-string/jumbo v0, "36350"
+    const-string/jumbo v0, "36351"
+    const-string/jumbo v0, "36352"
+    const-string/jumbo v0, "36353"
+    const-string/jumbo v0, "36354"
+    const-string/jumbo v0, "36355"
+    const-string/jumbo v0, "36356"
+    const-string/jumbo v0, "36357"
+    const-string/jumbo v0, "36358"
+    const-string/jumbo v0, "36359"
+    const-string/jumbo v0, "36360"
+    const-string/jumbo v0, "36361"
+    const-string/jumbo v0, "36362"
+    const-string/jumbo v0, "36363"
+    const-string/jumbo v0, "36364"
+    const-string/jumbo v0, "36365"
+    const-string/jumbo v0, "36366"
+    const-string/jumbo v0, "36367"
+    const-string/jumbo v0, "36368"
+    const-string/jumbo v0, "36369"
+    const-string/jumbo v0, "36370"
+    const-string/jumbo v0, "36371"
+    const-string/jumbo v0, "36372"
+    const-string/jumbo v0, "36373"
+    const-string/jumbo v0, "36374"
+    const-string/jumbo v0, "36375"
+    const-string/jumbo v0, "36376"
+    const-string/jumbo v0, "36377"
+    const-string/jumbo v0, "36378"
+    const-string/jumbo v0, "36379"
+    const-string/jumbo v0, "36380"
+    const-string/jumbo v0, "36381"
+    const-string/jumbo v0, "36382"
+    const-string/jumbo v0, "36383"
+    const-string/jumbo v0, "36384"
+    const-string/jumbo v0, "36385"
+    const-string/jumbo v0, "36386"
+    const-string/jumbo v0, "36387"
+    const-string/jumbo v0, "36388"
+    const-string/jumbo v0, "36389"
+    const-string/jumbo v0, "36390"
+    const-string/jumbo v0, "36391"
+    const-string/jumbo v0, "36392"
+    const-string/jumbo v0, "36393"
+    const-string/jumbo v0, "36394"
+    const-string/jumbo v0, "36395"
+    const-string/jumbo v0, "36396"
+    const-string/jumbo v0, "36397"
+    const-string/jumbo v0, "36398"
+    const-string/jumbo v0, "36399"
+    const-string/jumbo v0, "36400"
+    const-string/jumbo v0, "36401"
+    const-string/jumbo v0, "36402"
+    const-string/jumbo v0, "36403"
+    const-string/jumbo v0, "36404"
+    const-string/jumbo v0, "36405"
+    const-string/jumbo v0, "36406"
+    const-string/jumbo v0, "36407"
+    const-string/jumbo v0, "36408"
+    const-string/jumbo v0, "36409"
+    const-string/jumbo v0, "36410"
+    const-string/jumbo v0, "36411"
+    const-string/jumbo v0, "36412"
+    const-string/jumbo v0, "36413"
+    const-string/jumbo v0, "36414"
+    const-string/jumbo v0, "36415"
+    const-string/jumbo v0, "36416"
+    const-string/jumbo v0, "36417"
+    const-string/jumbo v0, "36418"
+    const-string/jumbo v0, "36419"
+    const-string/jumbo v0, "36420"
+    const-string/jumbo v0, "36421"
+    const-string/jumbo v0, "36422"
+    const-string/jumbo v0, "36423"
+    const-string/jumbo v0, "36424"
+    const-string/jumbo v0, "36425"
+    const-string/jumbo v0, "36426"
+    const-string/jumbo v0, "36427"
+    const-string/jumbo v0, "36428"
+    const-string/jumbo v0, "36429"
+    const-string/jumbo v0, "36430"
+    const-string/jumbo v0, "36431"
+    const-string/jumbo v0, "36432"
+    const-string/jumbo v0, "36433"
+    const-string/jumbo v0, "36434"
+    const-string/jumbo v0, "36435"
+    const-string/jumbo v0, "36436"
+    const-string/jumbo v0, "36437"
+    const-string/jumbo v0, "36438"
+    const-string/jumbo v0, "36439"
+    const-string/jumbo v0, "36440"
+    const-string/jumbo v0, "36441"
+    const-string/jumbo v0, "36442"
+    const-string/jumbo v0, "36443"
+    const-string/jumbo v0, "36444"
+    const-string/jumbo v0, "36445"
+    const-string/jumbo v0, "36446"
+    const-string/jumbo v0, "36447"
+    const-string/jumbo v0, "36448"
+    const-string/jumbo v0, "36449"
+    const-string/jumbo v0, "36450"
+    const-string/jumbo v0, "36451"
+    const-string/jumbo v0, "36452"
+    const-string/jumbo v0, "36453"
+    const-string/jumbo v0, "36454"
+    const-string/jumbo v0, "36455"
+    const-string/jumbo v0, "36456"
+    const-string/jumbo v0, "36457"
+    const-string/jumbo v0, "36458"
+    const-string/jumbo v0, "36459"
+    const-string/jumbo v0, "36460"
+    const-string/jumbo v0, "36461"
+    const-string/jumbo v0, "36462"
+    const-string/jumbo v0, "36463"
+    const-string/jumbo v0, "36464"
+    const-string/jumbo v0, "36465"
+    const-string/jumbo v0, "36466"
+    const-string/jumbo v0, "36467"
+    const-string/jumbo v0, "36468"
+    const-string/jumbo v0, "36469"
+    const-string/jumbo v0, "36470"
+    const-string/jumbo v0, "36471"
+    const-string/jumbo v0, "36472"
+    const-string/jumbo v0, "36473"
+    const-string/jumbo v0, "36474"
+    const-string/jumbo v0, "36475"
+    const-string/jumbo v0, "36476"
+    const-string/jumbo v0, "36477"
+    const-string/jumbo v0, "36478"
+    const-string/jumbo v0, "36479"
+    const-string/jumbo v0, "36480"
+    const-string/jumbo v0, "36481"
+    const-string/jumbo v0, "36482"
+    const-string/jumbo v0, "36483"
+    const-string/jumbo v0, "36484"
+    const-string/jumbo v0, "36485"
+    const-string/jumbo v0, "36486"
+    const-string/jumbo v0, "36487"
+    const-string/jumbo v0, "36488"
+    const-string/jumbo v0, "36489"
+    const-string/jumbo v0, "36490"
+    const-string/jumbo v0, "36491"
+    const-string/jumbo v0, "36492"
+    const-string/jumbo v0, "36493"
+    const-string/jumbo v0, "36494"
+    const-string/jumbo v0, "36495"
+    const-string/jumbo v0, "36496"
+    const-string/jumbo v0, "36497"
+    const-string/jumbo v0, "36498"
+    const-string/jumbo v0, "36499"
+    const-string/jumbo v0, "36500"
+    const-string/jumbo v0, "36501"
+    const-string/jumbo v0, "36502"
+    const-string/jumbo v0, "36503"
+    const-string/jumbo v0, "36504"
+    const-string/jumbo v0, "36505"
+    const-string/jumbo v0, "36506"
+    const-string/jumbo v0, "36507"
+    const-string/jumbo v0, "36508"
+    const-string/jumbo v0, "36509"
+    const-string/jumbo v0, "36510"
+    const-string/jumbo v0, "36511"
+    const-string/jumbo v0, "36512"
+    const-string/jumbo v0, "36513"
+    const-string/jumbo v0, "36514"
+    const-string/jumbo v0, "36515"
+    const-string/jumbo v0, "36516"
+    const-string/jumbo v0, "36517"
+    const-string/jumbo v0, "36518"
+    const-string/jumbo v0, "36519"
+    const-string/jumbo v0, "36520"
+    const-string/jumbo v0, "36521"
+    const-string/jumbo v0, "36522"
+    const-string/jumbo v0, "36523"
+    const-string/jumbo v0, "36524"
+    const-string/jumbo v0, "36525"
+    const-string/jumbo v0, "36526"
+    const-string/jumbo v0, "36527"
+    const-string/jumbo v0, "36528"
+    const-string/jumbo v0, "36529"
+    const-string/jumbo v0, "36530"
+    const-string/jumbo v0, "36531"
+    const-string/jumbo v0, "36532"
+    const-string/jumbo v0, "36533"
+    const-string/jumbo v0, "36534"
+    const-string/jumbo v0, "36535"
+    const-string/jumbo v0, "36536"
+    const-string/jumbo v0, "36537"
+    const-string/jumbo v0, "36538"
+    const-string/jumbo v0, "36539"
+    const-string/jumbo v0, "36540"
+    const-string/jumbo v0, "36541"
+    const-string/jumbo v0, "36542"
+    const-string/jumbo v0, "36543"
+    const-string/jumbo v0, "36544"
+    const-string/jumbo v0, "36545"
+    const-string/jumbo v0, "36546"
+    const-string/jumbo v0, "36547"
+    const-string/jumbo v0, "36548"
+    const-string/jumbo v0, "36549"
+    const-string/jumbo v0, "36550"
+    const-string/jumbo v0, "36551"
+    const-string/jumbo v0, "36552"
+    const-string/jumbo v0, "36553"
+    const-string/jumbo v0, "36554"
+    const-string/jumbo v0, "36555"
+    const-string/jumbo v0, "36556"
+    const-string/jumbo v0, "36557"
+    const-string/jumbo v0, "36558"
+    const-string/jumbo v0, "36559"
+    const-string/jumbo v0, "36560"
+    const-string/jumbo v0, "36561"
+    const-string/jumbo v0, "36562"
+    const-string/jumbo v0, "36563"
+    const-string/jumbo v0, "36564"
+    const-string/jumbo v0, "36565"
+    const-string/jumbo v0, "36566"
+    const-string/jumbo v0, "36567"
+    const-string/jumbo v0, "36568"
+    const-string/jumbo v0, "36569"
+    const-string/jumbo v0, "36570"
+    const-string/jumbo v0, "36571"
+    const-string/jumbo v0, "36572"
+    const-string/jumbo v0, "36573"
+    const-string/jumbo v0, "36574"
+    const-string/jumbo v0, "36575"
+    const-string/jumbo v0, "36576"
+    const-string/jumbo v0, "36577"
+    const-string/jumbo v0, "36578"
+    const-string/jumbo v0, "36579"
+    const-string/jumbo v0, "36580"
+    const-string/jumbo v0, "36581"
+    const-string/jumbo v0, "36582"
+    const-string/jumbo v0, "36583"
+    const-string/jumbo v0, "36584"
+    const-string/jumbo v0, "36585"
+    const-string/jumbo v0, "36586"
+    const-string/jumbo v0, "36587"
+    const-string/jumbo v0, "36588"
+    const-string/jumbo v0, "36589"
+    const-string/jumbo v0, "36590"
+    const-string/jumbo v0, "36591"
+    const-string/jumbo v0, "36592"
+    const-string/jumbo v0, "36593"
+    const-string/jumbo v0, "36594"
+    const-string/jumbo v0, "36595"
+    const-string/jumbo v0, "36596"
+    const-string/jumbo v0, "36597"
+    const-string/jumbo v0, "36598"
+    const-string/jumbo v0, "36599"
+    const-string/jumbo v0, "36600"
+    const-string/jumbo v0, "36601"
+    const-string/jumbo v0, "36602"
+    const-string/jumbo v0, "36603"
+    const-string/jumbo v0, "36604"
+    const-string/jumbo v0, "36605"
+    const-string/jumbo v0, "36606"
+    const-string/jumbo v0, "36607"
+    const-string/jumbo v0, "36608"
+    const-string/jumbo v0, "36609"
+    const-string/jumbo v0, "36610"
+    const-string/jumbo v0, "36611"
+    const-string/jumbo v0, "36612"
+    const-string/jumbo v0, "36613"
+    const-string/jumbo v0, "36614"
+    const-string/jumbo v0, "36615"
+    const-string/jumbo v0, "36616"
+    const-string/jumbo v0, "36617"
+    const-string/jumbo v0, "36618"
+    const-string/jumbo v0, "36619"
+    const-string/jumbo v0, "36620"
+    const-string/jumbo v0, "36621"
+    const-string/jumbo v0, "36622"
+    const-string/jumbo v0, "36623"
+    const-string/jumbo v0, "36624"
+    const-string/jumbo v0, "36625"
+    const-string/jumbo v0, "36626"
+    const-string/jumbo v0, "36627"
+    const-string/jumbo v0, "36628"
+    const-string/jumbo v0, "36629"
+    const-string/jumbo v0, "36630"
+    const-string/jumbo v0, "36631"
+    const-string/jumbo v0, "36632"
+    const-string/jumbo v0, "36633"
+    const-string/jumbo v0, "36634"
+    const-string/jumbo v0, "36635"
+    const-string/jumbo v0, "36636"
+    const-string/jumbo v0, "36637"
+    const-string/jumbo v0, "36638"
+    const-string/jumbo v0, "36639"
+    const-string/jumbo v0, "36640"
+    const-string/jumbo v0, "36641"
+    const-string/jumbo v0, "36642"
+    const-string/jumbo v0, "36643"
+    const-string/jumbo v0, "36644"
+    const-string/jumbo v0, "36645"
+    const-string/jumbo v0, "36646"
+    const-string/jumbo v0, "36647"
+    const-string/jumbo v0, "36648"
+    const-string/jumbo v0, "36649"
+    const-string/jumbo v0, "36650"
+    const-string/jumbo v0, "36651"
+    const-string/jumbo v0, "36652"
+    const-string/jumbo v0, "36653"
+    const-string/jumbo v0, "36654"
+    const-string/jumbo v0, "36655"
+    const-string/jumbo v0, "36656"
+    const-string/jumbo v0, "36657"
+    const-string/jumbo v0, "36658"
+    const-string/jumbo v0, "36659"
+    const-string/jumbo v0, "36660"
+    const-string/jumbo v0, "36661"
+    const-string/jumbo v0, "36662"
+    const-string/jumbo v0, "36663"
+    const-string/jumbo v0, "36664"
+    const-string/jumbo v0, "36665"
+    const-string/jumbo v0, "36666"
+    const-string/jumbo v0, "36667"
+    const-string/jumbo v0, "36668"
+    const-string/jumbo v0, "36669"
+    const-string/jumbo v0, "36670"
+    const-string/jumbo v0, "36671"
+    const-string/jumbo v0, "36672"
+    const-string/jumbo v0, "36673"
+    const-string/jumbo v0, "36674"
+    const-string/jumbo v0, "36675"
+    const-string/jumbo v0, "36676"
+    const-string/jumbo v0, "36677"
+    const-string/jumbo v0, "36678"
+    const-string/jumbo v0, "36679"
+    const-string/jumbo v0, "36680"
+    const-string/jumbo v0, "36681"
+    const-string/jumbo v0, "36682"
+    const-string/jumbo v0, "36683"
+    const-string/jumbo v0, "36684"
+    const-string/jumbo v0, "36685"
+    const-string/jumbo v0, "36686"
+    const-string/jumbo v0, "36687"
+    const-string/jumbo v0, "36688"
+    const-string/jumbo v0, "36689"
+    const-string/jumbo v0, "36690"
+    const-string/jumbo v0, "36691"
+    const-string/jumbo v0, "36692"
+    const-string/jumbo v0, "36693"
+    const-string/jumbo v0, "36694"
+    const-string/jumbo v0, "36695"
+    const-string/jumbo v0, "36696"
+    const-string/jumbo v0, "36697"
+    const-string/jumbo v0, "36698"
+    const-string/jumbo v0, "36699"
+    const-string/jumbo v0, "36700"
+    const-string/jumbo v0, "36701"
+    const-string/jumbo v0, "36702"
+    const-string/jumbo v0, "36703"
+    const-string/jumbo v0, "36704"
+    const-string/jumbo v0, "36705"
+    const-string/jumbo v0, "36706"
+    const-string/jumbo v0, "36707"
+    const-string/jumbo v0, "36708"
+    const-string/jumbo v0, "36709"
+    const-string/jumbo v0, "36710"
+    const-string/jumbo v0, "36711"
+    const-string/jumbo v0, "36712"
+    const-string/jumbo v0, "36713"
+    const-string/jumbo v0, "36714"
+    const-string/jumbo v0, "36715"
+    const-string/jumbo v0, "36716"
+    const-string/jumbo v0, "36717"
+    const-string/jumbo v0, "36718"
+    const-string/jumbo v0, "36719"
+    const-string/jumbo v0, "36720"
+    const-string/jumbo v0, "36721"
+    const-string/jumbo v0, "36722"
+    const-string/jumbo v0, "36723"
+    const-string/jumbo v0, "36724"
+    const-string/jumbo v0, "36725"
+    const-string/jumbo v0, "36726"
+    const-string/jumbo v0, "36727"
+    const-string/jumbo v0, "36728"
+    const-string/jumbo v0, "36729"
+    const-string/jumbo v0, "36730"
+    const-string/jumbo v0, "36731"
+    const-string/jumbo v0, "36732"
+    const-string/jumbo v0, "36733"
+    const-string/jumbo v0, "36734"
+    const-string/jumbo v0, "36735"
+    const-string/jumbo v0, "36736"
+    const-string/jumbo v0, "36737"
+    const-string/jumbo v0, "36738"
+    const-string/jumbo v0, "36739"
+    const-string/jumbo v0, "36740"
+    const-string/jumbo v0, "36741"
+    const-string/jumbo v0, "36742"
+    const-string/jumbo v0, "36743"
+    const-string/jumbo v0, "36744"
+    const-string/jumbo v0, "36745"
+    const-string/jumbo v0, "36746"
+    const-string/jumbo v0, "36747"
+    const-string/jumbo v0, "36748"
+    const-string/jumbo v0, "36749"
+    const-string/jumbo v0, "36750"
+    const-string/jumbo v0, "36751"
+    const-string/jumbo v0, "36752"
+    const-string/jumbo v0, "36753"
+    const-string/jumbo v0, "36754"
+    const-string/jumbo v0, "36755"
+    const-string/jumbo v0, "36756"
+    const-string/jumbo v0, "36757"
+    const-string/jumbo v0, "36758"
+    const-string/jumbo v0, "36759"
+    const-string/jumbo v0, "36760"
+    const-string/jumbo v0, "36761"
+    const-string/jumbo v0, "36762"
+    const-string/jumbo v0, "36763"
+    const-string/jumbo v0, "36764"
+    const-string/jumbo v0, "36765"
+    const-string/jumbo v0, "36766"
+    const-string/jumbo v0, "36767"
+    const-string/jumbo v0, "36768"
+    const-string/jumbo v0, "36769"
+    const-string/jumbo v0, "36770"
+    const-string/jumbo v0, "36771"
+    const-string/jumbo v0, "36772"
+    const-string/jumbo v0, "36773"
+    const-string/jumbo v0, "36774"
+    const-string/jumbo v0, "36775"
+    const-string/jumbo v0, "36776"
+    const-string/jumbo v0, "36777"
+    const-string/jumbo v0, "36778"
+    const-string/jumbo v0, "36779"
+    const-string/jumbo v0, "36780"
+    const-string/jumbo v0, "36781"
+    const-string/jumbo v0, "36782"
+    const-string/jumbo v0, "36783"
+    const-string/jumbo v0, "36784"
+    const-string/jumbo v0, "36785"
+    const-string/jumbo v0, "36786"
+    const-string/jumbo v0, "36787"
+    const-string/jumbo v0, "36788"
+    const-string/jumbo v0, "36789"
+    const-string/jumbo v0, "36790"
+    const-string/jumbo v0, "36791"
+    const-string/jumbo v0, "36792"
+    const-string/jumbo v0, "36793"
+    const-string/jumbo v0, "36794"
+    const-string/jumbo v0, "36795"
+    const-string/jumbo v0, "36796"
+    const-string/jumbo v0, "36797"
+    const-string/jumbo v0, "36798"
+    const-string/jumbo v0, "36799"
+    const-string/jumbo v0, "36800"
+    const-string/jumbo v0, "36801"
+    const-string/jumbo v0, "36802"
+    const-string/jumbo v0, "36803"
+    const-string/jumbo v0, "36804"
+    const-string/jumbo v0, "36805"
+    const-string/jumbo v0, "36806"
+    const-string/jumbo v0, "36807"
+    const-string/jumbo v0, "36808"
+    const-string/jumbo v0, "36809"
+    const-string/jumbo v0, "36810"
+    const-string/jumbo v0, "36811"
+    const-string/jumbo v0, "36812"
+    const-string/jumbo v0, "36813"
+    const-string/jumbo v0, "36814"
+    const-string/jumbo v0, "36815"
+    const-string/jumbo v0, "36816"
+    const-string/jumbo v0, "36817"
+    const-string/jumbo v0, "36818"
+    const-string/jumbo v0, "36819"
+    const-string/jumbo v0, "36820"
+    const-string/jumbo v0, "36821"
+    const-string/jumbo v0, "36822"
+    const-string/jumbo v0, "36823"
+    const-string/jumbo v0, "36824"
+    const-string/jumbo v0, "36825"
+    const-string/jumbo v0, "36826"
+    const-string/jumbo v0, "36827"
+    const-string/jumbo v0, "36828"
+    const-string/jumbo v0, "36829"
+    const-string/jumbo v0, "36830"
+    const-string/jumbo v0, "36831"
+    const-string/jumbo v0, "36832"
+    const-string/jumbo v0, "36833"
+    const-string/jumbo v0, "36834"
+    const-string/jumbo v0, "36835"
+    const-string/jumbo v0, "36836"
+    const-string/jumbo v0, "36837"
+    const-string/jumbo v0, "36838"
+    const-string/jumbo v0, "36839"
+    const-string/jumbo v0, "36840"
+    const-string/jumbo v0, "36841"
+    const-string/jumbo v0, "36842"
+    const-string/jumbo v0, "36843"
+    const-string/jumbo v0, "36844"
+    const-string/jumbo v0, "36845"
+    const-string/jumbo v0, "36846"
+    const-string/jumbo v0, "36847"
+    const-string/jumbo v0, "36848"
+    const-string/jumbo v0, "36849"
+    const-string/jumbo v0, "36850"
+    const-string/jumbo v0, "36851"
+    const-string/jumbo v0, "36852"
+    const-string/jumbo v0, "36853"
+    const-string/jumbo v0, "36854"
+    const-string/jumbo v0, "36855"
+    const-string/jumbo v0, "36856"
+    const-string/jumbo v0, "36857"
+    const-string/jumbo v0, "36858"
+    const-string/jumbo v0, "36859"
+    const-string/jumbo v0, "36860"
+    const-string/jumbo v0, "36861"
+    const-string/jumbo v0, "36862"
+    const-string/jumbo v0, "36863"
+    const-string/jumbo v0, "36864"
+    const-string/jumbo v0, "36865"
+    const-string/jumbo v0, "36866"
+    const-string/jumbo v0, "36867"
+    const-string/jumbo v0, "36868"
+    const-string/jumbo v0, "36869"
+    const-string/jumbo v0, "36870"
+    const-string/jumbo v0, "36871"
+    const-string/jumbo v0, "36872"
+    const-string/jumbo v0, "36873"
+    const-string/jumbo v0, "36874"
+    const-string/jumbo v0, "36875"
+    const-string/jumbo v0, "36876"
+    const-string/jumbo v0, "36877"
+    const-string/jumbo v0, "36878"
+    const-string/jumbo v0, "36879"
+    const-string/jumbo v0, "36880"
+    const-string/jumbo v0, "36881"
+    const-string/jumbo v0, "36882"
+    const-string/jumbo v0, "36883"
+    const-string/jumbo v0, "36884"
+    const-string/jumbo v0, "36885"
+    const-string/jumbo v0, "36886"
+    const-string/jumbo v0, "36887"
+    const-string/jumbo v0, "36888"
+    const-string/jumbo v0, "36889"
+    const-string/jumbo v0, "36890"
+    const-string/jumbo v0, "36891"
+    const-string/jumbo v0, "36892"
+    const-string/jumbo v0, "36893"
+    const-string/jumbo v0, "36894"
+    const-string/jumbo v0, "36895"
+    const-string/jumbo v0, "36896"
+    const-string/jumbo v0, "36897"
+    const-string/jumbo v0, "36898"
+    const-string/jumbo v0, "36899"
+    const-string/jumbo v0, "36900"
+    const-string/jumbo v0, "36901"
+    const-string/jumbo v0, "36902"
+    const-string/jumbo v0, "36903"
+    const-string/jumbo v0, "36904"
+    const-string/jumbo v0, "36905"
+    const-string/jumbo v0, "36906"
+    const-string/jumbo v0, "36907"
+    const-string/jumbo v0, "36908"
+    const-string/jumbo v0, "36909"
+    const-string/jumbo v0, "36910"
+    const-string/jumbo v0, "36911"
+    const-string/jumbo v0, "36912"
+    const-string/jumbo v0, "36913"
+    const-string/jumbo v0, "36914"
+    const-string/jumbo v0, "36915"
+    const-string/jumbo v0, "36916"
+    const-string/jumbo v0, "36917"
+    const-string/jumbo v0, "36918"
+    const-string/jumbo v0, "36919"
+    const-string/jumbo v0, "36920"
+    const-string/jumbo v0, "36921"
+    const-string/jumbo v0, "36922"
+    const-string/jumbo v0, "36923"
+    const-string/jumbo v0, "36924"
+    const-string/jumbo v0, "36925"
+    const-string/jumbo v0, "36926"
+    const-string/jumbo v0, "36927"
+    const-string/jumbo v0, "36928"
+    const-string/jumbo v0, "36929"
+    const-string/jumbo v0, "36930"
+    const-string/jumbo v0, "36931"
+    const-string/jumbo v0, "36932"
+    const-string/jumbo v0, "36933"
+    const-string/jumbo v0, "36934"
+    const-string/jumbo v0, "36935"
+    const-string/jumbo v0, "36936"
+    const-string/jumbo v0, "36937"
+    const-string/jumbo v0, "36938"
+    const-string/jumbo v0, "36939"
+    const-string/jumbo v0, "36940"
+    const-string/jumbo v0, "36941"
+    const-string/jumbo v0, "36942"
+    const-string/jumbo v0, "36943"
+    const-string/jumbo v0, "36944"
+    const-string/jumbo v0, "36945"
+    const-string/jumbo v0, "36946"
+    const-string/jumbo v0, "36947"
+    const-string/jumbo v0, "36948"
+    const-string/jumbo v0, "36949"
+    const-string/jumbo v0, "36950"
+    const-string/jumbo v0, "36951"
+    const-string/jumbo v0, "36952"
+    const-string/jumbo v0, "36953"
+    const-string/jumbo v0, "36954"
+    const-string/jumbo v0, "36955"
+    const-string/jumbo v0, "36956"
+    const-string/jumbo v0, "36957"
+    const-string/jumbo v0, "36958"
+    const-string/jumbo v0, "36959"
+    const-string/jumbo v0, "36960"
+    const-string/jumbo v0, "36961"
+    const-string/jumbo v0, "36962"
+    const-string/jumbo v0, "36963"
+    const-string/jumbo v0, "36964"
+    const-string/jumbo v0, "36965"
+    const-string/jumbo v0, "36966"
+    const-string/jumbo v0, "36967"
+    const-string/jumbo v0, "36968"
+    const-string/jumbo v0, "36969"
+    const-string/jumbo v0, "36970"
+    const-string/jumbo v0, "36971"
+    const-string/jumbo v0, "36972"
+    const-string/jumbo v0, "36973"
+    const-string/jumbo v0, "36974"
+    const-string/jumbo v0, "36975"
+    const-string/jumbo v0, "36976"
+    const-string/jumbo v0, "36977"
+    const-string/jumbo v0, "36978"
+    const-string/jumbo v0, "36979"
+    const-string/jumbo v0, "36980"
+    const-string/jumbo v0, "36981"
+    const-string/jumbo v0, "36982"
+    const-string/jumbo v0, "36983"
+    const-string/jumbo v0, "36984"
+    const-string/jumbo v0, "36985"
+    const-string/jumbo v0, "36986"
+    const-string/jumbo v0, "36987"
+    const-string/jumbo v0, "36988"
+    const-string/jumbo v0, "36989"
+    const-string/jumbo v0, "36990"
+    const-string/jumbo v0, "36991"
+    const-string/jumbo v0, "36992"
+    const-string/jumbo v0, "36993"
+    const-string/jumbo v0, "36994"
+    const-string/jumbo v0, "36995"
+    const-string/jumbo v0, "36996"
+    const-string/jumbo v0, "36997"
+    const-string/jumbo v0, "36998"
+    const-string/jumbo v0, "36999"
+    const-string/jumbo v0, "37000"
+    const-string/jumbo v0, "37001"
+    const-string/jumbo v0, "37002"
+    const-string/jumbo v0, "37003"
+    const-string/jumbo v0, "37004"
+    const-string/jumbo v0, "37005"
+    const-string/jumbo v0, "37006"
+    const-string/jumbo v0, "37007"
+    const-string/jumbo v0, "37008"
+    const-string/jumbo v0, "37009"
+    const-string/jumbo v0, "37010"
+    const-string/jumbo v0, "37011"
+    const-string/jumbo v0, "37012"
+    const-string/jumbo v0, "37013"
+    const-string/jumbo v0, "37014"
+    const-string/jumbo v0, "37015"
+    const-string/jumbo v0, "37016"
+    const-string/jumbo v0, "37017"
+    const-string/jumbo v0, "37018"
+    const-string/jumbo v0, "37019"
+    const-string/jumbo v0, "37020"
+    const-string/jumbo v0, "37021"
+    const-string/jumbo v0, "37022"
+    const-string/jumbo v0, "37023"
+    const-string/jumbo v0, "37024"
+    const-string/jumbo v0, "37025"
+    const-string/jumbo v0, "37026"
+    const-string/jumbo v0, "37027"
+    const-string/jumbo v0, "37028"
+    const-string/jumbo v0, "37029"
+    const-string/jumbo v0, "37030"
+    const-string/jumbo v0, "37031"
+    const-string/jumbo v0, "37032"
+    const-string/jumbo v0, "37033"
+    const-string/jumbo v0, "37034"
+    const-string/jumbo v0, "37035"
+    const-string/jumbo v0, "37036"
+    const-string/jumbo v0, "37037"
+    const-string/jumbo v0, "37038"
+    const-string/jumbo v0, "37039"
+    const-string/jumbo v0, "37040"
+    const-string/jumbo v0, "37041"
+    const-string/jumbo v0, "37042"
+    const-string/jumbo v0, "37043"
+    const-string/jumbo v0, "37044"
+    const-string/jumbo v0, "37045"
+    const-string/jumbo v0, "37046"
+    const-string/jumbo v0, "37047"
+    const-string/jumbo v0, "37048"
+    const-string/jumbo v0, "37049"
+    const-string/jumbo v0, "37050"
+    const-string/jumbo v0, "37051"
+    const-string/jumbo v0, "37052"
+    const-string/jumbo v0, "37053"
+    const-string/jumbo v0, "37054"
+    const-string/jumbo v0, "37055"
+    const-string/jumbo v0, "37056"
+    const-string/jumbo v0, "37057"
+    const-string/jumbo v0, "37058"
+    const-string/jumbo v0, "37059"
+    const-string/jumbo v0, "37060"
+    const-string/jumbo v0, "37061"
+    const-string/jumbo v0, "37062"
+    const-string/jumbo v0, "37063"
+    const-string/jumbo v0, "37064"
+    const-string/jumbo v0, "37065"
+    const-string/jumbo v0, "37066"
+    const-string/jumbo v0, "37067"
+    const-string/jumbo v0, "37068"
+    const-string/jumbo v0, "37069"
+    const-string/jumbo v0, "37070"
+    const-string/jumbo v0, "37071"
+    const-string/jumbo v0, "37072"
+    const-string/jumbo v0, "37073"
+    const-string/jumbo v0, "37074"
+    const-string/jumbo v0, "37075"
+    const-string/jumbo v0, "37076"
+    const-string/jumbo v0, "37077"
+    const-string/jumbo v0, "37078"
+    const-string/jumbo v0, "37079"
+    const-string/jumbo v0, "37080"
+    const-string/jumbo v0, "37081"
+    const-string/jumbo v0, "37082"
+    const-string/jumbo v0, "37083"
+    const-string/jumbo v0, "37084"
+    const-string/jumbo v0, "37085"
+    const-string/jumbo v0, "37086"
+    const-string/jumbo v0, "37087"
+    const-string/jumbo v0, "37088"
+    const-string/jumbo v0, "37089"
+    const-string/jumbo v0, "37090"
+    const-string/jumbo v0, "37091"
+    const-string/jumbo v0, "37092"
+    const-string/jumbo v0, "37093"
+    const-string/jumbo v0, "37094"
+    const-string/jumbo v0, "37095"
+    const-string/jumbo v0, "37096"
+    const-string/jumbo v0, "37097"
+    const-string/jumbo v0, "37098"
+    const-string/jumbo v0, "37099"
+    const-string/jumbo v0, "37100"
+    const-string/jumbo v0, "37101"
+    const-string/jumbo v0, "37102"
+    const-string/jumbo v0, "37103"
+    const-string/jumbo v0, "37104"
+    const-string/jumbo v0, "37105"
+    const-string/jumbo v0, "37106"
+    const-string/jumbo v0, "37107"
+    const-string/jumbo v0, "37108"
+    const-string/jumbo v0, "37109"
+    const-string/jumbo v0, "37110"
+    const-string/jumbo v0, "37111"
+    const-string/jumbo v0, "37112"
+    const-string/jumbo v0, "37113"
+    const-string/jumbo v0, "37114"
+    const-string/jumbo v0, "37115"
+    const-string/jumbo v0, "37116"
+    const-string/jumbo v0, "37117"
+    const-string/jumbo v0, "37118"
+    const-string/jumbo v0, "37119"
+    const-string/jumbo v0, "37120"
+    const-string/jumbo v0, "37121"
+    const-string/jumbo v0, "37122"
+    const-string/jumbo v0, "37123"
+    const-string/jumbo v0, "37124"
+    const-string/jumbo v0, "37125"
+    const-string/jumbo v0, "37126"
+    const-string/jumbo v0, "37127"
+    const-string/jumbo v0, "37128"
+    const-string/jumbo v0, "37129"
+    const-string/jumbo v0, "37130"
+    const-string/jumbo v0, "37131"
+    const-string/jumbo v0, "37132"
+    const-string/jumbo v0, "37133"
+    const-string/jumbo v0, "37134"
+    const-string/jumbo v0, "37135"
+    const-string/jumbo v0, "37136"
+    const-string/jumbo v0, "37137"
+    const-string/jumbo v0, "37138"
+    const-string/jumbo v0, "37139"
+    const-string/jumbo v0, "37140"
+    const-string/jumbo v0, "37141"
+    const-string/jumbo v0, "37142"
+    const-string/jumbo v0, "37143"
+    const-string/jumbo v0, "37144"
+    const-string/jumbo v0, "37145"
+    const-string/jumbo v0, "37146"
+    const-string/jumbo v0, "37147"
+    const-string/jumbo v0, "37148"
+    const-string/jumbo v0, "37149"
+    const-string/jumbo v0, "37150"
+    const-string/jumbo v0, "37151"
+    const-string/jumbo v0, "37152"
+    const-string/jumbo v0, "37153"
+    const-string/jumbo v0, "37154"
+    const-string/jumbo v0, "37155"
+    const-string/jumbo v0, "37156"
+    const-string/jumbo v0, "37157"
+    const-string/jumbo v0, "37158"
+    const-string/jumbo v0, "37159"
+    const-string/jumbo v0, "37160"
+    const-string/jumbo v0, "37161"
+    const-string/jumbo v0, "37162"
+    const-string/jumbo v0, "37163"
+    const-string/jumbo v0, "37164"
+    const-string/jumbo v0, "37165"
+    const-string/jumbo v0, "37166"
+    const-string/jumbo v0, "37167"
+    const-string/jumbo v0, "37168"
+    const-string/jumbo v0, "37169"
+    const-string/jumbo v0, "37170"
+    const-string/jumbo v0, "37171"
+    const-string/jumbo v0, "37172"
+    const-string/jumbo v0, "37173"
+    const-string/jumbo v0, "37174"
+    const-string/jumbo v0, "37175"
+    const-string/jumbo v0, "37176"
+    const-string/jumbo v0, "37177"
+    const-string/jumbo v0, "37178"
+    const-string/jumbo v0, "37179"
+    const-string/jumbo v0, "37180"
+    const-string/jumbo v0, "37181"
+    const-string/jumbo v0, "37182"
+    const-string/jumbo v0, "37183"
+    const-string/jumbo v0, "37184"
+    const-string/jumbo v0, "37185"
+    const-string/jumbo v0, "37186"
+    const-string/jumbo v0, "37187"
+    const-string/jumbo v0, "37188"
+    const-string/jumbo v0, "37189"
+    const-string/jumbo v0, "37190"
+    const-string/jumbo v0, "37191"
+    const-string/jumbo v0, "37192"
+    const-string/jumbo v0, "37193"
+    const-string/jumbo v0, "37194"
+    const-string/jumbo v0, "37195"
+    const-string/jumbo v0, "37196"
+    const-string/jumbo v0, "37197"
+    const-string/jumbo v0, "37198"
+    const-string/jumbo v0, "37199"
+    const-string/jumbo v0, "37200"
+    const-string/jumbo v0, "37201"
+    const-string/jumbo v0, "37202"
+    const-string/jumbo v0, "37203"
+    const-string/jumbo v0, "37204"
+    const-string/jumbo v0, "37205"
+    const-string/jumbo v0, "37206"
+    const-string/jumbo v0, "37207"
+    const-string/jumbo v0, "37208"
+    const-string/jumbo v0, "37209"
+    const-string/jumbo v0, "37210"
+    const-string/jumbo v0, "37211"
+    const-string/jumbo v0, "37212"
+    const-string/jumbo v0, "37213"
+    const-string/jumbo v0, "37214"
+    const-string/jumbo v0, "37215"
+    const-string/jumbo v0, "37216"
+    const-string/jumbo v0, "37217"
+    const-string/jumbo v0, "37218"
+    const-string/jumbo v0, "37219"
+    const-string/jumbo v0, "37220"
+    const-string/jumbo v0, "37221"
+    const-string/jumbo v0, "37222"
+    const-string/jumbo v0, "37223"
+    const-string/jumbo v0, "37224"
+    const-string/jumbo v0, "37225"
+    const-string/jumbo v0, "37226"
+    const-string/jumbo v0, "37227"
+    const-string/jumbo v0, "37228"
+    const-string/jumbo v0, "37229"
+    const-string/jumbo v0, "37230"
+    const-string/jumbo v0, "37231"
+    const-string/jumbo v0, "37232"
+    const-string/jumbo v0, "37233"
+    const-string/jumbo v0, "37234"
+    const-string/jumbo v0, "37235"
+    const-string/jumbo v0, "37236"
+    const-string/jumbo v0, "37237"
+    const-string/jumbo v0, "37238"
+    const-string/jumbo v0, "37239"
+    const-string/jumbo v0, "37240"
+    const-string/jumbo v0, "37241"
+    const-string/jumbo v0, "37242"
+    const-string/jumbo v0, "37243"
+    const-string/jumbo v0, "37244"
+    const-string/jumbo v0, "37245"
+    const-string/jumbo v0, "37246"
+    const-string/jumbo v0, "37247"
+    const-string/jumbo v0, "37248"
+    const-string/jumbo v0, "37249"
+    const-string/jumbo v0, "37250"
+    const-string/jumbo v0, "37251"
+    const-string/jumbo v0, "37252"
+    const-string/jumbo v0, "37253"
+    const-string/jumbo v0, "37254"
+    const-string/jumbo v0, "37255"
+    const-string/jumbo v0, "37256"
+    const-string/jumbo v0, "37257"
+    const-string/jumbo v0, "37258"
+    const-string/jumbo v0, "37259"
+    const-string/jumbo v0, "37260"
+    const-string/jumbo v0, "37261"
+    const-string/jumbo v0, "37262"
+    const-string/jumbo v0, "37263"
+    const-string/jumbo v0, "37264"
+    const-string/jumbo v0, "37265"
+    const-string/jumbo v0, "37266"
+    const-string/jumbo v0, "37267"
+    const-string/jumbo v0, "37268"
+    const-string/jumbo v0, "37269"
+    const-string/jumbo v0, "37270"
+    const-string/jumbo v0, "37271"
+    const-string/jumbo v0, "37272"
+    const-string/jumbo v0, "37273"
+    const-string/jumbo v0, "37274"
+    const-string/jumbo v0, "37275"
+    const-string/jumbo v0, "37276"
+    const-string/jumbo v0, "37277"
+    const-string/jumbo v0, "37278"
+    const-string/jumbo v0, "37279"
+    const-string/jumbo v0, "37280"
+    const-string/jumbo v0, "37281"
+    const-string/jumbo v0, "37282"
+    const-string/jumbo v0, "37283"
+    const-string/jumbo v0, "37284"
+    const-string/jumbo v0, "37285"
+    const-string/jumbo v0, "37286"
+    const-string/jumbo v0, "37287"
+    const-string/jumbo v0, "37288"
+    const-string/jumbo v0, "37289"
+    const-string/jumbo v0, "37290"
+    const-string/jumbo v0, "37291"
+    const-string/jumbo v0, "37292"
+    const-string/jumbo v0, "37293"
+    const-string/jumbo v0, "37294"
+    const-string/jumbo v0, "37295"
+    const-string/jumbo v0, "37296"
+    const-string/jumbo v0, "37297"
+    const-string/jumbo v0, "37298"
+    const-string/jumbo v0, "37299"
+    const-string/jumbo v0, "37300"
+    const-string/jumbo v0, "37301"
+    const-string/jumbo v0, "37302"
+    const-string/jumbo v0, "37303"
+    const-string/jumbo v0, "37304"
+    const-string/jumbo v0, "37305"
+    const-string/jumbo v0, "37306"
+    const-string/jumbo v0, "37307"
+    const-string/jumbo v0, "37308"
+    const-string/jumbo v0, "37309"
+    const-string/jumbo v0, "37310"
+    const-string/jumbo v0, "37311"
+    const-string/jumbo v0, "37312"
+    const-string/jumbo v0, "37313"
+    const-string/jumbo v0, "37314"
+    const-string/jumbo v0, "37315"
+    const-string/jumbo v0, "37316"
+    const-string/jumbo v0, "37317"
+    const-string/jumbo v0, "37318"
+    const-string/jumbo v0, "37319"
+    const-string/jumbo v0, "37320"
+    const-string/jumbo v0, "37321"
+    const-string/jumbo v0, "37322"
+    const-string/jumbo v0, "37323"
+    const-string/jumbo v0, "37324"
+    const-string/jumbo v0, "37325"
+    const-string/jumbo v0, "37326"
+    const-string/jumbo v0, "37327"
+    const-string/jumbo v0, "37328"
+    const-string/jumbo v0, "37329"
+    const-string/jumbo v0, "37330"
+    const-string/jumbo v0, "37331"
+    const-string/jumbo v0, "37332"
+    const-string/jumbo v0, "37333"
+    const-string/jumbo v0, "37334"
+    const-string/jumbo v0, "37335"
+    const-string/jumbo v0, "37336"
+    const-string/jumbo v0, "37337"
+    const-string/jumbo v0, "37338"
+    const-string/jumbo v0, "37339"
+    const-string/jumbo v0, "37340"
+    const-string/jumbo v0, "37341"
+    const-string/jumbo v0, "37342"
+    const-string/jumbo v0, "37343"
+    const-string/jumbo v0, "37344"
+    const-string/jumbo v0, "37345"
+    const-string/jumbo v0, "37346"
+    const-string/jumbo v0, "37347"
+    const-string/jumbo v0, "37348"
+    const-string/jumbo v0, "37349"
+    const-string/jumbo v0, "37350"
+    const-string/jumbo v0, "37351"
+    const-string/jumbo v0, "37352"
+    const-string/jumbo v0, "37353"
+    const-string/jumbo v0, "37354"
+    const-string/jumbo v0, "37355"
+    const-string/jumbo v0, "37356"
+    const-string/jumbo v0, "37357"
+    const-string/jumbo v0, "37358"
+    const-string/jumbo v0, "37359"
+    const-string/jumbo v0, "37360"
+    const-string/jumbo v0, "37361"
+    const-string/jumbo v0, "37362"
+    const-string/jumbo v0, "37363"
+    const-string/jumbo v0, "37364"
+    const-string/jumbo v0, "37365"
+    const-string/jumbo v0, "37366"
+    const-string/jumbo v0, "37367"
+    const-string/jumbo v0, "37368"
+    const-string/jumbo v0, "37369"
+    const-string/jumbo v0, "37370"
+    const-string/jumbo v0, "37371"
+    const-string/jumbo v0, "37372"
+    const-string/jumbo v0, "37373"
+    const-string/jumbo v0, "37374"
+    const-string/jumbo v0, "37375"
+    const-string/jumbo v0, "37376"
+    const-string/jumbo v0, "37377"
+    const-string/jumbo v0, "37378"
+    const-string/jumbo v0, "37379"
+    const-string/jumbo v0, "37380"
+    const-string/jumbo v0, "37381"
+    const-string/jumbo v0, "37382"
+    const-string/jumbo v0, "37383"
+    const-string/jumbo v0, "37384"
+    const-string/jumbo v0, "37385"
+    const-string/jumbo v0, "37386"
+    const-string/jumbo v0, "37387"
+    const-string/jumbo v0, "37388"
+    const-string/jumbo v0, "37389"
+    const-string/jumbo v0, "37390"
+    const-string/jumbo v0, "37391"
+    const-string/jumbo v0, "37392"
+    const-string/jumbo v0, "37393"
+    const-string/jumbo v0, "37394"
+    const-string/jumbo v0, "37395"
+    const-string/jumbo v0, "37396"
+    const-string/jumbo v0, "37397"
+    const-string/jumbo v0, "37398"
+    const-string/jumbo v0, "37399"
+    const-string/jumbo v0, "37400"
+    const-string/jumbo v0, "37401"
+    const-string/jumbo v0, "37402"
+    const-string/jumbo v0, "37403"
+    const-string/jumbo v0, "37404"
+    const-string/jumbo v0, "37405"
+    const-string/jumbo v0, "37406"
+    const-string/jumbo v0, "37407"
+    const-string/jumbo v0, "37408"
+    const-string/jumbo v0, "37409"
+    const-string/jumbo v0, "37410"
+    const-string/jumbo v0, "37411"
+    const-string/jumbo v0, "37412"
+    const-string/jumbo v0, "37413"
+    const-string/jumbo v0, "37414"
+    const-string/jumbo v0, "37415"
+    const-string/jumbo v0, "37416"
+    const-string/jumbo v0, "37417"
+    const-string/jumbo v0, "37418"
+    const-string/jumbo v0, "37419"
+    const-string/jumbo v0, "37420"
+    const-string/jumbo v0, "37421"
+    const-string/jumbo v0, "37422"
+    const-string/jumbo v0, "37423"
+    const-string/jumbo v0, "37424"
+    const-string/jumbo v0, "37425"
+    const-string/jumbo v0, "37426"
+    const-string/jumbo v0, "37427"
+    const-string/jumbo v0, "37428"
+    const-string/jumbo v0, "37429"
+    const-string/jumbo v0, "37430"
+    const-string/jumbo v0, "37431"
+    const-string/jumbo v0, "37432"
+    const-string/jumbo v0, "37433"
+    const-string/jumbo v0, "37434"
+    const-string/jumbo v0, "37435"
+    const-string/jumbo v0, "37436"
+    const-string/jumbo v0, "37437"
+    const-string/jumbo v0, "37438"
+    const-string/jumbo v0, "37439"
+    const-string/jumbo v0, "37440"
+    const-string/jumbo v0, "37441"
+    const-string/jumbo v0, "37442"
+    const-string/jumbo v0, "37443"
+    const-string/jumbo v0, "37444"
+    const-string/jumbo v0, "37445"
+    const-string/jumbo v0, "37446"
+    const-string/jumbo v0, "37447"
+    const-string/jumbo v0, "37448"
+    const-string/jumbo v0, "37449"
+    const-string/jumbo v0, "37450"
+    const-string/jumbo v0, "37451"
+    const-string/jumbo v0, "37452"
+    const-string/jumbo v0, "37453"
+    const-string/jumbo v0, "37454"
+    const-string/jumbo v0, "37455"
+    const-string/jumbo v0, "37456"
+    const-string/jumbo v0, "37457"
+    const-string/jumbo v0, "37458"
+    const-string/jumbo v0, "37459"
+    const-string/jumbo v0, "37460"
+    const-string/jumbo v0, "37461"
+    const-string/jumbo v0, "37462"
+    const-string/jumbo v0, "37463"
+    const-string/jumbo v0, "37464"
+    const-string/jumbo v0, "37465"
+    const-string/jumbo v0, "37466"
+    const-string/jumbo v0, "37467"
+    const-string/jumbo v0, "37468"
+    const-string/jumbo v0, "37469"
+    const-string/jumbo v0, "37470"
+    const-string/jumbo v0, "37471"
+    const-string/jumbo v0, "37472"
+    const-string/jumbo v0, "37473"
+    const-string/jumbo v0, "37474"
+    const-string/jumbo v0, "37475"
+    const-string/jumbo v0, "37476"
+    const-string/jumbo v0, "37477"
+    const-string/jumbo v0, "37478"
+    const-string/jumbo v0, "37479"
+    const-string/jumbo v0, "37480"
+    const-string/jumbo v0, "37481"
+    const-string/jumbo v0, "37482"
+    const-string/jumbo v0, "37483"
+    const-string/jumbo v0, "37484"
+    const-string/jumbo v0, "37485"
+    const-string/jumbo v0, "37486"
+    const-string/jumbo v0, "37487"
+    const-string/jumbo v0, "37488"
+    const-string/jumbo v0, "37489"
+    const-string/jumbo v0, "37490"
+    const-string/jumbo v0, "37491"
+    const-string/jumbo v0, "37492"
+    const-string/jumbo v0, "37493"
+    const-string/jumbo v0, "37494"
+    const-string/jumbo v0, "37495"
+    const-string/jumbo v0, "37496"
+    const-string/jumbo v0, "37497"
+    const-string/jumbo v0, "37498"
+    const-string/jumbo v0, "37499"
+    const-string/jumbo v0, "37500"
+    const-string/jumbo v0, "37501"
+    const-string/jumbo v0, "37502"
+    const-string/jumbo v0, "37503"
+    const-string/jumbo v0, "37504"
+    const-string/jumbo v0, "37505"
+    const-string/jumbo v0, "37506"
+    const-string/jumbo v0, "37507"
+    const-string/jumbo v0, "37508"
+    const-string/jumbo v0, "37509"
+    const-string/jumbo v0, "37510"
+    const-string/jumbo v0, "37511"
+    const-string/jumbo v0, "37512"
+    const-string/jumbo v0, "37513"
+    const-string/jumbo v0, "37514"
+    const-string/jumbo v0, "37515"
+    const-string/jumbo v0, "37516"
+    const-string/jumbo v0, "37517"
+    const-string/jumbo v0, "37518"
+    const-string/jumbo v0, "37519"
+    const-string/jumbo v0, "37520"
+    const-string/jumbo v0, "37521"
+    const-string/jumbo v0, "37522"
+    const-string/jumbo v0, "37523"
+    const-string/jumbo v0, "37524"
+    const-string/jumbo v0, "37525"
+    const-string/jumbo v0, "37526"
+    const-string/jumbo v0, "37527"
+    const-string/jumbo v0, "37528"
+    const-string/jumbo v0, "37529"
+    const-string/jumbo v0, "37530"
+    const-string/jumbo v0, "37531"
+    const-string/jumbo v0, "37532"
+    const-string/jumbo v0, "37533"
+    const-string/jumbo v0, "37534"
+    const-string/jumbo v0, "37535"
+    const-string/jumbo v0, "37536"
+    const-string/jumbo v0, "37537"
+    const-string/jumbo v0, "37538"
+    const-string/jumbo v0, "37539"
+    const-string/jumbo v0, "37540"
+    const-string/jumbo v0, "37541"
+    const-string/jumbo v0, "37542"
+    const-string/jumbo v0, "37543"
+    const-string/jumbo v0, "37544"
+    const-string/jumbo v0, "37545"
+    const-string/jumbo v0, "37546"
+    const-string/jumbo v0, "37547"
+    const-string/jumbo v0, "37548"
+    const-string/jumbo v0, "37549"
+    const-string/jumbo v0, "37550"
+    const-string/jumbo v0, "37551"
+    const-string/jumbo v0, "37552"
+    const-string/jumbo v0, "37553"
+    const-string/jumbo v0, "37554"
+    const-string/jumbo v0, "37555"
+    const-string/jumbo v0, "37556"
+    const-string/jumbo v0, "37557"
+    const-string/jumbo v0, "37558"
+    const-string/jumbo v0, "37559"
+    const-string/jumbo v0, "37560"
+    const-string/jumbo v0, "37561"
+    const-string/jumbo v0, "37562"
+    const-string/jumbo v0, "37563"
+    const-string/jumbo v0, "37564"
+    const-string/jumbo v0, "37565"
+    const-string/jumbo v0, "37566"
+    const-string/jumbo v0, "37567"
+    const-string/jumbo v0, "37568"
+    const-string/jumbo v0, "37569"
+    const-string/jumbo v0, "37570"
+    const-string/jumbo v0, "37571"
+    const-string/jumbo v0, "37572"
+    const-string/jumbo v0, "37573"
+    const-string/jumbo v0, "37574"
+    const-string/jumbo v0, "37575"
+    const-string/jumbo v0, "37576"
+    const-string/jumbo v0, "37577"
+    const-string/jumbo v0, "37578"
+    const-string/jumbo v0, "37579"
+    const-string/jumbo v0, "37580"
+    const-string/jumbo v0, "37581"
+    const-string/jumbo v0, "37582"
+    const-string/jumbo v0, "37583"
+    const-string/jumbo v0, "37584"
+    const-string/jumbo v0, "37585"
+    const-string/jumbo v0, "37586"
+    const-string/jumbo v0, "37587"
+    const-string/jumbo v0, "37588"
+    const-string/jumbo v0, "37589"
+    const-string/jumbo v0, "37590"
+    const-string/jumbo v0, "37591"
+    const-string/jumbo v0, "37592"
+    const-string/jumbo v0, "37593"
+    const-string/jumbo v0, "37594"
+    const-string/jumbo v0, "37595"
+    const-string/jumbo v0, "37596"
+    const-string/jumbo v0, "37597"
+    const-string/jumbo v0, "37598"
+    const-string/jumbo v0, "37599"
+    const-string/jumbo v0, "37600"
+    const-string/jumbo v0, "37601"
+    const-string/jumbo v0, "37602"
+    const-string/jumbo v0, "37603"
+    const-string/jumbo v0, "37604"
+    const-string/jumbo v0, "37605"
+    const-string/jumbo v0, "37606"
+    const-string/jumbo v0, "37607"
+    const-string/jumbo v0, "37608"
+    const-string/jumbo v0, "37609"
+    const-string/jumbo v0, "37610"
+    const-string/jumbo v0, "37611"
+    const-string/jumbo v0, "37612"
+    const-string/jumbo v0, "37613"
+    const-string/jumbo v0, "37614"
+    const-string/jumbo v0, "37615"
+    const-string/jumbo v0, "37616"
+    const-string/jumbo v0, "37617"
+    const-string/jumbo v0, "37618"
+    const-string/jumbo v0, "37619"
+    const-string/jumbo v0, "37620"
+    const-string/jumbo v0, "37621"
+    const-string/jumbo v0, "37622"
+    const-string/jumbo v0, "37623"
+    const-string/jumbo v0, "37624"
+    const-string/jumbo v0, "37625"
+    const-string/jumbo v0, "37626"
+    const-string/jumbo v0, "37627"
+    const-string/jumbo v0, "37628"
+    const-string/jumbo v0, "37629"
+    const-string/jumbo v0, "37630"
+    const-string/jumbo v0, "37631"
+    const-string/jumbo v0, "37632"
+    const-string/jumbo v0, "37633"
+    const-string/jumbo v0, "37634"
+    const-string/jumbo v0, "37635"
+    const-string/jumbo v0, "37636"
+    const-string/jumbo v0, "37637"
+    const-string/jumbo v0, "37638"
+    const-string/jumbo v0, "37639"
+    const-string/jumbo v0, "37640"
+    const-string/jumbo v0, "37641"
+    const-string/jumbo v0, "37642"
+    const-string/jumbo v0, "37643"
+    const-string/jumbo v0, "37644"
+    const-string/jumbo v0, "37645"
+    const-string/jumbo v0, "37646"
+    const-string/jumbo v0, "37647"
+    const-string/jumbo v0, "37648"
+    const-string/jumbo v0, "37649"
+    const-string/jumbo v0, "37650"
+    const-string/jumbo v0, "37651"
+    const-string/jumbo v0, "37652"
+    const-string/jumbo v0, "37653"
+    const-string/jumbo v0, "37654"
+    const-string/jumbo v0, "37655"
+    const-string/jumbo v0, "37656"
+    const-string/jumbo v0, "37657"
+    const-string/jumbo v0, "37658"
+    const-string/jumbo v0, "37659"
+    const-string/jumbo v0, "37660"
+    const-string/jumbo v0, "37661"
+    const-string/jumbo v0, "37662"
+    const-string/jumbo v0, "37663"
+    const-string/jumbo v0, "37664"
+    const-string/jumbo v0, "37665"
+    const-string/jumbo v0, "37666"
+    const-string/jumbo v0, "37667"
+    const-string/jumbo v0, "37668"
+    const-string/jumbo v0, "37669"
+    const-string/jumbo v0, "37670"
+    const-string/jumbo v0, "37671"
+    const-string/jumbo v0, "37672"
+    const-string/jumbo v0, "37673"
+    const-string/jumbo v0, "37674"
+    const-string/jumbo v0, "37675"
+    const-string/jumbo v0, "37676"
+    const-string/jumbo v0, "37677"
+    const-string/jumbo v0, "37678"
+    const-string/jumbo v0, "37679"
+    const-string/jumbo v0, "37680"
+    const-string/jumbo v0, "37681"
+    const-string/jumbo v0, "37682"
+    const-string/jumbo v0, "37683"
+    const-string/jumbo v0, "37684"
+    const-string/jumbo v0, "37685"
+    const-string/jumbo v0, "37686"
+    const-string/jumbo v0, "37687"
+    const-string/jumbo v0, "37688"
+    const-string/jumbo v0, "37689"
+    const-string/jumbo v0, "37690"
+    const-string/jumbo v0, "37691"
+    const-string/jumbo v0, "37692"
+    const-string/jumbo v0, "37693"
+    const-string/jumbo v0, "37694"
+    const-string/jumbo v0, "37695"
+    const-string/jumbo v0, "37696"
+    const-string/jumbo v0, "37697"
+    const-string/jumbo v0, "37698"
+    const-string/jumbo v0, "37699"
+    const-string/jumbo v0, "37700"
+    const-string/jumbo v0, "37701"
+    const-string/jumbo v0, "37702"
+    const-string/jumbo v0, "37703"
+    const-string/jumbo v0, "37704"
+    const-string/jumbo v0, "37705"
+    const-string/jumbo v0, "37706"
+    const-string/jumbo v0, "37707"
+    const-string/jumbo v0, "37708"
+    const-string/jumbo v0, "37709"
+    const-string/jumbo v0, "37710"
+    const-string/jumbo v0, "37711"
+    const-string/jumbo v0, "37712"
+    const-string/jumbo v0, "37713"
+    const-string/jumbo v0, "37714"
+    const-string/jumbo v0, "37715"
+    const-string/jumbo v0, "37716"
+    const-string/jumbo v0, "37717"
+    const-string/jumbo v0, "37718"
+    const-string/jumbo v0, "37719"
+    const-string/jumbo v0, "37720"
+    const-string/jumbo v0, "37721"
+    const-string/jumbo v0, "37722"
+    const-string/jumbo v0, "37723"
+    const-string/jumbo v0, "37724"
+    const-string/jumbo v0, "37725"
+    const-string/jumbo v0, "37726"
+    const-string/jumbo v0, "37727"
+    const-string/jumbo v0, "37728"
+    const-string/jumbo v0, "37729"
+    const-string/jumbo v0, "37730"
+    const-string/jumbo v0, "37731"
+    const-string/jumbo v0, "37732"
+    const-string/jumbo v0, "37733"
+    const-string/jumbo v0, "37734"
+    const-string/jumbo v0, "37735"
+    const-string/jumbo v0, "37736"
+    const-string/jumbo v0, "37737"
+    const-string/jumbo v0, "37738"
+    const-string/jumbo v0, "37739"
+    const-string/jumbo v0, "37740"
+    const-string/jumbo v0, "37741"
+    const-string/jumbo v0, "37742"
+    const-string/jumbo v0, "37743"
+    const-string/jumbo v0, "37744"
+    const-string/jumbo v0, "37745"
+    const-string/jumbo v0, "37746"
+    const-string/jumbo v0, "37747"
+    const-string/jumbo v0, "37748"
+    const-string/jumbo v0, "37749"
+    const-string/jumbo v0, "37750"
+    const-string/jumbo v0, "37751"
+    const-string/jumbo v0, "37752"
+    const-string/jumbo v0, "37753"
+    const-string/jumbo v0, "37754"
+    const-string/jumbo v0, "37755"
+    const-string/jumbo v0, "37756"
+    const-string/jumbo v0, "37757"
+    const-string/jumbo v0, "37758"
+    const-string/jumbo v0, "37759"
+    const-string/jumbo v0, "37760"
+    const-string/jumbo v0, "37761"
+    const-string/jumbo v0, "37762"
+    const-string/jumbo v0, "37763"
+    const-string/jumbo v0, "37764"
+    const-string/jumbo v0, "37765"
+    const-string/jumbo v0, "37766"
+    const-string/jumbo v0, "37767"
+    const-string/jumbo v0, "37768"
+    const-string/jumbo v0, "37769"
+    const-string/jumbo v0, "37770"
+    const-string/jumbo v0, "37771"
+    const-string/jumbo v0, "37772"
+    const-string/jumbo v0, "37773"
+    const-string/jumbo v0, "37774"
+    const-string/jumbo v0, "37775"
+    const-string/jumbo v0, "37776"
+    const-string/jumbo v0, "37777"
+    const-string/jumbo v0, "37778"
+    const-string/jumbo v0, "37779"
+    const-string/jumbo v0, "37780"
+    const-string/jumbo v0, "37781"
+    const-string/jumbo v0, "37782"
+    const-string/jumbo v0, "37783"
+    const-string/jumbo v0, "37784"
+    const-string/jumbo v0, "37785"
+    const-string/jumbo v0, "37786"
+    const-string/jumbo v0, "37787"
+    const-string/jumbo v0, "37788"
+    const-string/jumbo v0, "37789"
+    const-string/jumbo v0, "37790"
+    const-string/jumbo v0, "37791"
+    const-string/jumbo v0, "37792"
+    const-string/jumbo v0, "37793"
+    const-string/jumbo v0, "37794"
+    const-string/jumbo v0, "37795"
+    const-string/jumbo v0, "37796"
+    const-string/jumbo v0, "37797"
+    const-string/jumbo v0, "37798"
+    const-string/jumbo v0, "37799"
+    const-string/jumbo v0, "37800"
+    const-string/jumbo v0, "37801"
+    const-string/jumbo v0, "37802"
+    const-string/jumbo v0, "37803"
+    const-string/jumbo v0, "37804"
+    const-string/jumbo v0, "37805"
+    const-string/jumbo v0, "37806"
+    const-string/jumbo v0, "37807"
+    const-string/jumbo v0, "37808"
+    const-string/jumbo v0, "37809"
+    const-string/jumbo v0, "37810"
+    const-string/jumbo v0, "37811"
+    const-string/jumbo v0, "37812"
+    const-string/jumbo v0, "37813"
+    const-string/jumbo v0, "37814"
+    const-string/jumbo v0, "37815"
+    const-string/jumbo v0, "37816"
+    const-string/jumbo v0, "37817"
+    const-string/jumbo v0, "37818"
+    const-string/jumbo v0, "37819"
+    const-string/jumbo v0, "37820"
+    const-string/jumbo v0, "37821"
+    const-string/jumbo v0, "37822"
+    const-string/jumbo v0, "37823"
+    const-string/jumbo v0, "37824"
+    const-string/jumbo v0, "37825"
+    const-string/jumbo v0, "37826"
+    const-string/jumbo v0, "37827"
+    const-string/jumbo v0, "37828"
+    const-string/jumbo v0, "37829"
+    const-string/jumbo v0, "37830"
+    const-string/jumbo v0, "37831"
+    const-string/jumbo v0, "37832"
+    const-string/jumbo v0, "37833"
+    const-string/jumbo v0, "37834"
+    const-string/jumbo v0, "37835"
+    const-string/jumbo v0, "37836"
+    const-string/jumbo v0, "37837"
+    const-string/jumbo v0, "37838"
+    const-string/jumbo v0, "37839"
+    const-string/jumbo v0, "37840"
+    const-string/jumbo v0, "37841"
+    const-string/jumbo v0, "37842"
+    const-string/jumbo v0, "37843"
+    const-string/jumbo v0, "37844"
+    const-string/jumbo v0, "37845"
+    const-string/jumbo v0, "37846"
+    const-string/jumbo v0, "37847"
+    const-string/jumbo v0, "37848"
+    const-string/jumbo v0, "37849"
+    const-string/jumbo v0, "37850"
+    const-string/jumbo v0, "37851"
+    const-string/jumbo v0, "37852"
+    const-string/jumbo v0, "37853"
+    const-string/jumbo v0, "37854"
+    const-string/jumbo v0, "37855"
+    const-string/jumbo v0, "37856"
+    const-string/jumbo v0, "37857"
+    const-string/jumbo v0, "37858"
+    const-string/jumbo v0, "37859"
+    const-string/jumbo v0, "37860"
+    const-string/jumbo v0, "37861"
+    const-string/jumbo v0, "37862"
+    const-string/jumbo v0, "37863"
+    const-string/jumbo v0, "37864"
+    const-string/jumbo v0, "37865"
+    const-string/jumbo v0, "37866"
+    const-string/jumbo v0, "37867"
+    const-string/jumbo v0, "37868"
+    const-string/jumbo v0, "37869"
+    const-string/jumbo v0, "37870"
+    const-string/jumbo v0, "37871"
+    const-string/jumbo v0, "37872"
+    const-string/jumbo v0, "37873"
+    const-string/jumbo v0, "37874"
+    const-string/jumbo v0, "37875"
+    const-string/jumbo v0, "37876"
+    const-string/jumbo v0, "37877"
+    const-string/jumbo v0, "37878"
+    const-string/jumbo v0, "37879"
+    const-string/jumbo v0, "37880"
+    const-string/jumbo v0, "37881"
+    const-string/jumbo v0, "37882"
+    const-string/jumbo v0, "37883"
+    const-string/jumbo v0, "37884"
+    const-string/jumbo v0, "37885"
+    const-string/jumbo v0, "37886"
+    const-string/jumbo v0, "37887"
+    const-string/jumbo v0, "37888"
+    const-string/jumbo v0, "37889"
+    const-string/jumbo v0, "37890"
+    const-string/jumbo v0, "37891"
+    const-string/jumbo v0, "37892"
+    const-string/jumbo v0, "37893"
+    const-string/jumbo v0, "37894"
+    const-string/jumbo v0, "37895"
+    const-string/jumbo v0, "37896"
+    const-string/jumbo v0, "37897"
+    const-string/jumbo v0, "37898"
+    const-string/jumbo v0, "37899"
+    const-string/jumbo v0, "37900"
+    const-string/jumbo v0, "37901"
+    const-string/jumbo v0, "37902"
+    const-string/jumbo v0, "37903"
+    const-string/jumbo v0, "37904"
+    const-string/jumbo v0, "37905"
+    const-string/jumbo v0, "37906"
+    const-string/jumbo v0, "37907"
+    const-string/jumbo v0, "37908"
+    const-string/jumbo v0, "37909"
+    const-string/jumbo v0, "37910"
+    const-string/jumbo v0, "37911"
+    const-string/jumbo v0, "37912"
+    const-string/jumbo v0, "37913"
+    const-string/jumbo v0, "37914"
+    const-string/jumbo v0, "37915"
+    const-string/jumbo v0, "37916"
+    const-string/jumbo v0, "37917"
+    const-string/jumbo v0, "37918"
+    const-string/jumbo v0, "37919"
+    const-string/jumbo v0, "37920"
+    const-string/jumbo v0, "37921"
+    const-string/jumbo v0, "37922"
+    const-string/jumbo v0, "37923"
+    const-string/jumbo v0, "37924"
+    const-string/jumbo v0, "37925"
+    const-string/jumbo v0, "37926"
+    const-string/jumbo v0, "37927"
+    const-string/jumbo v0, "37928"
+    const-string/jumbo v0, "37929"
+    const-string/jumbo v0, "37930"
+    const-string/jumbo v0, "37931"
+    const-string/jumbo v0, "37932"
+    const-string/jumbo v0, "37933"
+    const-string/jumbo v0, "37934"
+    const-string/jumbo v0, "37935"
+    const-string/jumbo v0, "37936"
+    const-string/jumbo v0, "37937"
+    const-string/jumbo v0, "37938"
+    const-string/jumbo v0, "37939"
+    const-string/jumbo v0, "37940"
+    const-string/jumbo v0, "37941"
+    const-string/jumbo v0, "37942"
+    const-string/jumbo v0, "37943"
+    const-string/jumbo v0, "37944"
+    const-string/jumbo v0, "37945"
+    const-string/jumbo v0, "37946"
+    const-string/jumbo v0, "37947"
+    const-string/jumbo v0, "37948"
+    const-string/jumbo v0, "37949"
+    const-string/jumbo v0, "37950"
+    const-string/jumbo v0, "37951"
+    const-string/jumbo v0, "37952"
+    const-string/jumbo v0, "37953"
+    const-string/jumbo v0, "37954"
+    const-string/jumbo v0, "37955"
+    const-string/jumbo v0, "37956"
+    const-string/jumbo v0, "37957"
+    const-string/jumbo v0, "37958"
+    const-string/jumbo v0, "37959"
+    const-string/jumbo v0, "37960"
+    const-string/jumbo v0, "37961"
+    const-string/jumbo v0, "37962"
+    const-string/jumbo v0, "37963"
+    const-string/jumbo v0, "37964"
+    const-string/jumbo v0, "37965"
+    const-string/jumbo v0, "37966"
+    const-string/jumbo v0, "37967"
+    const-string/jumbo v0, "37968"
+    const-string/jumbo v0, "37969"
+    const-string/jumbo v0, "37970"
+    const-string/jumbo v0, "37971"
+    const-string/jumbo v0, "37972"
+    const-string/jumbo v0, "37973"
+    const-string/jumbo v0, "37974"
+    const-string/jumbo v0, "37975"
+    const-string/jumbo v0, "37976"
+    const-string/jumbo v0, "37977"
+    const-string/jumbo v0, "37978"
+    const-string/jumbo v0, "37979"
+    const-string/jumbo v0, "37980"
+    const-string/jumbo v0, "37981"
+    const-string/jumbo v0, "37982"
+    const-string/jumbo v0, "37983"
+    const-string/jumbo v0, "37984"
+    const-string/jumbo v0, "37985"
+    const-string/jumbo v0, "37986"
+    const-string/jumbo v0, "37987"
+    const-string/jumbo v0, "37988"
+    const-string/jumbo v0, "37989"
+    const-string/jumbo v0, "37990"
+    const-string/jumbo v0, "37991"
+    const-string/jumbo v0, "37992"
+    const-string/jumbo v0, "37993"
+    const-string/jumbo v0, "37994"
+    const-string/jumbo v0, "37995"
+    const-string/jumbo v0, "37996"
+    const-string/jumbo v0, "37997"
+    const-string/jumbo v0, "37998"
+    const-string/jumbo v0, "37999"
+    const-string/jumbo v0, "38000"
+    const-string/jumbo v0, "38001"
+    const-string/jumbo v0, "38002"
+    const-string/jumbo v0, "38003"
+    const-string/jumbo v0, "38004"
+    const-string/jumbo v0, "38005"
+    const-string/jumbo v0, "38006"
+    const-string/jumbo v0, "38007"
+    const-string/jumbo v0, "38008"
+    const-string/jumbo v0, "38009"
+    const-string/jumbo v0, "38010"
+    const-string/jumbo v0, "38011"
+    const-string/jumbo v0, "38012"
+    const-string/jumbo v0, "38013"
+    const-string/jumbo v0, "38014"
+    const-string/jumbo v0, "38015"
+    const-string/jumbo v0, "38016"
+    const-string/jumbo v0, "38017"
+    const-string/jumbo v0, "38018"
+    const-string/jumbo v0, "38019"
+    const-string/jumbo v0, "38020"
+    const-string/jumbo v0, "38021"
+    const-string/jumbo v0, "38022"
+    const-string/jumbo v0, "38023"
+    const-string/jumbo v0, "38024"
+    const-string/jumbo v0, "38025"
+    const-string/jumbo v0, "38026"
+    const-string/jumbo v0, "38027"
+    const-string/jumbo v0, "38028"
+    const-string/jumbo v0, "38029"
+    const-string/jumbo v0, "38030"
+    const-string/jumbo v0, "38031"
+    const-string/jumbo v0, "38032"
+    const-string/jumbo v0, "38033"
+    const-string/jumbo v0, "38034"
+    const-string/jumbo v0, "38035"
+    const-string/jumbo v0, "38036"
+    const-string/jumbo v0, "38037"
+    const-string/jumbo v0, "38038"
+    const-string/jumbo v0, "38039"
+    const-string/jumbo v0, "38040"
+    const-string/jumbo v0, "38041"
+    const-string/jumbo v0, "38042"
+    const-string/jumbo v0, "38043"
+    const-string/jumbo v0, "38044"
+    const-string/jumbo v0, "38045"
+    const-string/jumbo v0, "38046"
+    const-string/jumbo v0, "38047"
+    const-string/jumbo v0, "38048"
+    const-string/jumbo v0, "38049"
+    const-string/jumbo v0, "38050"
+    const-string/jumbo v0, "38051"
+    const-string/jumbo v0, "38052"
+    const-string/jumbo v0, "38053"
+    const-string/jumbo v0, "38054"
+    const-string/jumbo v0, "38055"
+    const-string/jumbo v0, "38056"
+    const-string/jumbo v0, "38057"
+    const-string/jumbo v0, "38058"
+    const-string/jumbo v0, "38059"
+    const-string/jumbo v0, "38060"
+    const-string/jumbo v0, "38061"
+    const-string/jumbo v0, "38062"
+    const-string/jumbo v0, "38063"
+    const-string/jumbo v0, "38064"
+    const-string/jumbo v0, "38065"
+    const-string/jumbo v0, "38066"
+    const-string/jumbo v0, "38067"
+    const-string/jumbo v0, "38068"
+    const-string/jumbo v0, "38069"
+    const-string/jumbo v0, "38070"
+    const-string/jumbo v0, "38071"
+    const-string/jumbo v0, "38072"
+    const-string/jumbo v0, "38073"
+    const-string/jumbo v0, "38074"
+    const-string/jumbo v0, "38075"
+    const-string/jumbo v0, "38076"
+    const-string/jumbo v0, "38077"
+    const-string/jumbo v0, "38078"
+    const-string/jumbo v0, "38079"
+    const-string/jumbo v0, "38080"
+    const-string/jumbo v0, "38081"
+    const-string/jumbo v0, "38082"
+    const-string/jumbo v0, "38083"
+    const-string/jumbo v0, "38084"
+    const-string/jumbo v0, "38085"
+    const-string/jumbo v0, "38086"
+    const-string/jumbo v0, "38087"
+    const-string/jumbo v0, "38088"
+    const-string/jumbo v0, "38089"
+    const-string/jumbo v0, "38090"
+    const-string/jumbo v0, "38091"
+    const-string/jumbo v0, "38092"
+    const-string/jumbo v0, "38093"
+    const-string/jumbo v0, "38094"
+    const-string/jumbo v0, "38095"
+    const-string/jumbo v0, "38096"
+    const-string/jumbo v0, "38097"
+    const-string/jumbo v0, "38098"
+    const-string/jumbo v0, "38099"
+    const-string/jumbo v0, "38100"
+    const-string/jumbo v0, "38101"
+    const-string/jumbo v0, "38102"
+    const-string/jumbo v0, "38103"
+    const-string/jumbo v0, "38104"
+    const-string/jumbo v0, "38105"
+    const-string/jumbo v0, "38106"
+    const-string/jumbo v0, "38107"
+    const-string/jumbo v0, "38108"
+    const-string/jumbo v0, "38109"
+    const-string/jumbo v0, "38110"
+    const-string/jumbo v0, "38111"
+    const-string/jumbo v0, "38112"
+    const-string/jumbo v0, "38113"
+    const-string/jumbo v0, "38114"
+    const-string/jumbo v0, "38115"
+    const-string/jumbo v0, "38116"
+    const-string/jumbo v0, "38117"
+    const-string/jumbo v0, "38118"
+    const-string/jumbo v0, "38119"
+    const-string/jumbo v0, "38120"
+    const-string/jumbo v0, "38121"
+    const-string/jumbo v0, "38122"
+    const-string/jumbo v0, "38123"
+    const-string/jumbo v0, "38124"
+    const-string/jumbo v0, "38125"
+    const-string/jumbo v0, "38126"
+    const-string/jumbo v0, "38127"
+    const-string/jumbo v0, "38128"
+    const-string/jumbo v0, "38129"
+    const-string/jumbo v0, "38130"
+    const-string/jumbo v0, "38131"
+    const-string/jumbo v0, "38132"
+    const-string/jumbo v0, "38133"
+    const-string/jumbo v0, "38134"
+    const-string/jumbo v0, "38135"
+    const-string/jumbo v0, "38136"
+    const-string/jumbo v0, "38137"
+    const-string/jumbo v0, "38138"
+    const-string/jumbo v0, "38139"
+    const-string/jumbo v0, "38140"
+    const-string/jumbo v0, "38141"
+    const-string/jumbo v0, "38142"
+    const-string/jumbo v0, "38143"
+    const-string/jumbo v0, "38144"
+    const-string/jumbo v0, "38145"
+    const-string/jumbo v0, "38146"
+    const-string/jumbo v0, "38147"
+    const-string/jumbo v0, "38148"
+    const-string/jumbo v0, "38149"
+    const-string/jumbo v0, "38150"
+    const-string/jumbo v0, "38151"
+    const-string/jumbo v0, "38152"
+    const-string/jumbo v0, "38153"
+    const-string/jumbo v0, "38154"
+    const-string/jumbo v0, "38155"
+    const-string/jumbo v0, "38156"
+    const-string/jumbo v0, "38157"
+    const-string/jumbo v0, "38158"
+    const-string/jumbo v0, "38159"
+    const-string/jumbo v0, "38160"
+    const-string/jumbo v0, "38161"
+    const-string/jumbo v0, "38162"
+    const-string/jumbo v0, "38163"
+    const-string/jumbo v0, "38164"
+    const-string/jumbo v0, "38165"
+    const-string/jumbo v0, "38166"
+    const-string/jumbo v0, "38167"
+    const-string/jumbo v0, "38168"
+    const-string/jumbo v0, "38169"
+    const-string/jumbo v0, "38170"
+    const-string/jumbo v0, "38171"
+    const-string/jumbo v0, "38172"
+    const-string/jumbo v0, "38173"
+    const-string/jumbo v0, "38174"
+    const-string/jumbo v0, "38175"
+    const-string/jumbo v0, "38176"
+    const-string/jumbo v0, "38177"
+    const-string/jumbo v0, "38178"
+    const-string/jumbo v0, "38179"
+    const-string/jumbo v0, "38180"
+    const-string/jumbo v0, "38181"
+    const-string/jumbo v0, "38182"
+    const-string/jumbo v0, "38183"
+    const-string/jumbo v0, "38184"
+    const-string/jumbo v0, "38185"
+    const-string/jumbo v0, "38186"
+    const-string/jumbo v0, "38187"
+    const-string/jumbo v0, "38188"
+    const-string/jumbo v0, "38189"
+    const-string/jumbo v0, "38190"
+    const-string/jumbo v0, "38191"
+    const-string/jumbo v0, "38192"
+    const-string/jumbo v0, "38193"
+    const-string/jumbo v0, "38194"
+    const-string/jumbo v0, "38195"
+    const-string/jumbo v0, "38196"
+    const-string/jumbo v0, "38197"
+    const-string/jumbo v0, "38198"
+    const-string/jumbo v0, "38199"
+    const-string/jumbo v0, "38200"
+    const-string/jumbo v0, "38201"
+    const-string/jumbo v0, "38202"
+    const-string/jumbo v0, "38203"
+    const-string/jumbo v0, "38204"
+    const-string/jumbo v0, "38205"
+    const-string/jumbo v0, "38206"
+    const-string/jumbo v0, "38207"
+    const-string/jumbo v0, "38208"
+    const-string/jumbo v0, "38209"
+    const-string/jumbo v0, "38210"
+    const-string/jumbo v0, "38211"
+    const-string/jumbo v0, "38212"
+    const-string/jumbo v0, "38213"
+    const-string/jumbo v0, "38214"
+    const-string/jumbo v0, "38215"
+    const-string/jumbo v0, "38216"
+    const-string/jumbo v0, "38217"
+    const-string/jumbo v0, "38218"
+    const-string/jumbo v0, "38219"
+    const-string/jumbo v0, "38220"
+    const-string/jumbo v0, "38221"
+    const-string/jumbo v0, "38222"
+    const-string/jumbo v0, "38223"
+    const-string/jumbo v0, "38224"
+    const-string/jumbo v0, "38225"
+    const-string/jumbo v0, "38226"
+    const-string/jumbo v0, "38227"
+    const-string/jumbo v0, "38228"
+    const-string/jumbo v0, "38229"
+    const-string/jumbo v0, "38230"
+    const-string/jumbo v0, "38231"
+    const-string/jumbo v0, "38232"
+    const-string/jumbo v0, "38233"
+    const-string/jumbo v0, "38234"
+    const-string/jumbo v0, "38235"
+    const-string/jumbo v0, "38236"
+    const-string/jumbo v0, "38237"
+    const-string/jumbo v0, "38238"
+    const-string/jumbo v0, "38239"
+    const-string/jumbo v0, "38240"
+    const-string/jumbo v0, "38241"
+    const-string/jumbo v0, "38242"
+    const-string/jumbo v0, "38243"
+    const-string/jumbo v0, "38244"
+    const-string/jumbo v0, "38245"
+    const-string/jumbo v0, "38246"
+    const-string/jumbo v0, "38247"
+    const-string/jumbo v0, "38248"
+    const-string/jumbo v0, "38249"
+    const-string/jumbo v0, "38250"
+    const-string/jumbo v0, "38251"
+    const-string/jumbo v0, "38252"
+    const-string/jumbo v0, "38253"
+    const-string/jumbo v0, "38254"
+    const-string/jumbo v0, "38255"
+    const-string/jumbo v0, "38256"
+    const-string/jumbo v0, "38257"
+    const-string/jumbo v0, "38258"
+    const-string/jumbo v0, "38259"
+    const-string/jumbo v0, "38260"
+    const-string/jumbo v0, "38261"
+    const-string/jumbo v0, "38262"
+    const-string/jumbo v0, "38263"
+    const-string/jumbo v0, "38264"
+    const-string/jumbo v0, "38265"
+    const-string/jumbo v0, "38266"
+    const-string/jumbo v0, "38267"
+    const-string/jumbo v0, "38268"
+    const-string/jumbo v0, "38269"
+    const-string/jumbo v0, "38270"
+    const-string/jumbo v0, "38271"
+    const-string/jumbo v0, "38272"
+    const-string/jumbo v0, "38273"
+    const-string/jumbo v0, "38274"
+    const-string/jumbo v0, "38275"
+    const-string/jumbo v0, "38276"
+    const-string/jumbo v0, "38277"
+    const-string/jumbo v0, "38278"
+    const-string/jumbo v0, "38279"
+    const-string/jumbo v0, "38280"
+    const-string/jumbo v0, "38281"
+    const-string/jumbo v0, "38282"
+    const-string/jumbo v0, "38283"
+    const-string/jumbo v0, "38284"
+    const-string/jumbo v0, "38285"
+    const-string/jumbo v0, "38286"
+    const-string/jumbo v0, "38287"
+    const-string/jumbo v0, "38288"
+    const-string/jumbo v0, "38289"
+    const-string/jumbo v0, "38290"
+    const-string/jumbo v0, "38291"
+    const-string/jumbo v0, "38292"
+    const-string/jumbo v0, "38293"
+    const-string/jumbo v0, "38294"
+    const-string/jumbo v0, "38295"
+    const-string/jumbo v0, "38296"
+    const-string/jumbo v0, "38297"
+    const-string/jumbo v0, "38298"
+    const-string/jumbo v0, "38299"
+    const-string/jumbo v0, "38300"
+    const-string/jumbo v0, "38301"
+    const-string/jumbo v0, "38302"
+    const-string/jumbo v0, "38303"
+    const-string/jumbo v0, "38304"
+    const-string/jumbo v0, "38305"
+    const-string/jumbo v0, "38306"
+    const-string/jumbo v0, "38307"
+    const-string/jumbo v0, "38308"
+    const-string/jumbo v0, "38309"
+    const-string/jumbo v0, "38310"
+    const-string/jumbo v0, "38311"
+    const-string/jumbo v0, "38312"
+    const-string/jumbo v0, "38313"
+    const-string/jumbo v0, "38314"
+    const-string/jumbo v0, "38315"
+    const-string/jumbo v0, "38316"
+    const-string/jumbo v0, "38317"
+    const-string/jumbo v0, "38318"
+    const-string/jumbo v0, "38319"
+    const-string/jumbo v0, "38320"
+    const-string/jumbo v0, "38321"
+    const-string/jumbo v0, "38322"
+    const-string/jumbo v0, "38323"
+    const-string/jumbo v0, "38324"
+    const-string/jumbo v0, "38325"
+    const-string/jumbo v0, "38326"
+    const-string/jumbo v0, "38327"
+    const-string/jumbo v0, "38328"
+    const-string/jumbo v0, "38329"
+    const-string/jumbo v0, "38330"
+    const-string/jumbo v0, "38331"
+    const-string/jumbo v0, "38332"
+    const-string/jumbo v0, "38333"
+    const-string/jumbo v0, "38334"
+    const-string/jumbo v0, "38335"
+    const-string/jumbo v0, "38336"
+    const-string/jumbo v0, "38337"
+    const-string/jumbo v0, "38338"
+    const-string/jumbo v0, "38339"
+    const-string/jumbo v0, "38340"
+    const-string/jumbo v0, "38341"
+    const-string/jumbo v0, "38342"
+    const-string/jumbo v0, "38343"
+    const-string/jumbo v0, "38344"
+    const-string/jumbo v0, "38345"
+    const-string/jumbo v0, "38346"
+    const-string/jumbo v0, "38347"
+    const-string/jumbo v0, "38348"
+    const-string/jumbo v0, "38349"
+    const-string/jumbo v0, "38350"
+    const-string/jumbo v0, "38351"
+    const-string/jumbo v0, "38352"
+    const-string/jumbo v0, "38353"
+    const-string/jumbo v0, "38354"
+    const-string/jumbo v0, "38355"
+    const-string/jumbo v0, "38356"
+    const-string/jumbo v0, "38357"
+    const-string/jumbo v0, "38358"
+    const-string/jumbo v0, "38359"
+    const-string/jumbo v0, "38360"
+    const-string/jumbo v0, "38361"
+    const-string/jumbo v0, "38362"
+    const-string/jumbo v0, "38363"
+    const-string/jumbo v0, "38364"
+    const-string/jumbo v0, "38365"
+    const-string/jumbo v0, "38366"
+    const-string/jumbo v0, "38367"
+    const-string/jumbo v0, "38368"
+    const-string/jumbo v0, "38369"
+    const-string/jumbo v0, "38370"
+    const-string/jumbo v0, "38371"
+    const-string/jumbo v0, "38372"
+    const-string/jumbo v0, "38373"
+    const-string/jumbo v0, "38374"
+    const-string/jumbo v0, "38375"
+    const-string/jumbo v0, "38376"
+    const-string/jumbo v0, "38377"
+    const-string/jumbo v0, "38378"
+    const-string/jumbo v0, "38379"
+    const-string/jumbo v0, "38380"
+    const-string/jumbo v0, "38381"
+    const-string/jumbo v0, "38382"
+    const-string/jumbo v0, "38383"
+    const-string/jumbo v0, "38384"
+    const-string/jumbo v0, "38385"
+    const-string/jumbo v0, "38386"
+    const-string/jumbo v0, "38387"
+    const-string/jumbo v0, "38388"
+    const-string/jumbo v0, "38389"
+    const-string/jumbo v0, "38390"
+    const-string/jumbo v0, "38391"
+    const-string/jumbo v0, "38392"
+    const-string/jumbo v0, "38393"
+    const-string/jumbo v0, "38394"
+    const-string/jumbo v0, "38395"
+    const-string/jumbo v0, "38396"
+    const-string/jumbo v0, "38397"
+    const-string/jumbo v0, "38398"
+    const-string/jumbo v0, "38399"
+    const-string/jumbo v0, "38400"
+    const-string/jumbo v0, "38401"
+    const-string/jumbo v0, "38402"
+    const-string/jumbo v0, "38403"
+    const-string/jumbo v0, "38404"
+    const-string/jumbo v0, "38405"
+    const-string/jumbo v0, "38406"
+    const-string/jumbo v0, "38407"
+    const-string/jumbo v0, "38408"
+    const-string/jumbo v0, "38409"
+    const-string/jumbo v0, "38410"
+    const-string/jumbo v0, "38411"
+    const-string/jumbo v0, "38412"
+    const-string/jumbo v0, "38413"
+    const-string/jumbo v0, "38414"
+    const-string/jumbo v0, "38415"
+    const-string/jumbo v0, "38416"
+    const-string/jumbo v0, "38417"
+    const-string/jumbo v0, "38418"
+    const-string/jumbo v0, "38419"
+    const-string/jumbo v0, "38420"
+    const-string/jumbo v0, "38421"
+    const-string/jumbo v0, "38422"
+    const-string/jumbo v0, "38423"
+    const-string/jumbo v0, "38424"
+    const-string/jumbo v0, "38425"
+    const-string/jumbo v0, "38426"
+    const-string/jumbo v0, "38427"
+    const-string/jumbo v0, "38428"
+    const-string/jumbo v0, "38429"
+    const-string/jumbo v0, "38430"
+    const-string/jumbo v0, "38431"
+    const-string/jumbo v0, "38432"
+    const-string/jumbo v0, "38433"
+    const-string/jumbo v0, "38434"
+    const-string/jumbo v0, "38435"
+    const-string/jumbo v0, "38436"
+    const-string/jumbo v0, "38437"
+    const-string/jumbo v0, "38438"
+    const-string/jumbo v0, "38439"
+    const-string/jumbo v0, "38440"
+    const-string/jumbo v0, "38441"
+    const-string/jumbo v0, "38442"
+    const-string/jumbo v0, "38443"
+    const-string/jumbo v0, "38444"
+    const-string/jumbo v0, "38445"
+    const-string/jumbo v0, "38446"
+    const-string/jumbo v0, "38447"
+    const-string/jumbo v0, "38448"
+    const-string/jumbo v0, "38449"
+    const-string/jumbo v0, "38450"
+    const-string/jumbo v0, "38451"
+    const-string/jumbo v0, "38452"
+    const-string/jumbo v0, "38453"
+    const-string/jumbo v0, "38454"
+    const-string/jumbo v0, "38455"
+    const-string/jumbo v0, "38456"
+    const-string/jumbo v0, "38457"
+    const-string/jumbo v0, "38458"
+    const-string/jumbo v0, "38459"
+    const-string/jumbo v0, "38460"
+    const-string/jumbo v0, "38461"
+    const-string/jumbo v0, "38462"
+    const-string/jumbo v0, "38463"
+    const-string/jumbo v0, "38464"
+    const-string/jumbo v0, "38465"
+    const-string/jumbo v0, "38466"
+    const-string/jumbo v0, "38467"
+    const-string/jumbo v0, "38468"
+    const-string/jumbo v0, "38469"
+    const-string/jumbo v0, "38470"
+    const-string/jumbo v0, "38471"
+    const-string/jumbo v0, "38472"
+    const-string/jumbo v0, "38473"
+    const-string/jumbo v0, "38474"
+    const-string/jumbo v0, "38475"
+    const-string/jumbo v0, "38476"
+    const-string/jumbo v0, "38477"
+    const-string/jumbo v0, "38478"
+    const-string/jumbo v0, "38479"
+    const-string/jumbo v0, "38480"
+    const-string/jumbo v0, "38481"
+    const-string/jumbo v0, "38482"
+    const-string/jumbo v0, "38483"
+    const-string/jumbo v0, "38484"
+    const-string/jumbo v0, "38485"
+    const-string/jumbo v0, "38486"
+    const-string/jumbo v0, "38487"
+    const-string/jumbo v0, "38488"
+    const-string/jumbo v0, "38489"
+    const-string/jumbo v0, "38490"
+    const-string/jumbo v0, "38491"
+    const-string/jumbo v0, "38492"
+    const-string/jumbo v0, "38493"
+    const-string/jumbo v0, "38494"
+    const-string/jumbo v0, "38495"
+    const-string/jumbo v0, "38496"
+    const-string/jumbo v0, "38497"
+    const-string/jumbo v0, "38498"
+    const-string/jumbo v0, "38499"
+    const-string/jumbo v0, "38500"
+    const-string/jumbo v0, "38501"
+    const-string/jumbo v0, "38502"
+    const-string/jumbo v0, "38503"
+    const-string/jumbo v0, "38504"
+    const-string/jumbo v0, "38505"
+    const-string/jumbo v0, "38506"
+    const-string/jumbo v0, "38507"
+    const-string/jumbo v0, "38508"
+    const-string/jumbo v0, "38509"
+    const-string/jumbo v0, "38510"
+    const-string/jumbo v0, "38511"
+    const-string/jumbo v0, "38512"
+    const-string/jumbo v0, "38513"
+    const-string/jumbo v0, "38514"
+    const-string/jumbo v0, "38515"
+    const-string/jumbo v0, "38516"
+    const-string/jumbo v0, "38517"
+    const-string/jumbo v0, "38518"
+    const-string/jumbo v0, "38519"
+    const-string/jumbo v0, "38520"
+    const-string/jumbo v0, "38521"
+    const-string/jumbo v0, "38522"
+    const-string/jumbo v0, "38523"
+    const-string/jumbo v0, "38524"
+    const-string/jumbo v0, "38525"
+    const-string/jumbo v0, "38526"
+    const-string/jumbo v0, "38527"
+    const-string/jumbo v0, "38528"
+    const-string/jumbo v0, "38529"
+    const-string/jumbo v0, "38530"
+    const-string/jumbo v0, "38531"
+    const-string/jumbo v0, "38532"
+    const-string/jumbo v0, "38533"
+    const-string/jumbo v0, "38534"
+    const-string/jumbo v0, "38535"
+    const-string/jumbo v0, "38536"
+    const-string/jumbo v0, "38537"
+    const-string/jumbo v0, "38538"
+    const-string/jumbo v0, "38539"
+    const-string/jumbo v0, "38540"
+    const-string/jumbo v0, "38541"
+    const-string/jumbo v0, "38542"
+    const-string/jumbo v0, "38543"
+    const-string/jumbo v0, "38544"
+    const-string/jumbo v0, "38545"
+    const-string/jumbo v0, "38546"
+    const-string/jumbo v0, "38547"
+    const-string/jumbo v0, "38548"
+    const-string/jumbo v0, "38549"
+    const-string/jumbo v0, "38550"
+    const-string/jumbo v0, "38551"
+    const-string/jumbo v0, "38552"
+    const-string/jumbo v0, "38553"
+    const-string/jumbo v0, "38554"
+    const-string/jumbo v0, "38555"
+    const-string/jumbo v0, "38556"
+    const-string/jumbo v0, "38557"
+    const-string/jumbo v0, "38558"
+    const-string/jumbo v0, "38559"
+    const-string/jumbo v0, "38560"
+    const-string/jumbo v0, "38561"
+    const-string/jumbo v0, "38562"
+    const-string/jumbo v0, "38563"
+    const-string/jumbo v0, "38564"
+    const-string/jumbo v0, "38565"
+    const-string/jumbo v0, "38566"
+    const-string/jumbo v0, "38567"
+    const-string/jumbo v0, "38568"
+    const-string/jumbo v0, "38569"
+    const-string/jumbo v0, "38570"
+    const-string/jumbo v0, "38571"
+    const-string/jumbo v0, "38572"
+    const-string/jumbo v0, "38573"
+    const-string/jumbo v0, "38574"
+    const-string/jumbo v0, "38575"
+    const-string/jumbo v0, "38576"
+    const-string/jumbo v0, "38577"
+    const-string/jumbo v0, "38578"
+    const-string/jumbo v0, "38579"
+    const-string/jumbo v0, "38580"
+    const-string/jumbo v0, "38581"
+    const-string/jumbo v0, "38582"
+    const-string/jumbo v0, "38583"
+    const-string/jumbo v0, "38584"
+    const-string/jumbo v0, "38585"
+    const-string/jumbo v0, "38586"
+    const-string/jumbo v0, "38587"
+    const-string/jumbo v0, "38588"
+    const-string/jumbo v0, "38589"
+    const-string/jumbo v0, "38590"
+    const-string/jumbo v0, "38591"
+    const-string/jumbo v0, "38592"
+    const-string/jumbo v0, "38593"
+    const-string/jumbo v0, "38594"
+    const-string/jumbo v0, "38595"
+    const-string/jumbo v0, "38596"
+    const-string/jumbo v0, "38597"
+    const-string/jumbo v0, "38598"
+    const-string/jumbo v0, "38599"
+    const-string/jumbo v0, "38600"
+    const-string/jumbo v0, "38601"
+    const-string/jumbo v0, "38602"
+    const-string/jumbo v0, "38603"
+    const-string/jumbo v0, "38604"
+    const-string/jumbo v0, "38605"
+    const-string/jumbo v0, "38606"
+    const-string/jumbo v0, "38607"
+    const-string/jumbo v0, "38608"
+    const-string/jumbo v0, "38609"
+    const-string/jumbo v0, "38610"
+    const-string/jumbo v0, "38611"
+    const-string/jumbo v0, "38612"
+    const-string/jumbo v0, "38613"
+    const-string/jumbo v0, "38614"
+    const-string/jumbo v0, "38615"
+    const-string/jumbo v0, "38616"
+    const-string/jumbo v0, "38617"
+    const-string/jumbo v0, "38618"
+    const-string/jumbo v0, "38619"
+    const-string/jumbo v0, "38620"
+    const-string/jumbo v0, "38621"
+    const-string/jumbo v0, "38622"
+    const-string/jumbo v0, "38623"
+    const-string/jumbo v0, "38624"
+    const-string/jumbo v0, "38625"
+    const-string/jumbo v0, "38626"
+    const-string/jumbo v0, "38627"
+    const-string/jumbo v0, "38628"
+    const-string/jumbo v0, "38629"
+    const-string/jumbo v0, "38630"
+    const-string/jumbo v0, "38631"
+    const-string/jumbo v0, "38632"
+    const-string/jumbo v0, "38633"
+    const-string/jumbo v0, "38634"
+    const-string/jumbo v0, "38635"
+    const-string/jumbo v0, "38636"
+    const-string/jumbo v0, "38637"
+    const-string/jumbo v0, "38638"
+    const-string/jumbo v0, "38639"
+    const-string/jumbo v0, "38640"
+    const-string/jumbo v0, "38641"
+    const-string/jumbo v0, "38642"
+    const-string/jumbo v0, "38643"
+    const-string/jumbo v0, "38644"
+    const-string/jumbo v0, "38645"
+    const-string/jumbo v0, "38646"
+    const-string/jumbo v0, "38647"
+    const-string/jumbo v0, "38648"
+    const-string/jumbo v0, "38649"
+    const-string/jumbo v0, "38650"
+    const-string/jumbo v0, "38651"
+    const-string/jumbo v0, "38652"
+    const-string/jumbo v0, "38653"
+    const-string/jumbo v0, "38654"
+    const-string/jumbo v0, "38655"
+    const-string/jumbo v0, "38656"
+    const-string/jumbo v0, "38657"
+    const-string/jumbo v0, "38658"
+    const-string/jumbo v0, "38659"
+    const-string/jumbo v0, "38660"
+    const-string/jumbo v0, "38661"
+    const-string/jumbo v0, "38662"
+    const-string/jumbo v0, "38663"
+    const-string/jumbo v0, "38664"
+    const-string/jumbo v0, "38665"
+    const-string/jumbo v0, "38666"
+    const-string/jumbo v0, "38667"
+    const-string/jumbo v0, "38668"
+    const-string/jumbo v0, "38669"
+    const-string/jumbo v0, "38670"
+    const-string/jumbo v0, "38671"
+    const-string/jumbo v0, "38672"
+    const-string/jumbo v0, "38673"
+    const-string/jumbo v0, "38674"
+    const-string/jumbo v0, "38675"
+    const-string/jumbo v0, "38676"
+    const-string/jumbo v0, "38677"
+    const-string/jumbo v0, "38678"
+    const-string/jumbo v0, "38679"
+    const-string/jumbo v0, "38680"
+    const-string/jumbo v0, "38681"
+    const-string/jumbo v0, "38682"
+    const-string/jumbo v0, "38683"
+    const-string/jumbo v0, "38684"
+    const-string/jumbo v0, "38685"
+    const-string/jumbo v0, "38686"
+    const-string/jumbo v0, "38687"
+    const-string/jumbo v0, "38688"
+    const-string/jumbo v0, "38689"
+    const-string/jumbo v0, "38690"
+    const-string/jumbo v0, "38691"
+    const-string/jumbo v0, "38692"
+    const-string/jumbo v0, "38693"
+    const-string/jumbo v0, "38694"
+    const-string/jumbo v0, "38695"
+    const-string/jumbo v0, "38696"
+    const-string/jumbo v0, "38697"
+    const-string/jumbo v0, "38698"
+    const-string/jumbo v0, "38699"
+    const-string/jumbo v0, "38700"
+    const-string/jumbo v0, "38701"
+    const-string/jumbo v0, "38702"
+    const-string/jumbo v0, "38703"
+    const-string/jumbo v0, "38704"
+    const-string/jumbo v0, "38705"
+    const-string/jumbo v0, "38706"
+    const-string/jumbo v0, "38707"
+    const-string/jumbo v0, "38708"
+    const-string/jumbo v0, "38709"
+    const-string/jumbo v0, "38710"
+    const-string/jumbo v0, "38711"
+    const-string/jumbo v0, "38712"
+    const-string/jumbo v0, "38713"
+    const-string/jumbo v0, "38714"
+    const-string/jumbo v0, "38715"
+    const-string/jumbo v0, "38716"
+    const-string/jumbo v0, "38717"
+    const-string/jumbo v0, "38718"
+    const-string/jumbo v0, "38719"
+    const-string/jumbo v0, "38720"
+    const-string/jumbo v0, "38721"
+    const-string/jumbo v0, "38722"
+    const-string/jumbo v0, "38723"
+    const-string/jumbo v0, "38724"
+    const-string/jumbo v0, "38725"
+    const-string/jumbo v0, "38726"
+    const-string/jumbo v0, "38727"
+    const-string/jumbo v0, "38728"
+    const-string/jumbo v0, "38729"
+    const-string/jumbo v0, "38730"
+    const-string/jumbo v0, "38731"
+    const-string/jumbo v0, "38732"
+    const-string/jumbo v0, "38733"
+    const-string/jumbo v0, "38734"
+    const-string/jumbo v0, "38735"
+    const-string/jumbo v0, "38736"
+    const-string/jumbo v0, "38737"
+    const-string/jumbo v0, "38738"
+    const-string/jumbo v0, "38739"
+    const-string/jumbo v0, "38740"
+    const-string/jumbo v0, "38741"
+    const-string/jumbo v0, "38742"
+    const-string/jumbo v0, "38743"
+    const-string/jumbo v0, "38744"
+    const-string/jumbo v0, "38745"
+    const-string/jumbo v0, "38746"
+    const-string/jumbo v0, "38747"
+    const-string/jumbo v0, "38748"
+    const-string/jumbo v0, "38749"
+    const-string/jumbo v0, "38750"
+    const-string/jumbo v0, "38751"
+    const-string/jumbo v0, "38752"
+    const-string/jumbo v0, "38753"
+    const-string/jumbo v0, "38754"
+    const-string/jumbo v0, "38755"
+    const-string/jumbo v0, "38756"
+    const-string/jumbo v0, "38757"
+    const-string/jumbo v0, "38758"
+    const-string/jumbo v0, "38759"
+    const-string/jumbo v0, "38760"
+    const-string/jumbo v0, "38761"
+    const-string/jumbo v0, "38762"
+    const-string/jumbo v0, "38763"
+    const-string/jumbo v0, "38764"
+    const-string/jumbo v0, "38765"
+    const-string/jumbo v0, "38766"
+    const-string/jumbo v0, "38767"
+    const-string/jumbo v0, "38768"
+    const-string/jumbo v0, "38769"
+    const-string/jumbo v0, "38770"
+    const-string/jumbo v0, "38771"
+    const-string/jumbo v0, "38772"
+    const-string/jumbo v0, "38773"
+    const-string/jumbo v0, "38774"
+    const-string/jumbo v0, "38775"
+    const-string/jumbo v0, "38776"
+    const-string/jumbo v0, "38777"
+    const-string/jumbo v0, "38778"
+    const-string/jumbo v0, "38779"
+    const-string/jumbo v0, "38780"
+    const-string/jumbo v0, "38781"
+    const-string/jumbo v0, "38782"
+    const-string/jumbo v0, "38783"
+    const-string/jumbo v0, "38784"
+    const-string/jumbo v0, "38785"
+    const-string/jumbo v0, "38786"
+    const-string/jumbo v0, "38787"
+    const-string/jumbo v0, "38788"
+    const-string/jumbo v0, "38789"
+    const-string/jumbo v0, "38790"
+    const-string/jumbo v0, "38791"
+    const-string/jumbo v0, "38792"
+    const-string/jumbo v0, "38793"
+    const-string/jumbo v0, "38794"
+    const-string/jumbo v0, "38795"
+    const-string/jumbo v0, "38796"
+    const-string/jumbo v0, "38797"
+    const-string/jumbo v0, "38798"
+    const-string/jumbo v0, "38799"
+    const-string/jumbo v0, "38800"
+    const-string/jumbo v0, "38801"
+    const-string/jumbo v0, "38802"
+    const-string/jumbo v0, "38803"
+    const-string/jumbo v0, "38804"
+    const-string/jumbo v0, "38805"
+    const-string/jumbo v0, "38806"
+    const-string/jumbo v0, "38807"
+    const-string/jumbo v0, "38808"
+    const-string/jumbo v0, "38809"
+    const-string/jumbo v0, "38810"
+    const-string/jumbo v0, "38811"
+    const-string/jumbo v0, "38812"
+    const-string/jumbo v0, "38813"
+    const-string/jumbo v0, "38814"
+    const-string/jumbo v0, "38815"
+    const-string/jumbo v0, "38816"
+    const-string/jumbo v0, "38817"
+    const-string/jumbo v0, "38818"
+    const-string/jumbo v0, "38819"
+    const-string/jumbo v0, "38820"
+    const-string/jumbo v0, "38821"
+    const-string/jumbo v0, "38822"
+    const-string/jumbo v0, "38823"
+    const-string/jumbo v0, "38824"
+    const-string/jumbo v0, "38825"
+    const-string/jumbo v0, "38826"
+    const-string/jumbo v0, "38827"
+    const-string/jumbo v0, "38828"
+    const-string/jumbo v0, "38829"
+    const-string/jumbo v0, "38830"
+    const-string/jumbo v0, "38831"
+    const-string/jumbo v0, "38832"
+    const-string/jumbo v0, "38833"
+    const-string/jumbo v0, "38834"
+    const-string/jumbo v0, "38835"
+    const-string/jumbo v0, "38836"
+    const-string/jumbo v0, "38837"
+    const-string/jumbo v0, "38838"
+    const-string/jumbo v0, "38839"
+    const-string/jumbo v0, "38840"
+    const-string/jumbo v0, "38841"
+    const-string/jumbo v0, "38842"
+    const-string/jumbo v0, "38843"
+    const-string/jumbo v0, "38844"
+    const-string/jumbo v0, "38845"
+    const-string/jumbo v0, "38846"
+    const-string/jumbo v0, "38847"
+    const-string/jumbo v0, "38848"
+    const-string/jumbo v0, "38849"
+    const-string/jumbo v0, "38850"
+    const-string/jumbo v0, "38851"
+    const-string/jumbo v0, "38852"
+    const-string/jumbo v0, "38853"
+    const-string/jumbo v0, "38854"
+    const-string/jumbo v0, "38855"
+    const-string/jumbo v0, "38856"
+    const-string/jumbo v0, "38857"
+    const-string/jumbo v0, "38858"
+    const-string/jumbo v0, "38859"
+    const-string/jumbo v0, "38860"
+    const-string/jumbo v0, "38861"
+    const-string/jumbo v0, "38862"
+    const-string/jumbo v0, "38863"
+    const-string/jumbo v0, "38864"
+    const-string/jumbo v0, "38865"
+    const-string/jumbo v0, "38866"
+    const-string/jumbo v0, "38867"
+    const-string/jumbo v0, "38868"
+    const-string/jumbo v0, "38869"
+    const-string/jumbo v0, "38870"
+    const-string/jumbo v0, "38871"
+    const-string/jumbo v0, "38872"
+    const-string/jumbo v0, "38873"
+    const-string/jumbo v0, "38874"
+    const-string/jumbo v0, "38875"
+    const-string/jumbo v0, "38876"
+    const-string/jumbo v0, "38877"
+    const-string/jumbo v0, "38878"
+    const-string/jumbo v0, "38879"
+    const-string/jumbo v0, "38880"
+    const-string/jumbo v0, "38881"
+    const-string/jumbo v0, "38882"
+    const-string/jumbo v0, "38883"
+    const-string/jumbo v0, "38884"
+    const-string/jumbo v0, "38885"
+    const-string/jumbo v0, "38886"
+    const-string/jumbo v0, "38887"
+    const-string/jumbo v0, "38888"
+    const-string/jumbo v0, "38889"
+    const-string/jumbo v0, "38890"
+    const-string/jumbo v0, "38891"
+    const-string/jumbo v0, "38892"
+    const-string/jumbo v0, "38893"
+    const-string/jumbo v0, "38894"
+    const-string/jumbo v0, "38895"
+    const-string/jumbo v0, "38896"
+    const-string/jumbo v0, "38897"
+    const-string/jumbo v0, "38898"
+    const-string/jumbo v0, "38899"
+    const-string/jumbo v0, "38900"
+    const-string/jumbo v0, "38901"
+    const-string/jumbo v0, "38902"
+    const-string/jumbo v0, "38903"
+    const-string/jumbo v0, "38904"
+    const-string/jumbo v0, "38905"
+    const-string/jumbo v0, "38906"
+    const-string/jumbo v0, "38907"
+    const-string/jumbo v0, "38908"
+    const-string/jumbo v0, "38909"
+    const-string/jumbo v0, "38910"
+    const-string/jumbo v0, "38911"
+    const-string/jumbo v0, "38912"
+    const-string/jumbo v0, "38913"
+    const-string/jumbo v0, "38914"
+    const-string/jumbo v0, "38915"
+    const-string/jumbo v0, "38916"
+    const-string/jumbo v0, "38917"
+    const-string/jumbo v0, "38918"
+    const-string/jumbo v0, "38919"
+    const-string/jumbo v0, "38920"
+    const-string/jumbo v0, "38921"
+    const-string/jumbo v0, "38922"
+    const-string/jumbo v0, "38923"
+    const-string/jumbo v0, "38924"
+    const-string/jumbo v0, "38925"
+    const-string/jumbo v0, "38926"
+    const-string/jumbo v0, "38927"
+    const-string/jumbo v0, "38928"
+    const-string/jumbo v0, "38929"
+    const-string/jumbo v0, "38930"
+    const-string/jumbo v0, "38931"
+    const-string/jumbo v0, "38932"
+    const-string/jumbo v0, "38933"
+    const-string/jumbo v0, "38934"
+    const-string/jumbo v0, "38935"
+    const-string/jumbo v0, "38936"
+    const-string/jumbo v0, "38937"
+    const-string/jumbo v0, "38938"
+    const-string/jumbo v0, "38939"
+    const-string/jumbo v0, "38940"
+    const-string/jumbo v0, "38941"
+    const-string/jumbo v0, "38942"
+    const-string/jumbo v0, "38943"
+    const-string/jumbo v0, "38944"
+    const-string/jumbo v0, "38945"
+    const-string/jumbo v0, "38946"
+    const-string/jumbo v0, "38947"
+    const-string/jumbo v0, "38948"
+    const-string/jumbo v0, "38949"
+    const-string/jumbo v0, "38950"
+    const-string/jumbo v0, "38951"
+    const-string/jumbo v0, "38952"
+    const-string/jumbo v0, "38953"
+    const-string/jumbo v0, "38954"
+    const-string/jumbo v0, "38955"
+    const-string/jumbo v0, "38956"
+    const-string/jumbo v0, "38957"
+    const-string/jumbo v0, "38958"
+    const-string/jumbo v0, "38959"
+    const-string/jumbo v0, "38960"
+    const-string/jumbo v0, "38961"
+    const-string/jumbo v0, "38962"
+    const-string/jumbo v0, "38963"
+    const-string/jumbo v0, "38964"
+    const-string/jumbo v0, "38965"
+    const-string/jumbo v0, "38966"
+    const-string/jumbo v0, "38967"
+    const-string/jumbo v0, "38968"
+    const-string/jumbo v0, "38969"
+    const-string/jumbo v0, "38970"
+    const-string/jumbo v0, "38971"
+    const-string/jumbo v0, "38972"
+    const-string/jumbo v0, "38973"
+    const-string/jumbo v0, "38974"
+    const-string/jumbo v0, "38975"
+    const-string/jumbo v0, "38976"
+    const-string/jumbo v0, "38977"
+    const-string/jumbo v0, "38978"
+    const-string/jumbo v0, "38979"
+    const-string/jumbo v0, "38980"
+    const-string/jumbo v0, "38981"
+    const-string/jumbo v0, "38982"
+    const-string/jumbo v0, "38983"
+    const-string/jumbo v0, "38984"
+    const-string/jumbo v0, "38985"
+    const-string/jumbo v0, "38986"
+    const-string/jumbo v0, "38987"
+    const-string/jumbo v0, "38988"
+    const-string/jumbo v0, "38989"
+    const-string/jumbo v0, "38990"
+    const-string/jumbo v0, "38991"
+    const-string/jumbo v0, "38992"
+    const-string/jumbo v0, "38993"
+    const-string/jumbo v0, "38994"
+    const-string/jumbo v0, "38995"
+    const-string/jumbo v0, "38996"
+    const-string/jumbo v0, "38997"
+    const-string/jumbo v0, "38998"
+    const-string/jumbo v0, "38999"
+    const-string/jumbo v0, "39000"
+    const-string/jumbo v0, "39001"
+    const-string/jumbo v0, "39002"
+    const-string/jumbo v0, "39003"
+    const-string/jumbo v0, "39004"
+    const-string/jumbo v0, "39005"
+    const-string/jumbo v0, "39006"
+    const-string/jumbo v0, "39007"
+    const-string/jumbo v0, "39008"
+    const-string/jumbo v0, "39009"
+    const-string/jumbo v0, "39010"
+    const-string/jumbo v0, "39011"
+    const-string/jumbo v0, "39012"
+    const-string/jumbo v0, "39013"
+    const-string/jumbo v0, "39014"
+    const-string/jumbo v0, "39015"
+    const-string/jumbo v0, "39016"
+    const-string/jumbo v0, "39017"
+    const-string/jumbo v0, "39018"
+    const-string/jumbo v0, "39019"
+    const-string/jumbo v0, "39020"
+    const-string/jumbo v0, "39021"
+    const-string/jumbo v0, "39022"
+    const-string/jumbo v0, "39023"
+    const-string/jumbo v0, "39024"
+    const-string/jumbo v0, "39025"
+    const-string/jumbo v0, "39026"
+    const-string/jumbo v0, "39027"
+    const-string/jumbo v0, "39028"
+    const-string/jumbo v0, "39029"
+    const-string/jumbo v0, "39030"
+    const-string/jumbo v0, "39031"
+    const-string/jumbo v0, "39032"
+    const-string/jumbo v0, "39033"
+    const-string/jumbo v0, "39034"
+    const-string/jumbo v0, "39035"
+    const-string/jumbo v0, "39036"
+    const-string/jumbo v0, "39037"
+    const-string/jumbo v0, "39038"
+    const-string/jumbo v0, "39039"
+    const-string/jumbo v0, "39040"
+    const-string/jumbo v0, "39041"
+    const-string/jumbo v0, "39042"
+    const-string/jumbo v0, "39043"
+    const-string/jumbo v0, "39044"
+    const-string/jumbo v0, "39045"
+    const-string/jumbo v0, "39046"
+    const-string/jumbo v0, "39047"
+    const-string/jumbo v0, "39048"
+    const-string/jumbo v0, "39049"
+    const-string/jumbo v0, "39050"
+    const-string/jumbo v0, "39051"
+    const-string/jumbo v0, "39052"
+    const-string/jumbo v0, "39053"
+    const-string/jumbo v0, "39054"
+    const-string/jumbo v0, "39055"
+    const-string/jumbo v0, "39056"
+    const-string/jumbo v0, "39057"
+    const-string/jumbo v0, "39058"
+    const-string/jumbo v0, "39059"
+    const-string/jumbo v0, "39060"
+    const-string/jumbo v0, "39061"
+    const-string/jumbo v0, "39062"
+    const-string/jumbo v0, "39063"
+    const-string/jumbo v0, "39064"
+    const-string/jumbo v0, "39065"
+    const-string/jumbo v0, "39066"
+    const-string/jumbo v0, "39067"
+    const-string/jumbo v0, "39068"
+    const-string/jumbo v0, "39069"
+    const-string/jumbo v0, "39070"
+    const-string/jumbo v0, "39071"
+    const-string/jumbo v0, "39072"
+    const-string/jumbo v0, "39073"
+    const-string/jumbo v0, "39074"
+    const-string/jumbo v0, "39075"
+    const-string/jumbo v0, "39076"
+    const-string/jumbo v0, "39077"
+    const-string/jumbo v0, "39078"
+    const-string/jumbo v0, "39079"
+    const-string/jumbo v0, "39080"
+    const-string/jumbo v0, "39081"
+    const-string/jumbo v0, "39082"
+    const-string/jumbo v0, "39083"
+    const-string/jumbo v0, "39084"
+    const-string/jumbo v0, "39085"
+    const-string/jumbo v0, "39086"
+    const-string/jumbo v0, "39087"
+    const-string/jumbo v0, "39088"
+    const-string/jumbo v0, "39089"
+    const-string/jumbo v0, "39090"
+    const-string/jumbo v0, "39091"
+    const-string/jumbo v0, "39092"
+    const-string/jumbo v0, "39093"
+    const-string/jumbo v0, "39094"
+    const-string/jumbo v0, "39095"
+    const-string/jumbo v0, "39096"
+    const-string/jumbo v0, "39097"
+    const-string/jumbo v0, "39098"
+    const-string/jumbo v0, "39099"
+    const-string/jumbo v0, "39100"
+    const-string/jumbo v0, "39101"
+    const-string/jumbo v0, "39102"
+    const-string/jumbo v0, "39103"
+    const-string/jumbo v0, "39104"
+    const-string/jumbo v0, "39105"
+    const-string/jumbo v0, "39106"
+    const-string/jumbo v0, "39107"
+    const-string/jumbo v0, "39108"
+    const-string/jumbo v0, "39109"
+    const-string/jumbo v0, "39110"
+    const-string/jumbo v0, "39111"
+    const-string/jumbo v0, "39112"
+    const-string/jumbo v0, "39113"
+    const-string/jumbo v0, "39114"
+    const-string/jumbo v0, "39115"
+    const-string/jumbo v0, "39116"
+    const-string/jumbo v0, "39117"
+    const-string/jumbo v0, "39118"
+    const-string/jumbo v0, "39119"
+    const-string/jumbo v0, "39120"
+    const-string/jumbo v0, "39121"
+    const-string/jumbo v0, "39122"
+    const-string/jumbo v0, "39123"
+    const-string/jumbo v0, "39124"
+    const-string/jumbo v0, "39125"
+    const-string/jumbo v0, "39126"
+    const-string/jumbo v0, "39127"
+    const-string/jumbo v0, "39128"
+    const-string/jumbo v0, "39129"
+    const-string/jumbo v0, "39130"
+    const-string/jumbo v0, "39131"
+    const-string/jumbo v0, "39132"
+    const-string/jumbo v0, "39133"
+    const-string/jumbo v0, "39134"
+    const-string/jumbo v0, "39135"
+    const-string/jumbo v0, "39136"
+    const-string/jumbo v0, "39137"
+    const-string/jumbo v0, "39138"
+    const-string/jumbo v0, "39139"
+    const-string/jumbo v0, "39140"
+    const-string/jumbo v0, "39141"
+    const-string/jumbo v0, "39142"
+    const-string/jumbo v0, "39143"
+    const-string/jumbo v0, "39144"
+    const-string/jumbo v0, "39145"
+    const-string/jumbo v0, "39146"
+    const-string/jumbo v0, "39147"
+    const-string/jumbo v0, "39148"
+    const-string/jumbo v0, "39149"
+    const-string/jumbo v0, "39150"
+    const-string/jumbo v0, "39151"
+    const-string/jumbo v0, "39152"
+    const-string/jumbo v0, "39153"
+    const-string/jumbo v0, "39154"
+    const-string/jumbo v0, "39155"
+    const-string/jumbo v0, "39156"
+    const-string/jumbo v0, "39157"
+    const-string/jumbo v0, "39158"
+    const-string/jumbo v0, "39159"
+    const-string/jumbo v0, "39160"
+    const-string/jumbo v0, "39161"
+    const-string/jumbo v0, "39162"
+    const-string/jumbo v0, "39163"
+    const-string/jumbo v0, "39164"
+    const-string/jumbo v0, "39165"
+    const-string/jumbo v0, "39166"
+    const-string/jumbo v0, "39167"
+    const-string/jumbo v0, "39168"
+    const-string/jumbo v0, "39169"
+    const-string/jumbo v0, "39170"
+    const-string/jumbo v0, "39171"
+    const-string/jumbo v0, "39172"
+    const-string/jumbo v0, "39173"
+    const-string/jumbo v0, "39174"
+    const-string/jumbo v0, "39175"
+    const-string/jumbo v0, "39176"
+    const-string/jumbo v0, "39177"
+    const-string/jumbo v0, "39178"
+    const-string/jumbo v0, "39179"
+    const-string/jumbo v0, "39180"
+    const-string/jumbo v0, "39181"
+    const-string/jumbo v0, "39182"
+    const-string/jumbo v0, "39183"
+    const-string/jumbo v0, "39184"
+    const-string/jumbo v0, "39185"
+    const-string/jumbo v0, "39186"
+    const-string/jumbo v0, "39187"
+    const-string/jumbo v0, "39188"
+    const-string/jumbo v0, "39189"
+    const-string/jumbo v0, "39190"
+    const-string/jumbo v0, "39191"
+    const-string/jumbo v0, "39192"
+    const-string/jumbo v0, "39193"
+    const-string/jumbo v0, "39194"
+    const-string/jumbo v0, "39195"
+    const-string/jumbo v0, "39196"
+    const-string/jumbo v0, "39197"
+    const-string/jumbo v0, "39198"
+    const-string/jumbo v0, "39199"
+    const-string/jumbo v0, "39200"
+    const-string/jumbo v0, "39201"
+    const-string/jumbo v0, "39202"
+    const-string/jumbo v0, "39203"
+    const-string/jumbo v0, "39204"
+    const-string/jumbo v0, "39205"
+    const-string/jumbo v0, "39206"
+    const-string/jumbo v0, "39207"
+    const-string/jumbo v0, "39208"
+    const-string/jumbo v0, "39209"
+    const-string/jumbo v0, "39210"
+    const-string/jumbo v0, "39211"
+    const-string/jumbo v0, "39212"
+    const-string/jumbo v0, "39213"
+    const-string/jumbo v0, "39214"
+    const-string/jumbo v0, "39215"
+    const-string/jumbo v0, "39216"
+    const-string/jumbo v0, "39217"
+    const-string/jumbo v0, "39218"
+    const-string/jumbo v0, "39219"
+    const-string/jumbo v0, "39220"
+    const-string/jumbo v0, "39221"
+    const-string/jumbo v0, "39222"
+    const-string/jumbo v0, "39223"
+    const-string/jumbo v0, "39224"
+    const-string/jumbo v0, "39225"
+    const-string/jumbo v0, "39226"
+    const-string/jumbo v0, "39227"
+    const-string/jumbo v0, "39228"
+    const-string/jumbo v0, "39229"
+    const-string/jumbo v0, "39230"
+    const-string/jumbo v0, "39231"
+    const-string/jumbo v0, "39232"
+    const-string/jumbo v0, "39233"
+    const-string/jumbo v0, "39234"
+    const-string/jumbo v0, "39235"
+    const-string/jumbo v0, "39236"
+    const-string/jumbo v0, "39237"
+    const-string/jumbo v0, "39238"
+    const-string/jumbo v0, "39239"
+    const-string/jumbo v0, "39240"
+    const-string/jumbo v0, "39241"
+    const-string/jumbo v0, "39242"
+    const-string/jumbo v0, "39243"
+    const-string/jumbo v0, "39244"
+    const-string/jumbo v0, "39245"
+    const-string/jumbo v0, "39246"
+    const-string/jumbo v0, "39247"
+    const-string/jumbo v0, "39248"
+    const-string/jumbo v0, "39249"
+    const-string/jumbo v0, "39250"
+    const-string/jumbo v0, "39251"
+    const-string/jumbo v0, "39252"
+    const-string/jumbo v0, "39253"
+    const-string/jumbo v0, "39254"
+    const-string/jumbo v0, "39255"
+    const-string/jumbo v0, "39256"
+    const-string/jumbo v0, "39257"
+    const-string/jumbo v0, "39258"
+    const-string/jumbo v0, "39259"
+    const-string/jumbo v0, "39260"
+    const-string/jumbo v0, "39261"
+    const-string/jumbo v0, "39262"
+    const-string/jumbo v0, "39263"
+    const-string/jumbo v0, "39264"
+    const-string/jumbo v0, "39265"
+    const-string/jumbo v0, "39266"
+    const-string/jumbo v0, "39267"
+    const-string/jumbo v0, "39268"
+    const-string/jumbo v0, "39269"
+    const-string/jumbo v0, "39270"
+    const-string/jumbo v0, "39271"
+    const-string/jumbo v0, "39272"
+    const-string/jumbo v0, "39273"
+    const-string/jumbo v0, "39274"
+    const-string/jumbo v0, "39275"
+    const-string/jumbo v0, "39276"
+    const-string/jumbo v0, "39277"
+    const-string/jumbo v0, "39278"
+    const-string/jumbo v0, "39279"
+    const-string/jumbo v0, "39280"
+    const-string/jumbo v0, "39281"
+    const-string/jumbo v0, "39282"
+    const-string/jumbo v0, "39283"
+    const-string/jumbo v0, "39284"
+    const-string/jumbo v0, "39285"
+    const-string/jumbo v0, "39286"
+    const-string/jumbo v0, "39287"
+    const-string/jumbo v0, "39288"
+    const-string/jumbo v0, "39289"
+    const-string/jumbo v0, "39290"
+    const-string/jumbo v0, "39291"
+    const-string/jumbo v0, "39292"
+    const-string/jumbo v0, "39293"
+    const-string/jumbo v0, "39294"
+    const-string/jumbo v0, "39295"
+    const-string/jumbo v0, "39296"
+    const-string/jumbo v0, "39297"
+    const-string/jumbo v0, "39298"
+    const-string/jumbo v0, "39299"
+    const-string/jumbo v0, "39300"
+    const-string/jumbo v0, "39301"
+    const-string/jumbo v0, "39302"
+    const-string/jumbo v0, "39303"
+    const-string/jumbo v0, "39304"
+    const-string/jumbo v0, "39305"
+    const-string/jumbo v0, "39306"
+    const-string/jumbo v0, "39307"
+    const-string/jumbo v0, "39308"
+    const-string/jumbo v0, "39309"
+    const-string/jumbo v0, "39310"
+    const-string/jumbo v0, "39311"
+    const-string/jumbo v0, "39312"
+    const-string/jumbo v0, "39313"
+    const-string/jumbo v0, "39314"
+    const-string/jumbo v0, "39315"
+    const-string/jumbo v0, "39316"
+    const-string/jumbo v0, "39317"
+    const-string/jumbo v0, "39318"
+    const-string/jumbo v0, "39319"
+    const-string/jumbo v0, "39320"
+    const-string/jumbo v0, "39321"
+    const-string/jumbo v0, "39322"
+    const-string/jumbo v0, "39323"
+    const-string/jumbo v0, "39324"
+    const-string/jumbo v0, "39325"
+    const-string/jumbo v0, "39326"
+    const-string/jumbo v0, "39327"
+    const-string/jumbo v0, "39328"
+    const-string/jumbo v0, "39329"
+    const-string/jumbo v0, "39330"
+    const-string/jumbo v0, "39331"
+    const-string/jumbo v0, "39332"
+    const-string/jumbo v0, "39333"
+    const-string/jumbo v0, "39334"
+    const-string/jumbo v0, "39335"
+    const-string/jumbo v0, "39336"
+    const-string/jumbo v0, "39337"
+    const-string/jumbo v0, "39338"
+    const-string/jumbo v0, "39339"
+    const-string/jumbo v0, "39340"
+    const-string/jumbo v0, "39341"
+    const-string/jumbo v0, "39342"
+    const-string/jumbo v0, "39343"
+    const-string/jumbo v0, "39344"
+    const-string/jumbo v0, "39345"
+    const-string/jumbo v0, "39346"
+    const-string/jumbo v0, "39347"
+    const-string/jumbo v0, "39348"
+    const-string/jumbo v0, "39349"
+    const-string/jumbo v0, "39350"
+    const-string/jumbo v0, "39351"
+    const-string/jumbo v0, "39352"
+    const-string/jumbo v0, "39353"
+    const-string/jumbo v0, "39354"
+    const-string/jumbo v0, "39355"
+    const-string/jumbo v0, "39356"
+    const-string/jumbo v0, "39357"
+    const-string/jumbo v0, "39358"
+    const-string/jumbo v0, "39359"
+    const-string/jumbo v0, "39360"
+    const-string/jumbo v0, "39361"
+    const-string/jumbo v0, "39362"
+    const-string/jumbo v0, "39363"
+    const-string/jumbo v0, "39364"
+    const-string/jumbo v0, "39365"
+    const-string/jumbo v0, "39366"
+    const-string/jumbo v0, "39367"
+    const-string/jumbo v0, "39368"
+    const-string/jumbo v0, "39369"
+    const-string/jumbo v0, "39370"
+    const-string/jumbo v0, "39371"
+    const-string/jumbo v0, "39372"
+    const-string/jumbo v0, "39373"
+    const-string/jumbo v0, "39374"
+    const-string/jumbo v0, "39375"
+    const-string/jumbo v0, "39376"
+    const-string/jumbo v0, "39377"
+    const-string/jumbo v0, "39378"
+    const-string/jumbo v0, "39379"
+    const-string/jumbo v0, "39380"
+    const-string/jumbo v0, "39381"
+    const-string/jumbo v0, "39382"
+    const-string/jumbo v0, "39383"
+    const-string/jumbo v0, "39384"
+    const-string/jumbo v0, "39385"
+    const-string/jumbo v0, "39386"
+    const-string/jumbo v0, "39387"
+    const-string/jumbo v0, "39388"
+    const-string/jumbo v0, "39389"
+    const-string/jumbo v0, "39390"
+    const-string/jumbo v0, "39391"
+    const-string/jumbo v0, "39392"
+    const-string/jumbo v0, "39393"
+    const-string/jumbo v0, "39394"
+    const-string/jumbo v0, "39395"
+    const-string/jumbo v0, "39396"
+    const-string/jumbo v0, "39397"
+    const-string/jumbo v0, "39398"
+    const-string/jumbo v0, "39399"
+    const-string/jumbo v0, "39400"
+    const-string/jumbo v0, "39401"
+    const-string/jumbo v0, "39402"
+    const-string/jumbo v0, "39403"
+    const-string/jumbo v0, "39404"
+    const-string/jumbo v0, "39405"
+    const-string/jumbo v0, "39406"
+    const-string/jumbo v0, "39407"
+    const-string/jumbo v0, "39408"
+    const-string/jumbo v0, "39409"
+    const-string/jumbo v0, "39410"
+    const-string/jumbo v0, "39411"
+    const-string/jumbo v0, "39412"
+    const-string/jumbo v0, "39413"
+    const-string/jumbo v0, "39414"
+    const-string/jumbo v0, "39415"
+    const-string/jumbo v0, "39416"
+    const-string/jumbo v0, "39417"
+    const-string/jumbo v0, "39418"
+    const-string/jumbo v0, "39419"
+    const-string/jumbo v0, "39420"
+    const-string/jumbo v0, "39421"
+    const-string/jumbo v0, "39422"
+    const-string/jumbo v0, "39423"
+    const-string/jumbo v0, "39424"
+    const-string/jumbo v0, "39425"
+    const-string/jumbo v0, "39426"
+    const-string/jumbo v0, "39427"
+    const-string/jumbo v0, "39428"
+    const-string/jumbo v0, "39429"
+    const-string/jumbo v0, "39430"
+    const-string/jumbo v0, "39431"
+    const-string/jumbo v0, "39432"
+    const-string/jumbo v0, "39433"
+    const-string/jumbo v0, "39434"
+    const-string/jumbo v0, "39435"
+    const-string/jumbo v0, "39436"
+    const-string/jumbo v0, "39437"
+    const-string/jumbo v0, "39438"
+    const-string/jumbo v0, "39439"
+    const-string/jumbo v0, "39440"
+    const-string/jumbo v0, "39441"
+    const-string/jumbo v0, "39442"
+    const-string/jumbo v0, "39443"
+    const-string/jumbo v0, "39444"
+    const-string/jumbo v0, "39445"
+    const-string/jumbo v0, "39446"
+    const-string/jumbo v0, "39447"
+    const-string/jumbo v0, "39448"
+    const-string/jumbo v0, "39449"
+    const-string/jumbo v0, "39450"
+    const-string/jumbo v0, "39451"
+    const-string/jumbo v0, "39452"
+    const-string/jumbo v0, "39453"
+    const-string/jumbo v0, "39454"
+    const-string/jumbo v0, "39455"
+    const-string/jumbo v0, "39456"
+    const-string/jumbo v0, "39457"
+    const-string/jumbo v0, "39458"
+    const-string/jumbo v0, "39459"
+    const-string/jumbo v0, "39460"
+    const-string/jumbo v0, "39461"
+    const-string/jumbo v0, "39462"
+    const-string/jumbo v0, "39463"
+    const-string/jumbo v0, "39464"
+    const-string/jumbo v0, "39465"
+    const-string/jumbo v0, "39466"
+    const-string/jumbo v0, "39467"
+    const-string/jumbo v0, "39468"
+    const-string/jumbo v0, "39469"
+    const-string/jumbo v0, "39470"
+    const-string/jumbo v0, "39471"
+    const-string/jumbo v0, "39472"
+    const-string/jumbo v0, "39473"
+    const-string/jumbo v0, "39474"
+    const-string/jumbo v0, "39475"
+    const-string/jumbo v0, "39476"
+    const-string/jumbo v0, "39477"
+    const-string/jumbo v0, "39478"
+    const-string/jumbo v0, "39479"
+    const-string/jumbo v0, "39480"
+    const-string/jumbo v0, "39481"
+    const-string/jumbo v0, "39482"
+    const-string/jumbo v0, "39483"
+    const-string/jumbo v0, "39484"
+    const-string/jumbo v0, "39485"
+    const-string/jumbo v0, "39486"
+    const-string/jumbo v0, "39487"
+    const-string/jumbo v0, "39488"
+    const-string/jumbo v0, "39489"
+    const-string/jumbo v0, "39490"
+    const-string/jumbo v0, "39491"
+    const-string/jumbo v0, "39492"
+    const-string/jumbo v0, "39493"
+    const-string/jumbo v0, "39494"
+    const-string/jumbo v0, "39495"
+    const-string/jumbo v0, "39496"
+    const-string/jumbo v0, "39497"
+    const-string/jumbo v0, "39498"
+    const-string/jumbo v0, "39499"
+    const-string/jumbo v0, "39500"
+    const-string/jumbo v0, "39501"
+    const-string/jumbo v0, "39502"
+    const-string/jumbo v0, "39503"
+    const-string/jumbo v0, "39504"
+    const-string/jumbo v0, "39505"
+    const-string/jumbo v0, "39506"
+    const-string/jumbo v0, "39507"
+    const-string/jumbo v0, "39508"
+    const-string/jumbo v0, "39509"
+    const-string/jumbo v0, "39510"
+    const-string/jumbo v0, "39511"
+    const-string/jumbo v0, "39512"
+    const-string/jumbo v0, "39513"
+    const-string/jumbo v0, "39514"
+    const-string/jumbo v0, "39515"
+    const-string/jumbo v0, "39516"
+    const-string/jumbo v0, "39517"
+    const-string/jumbo v0, "39518"
+    const-string/jumbo v0, "39519"
+    const-string/jumbo v0, "39520"
+    const-string/jumbo v0, "39521"
+    const-string/jumbo v0, "39522"
+    const-string/jumbo v0, "39523"
+    const-string/jumbo v0, "39524"
+    const-string/jumbo v0, "39525"
+    const-string/jumbo v0, "39526"
+    const-string/jumbo v0, "39527"
+    const-string/jumbo v0, "39528"
+    const-string/jumbo v0, "39529"
+    const-string/jumbo v0, "39530"
+    const-string/jumbo v0, "39531"
+    const-string/jumbo v0, "39532"
+    const-string/jumbo v0, "39533"
+    const-string/jumbo v0, "39534"
+    const-string/jumbo v0, "39535"
+    const-string/jumbo v0, "39536"
+    const-string/jumbo v0, "39537"
+    const-string/jumbo v0, "39538"
+    const-string/jumbo v0, "39539"
+    const-string/jumbo v0, "39540"
+    const-string/jumbo v0, "39541"
+    const-string/jumbo v0, "39542"
+    const-string/jumbo v0, "39543"
+    const-string/jumbo v0, "39544"
+    const-string/jumbo v0, "39545"
+    const-string/jumbo v0, "39546"
+    const-string/jumbo v0, "39547"
+    const-string/jumbo v0, "39548"
+    const-string/jumbo v0, "39549"
+    const-string/jumbo v0, "39550"
+    const-string/jumbo v0, "39551"
+    const-string/jumbo v0, "39552"
+    const-string/jumbo v0, "39553"
+    const-string/jumbo v0, "39554"
+    const-string/jumbo v0, "39555"
+    const-string/jumbo v0, "39556"
+    const-string/jumbo v0, "39557"
+    const-string/jumbo v0, "39558"
+    const-string/jumbo v0, "39559"
+    const-string/jumbo v0, "39560"
+    const-string/jumbo v0, "39561"
+    const-string/jumbo v0, "39562"
+    const-string/jumbo v0, "39563"
+    const-string/jumbo v0, "39564"
+    const-string/jumbo v0, "39565"
+    const-string/jumbo v0, "39566"
+    const-string/jumbo v0, "39567"
+    const-string/jumbo v0, "39568"
+    const-string/jumbo v0, "39569"
+    const-string/jumbo v0, "39570"
+    const-string/jumbo v0, "39571"
+    const-string/jumbo v0, "39572"
+    const-string/jumbo v0, "39573"
+    const-string/jumbo v0, "39574"
+    const-string/jumbo v0, "39575"
+    const-string/jumbo v0, "39576"
+    const-string/jumbo v0, "39577"
+    const-string/jumbo v0, "39578"
+    const-string/jumbo v0, "39579"
+    const-string/jumbo v0, "39580"
+    const-string/jumbo v0, "39581"
+    const-string/jumbo v0, "39582"
+    const-string/jumbo v0, "39583"
+    const-string/jumbo v0, "39584"
+    const-string/jumbo v0, "39585"
+    const-string/jumbo v0, "39586"
+    const-string/jumbo v0, "39587"
+    const-string/jumbo v0, "39588"
+    const-string/jumbo v0, "39589"
+    const-string/jumbo v0, "39590"
+    const-string/jumbo v0, "39591"
+    const-string/jumbo v0, "39592"
+    const-string/jumbo v0, "39593"
+    const-string/jumbo v0, "39594"
+    const-string/jumbo v0, "39595"
+    const-string/jumbo v0, "39596"
+    const-string/jumbo v0, "39597"
+    const-string/jumbo v0, "39598"
+    const-string/jumbo v0, "39599"
+    const-string/jumbo v0, "39600"
+    const-string/jumbo v0, "39601"
+    const-string/jumbo v0, "39602"
+    const-string/jumbo v0, "39603"
+    const-string/jumbo v0, "39604"
+    const-string/jumbo v0, "39605"
+    const-string/jumbo v0, "39606"
+    const-string/jumbo v0, "39607"
+    const-string/jumbo v0, "39608"
+    const-string/jumbo v0, "39609"
+    const-string/jumbo v0, "39610"
+    const-string/jumbo v0, "39611"
+    const-string/jumbo v0, "39612"
+    const-string/jumbo v0, "39613"
+    const-string/jumbo v0, "39614"
+    const-string/jumbo v0, "39615"
+    const-string/jumbo v0, "39616"
+    const-string/jumbo v0, "39617"
+    const-string/jumbo v0, "39618"
+    const-string/jumbo v0, "39619"
+    const-string/jumbo v0, "39620"
+    const-string/jumbo v0, "39621"
+    const-string/jumbo v0, "39622"
+    const-string/jumbo v0, "39623"
+    const-string/jumbo v0, "39624"
+    const-string/jumbo v0, "39625"
+    const-string/jumbo v0, "39626"
+    const-string/jumbo v0, "39627"
+    const-string/jumbo v0, "39628"
+    const-string/jumbo v0, "39629"
+    const-string/jumbo v0, "39630"
+    const-string/jumbo v0, "39631"
+    const-string/jumbo v0, "39632"
+    const-string/jumbo v0, "39633"
+    const-string/jumbo v0, "39634"
+    const-string/jumbo v0, "39635"
+    const-string/jumbo v0, "39636"
+    const-string/jumbo v0, "39637"
+    const-string/jumbo v0, "39638"
+    const-string/jumbo v0, "39639"
+    const-string/jumbo v0, "39640"
+    const-string/jumbo v0, "39641"
+    const-string/jumbo v0, "39642"
+    const-string/jumbo v0, "39643"
+    const-string/jumbo v0, "39644"
+    const-string/jumbo v0, "39645"
+    const-string/jumbo v0, "39646"
+    const-string/jumbo v0, "39647"
+    const-string/jumbo v0, "39648"
+    const-string/jumbo v0, "39649"
+    const-string/jumbo v0, "39650"
+    const-string/jumbo v0, "39651"
+    const-string/jumbo v0, "39652"
+    const-string/jumbo v0, "39653"
+    const-string/jumbo v0, "39654"
+    const-string/jumbo v0, "39655"
+    const-string/jumbo v0, "39656"
+    const-string/jumbo v0, "39657"
+    const-string/jumbo v0, "39658"
+    const-string/jumbo v0, "39659"
+    const-string/jumbo v0, "39660"
+    const-string/jumbo v0, "39661"
+    const-string/jumbo v0, "39662"
+    const-string/jumbo v0, "39663"
+    const-string/jumbo v0, "39664"
+    const-string/jumbo v0, "39665"
+    const-string/jumbo v0, "39666"
+    const-string/jumbo v0, "39667"
+    const-string/jumbo v0, "39668"
+    const-string/jumbo v0, "39669"
+    const-string/jumbo v0, "39670"
+    const-string/jumbo v0, "39671"
+    const-string/jumbo v0, "39672"
+    const-string/jumbo v0, "39673"
+    const-string/jumbo v0, "39674"
+    const-string/jumbo v0, "39675"
+    const-string/jumbo v0, "39676"
+    const-string/jumbo v0, "39677"
+    const-string/jumbo v0, "39678"
+    const-string/jumbo v0, "39679"
+    const-string/jumbo v0, "39680"
+    const-string/jumbo v0, "39681"
+    const-string/jumbo v0, "39682"
+    const-string/jumbo v0, "39683"
+    const-string/jumbo v0, "39684"
+    const-string/jumbo v0, "39685"
+    const-string/jumbo v0, "39686"
+    const-string/jumbo v0, "39687"
+    const-string/jumbo v0, "39688"
+    const-string/jumbo v0, "39689"
+    const-string/jumbo v0, "39690"
+    const-string/jumbo v0, "39691"
+    const-string/jumbo v0, "39692"
+    const-string/jumbo v0, "39693"
+    const-string/jumbo v0, "39694"
+    const-string/jumbo v0, "39695"
+    const-string/jumbo v0, "39696"
+    const-string/jumbo v0, "39697"
+    const-string/jumbo v0, "39698"
+    const-string/jumbo v0, "39699"
+    const-string/jumbo v0, "39700"
+    const-string/jumbo v0, "39701"
+    const-string/jumbo v0, "39702"
+    const-string/jumbo v0, "39703"
+    const-string/jumbo v0, "39704"
+    const-string/jumbo v0, "39705"
+    const-string/jumbo v0, "39706"
+    const-string/jumbo v0, "39707"
+    const-string/jumbo v0, "39708"
+    const-string/jumbo v0, "39709"
+    const-string/jumbo v0, "39710"
+    const-string/jumbo v0, "39711"
+    const-string/jumbo v0, "39712"
+    const-string/jumbo v0, "39713"
+    const-string/jumbo v0, "39714"
+    const-string/jumbo v0, "39715"
+    const-string/jumbo v0, "39716"
+    const-string/jumbo v0, "39717"
+    const-string/jumbo v0, "39718"
+    const-string/jumbo v0, "39719"
+    const-string/jumbo v0, "39720"
+    const-string/jumbo v0, "39721"
+    const-string/jumbo v0, "39722"
+    const-string/jumbo v0, "39723"
+    const-string/jumbo v0, "39724"
+    const-string/jumbo v0, "39725"
+    const-string/jumbo v0, "39726"
+    const-string/jumbo v0, "39727"
+    const-string/jumbo v0, "39728"
+    const-string/jumbo v0, "39729"
+    const-string/jumbo v0, "39730"
+    const-string/jumbo v0, "39731"
+    const-string/jumbo v0, "39732"
+    const-string/jumbo v0, "39733"
+    const-string/jumbo v0, "39734"
+    const-string/jumbo v0, "39735"
+    const-string/jumbo v0, "39736"
+    const-string/jumbo v0, "39737"
+    const-string/jumbo v0, "39738"
+    const-string/jumbo v0, "39739"
+    const-string/jumbo v0, "39740"
+    const-string/jumbo v0, "39741"
+    const-string/jumbo v0, "39742"
+    const-string/jumbo v0, "39743"
+    const-string/jumbo v0, "39744"
+    const-string/jumbo v0, "39745"
+    const-string/jumbo v0, "39746"
+    const-string/jumbo v0, "39747"
+    const-string/jumbo v0, "39748"
+    const-string/jumbo v0, "39749"
+    const-string/jumbo v0, "39750"
+    const-string/jumbo v0, "39751"
+    const-string/jumbo v0, "39752"
+    const-string/jumbo v0, "39753"
+    const-string/jumbo v0, "39754"
+    const-string/jumbo v0, "39755"
+    const-string/jumbo v0, "39756"
+    const-string/jumbo v0, "39757"
+    const-string/jumbo v0, "39758"
+    const-string/jumbo v0, "39759"
+    const-string/jumbo v0, "39760"
+    const-string/jumbo v0, "39761"
+    const-string/jumbo v0, "39762"
+    const-string/jumbo v0, "39763"
+    const-string/jumbo v0, "39764"
+    const-string/jumbo v0, "39765"
+    const-string/jumbo v0, "39766"
+    const-string/jumbo v0, "39767"
+    const-string/jumbo v0, "39768"
+    const-string/jumbo v0, "39769"
+    const-string/jumbo v0, "39770"
+    const-string/jumbo v0, "39771"
+    const-string/jumbo v0, "39772"
+    const-string/jumbo v0, "39773"
+    const-string/jumbo v0, "39774"
+    const-string/jumbo v0, "39775"
+    const-string/jumbo v0, "39776"
+    const-string/jumbo v0, "39777"
+    const-string/jumbo v0, "39778"
+    const-string/jumbo v0, "39779"
+    const-string/jumbo v0, "39780"
+    const-string/jumbo v0, "39781"
+    const-string/jumbo v0, "39782"
+    const-string/jumbo v0, "39783"
+    const-string/jumbo v0, "39784"
+    const-string/jumbo v0, "39785"
+    const-string/jumbo v0, "39786"
+    const-string/jumbo v0, "39787"
+    const-string/jumbo v0, "39788"
+    const-string/jumbo v0, "39789"
+    const-string/jumbo v0, "39790"
+    const-string/jumbo v0, "39791"
+    const-string/jumbo v0, "39792"
+    const-string/jumbo v0, "39793"
+    const-string/jumbo v0, "39794"
+    const-string/jumbo v0, "39795"
+    const-string/jumbo v0, "39796"
+    const-string/jumbo v0, "39797"
+    const-string/jumbo v0, "39798"
+    const-string/jumbo v0, "39799"
+    const-string/jumbo v0, "39800"
+    const-string/jumbo v0, "39801"
+    const-string/jumbo v0, "39802"
+    const-string/jumbo v0, "39803"
+    const-string/jumbo v0, "39804"
+    const-string/jumbo v0, "39805"
+    const-string/jumbo v0, "39806"
+    const-string/jumbo v0, "39807"
+    const-string/jumbo v0, "39808"
+    const-string/jumbo v0, "39809"
+    const-string/jumbo v0, "39810"
+    const-string/jumbo v0, "39811"
+    const-string/jumbo v0, "39812"
+    const-string/jumbo v0, "39813"
+    const-string/jumbo v0, "39814"
+    const-string/jumbo v0, "39815"
+    const-string/jumbo v0, "39816"
+    const-string/jumbo v0, "39817"
+    const-string/jumbo v0, "39818"
+    const-string/jumbo v0, "39819"
+    const-string/jumbo v0, "39820"
+    const-string/jumbo v0, "39821"
+    const-string/jumbo v0, "39822"
+    const-string/jumbo v0, "39823"
+    const-string/jumbo v0, "39824"
+    const-string/jumbo v0, "39825"
+    const-string/jumbo v0, "39826"
+    const-string/jumbo v0, "39827"
+    const-string/jumbo v0, "39828"
+    const-string/jumbo v0, "39829"
+    const-string/jumbo v0, "39830"
+    const-string/jumbo v0, "39831"
+    const-string/jumbo v0, "39832"
+    const-string/jumbo v0, "39833"
+    const-string/jumbo v0, "39834"
+    const-string/jumbo v0, "39835"
+    const-string/jumbo v0, "39836"
+    const-string/jumbo v0, "39837"
+    const-string/jumbo v0, "39838"
+    const-string/jumbo v0, "39839"
+    const-string/jumbo v0, "39840"
+    const-string/jumbo v0, "39841"
+    const-string/jumbo v0, "39842"
+    const-string/jumbo v0, "39843"
+    const-string/jumbo v0, "39844"
+    const-string/jumbo v0, "39845"
+    const-string/jumbo v0, "39846"
+    const-string/jumbo v0, "39847"
+    const-string/jumbo v0, "39848"
+    const-string/jumbo v0, "39849"
+    const-string/jumbo v0, "39850"
+    const-string/jumbo v0, "39851"
+    const-string/jumbo v0, "39852"
+    const-string/jumbo v0, "39853"
+    const-string/jumbo v0, "39854"
+    const-string/jumbo v0, "39855"
+    const-string/jumbo v0, "39856"
+    const-string/jumbo v0, "39857"
+    const-string/jumbo v0, "39858"
+    const-string/jumbo v0, "39859"
+    const-string/jumbo v0, "39860"
+    const-string/jumbo v0, "39861"
+    const-string/jumbo v0, "39862"
+    const-string/jumbo v0, "39863"
+    const-string/jumbo v0, "39864"
+    const-string/jumbo v0, "39865"
+    const-string/jumbo v0, "39866"
+    const-string/jumbo v0, "39867"
+    const-string/jumbo v0, "39868"
+    const-string/jumbo v0, "39869"
+    const-string/jumbo v0, "39870"
+    const-string/jumbo v0, "39871"
+    const-string/jumbo v0, "39872"
+    const-string/jumbo v0, "39873"
+    const-string/jumbo v0, "39874"
+    const-string/jumbo v0, "39875"
+    const-string/jumbo v0, "39876"
+    const-string/jumbo v0, "39877"
+    const-string/jumbo v0, "39878"
+    const-string/jumbo v0, "39879"
+    const-string/jumbo v0, "39880"
+    const-string/jumbo v0, "39881"
+    const-string/jumbo v0, "39882"
+    const-string/jumbo v0, "39883"
+    const-string/jumbo v0, "39884"
+    const-string/jumbo v0, "39885"
+    const-string/jumbo v0, "39886"
+    const-string/jumbo v0, "39887"
+    const-string/jumbo v0, "39888"
+    const-string/jumbo v0, "39889"
+    const-string/jumbo v0, "39890"
+    const-string/jumbo v0, "39891"
+    const-string/jumbo v0, "39892"
+    const-string/jumbo v0, "39893"
+    const-string/jumbo v0, "39894"
+    const-string/jumbo v0, "39895"
+    const-string/jumbo v0, "39896"
+    const-string/jumbo v0, "39897"
+    const-string/jumbo v0, "39898"
+    const-string/jumbo v0, "39899"
+    const-string/jumbo v0, "39900"
+    const-string/jumbo v0, "39901"
+    const-string/jumbo v0, "39902"
+    const-string/jumbo v0, "39903"
+    const-string/jumbo v0, "39904"
+    const-string/jumbo v0, "39905"
+    const-string/jumbo v0, "39906"
+    const-string/jumbo v0, "39907"
+    const-string/jumbo v0, "39908"
+    const-string/jumbo v0, "39909"
+    const-string/jumbo v0, "39910"
+    const-string/jumbo v0, "39911"
+    const-string/jumbo v0, "39912"
+    const-string/jumbo v0, "39913"
+    const-string/jumbo v0, "39914"
+    const-string/jumbo v0, "39915"
+    const-string/jumbo v0, "39916"
+    const-string/jumbo v0, "39917"
+    const-string/jumbo v0, "39918"
+    const-string/jumbo v0, "39919"
+    const-string/jumbo v0, "39920"
+    const-string/jumbo v0, "39921"
+    const-string/jumbo v0, "39922"
+    const-string/jumbo v0, "39923"
+    const-string/jumbo v0, "39924"
+    const-string/jumbo v0, "39925"
+    const-string/jumbo v0, "39926"
+    const-string/jumbo v0, "39927"
+    const-string/jumbo v0, "39928"
+    const-string/jumbo v0, "39929"
+    const-string/jumbo v0, "39930"
+    const-string/jumbo v0, "39931"
+    const-string/jumbo v0, "39932"
+    const-string/jumbo v0, "39933"
+    const-string/jumbo v0, "39934"
+    const-string/jumbo v0, "39935"
+    const-string/jumbo v0, "39936"
+    const-string/jumbo v0, "39937"
+    const-string/jumbo v0, "39938"
+    const-string/jumbo v0, "39939"
+    const-string/jumbo v0, "39940"
+    const-string/jumbo v0, "39941"
+    const-string/jumbo v0, "39942"
+    const-string/jumbo v0, "39943"
+    const-string/jumbo v0, "39944"
+    const-string/jumbo v0, "39945"
+    const-string/jumbo v0, "39946"
+    const-string/jumbo v0, "39947"
+    const-string/jumbo v0, "39948"
+    const-string/jumbo v0, "39949"
+    const-string/jumbo v0, "39950"
+    const-string/jumbo v0, "39951"
+    const-string/jumbo v0, "39952"
+    const-string/jumbo v0, "39953"
+    const-string/jumbo v0, "39954"
+    const-string/jumbo v0, "39955"
+    const-string/jumbo v0, "39956"
+    const-string/jumbo v0, "39957"
+    const-string/jumbo v0, "39958"
+    const-string/jumbo v0, "39959"
+    const-string/jumbo v0, "39960"
+    const-string/jumbo v0, "39961"
+    const-string/jumbo v0, "39962"
+    const-string/jumbo v0, "39963"
+    const-string/jumbo v0, "39964"
+    const-string/jumbo v0, "39965"
+    const-string/jumbo v0, "39966"
+    const-string/jumbo v0, "39967"
+    const-string/jumbo v0, "39968"
+    const-string/jumbo v0, "39969"
+    const-string/jumbo v0, "39970"
+    const-string/jumbo v0, "39971"
+    const-string/jumbo v0, "39972"
+    const-string/jumbo v0, "39973"
+    const-string/jumbo v0, "39974"
+    const-string/jumbo v0, "39975"
+    const-string/jumbo v0, "39976"
+    const-string/jumbo v0, "39977"
+    const-string/jumbo v0, "39978"
+    const-string/jumbo v0, "39979"
+    const-string/jumbo v0, "39980"
+    const-string/jumbo v0, "39981"
+    const-string/jumbo v0, "39982"
+    const-string/jumbo v0, "39983"
+    const-string/jumbo v0, "39984"
+    const-string/jumbo v0, "39985"
+    const-string/jumbo v0, "39986"
+    const-string/jumbo v0, "39987"
+    const-string/jumbo v0, "39988"
+    const-string/jumbo v0, "39989"
+    const-string/jumbo v0, "39990"
+    const-string/jumbo v0, "39991"
+    const-string/jumbo v0, "39992"
+    const-string/jumbo v0, "39993"
+    const-string/jumbo v0, "39994"
+    const-string/jumbo v0, "39995"
+    const-string/jumbo v0, "39996"
+    const-string/jumbo v0, "39997"
+    const-string/jumbo v0, "39998"
+    const-string/jumbo v0, "39999"
+    const-string/jumbo v0, "40000"
+    const-string/jumbo v0, "40001"
+    const-string/jumbo v0, "40002"
+    const-string/jumbo v0, "40003"
+    const-string/jumbo v0, "40004"
+    const-string/jumbo v0, "40005"
+    const-string/jumbo v0, "40006"
+    const-string/jumbo v0, "40007"
+    const-string/jumbo v0, "40008"
+    const-string/jumbo v0, "40009"
+    const-string/jumbo v0, "40010"
+    const-string/jumbo v0, "40011"
+    const-string/jumbo v0, "40012"
+    const-string/jumbo v0, "40013"
+    const-string/jumbo v0, "40014"
+    const-string/jumbo v0, "40015"
+    const-string/jumbo v0, "40016"
+    const-string/jumbo v0, "40017"
+    const-string/jumbo v0, "40018"
+    const-string/jumbo v0, "40019"
+    const-string/jumbo v0, "40020"
+    const-string/jumbo v0, "40021"
+    const-string/jumbo v0, "40022"
+    const-string/jumbo v0, "40023"
+    const-string/jumbo v0, "40024"
+    const-string/jumbo v0, "40025"
+    const-string/jumbo v0, "40026"
+    const-string/jumbo v0, "40027"
+    const-string/jumbo v0, "40028"
+    const-string/jumbo v0, "40029"
+    const-string/jumbo v0, "40030"
+    const-string/jumbo v0, "40031"
+    const-string/jumbo v0, "40032"
+    const-string/jumbo v0, "40033"
+    const-string/jumbo v0, "40034"
+    const-string/jumbo v0, "40035"
+    const-string/jumbo v0, "40036"
+    const-string/jumbo v0, "40037"
+    const-string/jumbo v0, "40038"
+    const-string/jumbo v0, "40039"
+    const-string/jumbo v0, "40040"
+    const-string/jumbo v0, "40041"
+    const-string/jumbo v0, "40042"
+    const-string/jumbo v0, "40043"
+    const-string/jumbo v0, "40044"
+    const-string/jumbo v0, "40045"
+    const-string/jumbo v0, "40046"
+    const-string/jumbo v0, "40047"
+    const-string/jumbo v0, "40048"
+    const-string/jumbo v0, "40049"
+    const-string/jumbo v0, "40050"
+    const-string/jumbo v0, "40051"
+    const-string/jumbo v0, "40052"
+    const-string/jumbo v0, "40053"
+    const-string/jumbo v0, "40054"
+    const-string/jumbo v0, "40055"
+    const-string/jumbo v0, "40056"
+    const-string/jumbo v0, "40057"
+    const-string/jumbo v0, "40058"
+    const-string/jumbo v0, "40059"
+    const-string/jumbo v0, "40060"
+    const-string/jumbo v0, "40061"
+    const-string/jumbo v0, "40062"
+    const-string/jumbo v0, "40063"
+    const-string/jumbo v0, "40064"
+    const-string/jumbo v0, "40065"
+    const-string/jumbo v0, "40066"
+    const-string/jumbo v0, "40067"
+    const-string/jumbo v0, "40068"
+    const-string/jumbo v0, "40069"
+    const-string/jumbo v0, "40070"
+    const-string/jumbo v0, "40071"
+    const-string/jumbo v0, "40072"
+    const-string/jumbo v0, "40073"
+    const-string/jumbo v0, "40074"
+    const-string/jumbo v0, "40075"
+    const-string/jumbo v0, "40076"
+    const-string/jumbo v0, "40077"
+    const-string/jumbo v0, "40078"
+    const-string/jumbo v0, "40079"
+    const-string/jumbo v0, "40080"
+    const-string/jumbo v0, "40081"
+    const-string/jumbo v0, "40082"
+    const-string/jumbo v0, "40083"
+    const-string/jumbo v0, "40084"
+    const-string/jumbo v0, "40085"
+    const-string/jumbo v0, "40086"
+    const-string/jumbo v0, "40087"
+    const-string/jumbo v0, "40088"
+    const-string/jumbo v0, "40089"
+    const-string/jumbo v0, "40090"
+    const-string/jumbo v0, "40091"
+    const-string/jumbo v0, "40092"
+    const-string/jumbo v0, "40093"
+    const-string/jumbo v0, "40094"
+    const-string/jumbo v0, "40095"
+    const-string/jumbo v0, "40096"
+    const-string/jumbo v0, "40097"
+    const-string/jumbo v0, "40098"
+    const-string/jumbo v0, "40099"
+    const-string/jumbo v0, "40100"
+    const-string/jumbo v0, "40101"
+    const-string/jumbo v0, "40102"
+    const-string/jumbo v0, "40103"
+    const-string/jumbo v0, "40104"
+    const-string/jumbo v0, "40105"
+    const-string/jumbo v0, "40106"
+    const-string/jumbo v0, "40107"
+    const-string/jumbo v0, "40108"
+    const-string/jumbo v0, "40109"
+    const-string/jumbo v0, "40110"
+    const-string/jumbo v0, "40111"
+    const-string/jumbo v0, "40112"
+    const-string/jumbo v0, "40113"
+    const-string/jumbo v0, "40114"
+    const-string/jumbo v0, "40115"
+    const-string/jumbo v0, "40116"
+    const-string/jumbo v0, "40117"
+    const-string/jumbo v0, "40118"
+    const-string/jumbo v0, "40119"
+    const-string/jumbo v0, "40120"
+    const-string/jumbo v0, "40121"
+    const-string/jumbo v0, "40122"
+    const-string/jumbo v0, "40123"
+    const-string/jumbo v0, "40124"
+    const-string/jumbo v0, "40125"
+    const-string/jumbo v0, "40126"
+    const-string/jumbo v0, "40127"
+    const-string/jumbo v0, "40128"
+    const-string/jumbo v0, "40129"
+    const-string/jumbo v0, "40130"
+    const-string/jumbo v0, "40131"
+    const-string/jumbo v0, "40132"
+    const-string/jumbo v0, "40133"
+    const-string/jumbo v0, "40134"
+    const-string/jumbo v0, "40135"
+    const-string/jumbo v0, "40136"
+    const-string/jumbo v0, "40137"
+    const-string/jumbo v0, "40138"
+    const-string/jumbo v0, "40139"
+    const-string/jumbo v0, "40140"
+    const-string/jumbo v0, "40141"
+    const-string/jumbo v0, "40142"
+    const-string/jumbo v0, "40143"
+    const-string/jumbo v0, "40144"
+    const-string/jumbo v0, "40145"
+    const-string/jumbo v0, "40146"
+    const-string/jumbo v0, "40147"
+    const-string/jumbo v0, "40148"
+    const-string/jumbo v0, "40149"
+    const-string/jumbo v0, "40150"
+    const-string/jumbo v0, "40151"
+    const-string/jumbo v0, "40152"
+    const-string/jumbo v0, "40153"
+    const-string/jumbo v0, "40154"
+    const-string/jumbo v0, "40155"
+    const-string/jumbo v0, "40156"
+    const-string/jumbo v0, "40157"
+    const-string/jumbo v0, "40158"
+    const-string/jumbo v0, "40159"
+    const-string/jumbo v0, "40160"
+    const-string/jumbo v0, "40161"
+    const-string/jumbo v0, "40162"
+    const-string/jumbo v0, "40163"
+    const-string/jumbo v0, "40164"
+    const-string/jumbo v0, "40165"
+    const-string/jumbo v0, "40166"
+    const-string/jumbo v0, "40167"
+    const-string/jumbo v0, "40168"
+    const-string/jumbo v0, "40169"
+    const-string/jumbo v0, "40170"
+    const-string/jumbo v0, "40171"
+    const-string/jumbo v0, "40172"
+    const-string/jumbo v0, "40173"
+    const-string/jumbo v0, "40174"
+    const-string/jumbo v0, "40175"
+    const-string/jumbo v0, "40176"
+    const-string/jumbo v0, "40177"
+    const-string/jumbo v0, "40178"
+    const-string/jumbo v0, "40179"
+    const-string/jumbo v0, "40180"
+    const-string/jumbo v0, "40181"
+    const-string/jumbo v0, "40182"
+    const-string/jumbo v0, "40183"
+    const-string/jumbo v0, "40184"
+    const-string/jumbo v0, "40185"
+    const-string/jumbo v0, "40186"
+    const-string/jumbo v0, "40187"
+    const-string/jumbo v0, "40188"
+    const-string/jumbo v0, "40189"
+    const-string/jumbo v0, "40190"
+    const-string/jumbo v0, "40191"
+    const-string/jumbo v0, "40192"
+    const-string/jumbo v0, "40193"
+    const-string/jumbo v0, "40194"
+    const-string/jumbo v0, "40195"
+    const-string/jumbo v0, "40196"
+    const-string/jumbo v0, "40197"
+    const-string/jumbo v0, "40198"
+    const-string/jumbo v0, "40199"
+    const-string/jumbo v0, "40200"
+    const-string/jumbo v0, "40201"
+    const-string/jumbo v0, "40202"
+    const-string/jumbo v0, "40203"
+    const-string/jumbo v0, "40204"
+    const-string/jumbo v0, "40205"
+    const-string/jumbo v0, "40206"
+    const-string/jumbo v0, "40207"
+    const-string/jumbo v0, "40208"
+    const-string/jumbo v0, "40209"
+    const-string/jumbo v0, "40210"
+    const-string/jumbo v0, "40211"
+    const-string/jumbo v0, "40212"
+    const-string/jumbo v0, "40213"
+    const-string/jumbo v0, "40214"
+    const-string/jumbo v0, "40215"
+    const-string/jumbo v0, "40216"
+    const-string/jumbo v0, "40217"
+    const-string/jumbo v0, "40218"
+    const-string/jumbo v0, "40219"
+    const-string/jumbo v0, "40220"
+    const-string/jumbo v0, "40221"
+    const-string/jumbo v0, "40222"
+    const-string/jumbo v0, "40223"
+    const-string/jumbo v0, "40224"
+    const-string/jumbo v0, "40225"
+    const-string/jumbo v0, "40226"
+    const-string/jumbo v0, "40227"
+    const-string/jumbo v0, "40228"
+    const-string/jumbo v0, "40229"
+    const-string/jumbo v0, "40230"
+    const-string/jumbo v0, "40231"
+    const-string/jumbo v0, "40232"
+    const-string/jumbo v0, "40233"
+    const-string/jumbo v0, "40234"
+    const-string/jumbo v0, "40235"
+    const-string/jumbo v0, "40236"
+    const-string/jumbo v0, "40237"
+    const-string/jumbo v0, "40238"
+    const-string/jumbo v0, "40239"
+    const-string/jumbo v0, "40240"
+    const-string/jumbo v0, "40241"
+    const-string/jumbo v0, "40242"
+    const-string/jumbo v0, "40243"
+    const-string/jumbo v0, "40244"
+    const-string/jumbo v0, "40245"
+    const-string/jumbo v0, "40246"
+    const-string/jumbo v0, "40247"
+    const-string/jumbo v0, "40248"
+    const-string/jumbo v0, "40249"
+    const-string/jumbo v0, "40250"
+    const-string/jumbo v0, "40251"
+    const-string/jumbo v0, "40252"
+    const-string/jumbo v0, "40253"
+    const-string/jumbo v0, "40254"
+    const-string/jumbo v0, "40255"
+    const-string/jumbo v0, "40256"
+    const-string/jumbo v0, "40257"
+    const-string/jumbo v0, "40258"
+    const-string/jumbo v0, "40259"
+    const-string/jumbo v0, "40260"
+    const-string/jumbo v0, "40261"
+    const-string/jumbo v0, "40262"
+    const-string/jumbo v0, "40263"
+    const-string/jumbo v0, "40264"
+    const-string/jumbo v0, "40265"
+    const-string/jumbo v0, "40266"
+    const-string/jumbo v0, "40267"
+    const-string/jumbo v0, "40268"
+    const-string/jumbo v0, "40269"
+    const-string/jumbo v0, "40270"
+    const-string/jumbo v0, "40271"
+    const-string/jumbo v0, "40272"
+    const-string/jumbo v0, "40273"
+    const-string/jumbo v0, "40274"
+    const-string/jumbo v0, "40275"
+    const-string/jumbo v0, "40276"
+    const-string/jumbo v0, "40277"
+    const-string/jumbo v0, "40278"
+    const-string/jumbo v0, "40279"
+    const-string/jumbo v0, "40280"
+    const-string/jumbo v0, "40281"
+    const-string/jumbo v0, "40282"
+    const-string/jumbo v0, "40283"
+    const-string/jumbo v0, "40284"
+    const-string/jumbo v0, "40285"
+    const-string/jumbo v0, "40286"
+    const-string/jumbo v0, "40287"
+    const-string/jumbo v0, "40288"
+    const-string/jumbo v0, "40289"
+    const-string/jumbo v0, "40290"
+    const-string/jumbo v0, "40291"
+    const-string/jumbo v0, "40292"
+    const-string/jumbo v0, "40293"
+    const-string/jumbo v0, "40294"
+    const-string/jumbo v0, "40295"
+    const-string/jumbo v0, "40296"
+    const-string/jumbo v0, "40297"
+    const-string/jumbo v0, "40298"
+    const-string/jumbo v0, "40299"
+    const-string/jumbo v0, "40300"
+    const-string/jumbo v0, "40301"
+    const-string/jumbo v0, "40302"
+    const-string/jumbo v0, "40303"
+    const-string/jumbo v0, "40304"
+    const-string/jumbo v0, "40305"
+    const-string/jumbo v0, "40306"
+    const-string/jumbo v0, "40307"
+    const-string/jumbo v0, "40308"
+    const-string/jumbo v0, "40309"
+    const-string/jumbo v0, "40310"
+    const-string/jumbo v0, "40311"
+    const-string/jumbo v0, "40312"
+    const-string/jumbo v0, "40313"
+    const-string/jumbo v0, "40314"
+    const-string/jumbo v0, "40315"
+    const-string/jumbo v0, "40316"
+    const-string/jumbo v0, "40317"
+    const-string/jumbo v0, "40318"
+    const-string/jumbo v0, "40319"
+    const-string/jumbo v0, "40320"
+    const-string/jumbo v0, "40321"
+    const-string/jumbo v0, "40322"
+    const-string/jumbo v0, "40323"
+    const-string/jumbo v0, "40324"
+    const-string/jumbo v0, "40325"
+    const-string/jumbo v0, "40326"
+    const-string/jumbo v0, "40327"
+    const-string/jumbo v0, "40328"
+    const-string/jumbo v0, "40329"
+    const-string/jumbo v0, "40330"
+    const-string/jumbo v0, "40331"
+    const-string/jumbo v0, "40332"
+    const-string/jumbo v0, "40333"
+    const-string/jumbo v0, "40334"
+    const-string/jumbo v0, "40335"
+    const-string/jumbo v0, "40336"
+    const-string/jumbo v0, "40337"
+    const-string/jumbo v0, "40338"
+    const-string/jumbo v0, "40339"
+    const-string/jumbo v0, "40340"
+    const-string/jumbo v0, "40341"
+    const-string/jumbo v0, "40342"
+    const-string/jumbo v0, "40343"
+    const-string/jumbo v0, "40344"
+    const-string/jumbo v0, "40345"
+    const-string/jumbo v0, "40346"
+    const-string/jumbo v0, "40347"
+    const-string/jumbo v0, "40348"
+    const-string/jumbo v0, "40349"
+    const-string/jumbo v0, "40350"
+    const-string/jumbo v0, "40351"
+    const-string/jumbo v0, "40352"
+    const-string/jumbo v0, "40353"
+    const-string/jumbo v0, "40354"
+    const-string/jumbo v0, "40355"
+    const-string/jumbo v0, "40356"
+    const-string/jumbo v0, "40357"
+    const-string/jumbo v0, "40358"
+    const-string/jumbo v0, "40359"
+    const-string/jumbo v0, "40360"
+    const-string/jumbo v0, "40361"
+    const-string/jumbo v0, "40362"
+    const-string/jumbo v0, "40363"
+    const-string/jumbo v0, "40364"
+    const-string/jumbo v0, "40365"
+    const-string/jumbo v0, "40366"
+    const-string/jumbo v0, "40367"
+    const-string/jumbo v0, "40368"
+    const-string/jumbo v0, "40369"
+    const-string/jumbo v0, "40370"
+    const-string/jumbo v0, "40371"
+    const-string/jumbo v0, "40372"
+    const-string/jumbo v0, "40373"
+    const-string/jumbo v0, "40374"
+    const-string/jumbo v0, "40375"
+    const-string/jumbo v0, "40376"
+    const-string/jumbo v0, "40377"
+    const-string/jumbo v0, "40378"
+    const-string/jumbo v0, "40379"
+    const-string/jumbo v0, "40380"
+    const-string/jumbo v0, "40381"
+    const-string/jumbo v0, "40382"
+    const-string/jumbo v0, "40383"
+    const-string/jumbo v0, "40384"
+    const-string/jumbo v0, "40385"
+    const-string/jumbo v0, "40386"
+    const-string/jumbo v0, "40387"
+    const-string/jumbo v0, "40388"
+    const-string/jumbo v0, "40389"
+    const-string/jumbo v0, "40390"
+    const-string/jumbo v0, "40391"
+    const-string/jumbo v0, "40392"
+    const-string/jumbo v0, "40393"
+    const-string/jumbo v0, "40394"
+    const-string/jumbo v0, "40395"
+    const-string/jumbo v0, "40396"
+    const-string/jumbo v0, "40397"
+    const-string/jumbo v0, "40398"
+    const-string/jumbo v0, "40399"
+    const-string/jumbo v0, "40400"
+    const-string/jumbo v0, "40401"
+    const-string/jumbo v0, "40402"
+    const-string/jumbo v0, "40403"
+    const-string/jumbo v0, "40404"
+    const-string/jumbo v0, "40405"
+    const-string/jumbo v0, "40406"
+    const-string/jumbo v0, "40407"
+    const-string/jumbo v0, "40408"
+    const-string/jumbo v0, "40409"
+    const-string/jumbo v0, "40410"
+    const-string/jumbo v0, "40411"
+    const-string/jumbo v0, "40412"
+    const-string/jumbo v0, "40413"
+    const-string/jumbo v0, "40414"
+    const-string/jumbo v0, "40415"
+    const-string/jumbo v0, "40416"
+    const-string/jumbo v0, "40417"
+    const-string/jumbo v0, "40418"
+    const-string/jumbo v0, "40419"
+    const-string/jumbo v0, "40420"
+    const-string/jumbo v0, "40421"
+    const-string/jumbo v0, "40422"
+    const-string/jumbo v0, "40423"
+    const-string/jumbo v0, "40424"
+    const-string/jumbo v0, "40425"
+    const-string/jumbo v0, "40426"
+    const-string/jumbo v0, "40427"
+    const-string/jumbo v0, "40428"
+    const-string/jumbo v0, "40429"
+    const-string/jumbo v0, "40430"
+    const-string/jumbo v0, "40431"
+    const-string/jumbo v0, "40432"
+    const-string/jumbo v0, "40433"
+    const-string/jumbo v0, "40434"
+    const-string/jumbo v0, "40435"
+    const-string/jumbo v0, "40436"
+    const-string/jumbo v0, "40437"
+    const-string/jumbo v0, "40438"
+    const-string/jumbo v0, "40439"
+    const-string/jumbo v0, "40440"
+    const-string/jumbo v0, "40441"
+    const-string/jumbo v0, "40442"
+    const-string/jumbo v0, "40443"
+    const-string/jumbo v0, "40444"
+    const-string/jumbo v0, "40445"
+    const-string/jumbo v0, "40446"
+    const-string/jumbo v0, "40447"
+    const-string/jumbo v0, "40448"
+    const-string/jumbo v0, "40449"
+    const-string/jumbo v0, "40450"
+    const-string/jumbo v0, "40451"
+    const-string/jumbo v0, "40452"
+    const-string/jumbo v0, "40453"
+    const-string/jumbo v0, "40454"
+    const-string/jumbo v0, "40455"
+    const-string/jumbo v0, "40456"
+    const-string/jumbo v0, "40457"
+    const-string/jumbo v0, "40458"
+    const-string/jumbo v0, "40459"
+    const-string/jumbo v0, "40460"
+    const-string/jumbo v0, "40461"
+    const-string/jumbo v0, "40462"
+    const-string/jumbo v0, "40463"
+    const-string/jumbo v0, "40464"
+    const-string/jumbo v0, "40465"
+    const-string/jumbo v0, "40466"
+    const-string/jumbo v0, "40467"
+    const-string/jumbo v0, "40468"
+    const-string/jumbo v0, "40469"
+    const-string/jumbo v0, "40470"
+    const-string/jumbo v0, "40471"
+    const-string/jumbo v0, "40472"
+    const-string/jumbo v0, "40473"
+    const-string/jumbo v0, "40474"
+    const-string/jumbo v0, "40475"
+    const-string/jumbo v0, "40476"
+    const-string/jumbo v0, "40477"
+    const-string/jumbo v0, "40478"
+    const-string/jumbo v0, "40479"
+    const-string/jumbo v0, "40480"
+    const-string/jumbo v0, "40481"
+    const-string/jumbo v0, "40482"
+    const-string/jumbo v0, "40483"
+    const-string/jumbo v0, "40484"
+    const-string/jumbo v0, "40485"
+    const-string/jumbo v0, "40486"
+    const-string/jumbo v0, "40487"
+    const-string/jumbo v0, "40488"
+    const-string/jumbo v0, "40489"
+    const-string/jumbo v0, "40490"
+    const-string/jumbo v0, "40491"
+    const-string/jumbo v0, "40492"
+    const-string/jumbo v0, "40493"
+    const-string/jumbo v0, "40494"
+    const-string/jumbo v0, "40495"
+    const-string/jumbo v0, "40496"
+    const-string/jumbo v0, "40497"
+    const-string/jumbo v0, "40498"
+    const-string/jumbo v0, "40499"
+    const-string/jumbo v0, "40500"
+    const-string/jumbo v0, "40501"
+    const-string/jumbo v0, "40502"
+    const-string/jumbo v0, "40503"
+    const-string/jumbo v0, "40504"
+    const-string/jumbo v0, "40505"
+    const-string/jumbo v0, "40506"
+    const-string/jumbo v0, "40507"
+    const-string/jumbo v0, "40508"
+    const-string/jumbo v0, "40509"
+    const-string/jumbo v0, "40510"
+    const-string/jumbo v0, "40511"
+    const-string/jumbo v0, "40512"
+    const-string/jumbo v0, "40513"
+    const-string/jumbo v0, "40514"
+    const-string/jumbo v0, "40515"
+    const-string/jumbo v0, "40516"
+    const-string/jumbo v0, "40517"
+    const-string/jumbo v0, "40518"
+    const-string/jumbo v0, "40519"
+    const-string/jumbo v0, "40520"
+    const-string/jumbo v0, "40521"
+    const-string/jumbo v0, "40522"
+    const-string/jumbo v0, "40523"
+    const-string/jumbo v0, "40524"
+    const-string/jumbo v0, "40525"
+    const-string/jumbo v0, "40526"
+    const-string/jumbo v0, "40527"
+    const-string/jumbo v0, "40528"
+    const-string/jumbo v0, "40529"
+    const-string/jumbo v0, "40530"
+    const-string/jumbo v0, "40531"
+    const-string/jumbo v0, "40532"
+    const-string/jumbo v0, "40533"
+    const-string/jumbo v0, "40534"
+    const-string/jumbo v0, "40535"
+    const-string/jumbo v0, "40536"
+    const-string/jumbo v0, "40537"
+    const-string/jumbo v0, "40538"
+    const-string/jumbo v0, "40539"
+    const-string/jumbo v0, "40540"
+    const-string/jumbo v0, "40541"
+    const-string/jumbo v0, "40542"
+    const-string/jumbo v0, "40543"
+    const-string/jumbo v0, "40544"
+    const-string/jumbo v0, "40545"
+    const-string/jumbo v0, "40546"
+    const-string/jumbo v0, "40547"
+    const-string/jumbo v0, "40548"
+    const-string/jumbo v0, "40549"
+    const-string/jumbo v0, "40550"
+    const-string/jumbo v0, "40551"
+    const-string/jumbo v0, "40552"
+    const-string/jumbo v0, "40553"
+    const-string/jumbo v0, "40554"
+    const-string/jumbo v0, "40555"
+    const-string/jumbo v0, "40556"
+    const-string/jumbo v0, "40557"
+    const-string/jumbo v0, "40558"
+    const-string/jumbo v0, "40559"
+    const-string/jumbo v0, "40560"
+    const-string/jumbo v0, "40561"
+    const-string/jumbo v0, "40562"
+    const-string/jumbo v0, "40563"
+    const-string/jumbo v0, "40564"
+    const-string/jumbo v0, "40565"
+    const-string/jumbo v0, "40566"
+    const-string/jumbo v0, "40567"
+    const-string/jumbo v0, "40568"
+    const-string/jumbo v0, "40569"
+    const-string/jumbo v0, "40570"
+    const-string/jumbo v0, "40571"
+    const-string/jumbo v0, "40572"
+    const-string/jumbo v0, "40573"
+    const-string/jumbo v0, "40574"
+    const-string/jumbo v0, "40575"
+    const-string/jumbo v0, "40576"
+    const-string/jumbo v0, "40577"
+    const-string/jumbo v0, "40578"
+    const-string/jumbo v0, "40579"
+    const-string/jumbo v0, "40580"
+    const-string/jumbo v0, "40581"
+    const-string/jumbo v0, "40582"
+    const-string/jumbo v0, "40583"
+    const-string/jumbo v0, "40584"
+    const-string/jumbo v0, "40585"
+    const-string/jumbo v0, "40586"
+    const-string/jumbo v0, "40587"
+    const-string/jumbo v0, "40588"
+    const-string/jumbo v0, "40589"
+    const-string/jumbo v0, "40590"
+    const-string/jumbo v0, "40591"
+    const-string/jumbo v0, "40592"
+    const-string/jumbo v0, "40593"
+    const-string/jumbo v0, "40594"
+    const-string/jumbo v0, "40595"
+    const-string/jumbo v0, "40596"
+    const-string/jumbo v0, "40597"
+    const-string/jumbo v0, "40598"
+    const-string/jumbo v0, "40599"
+    const-string/jumbo v0, "40600"
+    const-string/jumbo v0, "40601"
+    const-string/jumbo v0, "40602"
+    const-string/jumbo v0, "40603"
+    const-string/jumbo v0, "40604"
+    const-string/jumbo v0, "40605"
+    const-string/jumbo v0, "40606"
+    const-string/jumbo v0, "40607"
+    const-string/jumbo v0, "40608"
+    const-string/jumbo v0, "40609"
+    const-string/jumbo v0, "40610"
+    const-string/jumbo v0, "40611"
+    const-string/jumbo v0, "40612"
+    const-string/jumbo v0, "40613"
+    const-string/jumbo v0, "40614"
+    const-string/jumbo v0, "40615"
+    const-string/jumbo v0, "40616"
+    const-string/jumbo v0, "40617"
+    const-string/jumbo v0, "40618"
+    const-string/jumbo v0, "40619"
+    const-string/jumbo v0, "40620"
+    const-string/jumbo v0, "40621"
+    const-string/jumbo v0, "40622"
+    const-string/jumbo v0, "40623"
+    const-string/jumbo v0, "40624"
+    const-string/jumbo v0, "40625"
+    const-string/jumbo v0, "40626"
+    const-string/jumbo v0, "40627"
+    const-string/jumbo v0, "40628"
+    const-string/jumbo v0, "40629"
+    const-string/jumbo v0, "40630"
+    const-string/jumbo v0, "40631"
+    const-string/jumbo v0, "40632"
+    const-string/jumbo v0, "40633"
+    const-string/jumbo v0, "40634"
+    const-string/jumbo v0, "40635"
+    const-string/jumbo v0, "40636"
+    const-string/jumbo v0, "40637"
+    const-string/jumbo v0, "40638"
+    const-string/jumbo v0, "40639"
+    const-string/jumbo v0, "40640"
+    const-string/jumbo v0, "40641"
+    const-string/jumbo v0, "40642"
+    const-string/jumbo v0, "40643"
+    const-string/jumbo v0, "40644"
+    const-string/jumbo v0, "40645"
+    const-string/jumbo v0, "40646"
+    const-string/jumbo v0, "40647"
+    const-string/jumbo v0, "40648"
+    const-string/jumbo v0, "40649"
+    const-string/jumbo v0, "40650"
+    const-string/jumbo v0, "40651"
+    const-string/jumbo v0, "40652"
+    const-string/jumbo v0, "40653"
+    const-string/jumbo v0, "40654"
+    const-string/jumbo v0, "40655"
+    const-string/jumbo v0, "40656"
+    const-string/jumbo v0, "40657"
+    const-string/jumbo v0, "40658"
+    const-string/jumbo v0, "40659"
+    const-string/jumbo v0, "40660"
+    const-string/jumbo v0, "40661"
+    const-string/jumbo v0, "40662"
+    const-string/jumbo v0, "40663"
+    const-string/jumbo v0, "40664"
+    const-string/jumbo v0, "40665"
+    const-string/jumbo v0, "40666"
+    const-string/jumbo v0, "40667"
+    const-string/jumbo v0, "40668"
+    const-string/jumbo v0, "40669"
+    const-string/jumbo v0, "40670"
+    const-string/jumbo v0, "40671"
+    const-string/jumbo v0, "40672"
+    const-string/jumbo v0, "40673"
+    const-string/jumbo v0, "40674"
+    const-string/jumbo v0, "40675"
+    const-string/jumbo v0, "40676"
+    const-string/jumbo v0, "40677"
+    const-string/jumbo v0, "40678"
+    const-string/jumbo v0, "40679"
+    const-string/jumbo v0, "40680"
+    const-string/jumbo v0, "40681"
+    const-string/jumbo v0, "40682"
+    const-string/jumbo v0, "40683"
+    const-string/jumbo v0, "40684"
+    const-string/jumbo v0, "40685"
+    const-string/jumbo v0, "40686"
+    const-string/jumbo v0, "40687"
+    const-string/jumbo v0, "40688"
+    const-string/jumbo v0, "40689"
+    const-string/jumbo v0, "40690"
+    const-string/jumbo v0, "40691"
+    const-string/jumbo v0, "40692"
+    const-string/jumbo v0, "40693"
+    const-string/jumbo v0, "40694"
+    const-string/jumbo v0, "40695"
+    const-string/jumbo v0, "40696"
+    const-string/jumbo v0, "40697"
+    const-string/jumbo v0, "40698"
+    const-string/jumbo v0, "40699"
+    const-string/jumbo v0, "40700"
+    const-string/jumbo v0, "40701"
+    const-string/jumbo v0, "40702"
+    const-string/jumbo v0, "40703"
+    const-string/jumbo v0, "40704"
+    const-string/jumbo v0, "40705"
+    const-string/jumbo v0, "40706"
+    const-string/jumbo v0, "40707"
+    const-string/jumbo v0, "40708"
+    const-string/jumbo v0, "40709"
+    const-string/jumbo v0, "40710"
+    const-string/jumbo v0, "40711"
+    const-string/jumbo v0, "40712"
+    const-string/jumbo v0, "40713"
+    const-string/jumbo v0, "40714"
+    const-string/jumbo v0, "40715"
+    const-string/jumbo v0, "40716"
+    const-string/jumbo v0, "40717"
+    const-string/jumbo v0, "40718"
+    const-string/jumbo v0, "40719"
+    const-string/jumbo v0, "40720"
+    const-string/jumbo v0, "40721"
+    const-string/jumbo v0, "40722"
+    const-string/jumbo v0, "40723"
+    const-string/jumbo v0, "40724"
+    const-string/jumbo v0, "40725"
+    const-string/jumbo v0, "40726"
+    const-string/jumbo v0, "40727"
+    const-string/jumbo v0, "40728"
+    const-string/jumbo v0, "40729"
+    const-string/jumbo v0, "40730"
+    const-string/jumbo v0, "40731"
+    const-string/jumbo v0, "40732"
+    const-string/jumbo v0, "40733"
+    const-string/jumbo v0, "40734"
+    const-string/jumbo v0, "40735"
+    const-string/jumbo v0, "40736"
+    const-string/jumbo v0, "40737"
+    const-string/jumbo v0, "40738"
+    const-string/jumbo v0, "40739"
+    const-string/jumbo v0, "40740"
+    const-string/jumbo v0, "40741"
+    const-string/jumbo v0, "40742"
+    const-string/jumbo v0, "40743"
+    const-string/jumbo v0, "40744"
+    const-string/jumbo v0, "40745"
+    const-string/jumbo v0, "40746"
+    const-string/jumbo v0, "40747"
+    const-string/jumbo v0, "40748"
+    const-string/jumbo v0, "40749"
+    const-string/jumbo v0, "40750"
+    const-string/jumbo v0, "40751"
+    const-string/jumbo v0, "40752"
+    const-string/jumbo v0, "40753"
+    const-string/jumbo v0, "40754"
+    const-string/jumbo v0, "40755"
+    const-string/jumbo v0, "40756"
+    const-string/jumbo v0, "40757"
+    const-string/jumbo v0, "40758"
+    const-string/jumbo v0, "40759"
+    const-string/jumbo v0, "40760"
+    const-string/jumbo v0, "40761"
+    const-string/jumbo v0, "40762"
+    const-string/jumbo v0, "40763"
+    const-string/jumbo v0, "40764"
+    const-string/jumbo v0, "40765"
+    const-string/jumbo v0, "40766"
+    const-string/jumbo v0, "40767"
+    const-string/jumbo v0, "40768"
+    const-string/jumbo v0, "40769"
+    const-string/jumbo v0, "40770"
+    const-string/jumbo v0, "40771"
+    const-string/jumbo v0, "40772"
+    const-string/jumbo v0, "40773"
+    const-string/jumbo v0, "40774"
+    const-string/jumbo v0, "40775"
+    const-string/jumbo v0, "40776"
+    const-string/jumbo v0, "40777"
+    const-string/jumbo v0, "40778"
+    const-string/jumbo v0, "40779"
+    const-string/jumbo v0, "40780"
+    const-string/jumbo v0, "40781"
+    const-string/jumbo v0, "40782"
+    const-string/jumbo v0, "40783"
+    const-string/jumbo v0, "40784"
+    const-string/jumbo v0, "40785"
+    const-string/jumbo v0, "40786"
+    const-string/jumbo v0, "40787"
+    const-string/jumbo v0, "40788"
+    const-string/jumbo v0, "40789"
+    const-string/jumbo v0, "40790"
+    const-string/jumbo v0, "40791"
+    const-string/jumbo v0, "40792"
+    const-string/jumbo v0, "40793"
+    const-string/jumbo v0, "40794"
+    const-string/jumbo v0, "40795"
+    const-string/jumbo v0, "40796"
+    const-string/jumbo v0, "40797"
+    const-string/jumbo v0, "40798"
+    const-string/jumbo v0, "40799"
+    const-string/jumbo v0, "40800"
+    const-string/jumbo v0, "40801"
+    const-string/jumbo v0, "40802"
+    const-string/jumbo v0, "40803"
+    const-string/jumbo v0, "40804"
+    const-string/jumbo v0, "40805"
+    const-string/jumbo v0, "40806"
+    const-string/jumbo v0, "40807"
+    const-string/jumbo v0, "40808"
+    const-string/jumbo v0, "40809"
+    const-string/jumbo v0, "40810"
+    const-string/jumbo v0, "40811"
+    const-string/jumbo v0, "40812"
+    const-string/jumbo v0, "40813"
+    const-string/jumbo v0, "40814"
+    const-string/jumbo v0, "40815"
+    const-string/jumbo v0, "40816"
+    const-string/jumbo v0, "40817"
+    const-string/jumbo v0, "40818"
+    const-string/jumbo v0, "40819"
+    const-string/jumbo v0, "40820"
+    const-string/jumbo v0, "40821"
+    const-string/jumbo v0, "40822"
+    const-string/jumbo v0, "40823"
+    const-string/jumbo v0, "40824"
+    const-string/jumbo v0, "40825"
+    const-string/jumbo v0, "40826"
+    const-string/jumbo v0, "40827"
+    const-string/jumbo v0, "40828"
+    const-string/jumbo v0, "40829"
+    const-string/jumbo v0, "40830"
+    const-string/jumbo v0, "40831"
+    const-string/jumbo v0, "40832"
+    const-string/jumbo v0, "40833"
+    const-string/jumbo v0, "40834"
+    const-string/jumbo v0, "40835"
+    const-string/jumbo v0, "40836"
+    const-string/jumbo v0, "40837"
+    const-string/jumbo v0, "40838"
+    const-string/jumbo v0, "40839"
+    const-string/jumbo v0, "40840"
+    const-string/jumbo v0, "40841"
+    const-string/jumbo v0, "40842"
+    const-string/jumbo v0, "40843"
+    const-string/jumbo v0, "40844"
+    const-string/jumbo v0, "40845"
+    const-string/jumbo v0, "40846"
+    const-string/jumbo v0, "40847"
+    const-string/jumbo v0, "40848"
+    const-string/jumbo v0, "40849"
+    const-string/jumbo v0, "40850"
+    const-string/jumbo v0, "40851"
+    const-string/jumbo v0, "40852"
+    const-string/jumbo v0, "40853"
+    const-string/jumbo v0, "40854"
+    const-string/jumbo v0, "40855"
+    const-string/jumbo v0, "40856"
+    const-string/jumbo v0, "40857"
+    const-string/jumbo v0, "40858"
+    const-string/jumbo v0, "40859"
+    const-string/jumbo v0, "40860"
+    const-string/jumbo v0, "40861"
+    const-string/jumbo v0, "40862"
+    const-string/jumbo v0, "40863"
+    const-string/jumbo v0, "40864"
+    const-string/jumbo v0, "40865"
+    const-string/jumbo v0, "40866"
+    const-string/jumbo v0, "40867"
+    const-string/jumbo v0, "40868"
+    const-string/jumbo v0, "40869"
+    const-string/jumbo v0, "40870"
+    const-string/jumbo v0, "40871"
+    const-string/jumbo v0, "40872"
+    const-string/jumbo v0, "40873"
+    const-string/jumbo v0, "40874"
+    const-string/jumbo v0, "40875"
+    const-string/jumbo v0, "40876"
+    const-string/jumbo v0, "40877"
+    const-string/jumbo v0, "40878"
+    const-string/jumbo v0, "40879"
+    const-string/jumbo v0, "40880"
+    const-string/jumbo v0, "40881"
+    const-string/jumbo v0, "40882"
+    const-string/jumbo v0, "40883"
+    const-string/jumbo v0, "40884"
+    const-string/jumbo v0, "40885"
+    const-string/jumbo v0, "40886"
+    const-string/jumbo v0, "40887"
+    const-string/jumbo v0, "40888"
+    const-string/jumbo v0, "40889"
+    const-string/jumbo v0, "40890"
+    const-string/jumbo v0, "40891"
+    const-string/jumbo v0, "40892"
+    const-string/jumbo v0, "40893"
+    const-string/jumbo v0, "40894"
+    const-string/jumbo v0, "40895"
+    const-string/jumbo v0, "40896"
+    const-string/jumbo v0, "40897"
+    const-string/jumbo v0, "40898"
+    const-string/jumbo v0, "40899"
+    const-string/jumbo v0, "40900"
+    const-string/jumbo v0, "40901"
+    const-string/jumbo v0, "40902"
+    const-string/jumbo v0, "40903"
+    const-string/jumbo v0, "40904"
+    const-string/jumbo v0, "40905"
+    const-string/jumbo v0, "40906"
+    const-string/jumbo v0, "40907"
+    const-string/jumbo v0, "40908"
+    const-string/jumbo v0, "40909"
+    const-string/jumbo v0, "40910"
+    const-string/jumbo v0, "40911"
+    const-string/jumbo v0, "40912"
+    const-string/jumbo v0, "40913"
+    const-string/jumbo v0, "40914"
+    const-string/jumbo v0, "40915"
+    const-string/jumbo v0, "40916"
+    const-string/jumbo v0, "40917"
+    const-string/jumbo v0, "40918"
+    const-string/jumbo v0, "40919"
+    const-string/jumbo v0, "40920"
+    const-string/jumbo v0, "40921"
+    const-string/jumbo v0, "40922"
+    const-string/jumbo v0, "40923"
+    const-string/jumbo v0, "40924"
+    const-string/jumbo v0, "40925"
+    const-string/jumbo v0, "40926"
+    const-string/jumbo v0, "40927"
+    const-string/jumbo v0, "40928"
+    const-string/jumbo v0, "40929"
+    const-string/jumbo v0, "40930"
+    const-string/jumbo v0, "40931"
+    const-string/jumbo v0, "40932"
+    const-string/jumbo v0, "40933"
+    const-string/jumbo v0, "40934"
+    const-string/jumbo v0, "40935"
+    const-string/jumbo v0, "40936"
+    const-string/jumbo v0, "40937"
+    const-string/jumbo v0, "40938"
+    const-string/jumbo v0, "40939"
+    const-string/jumbo v0, "40940"
+    const-string/jumbo v0, "40941"
+    const-string/jumbo v0, "40942"
+    const-string/jumbo v0, "40943"
+    const-string/jumbo v0, "40944"
+    const-string/jumbo v0, "40945"
+    const-string/jumbo v0, "40946"
+    const-string/jumbo v0, "40947"
+    const-string/jumbo v0, "40948"
+    const-string/jumbo v0, "40949"
+    const-string/jumbo v0, "40950"
+    const-string/jumbo v0, "40951"
+    const-string/jumbo v0, "40952"
+    const-string/jumbo v0, "40953"
+    const-string/jumbo v0, "40954"
+    const-string/jumbo v0, "40955"
+    const-string/jumbo v0, "40956"
+    const-string/jumbo v0, "40957"
+    const-string/jumbo v0, "40958"
+    const-string/jumbo v0, "40959"
+    const-string/jumbo v0, "40960"
+    const-string/jumbo v0, "40961"
+    const-string/jumbo v0, "40962"
+    const-string/jumbo v0, "40963"
+    const-string/jumbo v0, "40964"
+    const-string/jumbo v0, "40965"
+    const-string/jumbo v0, "40966"
+    const-string/jumbo v0, "40967"
+    const-string/jumbo v0, "40968"
+    const-string/jumbo v0, "40969"
+    const-string/jumbo v0, "40970"
+    const-string/jumbo v0, "40971"
+    const-string/jumbo v0, "40972"
+    const-string/jumbo v0, "40973"
+    const-string/jumbo v0, "40974"
+    const-string/jumbo v0, "40975"
+    const-string/jumbo v0, "40976"
+    const-string/jumbo v0, "40977"
+    const-string/jumbo v0, "40978"
+    const-string/jumbo v0, "40979"
+    const-string/jumbo v0, "40980"
+    const-string/jumbo v0, "40981"
+    const-string/jumbo v0, "40982"
+    const-string/jumbo v0, "40983"
+    const-string/jumbo v0, "40984"
+    const-string/jumbo v0, "40985"
+    const-string/jumbo v0, "40986"
+    const-string/jumbo v0, "40987"
+    const-string/jumbo v0, "40988"
+    const-string/jumbo v0, "40989"
+    const-string/jumbo v0, "40990"
+    const-string/jumbo v0, "40991"
+    const-string/jumbo v0, "40992"
+    const-string/jumbo v0, "40993"
+    const-string/jumbo v0, "40994"
+    const-string/jumbo v0, "40995"
+    const-string/jumbo v0, "40996"
+    const-string/jumbo v0, "40997"
+    const-string/jumbo v0, "40998"
+    const-string/jumbo v0, "40999"
+    const-string/jumbo v0, "41000"
+    const-string/jumbo v0, "41001"
+    const-string/jumbo v0, "41002"
+    const-string/jumbo v0, "41003"
+    const-string/jumbo v0, "41004"
+    const-string/jumbo v0, "41005"
+    const-string/jumbo v0, "41006"
+    const-string/jumbo v0, "41007"
+    const-string/jumbo v0, "41008"
+    const-string/jumbo v0, "41009"
+    const-string/jumbo v0, "41010"
+    const-string/jumbo v0, "41011"
+    const-string/jumbo v0, "41012"
+    const-string/jumbo v0, "41013"
+    const-string/jumbo v0, "41014"
+    const-string/jumbo v0, "41015"
+    const-string/jumbo v0, "41016"
+    const-string/jumbo v0, "41017"
+    const-string/jumbo v0, "41018"
+    const-string/jumbo v0, "41019"
+    const-string/jumbo v0, "41020"
+    const-string/jumbo v0, "41021"
+    const-string/jumbo v0, "41022"
+    const-string/jumbo v0, "41023"
+    const-string/jumbo v0, "41024"
+    const-string/jumbo v0, "41025"
+    const-string/jumbo v0, "41026"
+    const-string/jumbo v0, "41027"
+    const-string/jumbo v0, "41028"
+    const-string/jumbo v0, "41029"
+    const-string/jumbo v0, "41030"
+    const-string/jumbo v0, "41031"
+    const-string/jumbo v0, "41032"
+    const-string/jumbo v0, "41033"
+    const-string/jumbo v0, "41034"
+    const-string/jumbo v0, "41035"
+    const-string/jumbo v0, "41036"
+    const-string/jumbo v0, "41037"
+    const-string/jumbo v0, "41038"
+    const-string/jumbo v0, "41039"
+    const-string/jumbo v0, "41040"
+    const-string/jumbo v0, "41041"
+    const-string/jumbo v0, "41042"
+    const-string/jumbo v0, "41043"
+    const-string/jumbo v0, "41044"
+    const-string/jumbo v0, "41045"
+    const-string/jumbo v0, "41046"
+    const-string/jumbo v0, "41047"
+    const-string/jumbo v0, "41048"
+    const-string/jumbo v0, "41049"
+    const-string/jumbo v0, "41050"
+    const-string/jumbo v0, "41051"
+    const-string/jumbo v0, "41052"
+    const-string/jumbo v0, "41053"
+    const-string/jumbo v0, "41054"
+    const-string/jumbo v0, "41055"
+    const-string/jumbo v0, "41056"
+    const-string/jumbo v0, "41057"
+    const-string/jumbo v0, "41058"
+    const-string/jumbo v0, "41059"
+    const-string/jumbo v0, "41060"
+    const-string/jumbo v0, "41061"
+    const-string/jumbo v0, "41062"
+    const-string/jumbo v0, "41063"
+    const-string/jumbo v0, "41064"
+    const-string/jumbo v0, "41065"
+    const-string/jumbo v0, "41066"
+    const-string/jumbo v0, "41067"
+    const-string/jumbo v0, "41068"
+    const-string/jumbo v0, "41069"
+    const-string/jumbo v0, "41070"
+    const-string/jumbo v0, "41071"
+    const-string/jumbo v0, "41072"
+    const-string/jumbo v0, "41073"
+    const-string/jumbo v0, "41074"
+    const-string/jumbo v0, "41075"
+    const-string/jumbo v0, "41076"
+    const-string/jumbo v0, "41077"
+    const-string/jumbo v0, "41078"
+    const-string/jumbo v0, "41079"
+    const-string/jumbo v0, "41080"
+    const-string/jumbo v0, "41081"
+    const-string/jumbo v0, "41082"
+    const-string/jumbo v0, "41083"
+    const-string/jumbo v0, "41084"
+    const-string/jumbo v0, "41085"
+    const-string/jumbo v0, "41086"
+    const-string/jumbo v0, "41087"
+    const-string/jumbo v0, "41088"
+    const-string/jumbo v0, "41089"
+    const-string/jumbo v0, "41090"
+    const-string/jumbo v0, "41091"
+    const-string/jumbo v0, "41092"
+    const-string/jumbo v0, "41093"
+    const-string/jumbo v0, "41094"
+    const-string/jumbo v0, "41095"
+    const-string/jumbo v0, "41096"
+    const-string/jumbo v0, "41097"
+    const-string/jumbo v0, "41098"
+    const-string/jumbo v0, "41099"
+    const-string/jumbo v0, "41100"
+    const-string/jumbo v0, "41101"
+    const-string/jumbo v0, "41102"
+    const-string/jumbo v0, "41103"
+    const-string/jumbo v0, "41104"
+    const-string/jumbo v0, "41105"
+    const-string/jumbo v0, "41106"
+    const-string/jumbo v0, "41107"
+    const-string/jumbo v0, "41108"
+    const-string/jumbo v0, "41109"
+    const-string/jumbo v0, "41110"
+    const-string/jumbo v0, "41111"
+    const-string/jumbo v0, "41112"
+    const-string/jumbo v0, "41113"
+    const-string/jumbo v0, "41114"
+    const-string/jumbo v0, "41115"
+    const-string/jumbo v0, "41116"
+    const-string/jumbo v0, "41117"
+    const-string/jumbo v0, "41118"
+    const-string/jumbo v0, "41119"
+    const-string/jumbo v0, "41120"
+    const-string/jumbo v0, "41121"
+    const-string/jumbo v0, "41122"
+    const-string/jumbo v0, "41123"
+    const-string/jumbo v0, "41124"
+    const-string/jumbo v0, "41125"
+    const-string/jumbo v0, "41126"
+    const-string/jumbo v0, "41127"
+    const-string/jumbo v0, "41128"
+    const-string/jumbo v0, "41129"
+    const-string/jumbo v0, "41130"
+    const-string/jumbo v0, "41131"
+    const-string/jumbo v0, "41132"
+    const-string/jumbo v0, "41133"
+    const-string/jumbo v0, "41134"
+    const-string/jumbo v0, "41135"
+    const-string/jumbo v0, "41136"
+    const-string/jumbo v0, "41137"
+    const-string/jumbo v0, "41138"
+    const-string/jumbo v0, "41139"
+    const-string/jumbo v0, "41140"
+    const-string/jumbo v0, "41141"
+    const-string/jumbo v0, "41142"
+    const-string/jumbo v0, "41143"
+    const-string/jumbo v0, "41144"
+    const-string/jumbo v0, "41145"
+    const-string/jumbo v0, "41146"
+    const-string/jumbo v0, "41147"
+    const-string/jumbo v0, "41148"
+    const-string/jumbo v0, "41149"
+    const-string/jumbo v0, "41150"
+    const-string/jumbo v0, "41151"
+    const-string/jumbo v0, "41152"
+    const-string/jumbo v0, "41153"
+    const-string/jumbo v0, "41154"
+    const-string/jumbo v0, "41155"
+    const-string/jumbo v0, "41156"
+    const-string/jumbo v0, "41157"
+    const-string/jumbo v0, "41158"
+    const-string/jumbo v0, "41159"
+    const-string/jumbo v0, "41160"
+    const-string/jumbo v0, "41161"
+    const-string/jumbo v0, "41162"
+    const-string/jumbo v0, "41163"
+    const-string/jumbo v0, "41164"
+    const-string/jumbo v0, "41165"
+    const-string/jumbo v0, "41166"
+    const-string/jumbo v0, "41167"
+    const-string/jumbo v0, "41168"
+    const-string/jumbo v0, "41169"
+    const-string/jumbo v0, "41170"
+    const-string/jumbo v0, "41171"
+    const-string/jumbo v0, "41172"
+    const-string/jumbo v0, "41173"
+    const-string/jumbo v0, "41174"
+    const-string/jumbo v0, "41175"
+    const-string/jumbo v0, "41176"
+    const-string/jumbo v0, "41177"
+    const-string/jumbo v0, "41178"
+    const-string/jumbo v0, "41179"
+    const-string/jumbo v0, "41180"
+    const-string/jumbo v0, "41181"
+    const-string/jumbo v0, "41182"
+    const-string/jumbo v0, "41183"
+    const-string/jumbo v0, "41184"
+    const-string/jumbo v0, "41185"
+    const-string/jumbo v0, "41186"
+    const-string/jumbo v0, "41187"
+    const-string/jumbo v0, "41188"
+    const-string/jumbo v0, "41189"
+    const-string/jumbo v0, "41190"
+    const-string/jumbo v0, "41191"
+    const-string/jumbo v0, "41192"
+    const-string/jumbo v0, "41193"
+    const-string/jumbo v0, "41194"
+    const-string/jumbo v0, "41195"
+    const-string/jumbo v0, "41196"
+    const-string/jumbo v0, "41197"
+    const-string/jumbo v0, "41198"
+    const-string/jumbo v0, "41199"
+    const-string/jumbo v0, "41200"
+    const-string/jumbo v0, "41201"
+    const-string/jumbo v0, "41202"
+    const-string/jumbo v0, "41203"
+    const-string/jumbo v0, "41204"
+    const-string/jumbo v0, "41205"
+    const-string/jumbo v0, "41206"
+    const-string/jumbo v0, "41207"
+    const-string/jumbo v0, "41208"
+    const-string/jumbo v0, "41209"
+    const-string/jumbo v0, "41210"
+    const-string/jumbo v0, "41211"
+    const-string/jumbo v0, "41212"
+    const-string/jumbo v0, "41213"
+    const-string/jumbo v0, "41214"
+    const-string/jumbo v0, "41215"
+    const-string/jumbo v0, "41216"
+    const-string/jumbo v0, "41217"
+    const-string/jumbo v0, "41218"
+    const-string/jumbo v0, "41219"
+    const-string/jumbo v0, "41220"
+    const-string/jumbo v0, "41221"
+    const-string/jumbo v0, "41222"
+    const-string/jumbo v0, "41223"
+    const-string/jumbo v0, "41224"
+    const-string/jumbo v0, "41225"
+    const-string/jumbo v0, "41226"
+    const-string/jumbo v0, "41227"
+    const-string/jumbo v0, "41228"
+    const-string/jumbo v0, "41229"
+    const-string/jumbo v0, "41230"
+    const-string/jumbo v0, "41231"
+    const-string/jumbo v0, "41232"
+    const-string/jumbo v0, "41233"
+    const-string/jumbo v0, "41234"
+    const-string/jumbo v0, "41235"
+    const-string/jumbo v0, "41236"
+    const-string/jumbo v0, "41237"
+    const-string/jumbo v0, "41238"
+    const-string/jumbo v0, "41239"
+    const-string/jumbo v0, "41240"
+    const-string/jumbo v0, "41241"
+    const-string/jumbo v0, "41242"
+    const-string/jumbo v0, "41243"
+    const-string/jumbo v0, "41244"
+    const-string/jumbo v0, "41245"
+    const-string/jumbo v0, "41246"
+    const-string/jumbo v0, "41247"
+    const-string/jumbo v0, "41248"
+    const-string/jumbo v0, "41249"
+    const-string/jumbo v0, "41250"
+    const-string/jumbo v0, "41251"
+    const-string/jumbo v0, "41252"
+    const-string/jumbo v0, "41253"
+    const-string/jumbo v0, "41254"
+    const-string/jumbo v0, "41255"
+    const-string/jumbo v0, "41256"
+    const-string/jumbo v0, "41257"
+    const-string/jumbo v0, "41258"
+    const-string/jumbo v0, "41259"
+    const-string/jumbo v0, "41260"
+    const-string/jumbo v0, "41261"
+    const-string/jumbo v0, "41262"
+    const-string/jumbo v0, "41263"
+    const-string/jumbo v0, "41264"
+    const-string/jumbo v0, "41265"
+    const-string/jumbo v0, "41266"
+    const-string/jumbo v0, "41267"
+    const-string/jumbo v0, "41268"
+    const-string/jumbo v0, "41269"
+    const-string/jumbo v0, "41270"
+    const-string/jumbo v0, "41271"
+    const-string/jumbo v0, "41272"
+    const-string/jumbo v0, "41273"
+    const-string/jumbo v0, "41274"
+    const-string/jumbo v0, "41275"
+    const-string/jumbo v0, "41276"
+    const-string/jumbo v0, "41277"
+    const-string/jumbo v0, "41278"
+    const-string/jumbo v0, "41279"
+    const-string/jumbo v0, "41280"
+    const-string/jumbo v0, "41281"
+    const-string/jumbo v0, "41282"
+    const-string/jumbo v0, "41283"
+    const-string/jumbo v0, "41284"
+    const-string/jumbo v0, "41285"
+    const-string/jumbo v0, "41286"
+    const-string/jumbo v0, "41287"
+    const-string/jumbo v0, "41288"
+    const-string/jumbo v0, "41289"
+    const-string/jumbo v0, "41290"
+    const-string/jumbo v0, "41291"
+    const-string/jumbo v0, "41292"
+    const-string/jumbo v0, "41293"
+    const-string/jumbo v0, "41294"
+    const-string/jumbo v0, "41295"
+    const-string/jumbo v0, "41296"
+    const-string/jumbo v0, "41297"
+    const-string/jumbo v0, "41298"
+    const-string/jumbo v0, "41299"
+    const-string/jumbo v0, "41300"
+    const-string/jumbo v0, "41301"
+    const-string/jumbo v0, "41302"
+    const-string/jumbo v0, "41303"
+    const-string/jumbo v0, "41304"
+    const-string/jumbo v0, "41305"
+    const-string/jumbo v0, "41306"
+    const-string/jumbo v0, "41307"
+    const-string/jumbo v0, "41308"
+    const-string/jumbo v0, "41309"
+    const-string/jumbo v0, "41310"
+    const-string/jumbo v0, "41311"
+    const-string/jumbo v0, "41312"
+    const-string/jumbo v0, "41313"
+    const-string/jumbo v0, "41314"
+    const-string/jumbo v0, "41315"
+    const-string/jumbo v0, "41316"
+    const-string/jumbo v0, "41317"
+    const-string/jumbo v0, "41318"
+    const-string/jumbo v0, "41319"
+    const-string/jumbo v0, "41320"
+    const-string/jumbo v0, "41321"
+    const-string/jumbo v0, "41322"
+    const-string/jumbo v0, "41323"
+    const-string/jumbo v0, "41324"
+    const-string/jumbo v0, "41325"
+    const-string/jumbo v0, "41326"
+    const-string/jumbo v0, "41327"
+    const-string/jumbo v0, "41328"
+    const-string/jumbo v0, "41329"
+    const-string/jumbo v0, "41330"
+    const-string/jumbo v0, "41331"
+    const-string/jumbo v0, "41332"
+    const-string/jumbo v0, "41333"
+    const-string/jumbo v0, "41334"
+    const-string/jumbo v0, "41335"
+    const-string/jumbo v0, "41336"
+    const-string/jumbo v0, "41337"
+    const-string/jumbo v0, "41338"
+    const-string/jumbo v0, "41339"
+    const-string/jumbo v0, "41340"
+    const-string/jumbo v0, "41341"
+    const-string/jumbo v0, "41342"
+    const-string/jumbo v0, "41343"
+    const-string/jumbo v0, "41344"
+    const-string/jumbo v0, "41345"
+    const-string/jumbo v0, "41346"
+    const-string/jumbo v0, "41347"
+    const-string/jumbo v0, "41348"
+    const-string/jumbo v0, "41349"
+    const-string/jumbo v0, "41350"
+    const-string/jumbo v0, "41351"
+    const-string/jumbo v0, "41352"
+    const-string/jumbo v0, "41353"
+    const-string/jumbo v0, "41354"
+    const-string/jumbo v0, "41355"
+    const-string/jumbo v0, "41356"
+    const-string/jumbo v0, "41357"
+    const-string/jumbo v0, "41358"
+    const-string/jumbo v0, "41359"
+    const-string/jumbo v0, "41360"
+    const-string/jumbo v0, "41361"
+    const-string/jumbo v0, "41362"
+    const-string/jumbo v0, "41363"
+    const-string/jumbo v0, "41364"
+    const-string/jumbo v0, "41365"
+    const-string/jumbo v0, "41366"
+    const-string/jumbo v0, "41367"
+    const-string/jumbo v0, "41368"
+    const-string/jumbo v0, "41369"
+    const-string/jumbo v0, "41370"
+    const-string/jumbo v0, "41371"
+    const-string/jumbo v0, "41372"
+    const-string/jumbo v0, "41373"
+    const-string/jumbo v0, "41374"
+    const-string/jumbo v0, "41375"
+    const-string/jumbo v0, "41376"
+    const-string/jumbo v0, "41377"
+    const-string/jumbo v0, "41378"
+    const-string/jumbo v0, "41379"
+    const-string/jumbo v0, "41380"
+    const-string/jumbo v0, "41381"
+    const-string/jumbo v0, "41382"
+    const-string/jumbo v0, "41383"
+    const-string/jumbo v0, "41384"
+    const-string/jumbo v0, "41385"
+    const-string/jumbo v0, "41386"
+    const-string/jumbo v0, "41387"
+    const-string/jumbo v0, "41388"
+    const-string/jumbo v0, "41389"
+    const-string/jumbo v0, "41390"
+    const-string/jumbo v0, "41391"
+    const-string/jumbo v0, "41392"
+    const-string/jumbo v0, "41393"
+    const-string/jumbo v0, "41394"
+    const-string/jumbo v0, "41395"
+    const-string/jumbo v0, "41396"
+    const-string/jumbo v0, "41397"
+    const-string/jumbo v0, "41398"
+    const-string/jumbo v0, "41399"
+    const-string/jumbo v0, "41400"
+    const-string/jumbo v0, "41401"
+    const-string/jumbo v0, "41402"
+    const-string/jumbo v0, "41403"
+    const-string/jumbo v0, "41404"
+    const-string/jumbo v0, "41405"
+    const-string/jumbo v0, "41406"
+    const-string/jumbo v0, "41407"
+    const-string/jumbo v0, "41408"
+    const-string/jumbo v0, "41409"
+    const-string/jumbo v0, "41410"
+    const-string/jumbo v0, "41411"
+    const-string/jumbo v0, "41412"
+    const-string/jumbo v0, "41413"
+    const-string/jumbo v0, "41414"
+    const-string/jumbo v0, "41415"
+    const-string/jumbo v0, "41416"
+    const-string/jumbo v0, "41417"
+    const-string/jumbo v0, "41418"
+    const-string/jumbo v0, "41419"
+    const-string/jumbo v0, "41420"
+    const-string/jumbo v0, "41421"
+    const-string/jumbo v0, "41422"
+    const-string/jumbo v0, "41423"
+    const-string/jumbo v0, "41424"
+    const-string/jumbo v0, "41425"
+    const-string/jumbo v0, "41426"
+    const-string/jumbo v0, "41427"
+    const-string/jumbo v0, "41428"
+    const-string/jumbo v0, "41429"
+    const-string/jumbo v0, "41430"
+    const-string/jumbo v0, "41431"
+    const-string/jumbo v0, "41432"
+    const-string/jumbo v0, "41433"
+    const-string/jumbo v0, "41434"
+    const-string/jumbo v0, "41435"
+    const-string/jumbo v0, "41436"
+    const-string/jumbo v0, "41437"
+    const-string/jumbo v0, "41438"
+    const-string/jumbo v0, "41439"
+    const-string/jumbo v0, "41440"
+    const-string/jumbo v0, "41441"
+    const-string/jumbo v0, "41442"
+    const-string/jumbo v0, "41443"
+    const-string/jumbo v0, "41444"
+    const-string/jumbo v0, "41445"
+    const-string/jumbo v0, "41446"
+    const-string/jumbo v0, "41447"
+    const-string/jumbo v0, "41448"
+    const-string/jumbo v0, "41449"
+    const-string/jumbo v0, "41450"
+    const-string/jumbo v0, "41451"
+    const-string/jumbo v0, "41452"
+    const-string/jumbo v0, "41453"
+    const-string/jumbo v0, "41454"
+    const-string/jumbo v0, "41455"
+    const-string/jumbo v0, "41456"
+    const-string/jumbo v0, "41457"
+    const-string/jumbo v0, "41458"
+    const-string/jumbo v0, "41459"
+    const-string/jumbo v0, "41460"
+    const-string/jumbo v0, "41461"
+    const-string/jumbo v0, "41462"
+    const-string/jumbo v0, "41463"
+    const-string/jumbo v0, "41464"
+    const-string/jumbo v0, "41465"
+    const-string/jumbo v0, "41466"
+    const-string/jumbo v0, "41467"
+    const-string/jumbo v0, "41468"
+    const-string/jumbo v0, "41469"
+    const-string/jumbo v0, "41470"
+    const-string/jumbo v0, "41471"
+    const-string/jumbo v0, "41472"
+    const-string/jumbo v0, "41473"
+    const-string/jumbo v0, "41474"
+    const-string/jumbo v0, "41475"
+    const-string/jumbo v0, "41476"
+    const-string/jumbo v0, "41477"
+    const-string/jumbo v0, "41478"
+    const-string/jumbo v0, "41479"
+    const-string/jumbo v0, "41480"
+    const-string/jumbo v0, "41481"
+    const-string/jumbo v0, "41482"
+    const-string/jumbo v0, "41483"
+    const-string/jumbo v0, "41484"
+    const-string/jumbo v0, "41485"
+    const-string/jumbo v0, "41486"
+    const-string/jumbo v0, "41487"
+    const-string/jumbo v0, "41488"
+    const-string/jumbo v0, "41489"
+    const-string/jumbo v0, "41490"
+    const-string/jumbo v0, "41491"
+    const-string/jumbo v0, "41492"
+    const-string/jumbo v0, "41493"
+    const-string/jumbo v0, "41494"
+    const-string/jumbo v0, "41495"
+    const-string/jumbo v0, "41496"
+    const-string/jumbo v0, "41497"
+    const-string/jumbo v0, "41498"
+    const-string/jumbo v0, "41499"
+    const-string/jumbo v0, "41500"
+    const-string/jumbo v0, "41501"
+    const-string/jumbo v0, "41502"
+    const-string/jumbo v0, "41503"
+    const-string/jumbo v0, "41504"
+    const-string/jumbo v0, "41505"
+    const-string/jumbo v0, "41506"
+    const-string/jumbo v0, "41507"
+    const-string/jumbo v0, "41508"
+    const-string/jumbo v0, "41509"
+    const-string/jumbo v0, "41510"
+    const-string/jumbo v0, "41511"
+    const-string/jumbo v0, "41512"
+    const-string/jumbo v0, "41513"
+    const-string/jumbo v0, "41514"
+    const-string/jumbo v0, "41515"
+    const-string/jumbo v0, "41516"
+    const-string/jumbo v0, "41517"
+    const-string/jumbo v0, "41518"
+    const-string/jumbo v0, "41519"
+    const-string/jumbo v0, "41520"
+    const-string/jumbo v0, "41521"
+    const-string/jumbo v0, "41522"
+    const-string/jumbo v0, "41523"
+    const-string/jumbo v0, "41524"
+    const-string/jumbo v0, "41525"
+    const-string/jumbo v0, "41526"
+    const-string/jumbo v0, "41527"
+    const-string/jumbo v0, "41528"
+    const-string/jumbo v0, "41529"
+    const-string/jumbo v0, "41530"
+    const-string/jumbo v0, "41531"
+    const-string/jumbo v0, "41532"
+    const-string/jumbo v0, "41533"
+    const-string/jumbo v0, "41534"
+    const-string/jumbo v0, "41535"
+    const-string/jumbo v0, "41536"
+    const-string/jumbo v0, "41537"
+    const-string/jumbo v0, "41538"
+    const-string/jumbo v0, "41539"
+    const-string/jumbo v0, "41540"
+    const-string/jumbo v0, "41541"
+    const-string/jumbo v0, "41542"
+    const-string/jumbo v0, "41543"
+    const-string/jumbo v0, "41544"
+    const-string/jumbo v0, "41545"
+    const-string/jumbo v0, "41546"
+    const-string/jumbo v0, "41547"
+    const-string/jumbo v0, "41548"
+    const-string/jumbo v0, "41549"
+    const-string/jumbo v0, "41550"
+    const-string/jumbo v0, "41551"
+    const-string/jumbo v0, "41552"
+    const-string/jumbo v0, "41553"
+    const-string/jumbo v0, "41554"
+    const-string/jumbo v0, "41555"
+    const-string/jumbo v0, "41556"
+    const-string/jumbo v0, "41557"
+    const-string/jumbo v0, "41558"
+    const-string/jumbo v0, "41559"
+    const-string/jumbo v0, "41560"
+    const-string/jumbo v0, "41561"
+    const-string/jumbo v0, "41562"
+    const-string/jumbo v0, "41563"
+    const-string/jumbo v0, "41564"
+    const-string/jumbo v0, "41565"
+    const-string/jumbo v0, "41566"
+    const-string/jumbo v0, "41567"
+    const-string/jumbo v0, "41568"
+    const-string/jumbo v0, "41569"
+    const-string/jumbo v0, "41570"
+    const-string/jumbo v0, "41571"
+    const-string/jumbo v0, "41572"
+    const-string/jumbo v0, "41573"
+    const-string/jumbo v0, "41574"
+    const-string/jumbo v0, "41575"
+    const-string/jumbo v0, "41576"
+    const-string/jumbo v0, "41577"
+    const-string/jumbo v0, "41578"
+    const-string/jumbo v0, "41579"
+    const-string/jumbo v0, "41580"
+    const-string/jumbo v0, "41581"
+    const-string/jumbo v0, "41582"
+    const-string/jumbo v0, "41583"
+    const-string/jumbo v0, "41584"
+    const-string/jumbo v0, "41585"
+    const-string/jumbo v0, "41586"
+    const-string/jumbo v0, "41587"
+    const-string/jumbo v0, "41588"
+    const-string/jumbo v0, "41589"
+    const-string/jumbo v0, "41590"
+    const-string/jumbo v0, "41591"
+    const-string/jumbo v0, "41592"
+    const-string/jumbo v0, "41593"
+    const-string/jumbo v0, "41594"
+    const-string/jumbo v0, "41595"
+    const-string/jumbo v0, "41596"
+    const-string/jumbo v0, "41597"
+    const-string/jumbo v0, "41598"
+    const-string/jumbo v0, "41599"
+    const-string/jumbo v0, "41600"
+    const-string/jumbo v0, "41601"
+    const-string/jumbo v0, "41602"
+    const-string/jumbo v0, "41603"
+    const-string/jumbo v0, "41604"
+    const-string/jumbo v0, "41605"
+    const-string/jumbo v0, "41606"
+    const-string/jumbo v0, "41607"
+    const-string/jumbo v0, "41608"
+    const-string/jumbo v0, "41609"
+    const-string/jumbo v0, "41610"
+    const-string/jumbo v0, "41611"
+    const-string/jumbo v0, "41612"
+    const-string/jumbo v0, "41613"
+    const-string/jumbo v0, "41614"
+    const-string/jumbo v0, "41615"
+    const-string/jumbo v0, "41616"
+    const-string/jumbo v0, "41617"
+    const-string/jumbo v0, "41618"
+    const-string/jumbo v0, "41619"
+    const-string/jumbo v0, "41620"
+    const-string/jumbo v0, "41621"
+    const-string/jumbo v0, "41622"
+    const-string/jumbo v0, "41623"
+    const-string/jumbo v0, "41624"
+    const-string/jumbo v0, "41625"
+    const-string/jumbo v0, "41626"
+    const-string/jumbo v0, "41627"
+    const-string/jumbo v0, "41628"
+    const-string/jumbo v0, "41629"
+    const-string/jumbo v0, "41630"
+    const-string/jumbo v0, "41631"
+    const-string/jumbo v0, "41632"
+    const-string/jumbo v0, "41633"
+    const-string/jumbo v0, "41634"
+    const-string/jumbo v0, "41635"
+    const-string/jumbo v0, "41636"
+    const-string/jumbo v0, "41637"
+    const-string/jumbo v0, "41638"
+    const-string/jumbo v0, "41639"
+    const-string/jumbo v0, "41640"
+    const-string/jumbo v0, "41641"
+    const-string/jumbo v0, "41642"
+    const-string/jumbo v0, "41643"
+    const-string/jumbo v0, "41644"
+    const-string/jumbo v0, "41645"
+    const-string/jumbo v0, "41646"
+    const-string/jumbo v0, "41647"
+    const-string/jumbo v0, "41648"
+    const-string/jumbo v0, "41649"
+    const-string/jumbo v0, "41650"
+    const-string/jumbo v0, "41651"
+    const-string/jumbo v0, "41652"
+    const-string/jumbo v0, "41653"
+    const-string/jumbo v0, "41654"
+    const-string/jumbo v0, "41655"
+    const-string/jumbo v0, "41656"
+    const-string/jumbo v0, "41657"
+    const-string/jumbo v0, "41658"
+    const-string/jumbo v0, "41659"
+    const-string/jumbo v0, "41660"
+    const-string/jumbo v0, "41661"
+    const-string/jumbo v0, "41662"
+    const-string/jumbo v0, "41663"
+    const-string/jumbo v0, "41664"
+    const-string/jumbo v0, "41665"
+    const-string/jumbo v0, "41666"
+    const-string/jumbo v0, "41667"
+    const-string/jumbo v0, "41668"
+    const-string/jumbo v0, "41669"
+    const-string/jumbo v0, "41670"
+    const-string/jumbo v0, "41671"
+    const-string/jumbo v0, "41672"
+    const-string/jumbo v0, "41673"
+    const-string/jumbo v0, "41674"
+    const-string/jumbo v0, "41675"
+    const-string/jumbo v0, "41676"
+    const-string/jumbo v0, "41677"
+    const-string/jumbo v0, "41678"
+    const-string/jumbo v0, "41679"
+    const-string/jumbo v0, "41680"
+    const-string/jumbo v0, "41681"
+    const-string/jumbo v0, "41682"
+    const-string/jumbo v0, "41683"
+    const-string/jumbo v0, "41684"
+    const-string/jumbo v0, "41685"
+    const-string/jumbo v0, "41686"
+    const-string/jumbo v0, "41687"
+    const-string/jumbo v0, "41688"
+    const-string/jumbo v0, "41689"
+    const-string/jumbo v0, "41690"
+    const-string/jumbo v0, "41691"
+    const-string/jumbo v0, "41692"
+    const-string/jumbo v0, "41693"
+    const-string/jumbo v0, "41694"
+    const-string/jumbo v0, "41695"
+    const-string/jumbo v0, "41696"
+    const-string/jumbo v0, "41697"
+    const-string/jumbo v0, "41698"
+    const-string/jumbo v0, "41699"
+    const-string/jumbo v0, "41700"
+    const-string/jumbo v0, "41701"
+    const-string/jumbo v0, "41702"
+    const-string/jumbo v0, "41703"
+    const-string/jumbo v0, "41704"
+    const-string/jumbo v0, "41705"
+    const-string/jumbo v0, "41706"
+    const-string/jumbo v0, "41707"
+    const-string/jumbo v0, "41708"
+    const-string/jumbo v0, "41709"
+    const-string/jumbo v0, "41710"
+    const-string/jumbo v0, "41711"
+    const-string/jumbo v0, "41712"
+    const-string/jumbo v0, "41713"
+    const-string/jumbo v0, "41714"
+    const-string/jumbo v0, "41715"
+    const-string/jumbo v0, "41716"
+    const-string/jumbo v0, "41717"
+    const-string/jumbo v0, "41718"
+    const-string/jumbo v0, "41719"
+    const-string/jumbo v0, "41720"
+    const-string/jumbo v0, "41721"
+    const-string/jumbo v0, "41722"
+    const-string/jumbo v0, "41723"
+    const-string/jumbo v0, "41724"
+    const-string/jumbo v0, "41725"
+    const-string/jumbo v0, "41726"
+    const-string/jumbo v0, "41727"
+    const-string/jumbo v0, "41728"
+    const-string/jumbo v0, "41729"
+    const-string/jumbo v0, "41730"
+    const-string/jumbo v0, "41731"
+    const-string/jumbo v0, "41732"
+    const-string/jumbo v0, "41733"
+    const-string/jumbo v0, "41734"
+    const-string/jumbo v0, "41735"
+    const-string/jumbo v0, "41736"
+    const-string/jumbo v0, "41737"
+    const-string/jumbo v0, "41738"
+    const-string/jumbo v0, "41739"
+    const-string/jumbo v0, "41740"
+    const-string/jumbo v0, "41741"
+    const-string/jumbo v0, "41742"
+    const-string/jumbo v0, "41743"
+    const-string/jumbo v0, "41744"
+    const-string/jumbo v0, "41745"
+    const-string/jumbo v0, "41746"
+    const-string/jumbo v0, "41747"
+    const-string/jumbo v0, "41748"
+    const-string/jumbo v0, "41749"
+    const-string/jumbo v0, "41750"
+    const-string/jumbo v0, "41751"
+    const-string/jumbo v0, "41752"
+    const-string/jumbo v0, "41753"
+    const-string/jumbo v0, "41754"
+    const-string/jumbo v0, "41755"
+    const-string/jumbo v0, "41756"
+    const-string/jumbo v0, "41757"
+    const-string/jumbo v0, "41758"
+    const-string/jumbo v0, "41759"
+    const-string/jumbo v0, "41760"
+    const-string/jumbo v0, "41761"
+    const-string/jumbo v0, "41762"
+    const-string/jumbo v0, "41763"
+    const-string/jumbo v0, "41764"
+    const-string/jumbo v0, "41765"
+    const-string/jumbo v0, "41766"
+    const-string/jumbo v0, "41767"
+    const-string/jumbo v0, "41768"
+    const-string/jumbo v0, "41769"
+    const-string/jumbo v0, "41770"
+    const-string/jumbo v0, "41771"
+    const-string/jumbo v0, "41772"
+    const-string/jumbo v0, "41773"
+    const-string/jumbo v0, "41774"
+    const-string/jumbo v0, "41775"
+    const-string/jumbo v0, "41776"
+    const-string/jumbo v0, "41777"
+    const-string/jumbo v0, "41778"
+    const-string/jumbo v0, "41779"
+    const-string/jumbo v0, "41780"
+    const-string/jumbo v0, "41781"
+    const-string/jumbo v0, "41782"
+    const-string/jumbo v0, "41783"
+    const-string/jumbo v0, "41784"
+    const-string/jumbo v0, "41785"
+    const-string/jumbo v0, "41786"
+    const-string/jumbo v0, "41787"
+    const-string/jumbo v0, "41788"
+    const-string/jumbo v0, "41789"
+    const-string/jumbo v0, "41790"
+    const-string/jumbo v0, "41791"
+    const-string/jumbo v0, "41792"
+    const-string/jumbo v0, "41793"
+    const-string/jumbo v0, "41794"
+    const-string/jumbo v0, "41795"
+    const-string/jumbo v0, "41796"
+    const-string/jumbo v0, "41797"
+    const-string/jumbo v0, "41798"
+    const-string/jumbo v0, "41799"
+    const-string/jumbo v0, "41800"
+    const-string/jumbo v0, "41801"
+    const-string/jumbo v0, "41802"
+    const-string/jumbo v0, "41803"
+    const-string/jumbo v0, "41804"
+    const-string/jumbo v0, "41805"
+    const-string/jumbo v0, "41806"
+    const-string/jumbo v0, "41807"
+    const-string/jumbo v0, "41808"
+    const-string/jumbo v0, "41809"
+    const-string/jumbo v0, "41810"
+    const-string/jumbo v0, "41811"
+    const-string/jumbo v0, "41812"
+    const-string/jumbo v0, "41813"
+    const-string/jumbo v0, "41814"
+    const-string/jumbo v0, "41815"
+    const-string/jumbo v0, "41816"
+    const-string/jumbo v0, "41817"
+    const-string/jumbo v0, "41818"
+    const-string/jumbo v0, "41819"
+    const-string/jumbo v0, "41820"
+    const-string/jumbo v0, "41821"
+    const-string/jumbo v0, "41822"
+    const-string/jumbo v0, "41823"
+    const-string/jumbo v0, "41824"
+    const-string/jumbo v0, "41825"
+    const-string/jumbo v0, "41826"
+    const-string/jumbo v0, "41827"
+    const-string/jumbo v0, "41828"
+    const-string/jumbo v0, "41829"
+    const-string/jumbo v0, "41830"
+    const-string/jumbo v0, "41831"
+    const-string/jumbo v0, "41832"
+    const-string/jumbo v0, "41833"
+    const-string/jumbo v0, "41834"
+    const-string/jumbo v0, "41835"
+    const-string/jumbo v0, "41836"
+    const-string/jumbo v0, "41837"
+    const-string/jumbo v0, "41838"
+    const-string/jumbo v0, "41839"
+    const-string/jumbo v0, "41840"
+    const-string/jumbo v0, "41841"
+    const-string/jumbo v0, "41842"
+    const-string/jumbo v0, "41843"
+    const-string/jumbo v0, "41844"
+    const-string/jumbo v0, "41845"
+    const-string/jumbo v0, "41846"
+    const-string/jumbo v0, "41847"
+    const-string/jumbo v0, "41848"
+    const-string/jumbo v0, "41849"
+    const-string/jumbo v0, "41850"
+    const-string/jumbo v0, "41851"
+    const-string/jumbo v0, "41852"
+    const-string/jumbo v0, "41853"
+    const-string/jumbo v0, "41854"
+    const-string/jumbo v0, "41855"
+    const-string/jumbo v0, "41856"
+    const-string/jumbo v0, "41857"
+    const-string/jumbo v0, "41858"
+    const-string/jumbo v0, "41859"
+    const-string/jumbo v0, "41860"
+    const-string/jumbo v0, "41861"
+    const-string/jumbo v0, "41862"
+    const-string/jumbo v0, "41863"
+    const-string/jumbo v0, "41864"
+    const-string/jumbo v0, "41865"
+    const-string/jumbo v0, "41866"
+    const-string/jumbo v0, "41867"
+    const-string/jumbo v0, "41868"
+    const-string/jumbo v0, "41869"
+    const-string/jumbo v0, "41870"
+    const-string/jumbo v0, "41871"
+    const-string/jumbo v0, "41872"
+    const-string/jumbo v0, "41873"
+    const-string/jumbo v0, "41874"
+    const-string/jumbo v0, "41875"
+    const-string/jumbo v0, "41876"
+    const-string/jumbo v0, "41877"
+    const-string/jumbo v0, "41878"
+    const-string/jumbo v0, "41879"
+    const-string/jumbo v0, "41880"
+    const-string/jumbo v0, "41881"
+    const-string/jumbo v0, "41882"
+    const-string/jumbo v0, "41883"
+    const-string/jumbo v0, "41884"
+    const-string/jumbo v0, "41885"
+    const-string/jumbo v0, "41886"
+    const-string/jumbo v0, "41887"
+    const-string/jumbo v0, "41888"
+    const-string/jumbo v0, "41889"
+    const-string/jumbo v0, "41890"
+    const-string/jumbo v0, "41891"
+    const-string/jumbo v0, "41892"
+    const-string/jumbo v0, "41893"
+    const-string/jumbo v0, "41894"
+    const-string/jumbo v0, "41895"
+    const-string/jumbo v0, "41896"
+    const-string/jumbo v0, "41897"
+    const-string/jumbo v0, "41898"
+    const-string/jumbo v0, "41899"
+    const-string/jumbo v0, "41900"
+    const-string/jumbo v0, "41901"
+    const-string/jumbo v0, "41902"
+    const-string/jumbo v0, "41903"
+    const-string/jumbo v0, "41904"
+    const-string/jumbo v0, "41905"
+    const-string/jumbo v0, "41906"
+    const-string/jumbo v0, "41907"
+    const-string/jumbo v0, "41908"
+    const-string/jumbo v0, "41909"
+    const-string/jumbo v0, "41910"
+    const-string/jumbo v0, "41911"
+    const-string/jumbo v0, "41912"
+    const-string/jumbo v0, "41913"
+    const-string/jumbo v0, "41914"
+    const-string/jumbo v0, "41915"
+    const-string/jumbo v0, "41916"
+    const-string/jumbo v0, "41917"
+    const-string/jumbo v0, "41918"
+    const-string/jumbo v0, "41919"
+    const-string/jumbo v0, "41920"
+    const-string/jumbo v0, "41921"
+    const-string/jumbo v0, "41922"
+    const-string/jumbo v0, "41923"
+    const-string/jumbo v0, "41924"
+    const-string/jumbo v0, "41925"
+    const-string/jumbo v0, "41926"
+    const-string/jumbo v0, "41927"
+    const-string/jumbo v0, "41928"
+    const-string/jumbo v0, "41929"
+    const-string/jumbo v0, "41930"
+    const-string/jumbo v0, "41931"
+    const-string/jumbo v0, "41932"
+    const-string/jumbo v0, "41933"
+    const-string/jumbo v0, "41934"
+    const-string/jumbo v0, "41935"
+    const-string/jumbo v0, "41936"
+    const-string/jumbo v0, "41937"
+    const-string/jumbo v0, "41938"
+    const-string/jumbo v0, "41939"
+    const-string/jumbo v0, "41940"
+    const-string/jumbo v0, "41941"
+    const-string/jumbo v0, "41942"
+    const-string/jumbo v0, "41943"
+    const-string/jumbo v0, "41944"
+    const-string/jumbo v0, "41945"
+    const-string/jumbo v0, "41946"
+    const-string/jumbo v0, "41947"
+    const-string/jumbo v0, "41948"
+    const-string/jumbo v0, "41949"
+    const-string/jumbo v0, "41950"
+    const-string/jumbo v0, "41951"
+    const-string/jumbo v0, "41952"
+    const-string/jumbo v0, "41953"
+    const-string/jumbo v0, "41954"
+    const-string/jumbo v0, "41955"
+    const-string/jumbo v0, "41956"
+    const-string/jumbo v0, "41957"
+    const-string/jumbo v0, "41958"
+    const-string/jumbo v0, "41959"
+    const-string/jumbo v0, "41960"
+    const-string/jumbo v0, "41961"
+    const-string/jumbo v0, "41962"
+    const-string/jumbo v0, "41963"
+    const-string/jumbo v0, "41964"
+    const-string/jumbo v0, "41965"
+    const-string/jumbo v0, "41966"
+    const-string/jumbo v0, "41967"
+    const-string/jumbo v0, "41968"
+    const-string/jumbo v0, "41969"
+    const-string/jumbo v0, "41970"
+    const-string/jumbo v0, "41971"
+    const-string/jumbo v0, "41972"
+    const-string/jumbo v0, "41973"
+    const-string/jumbo v0, "41974"
+    const-string/jumbo v0, "41975"
+    const-string/jumbo v0, "41976"
+    const-string/jumbo v0, "41977"
+    const-string/jumbo v0, "41978"
+    const-string/jumbo v0, "41979"
+    const-string/jumbo v0, "41980"
+    const-string/jumbo v0, "41981"
+    const-string/jumbo v0, "41982"
+    const-string/jumbo v0, "41983"
+    const-string/jumbo v0, "41984"
+    const-string/jumbo v0, "41985"
+    const-string/jumbo v0, "41986"
+    const-string/jumbo v0, "41987"
+    const-string/jumbo v0, "41988"
+    const-string/jumbo v0, "41989"
+    const-string/jumbo v0, "41990"
+    const-string/jumbo v0, "41991"
+    const-string/jumbo v0, "41992"
+    const-string/jumbo v0, "41993"
+    const-string/jumbo v0, "41994"
+    const-string/jumbo v0, "41995"
+    const-string/jumbo v0, "41996"
+    const-string/jumbo v0, "41997"
+    const-string/jumbo v0, "41998"
+    const-string/jumbo v0, "41999"
+    const-string/jumbo v0, "42000"
+    const-string/jumbo v0, "42001"
+    const-string/jumbo v0, "42002"
+    const-string/jumbo v0, "42003"
+    const-string/jumbo v0, "42004"
+    const-string/jumbo v0, "42005"
+    const-string/jumbo v0, "42006"
+    const-string/jumbo v0, "42007"
+    const-string/jumbo v0, "42008"
+    const-string/jumbo v0, "42009"
+    const-string/jumbo v0, "42010"
+    const-string/jumbo v0, "42011"
+    const-string/jumbo v0, "42012"
+    const-string/jumbo v0, "42013"
+    const-string/jumbo v0, "42014"
+    const-string/jumbo v0, "42015"
+    const-string/jumbo v0, "42016"
+    const-string/jumbo v0, "42017"
+    const-string/jumbo v0, "42018"
+    const-string/jumbo v0, "42019"
+    const-string/jumbo v0, "42020"
+    const-string/jumbo v0, "42021"
+    const-string/jumbo v0, "42022"
+    const-string/jumbo v0, "42023"
+    const-string/jumbo v0, "42024"
+    const-string/jumbo v0, "42025"
+    const-string/jumbo v0, "42026"
+    const-string/jumbo v0, "42027"
+    const-string/jumbo v0, "42028"
+    const-string/jumbo v0, "42029"
+    const-string/jumbo v0, "42030"
+    const-string/jumbo v0, "42031"
+    const-string/jumbo v0, "42032"
+    const-string/jumbo v0, "42033"
+    const-string/jumbo v0, "42034"
+    const-string/jumbo v0, "42035"
+    const-string/jumbo v0, "42036"
+    const-string/jumbo v0, "42037"
+    const-string/jumbo v0, "42038"
+    const-string/jumbo v0, "42039"
+    const-string/jumbo v0, "42040"
+    const-string/jumbo v0, "42041"
+    const-string/jumbo v0, "42042"
+    const-string/jumbo v0, "42043"
+    const-string/jumbo v0, "42044"
+    const-string/jumbo v0, "42045"
+    const-string/jumbo v0, "42046"
+    const-string/jumbo v0, "42047"
+    const-string/jumbo v0, "42048"
+    const-string/jumbo v0, "42049"
+    const-string/jumbo v0, "42050"
+    const-string/jumbo v0, "42051"
+    const-string/jumbo v0, "42052"
+    const-string/jumbo v0, "42053"
+    const-string/jumbo v0, "42054"
+    const-string/jumbo v0, "42055"
+    const-string/jumbo v0, "42056"
+    const-string/jumbo v0, "42057"
+    const-string/jumbo v0, "42058"
+    const-string/jumbo v0, "42059"
+    const-string/jumbo v0, "42060"
+    const-string/jumbo v0, "42061"
+    const-string/jumbo v0, "42062"
+    const-string/jumbo v0, "42063"
+    const-string/jumbo v0, "42064"
+    const-string/jumbo v0, "42065"
+    const-string/jumbo v0, "42066"
+    const-string/jumbo v0, "42067"
+    const-string/jumbo v0, "42068"
+    const-string/jumbo v0, "42069"
+    const-string/jumbo v0, "42070"
+    const-string/jumbo v0, "42071"
+    const-string/jumbo v0, "42072"
+    const-string/jumbo v0, "42073"
+    const-string/jumbo v0, "42074"
+    const-string/jumbo v0, "42075"
+    const-string/jumbo v0, "42076"
+    const-string/jumbo v0, "42077"
+    const-string/jumbo v0, "42078"
+    const-string/jumbo v0, "42079"
+    const-string/jumbo v0, "42080"
+    const-string/jumbo v0, "42081"
+    const-string/jumbo v0, "42082"
+    const-string/jumbo v0, "42083"
+    const-string/jumbo v0, "42084"
+    const-string/jumbo v0, "42085"
+    const-string/jumbo v0, "42086"
+    const-string/jumbo v0, "42087"
+    const-string/jumbo v0, "42088"
+    const-string/jumbo v0, "42089"
+    const-string/jumbo v0, "42090"
+    const-string/jumbo v0, "42091"
+    const-string/jumbo v0, "42092"
+    const-string/jumbo v0, "42093"
+    const-string/jumbo v0, "42094"
+    const-string/jumbo v0, "42095"
+    const-string/jumbo v0, "42096"
+    const-string/jumbo v0, "42097"
+    const-string/jumbo v0, "42098"
+    const-string/jumbo v0, "42099"
+    const-string/jumbo v0, "42100"
+    const-string/jumbo v0, "42101"
+    const-string/jumbo v0, "42102"
+    const-string/jumbo v0, "42103"
+    const-string/jumbo v0, "42104"
+    const-string/jumbo v0, "42105"
+    const-string/jumbo v0, "42106"
+    const-string/jumbo v0, "42107"
+    const-string/jumbo v0, "42108"
+    const-string/jumbo v0, "42109"
+    const-string/jumbo v0, "42110"
+    const-string/jumbo v0, "42111"
+    const-string/jumbo v0, "42112"
+    const-string/jumbo v0, "42113"
+    const-string/jumbo v0, "42114"
+    const-string/jumbo v0, "42115"
+    const-string/jumbo v0, "42116"
+    const-string/jumbo v0, "42117"
+    const-string/jumbo v0, "42118"
+    const-string/jumbo v0, "42119"
+    const-string/jumbo v0, "42120"
+    const-string/jumbo v0, "42121"
+    const-string/jumbo v0, "42122"
+    const-string/jumbo v0, "42123"
+    const-string/jumbo v0, "42124"
+    const-string/jumbo v0, "42125"
+    const-string/jumbo v0, "42126"
+    const-string/jumbo v0, "42127"
+    const-string/jumbo v0, "42128"
+    const-string/jumbo v0, "42129"
+    const-string/jumbo v0, "42130"
+    const-string/jumbo v0, "42131"
+    const-string/jumbo v0, "42132"
+    const-string/jumbo v0, "42133"
+    const-string/jumbo v0, "42134"
+    const-string/jumbo v0, "42135"
+    const-string/jumbo v0, "42136"
+    const-string/jumbo v0, "42137"
+    const-string/jumbo v0, "42138"
+    const-string/jumbo v0, "42139"
+    const-string/jumbo v0, "42140"
+    const-string/jumbo v0, "42141"
+    const-string/jumbo v0, "42142"
+    const-string/jumbo v0, "42143"
+    const-string/jumbo v0, "42144"
+    const-string/jumbo v0, "42145"
+    const-string/jumbo v0, "42146"
+    const-string/jumbo v0, "42147"
+    const-string/jumbo v0, "42148"
+    const-string/jumbo v0, "42149"
+    const-string/jumbo v0, "42150"
+    const-string/jumbo v0, "42151"
+    const-string/jumbo v0, "42152"
+    const-string/jumbo v0, "42153"
+    const-string/jumbo v0, "42154"
+    const-string/jumbo v0, "42155"
+    const-string/jumbo v0, "42156"
+    const-string/jumbo v0, "42157"
+    const-string/jumbo v0, "42158"
+    const-string/jumbo v0, "42159"
+    const-string/jumbo v0, "42160"
+    const-string/jumbo v0, "42161"
+    const-string/jumbo v0, "42162"
+    const-string/jumbo v0, "42163"
+    const-string/jumbo v0, "42164"
+    const-string/jumbo v0, "42165"
+    const-string/jumbo v0, "42166"
+    const-string/jumbo v0, "42167"
+    const-string/jumbo v0, "42168"
+    const-string/jumbo v0, "42169"
+    const-string/jumbo v0, "42170"
+    const-string/jumbo v0, "42171"
+    const-string/jumbo v0, "42172"
+    const-string/jumbo v0, "42173"
+    const-string/jumbo v0, "42174"
+    const-string/jumbo v0, "42175"
+    const-string/jumbo v0, "42176"
+    const-string/jumbo v0, "42177"
+    const-string/jumbo v0, "42178"
+    const-string/jumbo v0, "42179"
+    const-string/jumbo v0, "42180"
+    const-string/jumbo v0, "42181"
+    const-string/jumbo v0, "42182"
+    const-string/jumbo v0, "42183"
+    const-string/jumbo v0, "42184"
+    const-string/jumbo v0, "42185"
+    const-string/jumbo v0, "42186"
+    const-string/jumbo v0, "42187"
+    const-string/jumbo v0, "42188"
+    const-string/jumbo v0, "42189"
+    const-string/jumbo v0, "42190"
+    const-string/jumbo v0, "42191"
+    const-string/jumbo v0, "42192"
+    const-string/jumbo v0, "42193"
+    const-string/jumbo v0, "42194"
+    const-string/jumbo v0, "42195"
+    const-string/jumbo v0, "42196"
+    const-string/jumbo v0, "42197"
+    const-string/jumbo v0, "42198"
+    const-string/jumbo v0, "42199"
+    const-string/jumbo v0, "42200"
+    const-string/jumbo v0, "42201"
+    const-string/jumbo v0, "42202"
+    const-string/jumbo v0, "42203"
+    const-string/jumbo v0, "42204"
+    const-string/jumbo v0, "42205"
+    const-string/jumbo v0, "42206"
+    const-string/jumbo v0, "42207"
+    const-string/jumbo v0, "42208"
+    const-string/jumbo v0, "42209"
+    const-string/jumbo v0, "42210"
+    const-string/jumbo v0, "42211"
+    const-string/jumbo v0, "42212"
+    const-string/jumbo v0, "42213"
+    const-string/jumbo v0, "42214"
+    const-string/jumbo v0, "42215"
+    const-string/jumbo v0, "42216"
+    const-string/jumbo v0, "42217"
+    const-string/jumbo v0, "42218"
+    const-string/jumbo v0, "42219"
+    const-string/jumbo v0, "42220"
+    const-string/jumbo v0, "42221"
+    const-string/jumbo v0, "42222"
+    const-string/jumbo v0, "42223"
+    const-string/jumbo v0, "42224"
+    const-string/jumbo v0, "42225"
+    const-string/jumbo v0, "42226"
+    const-string/jumbo v0, "42227"
+    const-string/jumbo v0, "42228"
+    const-string/jumbo v0, "42229"
+    const-string/jumbo v0, "42230"
+    const-string/jumbo v0, "42231"
+    const-string/jumbo v0, "42232"
+    const-string/jumbo v0, "42233"
+    const-string/jumbo v0, "42234"
+    const-string/jumbo v0, "42235"
+    const-string/jumbo v0, "42236"
+    const-string/jumbo v0, "42237"
+    const-string/jumbo v0, "42238"
+    const-string/jumbo v0, "42239"
+    const-string/jumbo v0, "42240"
+    const-string/jumbo v0, "42241"
+    const-string/jumbo v0, "42242"
+    const-string/jumbo v0, "42243"
+    const-string/jumbo v0, "42244"
+    const-string/jumbo v0, "42245"
+    const-string/jumbo v0, "42246"
+    const-string/jumbo v0, "42247"
+    const-string/jumbo v0, "42248"
+    const-string/jumbo v0, "42249"
+    const-string/jumbo v0, "42250"
+    const-string/jumbo v0, "42251"
+    const-string/jumbo v0, "42252"
+    const-string/jumbo v0, "42253"
+    const-string/jumbo v0, "42254"
+    const-string/jumbo v0, "42255"
+    const-string/jumbo v0, "42256"
+    const-string/jumbo v0, "42257"
+    const-string/jumbo v0, "42258"
+    const-string/jumbo v0, "42259"
+    const-string/jumbo v0, "42260"
+    const-string/jumbo v0, "42261"
+    const-string/jumbo v0, "42262"
+    const-string/jumbo v0, "42263"
+    const-string/jumbo v0, "42264"
+    const-string/jumbo v0, "42265"
+    const-string/jumbo v0, "42266"
+    const-string/jumbo v0, "42267"
+    const-string/jumbo v0, "42268"
+    const-string/jumbo v0, "42269"
+    const-string/jumbo v0, "42270"
+    const-string/jumbo v0, "42271"
+    const-string/jumbo v0, "42272"
+    const-string/jumbo v0, "42273"
+    const-string/jumbo v0, "42274"
+    const-string/jumbo v0, "42275"
+    const-string/jumbo v0, "42276"
+    const-string/jumbo v0, "42277"
+    const-string/jumbo v0, "42278"
+    const-string/jumbo v0, "42279"
+    const-string/jumbo v0, "42280"
+    const-string/jumbo v0, "42281"
+    const-string/jumbo v0, "42282"
+    const-string/jumbo v0, "42283"
+    const-string/jumbo v0, "42284"
+    const-string/jumbo v0, "42285"
+    const-string/jumbo v0, "42286"
+    const-string/jumbo v0, "42287"
+    const-string/jumbo v0, "42288"
+    const-string/jumbo v0, "42289"
+    const-string/jumbo v0, "42290"
+    const-string/jumbo v0, "42291"
+    const-string/jumbo v0, "42292"
+    const-string/jumbo v0, "42293"
+    const-string/jumbo v0, "42294"
+    const-string/jumbo v0, "42295"
+    const-string/jumbo v0, "42296"
+    const-string/jumbo v0, "42297"
+    const-string/jumbo v0, "42298"
+    const-string/jumbo v0, "42299"
+    const-string/jumbo v0, "42300"
+    const-string/jumbo v0, "42301"
+    const-string/jumbo v0, "42302"
+    const-string/jumbo v0, "42303"
+    const-string/jumbo v0, "42304"
+    const-string/jumbo v0, "42305"
+    const-string/jumbo v0, "42306"
+    const-string/jumbo v0, "42307"
+    const-string/jumbo v0, "42308"
+    const-string/jumbo v0, "42309"
+    const-string/jumbo v0, "42310"
+    const-string/jumbo v0, "42311"
+    const-string/jumbo v0, "42312"
+    const-string/jumbo v0, "42313"
+    const-string/jumbo v0, "42314"
+    const-string/jumbo v0, "42315"
+    const-string/jumbo v0, "42316"
+    const-string/jumbo v0, "42317"
+    const-string/jumbo v0, "42318"
+    const-string/jumbo v0, "42319"
+    const-string/jumbo v0, "42320"
+    const-string/jumbo v0, "42321"
+    const-string/jumbo v0, "42322"
+    const-string/jumbo v0, "42323"
+    const-string/jumbo v0, "42324"
+    const-string/jumbo v0, "42325"
+    const-string/jumbo v0, "42326"
+    const-string/jumbo v0, "42327"
+    const-string/jumbo v0, "42328"
+    const-string/jumbo v0, "42329"
+    const-string/jumbo v0, "42330"
+    const-string/jumbo v0, "42331"
+    const-string/jumbo v0, "42332"
+    const-string/jumbo v0, "42333"
+    const-string/jumbo v0, "42334"
+    const-string/jumbo v0, "42335"
+    const-string/jumbo v0, "42336"
+    const-string/jumbo v0, "42337"
+    const-string/jumbo v0, "42338"
+    const-string/jumbo v0, "42339"
+    const-string/jumbo v0, "42340"
+    const-string/jumbo v0, "42341"
+    const-string/jumbo v0, "42342"
+    const-string/jumbo v0, "42343"
+    const-string/jumbo v0, "42344"
+    const-string/jumbo v0, "42345"
+    const-string/jumbo v0, "42346"
+    const-string/jumbo v0, "42347"
+    const-string/jumbo v0, "42348"
+    const-string/jumbo v0, "42349"
+    const-string/jumbo v0, "42350"
+    const-string/jumbo v0, "42351"
+    const-string/jumbo v0, "42352"
+    const-string/jumbo v0, "42353"
+    const-string/jumbo v0, "42354"
+    const-string/jumbo v0, "42355"
+    const-string/jumbo v0, "42356"
+    const-string/jumbo v0, "42357"
+    const-string/jumbo v0, "42358"
+    const-string/jumbo v0, "42359"
+    const-string/jumbo v0, "42360"
+    const-string/jumbo v0, "42361"
+    const-string/jumbo v0, "42362"
+    const-string/jumbo v0, "42363"
+    const-string/jumbo v0, "42364"
+    const-string/jumbo v0, "42365"
+    const-string/jumbo v0, "42366"
+    const-string/jumbo v0, "42367"
+    const-string/jumbo v0, "42368"
+    const-string/jumbo v0, "42369"
+    const-string/jumbo v0, "42370"
+    const-string/jumbo v0, "42371"
+    const-string/jumbo v0, "42372"
+    const-string/jumbo v0, "42373"
+    const-string/jumbo v0, "42374"
+    const-string/jumbo v0, "42375"
+    const-string/jumbo v0, "42376"
+    const-string/jumbo v0, "42377"
+    const-string/jumbo v0, "42378"
+    const-string/jumbo v0, "42379"
+    const-string/jumbo v0, "42380"
+    const-string/jumbo v0, "42381"
+    const-string/jumbo v0, "42382"
+    const-string/jumbo v0, "42383"
+    const-string/jumbo v0, "42384"
+    const-string/jumbo v0, "42385"
+    const-string/jumbo v0, "42386"
+    const-string/jumbo v0, "42387"
+    const-string/jumbo v0, "42388"
+    const-string/jumbo v0, "42389"
+    const-string/jumbo v0, "42390"
+    const-string/jumbo v0, "42391"
+    const-string/jumbo v0, "42392"
+    const-string/jumbo v0, "42393"
+    const-string/jumbo v0, "42394"
+    const-string/jumbo v0, "42395"
+    const-string/jumbo v0, "42396"
+    const-string/jumbo v0, "42397"
+    const-string/jumbo v0, "42398"
+    const-string/jumbo v0, "42399"
+    const-string/jumbo v0, "42400"
+    const-string/jumbo v0, "42401"
+    const-string/jumbo v0, "42402"
+    const-string/jumbo v0, "42403"
+    const-string/jumbo v0, "42404"
+    const-string/jumbo v0, "42405"
+    const-string/jumbo v0, "42406"
+    const-string/jumbo v0, "42407"
+    const-string/jumbo v0, "42408"
+    const-string/jumbo v0, "42409"
+    const-string/jumbo v0, "42410"
+    const-string/jumbo v0, "42411"
+    const-string/jumbo v0, "42412"
+    const-string/jumbo v0, "42413"
+    const-string/jumbo v0, "42414"
+    const-string/jumbo v0, "42415"
+    const-string/jumbo v0, "42416"
+    const-string/jumbo v0, "42417"
+    const-string/jumbo v0, "42418"
+    const-string/jumbo v0, "42419"
+    const-string/jumbo v0, "42420"
+    const-string/jumbo v0, "42421"
+    const-string/jumbo v0, "42422"
+    const-string/jumbo v0, "42423"
+    const-string/jumbo v0, "42424"
+    const-string/jumbo v0, "42425"
+    const-string/jumbo v0, "42426"
+    const-string/jumbo v0, "42427"
+    const-string/jumbo v0, "42428"
+    const-string/jumbo v0, "42429"
+    const-string/jumbo v0, "42430"
+    const-string/jumbo v0, "42431"
+    const-string/jumbo v0, "42432"
+    const-string/jumbo v0, "42433"
+    const-string/jumbo v0, "42434"
+    const-string/jumbo v0, "42435"
+    const-string/jumbo v0, "42436"
+    const-string/jumbo v0, "42437"
+    const-string/jumbo v0, "42438"
+    const-string/jumbo v0, "42439"
+    const-string/jumbo v0, "42440"
+    const-string/jumbo v0, "42441"
+    const-string/jumbo v0, "42442"
+    const-string/jumbo v0, "42443"
+    const-string/jumbo v0, "42444"
+    const-string/jumbo v0, "42445"
+    const-string/jumbo v0, "42446"
+    const-string/jumbo v0, "42447"
+    const-string/jumbo v0, "42448"
+    const-string/jumbo v0, "42449"
+    const-string/jumbo v0, "42450"
+    const-string/jumbo v0, "42451"
+    const-string/jumbo v0, "42452"
+    const-string/jumbo v0, "42453"
+    const-string/jumbo v0, "42454"
+    const-string/jumbo v0, "42455"
+    const-string/jumbo v0, "42456"
+    const-string/jumbo v0, "42457"
+    const-string/jumbo v0, "42458"
+    const-string/jumbo v0, "42459"
+    const-string/jumbo v0, "42460"
+    const-string/jumbo v0, "42461"
+    const-string/jumbo v0, "42462"
+    const-string/jumbo v0, "42463"
+    const-string/jumbo v0, "42464"
+    const-string/jumbo v0, "42465"
+    const-string/jumbo v0, "42466"
+    const-string/jumbo v0, "42467"
+    const-string/jumbo v0, "42468"
+    const-string/jumbo v0, "42469"
+    const-string/jumbo v0, "42470"
+    const-string/jumbo v0, "42471"
+    const-string/jumbo v0, "42472"
+    const-string/jumbo v0, "42473"
+    const-string/jumbo v0, "42474"
+    const-string/jumbo v0, "42475"
+    const-string/jumbo v0, "42476"
+    const-string/jumbo v0, "42477"
+    const-string/jumbo v0, "42478"
+    const-string/jumbo v0, "42479"
+    const-string/jumbo v0, "42480"
+    const-string/jumbo v0, "42481"
+    const-string/jumbo v0, "42482"
+    const-string/jumbo v0, "42483"
+    const-string/jumbo v0, "42484"
+    const-string/jumbo v0, "42485"
+    const-string/jumbo v0, "42486"
+    const-string/jumbo v0, "42487"
+    const-string/jumbo v0, "42488"
+    const-string/jumbo v0, "42489"
+    const-string/jumbo v0, "42490"
+    const-string/jumbo v0, "42491"
+    const-string/jumbo v0, "42492"
+    const-string/jumbo v0, "42493"
+    const-string/jumbo v0, "42494"
+    const-string/jumbo v0, "42495"
+    const-string/jumbo v0, "42496"
+    const-string/jumbo v0, "42497"
+    const-string/jumbo v0, "42498"
+    const-string/jumbo v0, "42499"
+    const-string/jumbo v0, "42500"
+    const-string/jumbo v0, "42501"
+    const-string/jumbo v0, "42502"
+    const-string/jumbo v0, "42503"
+    const-string/jumbo v0, "42504"
+    const-string/jumbo v0, "42505"
+    const-string/jumbo v0, "42506"
+    const-string/jumbo v0, "42507"
+    const-string/jumbo v0, "42508"
+    const-string/jumbo v0, "42509"
+    const-string/jumbo v0, "42510"
+    const-string/jumbo v0, "42511"
+    const-string/jumbo v0, "42512"
+    const-string/jumbo v0, "42513"
+    const-string/jumbo v0, "42514"
+    const-string/jumbo v0, "42515"
+    const-string/jumbo v0, "42516"
+    const-string/jumbo v0, "42517"
+    const-string/jumbo v0, "42518"
+    const-string/jumbo v0, "42519"
+    const-string/jumbo v0, "42520"
+    const-string/jumbo v0, "42521"
+    const-string/jumbo v0, "42522"
+    const-string/jumbo v0, "42523"
+    const-string/jumbo v0, "42524"
+    const-string/jumbo v0, "42525"
+    const-string/jumbo v0, "42526"
+    const-string/jumbo v0, "42527"
+    const-string/jumbo v0, "42528"
+    const-string/jumbo v0, "42529"
+    const-string/jumbo v0, "42530"
+    const-string/jumbo v0, "42531"
+    const-string/jumbo v0, "42532"
+    const-string/jumbo v0, "42533"
+    const-string/jumbo v0, "42534"
+    const-string/jumbo v0, "42535"
+    const-string/jumbo v0, "42536"
+    const-string/jumbo v0, "42537"
+    const-string/jumbo v0, "42538"
+    const-string/jumbo v0, "42539"
+    const-string/jumbo v0, "42540"
+    const-string/jumbo v0, "42541"
+    const-string/jumbo v0, "42542"
+    const-string/jumbo v0, "42543"
+    const-string/jumbo v0, "42544"
+    const-string/jumbo v0, "42545"
+    const-string/jumbo v0, "42546"
+    const-string/jumbo v0, "42547"
+    const-string/jumbo v0, "42548"
+    const-string/jumbo v0, "42549"
+    const-string/jumbo v0, "42550"
+    const-string/jumbo v0, "42551"
+    const-string/jumbo v0, "42552"
+    const-string/jumbo v0, "42553"
+    const-string/jumbo v0, "42554"
+    const-string/jumbo v0, "42555"
+    const-string/jumbo v0, "42556"
+    const-string/jumbo v0, "42557"
+    const-string/jumbo v0, "42558"
+    const-string/jumbo v0, "42559"
+    const-string/jumbo v0, "42560"
+    const-string/jumbo v0, "42561"
+    const-string/jumbo v0, "42562"
+    const-string/jumbo v0, "42563"
+    const-string/jumbo v0, "42564"
+    const-string/jumbo v0, "42565"
+    const-string/jumbo v0, "42566"
+    const-string/jumbo v0, "42567"
+    const-string/jumbo v0, "42568"
+    const-string/jumbo v0, "42569"
+    const-string/jumbo v0, "42570"
+    const-string/jumbo v0, "42571"
+    const-string/jumbo v0, "42572"
+    const-string/jumbo v0, "42573"
+    const-string/jumbo v0, "42574"
+    const-string/jumbo v0, "42575"
+    const-string/jumbo v0, "42576"
+    const-string/jumbo v0, "42577"
+    const-string/jumbo v0, "42578"
+    const-string/jumbo v0, "42579"
+    const-string/jumbo v0, "42580"
+    const-string/jumbo v0, "42581"
+    const-string/jumbo v0, "42582"
+    const-string/jumbo v0, "42583"
+    const-string/jumbo v0, "42584"
+    const-string/jumbo v0, "42585"
+    const-string/jumbo v0, "42586"
+    const-string/jumbo v0, "42587"
+    const-string/jumbo v0, "42588"
+    const-string/jumbo v0, "42589"
+    const-string/jumbo v0, "42590"
+    const-string/jumbo v0, "42591"
+    const-string/jumbo v0, "42592"
+    const-string/jumbo v0, "42593"
+    const-string/jumbo v0, "42594"
+    const-string/jumbo v0, "42595"
+    const-string/jumbo v0, "42596"
+    const-string/jumbo v0, "42597"
+    const-string/jumbo v0, "42598"
+    const-string/jumbo v0, "42599"
+    const-string/jumbo v0, "42600"
+    const-string/jumbo v0, "42601"
+    const-string/jumbo v0, "42602"
+    const-string/jumbo v0, "42603"
+    const-string/jumbo v0, "42604"
+    const-string/jumbo v0, "42605"
+    const-string/jumbo v0, "42606"
+    const-string/jumbo v0, "42607"
+    const-string/jumbo v0, "42608"
+    const-string/jumbo v0, "42609"
+    const-string/jumbo v0, "42610"
+    const-string/jumbo v0, "42611"
+    const-string/jumbo v0, "42612"
+    const-string/jumbo v0, "42613"
+    const-string/jumbo v0, "42614"
+    const-string/jumbo v0, "42615"
+    const-string/jumbo v0, "42616"
+    const-string/jumbo v0, "42617"
+    const-string/jumbo v0, "42618"
+    const-string/jumbo v0, "42619"
+    const-string/jumbo v0, "42620"
+    const-string/jumbo v0, "42621"
+    const-string/jumbo v0, "42622"
+    const-string/jumbo v0, "42623"
+    const-string/jumbo v0, "42624"
+    const-string/jumbo v0, "42625"
+    const-string/jumbo v0, "42626"
+    const-string/jumbo v0, "42627"
+    const-string/jumbo v0, "42628"
+    const-string/jumbo v0, "42629"
+    const-string/jumbo v0, "42630"
+    const-string/jumbo v0, "42631"
+    const-string/jumbo v0, "42632"
+    const-string/jumbo v0, "42633"
+    const-string/jumbo v0, "42634"
+    const-string/jumbo v0, "42635"
+    const-string/jumbo v0, "42636"
+    const-string/jumbo v0, "42637"
+    const-string/jumbo v0, "42638"
+    const-string/jumbo v0, "42639"
+    const-string/jumbo v0, "42640"
+    const-string/jumbo v0, "42641"
+    const-string/jumbo v0, "42642"
+    const-string/jumbo v0, "42643"
+    const-string/jumbo v0, "42644"
+    const-string/jumbo v0, "42645"
+    const-string/jumbo v0, "42646"
+    const-string/jumbo v0, "42647"
+    const-string/jumbo v0, "42648"
+    const-string/jumbo v0, "42649"
+    const-string/jumbo v0, "42650"
+    const-string/jumbo v0, "42651"
+    const-string/jumbo v0, "42652"
+    const-string/jumbo v0, "42653"
+    const-string/jumbo v0, "42654"
+    const-string/jumbo v0, "42655"
+    const-string/jumbo v0, "42656"
+    const-string/jumbo v0, "42657"
+    const-string/jumbo v0, "42658"
+    const-string/jumbo v0, "42659"
+    const-string/jumbo v0, "42660"
+    const-string/jumbo v0, "42661"
+    const-string/jumbo v0, "42662"
+    const-string/jumbo v0, "42663"
+    const-string/jumbo v0, "42664"
+    const-string/jumbo v0, "42665"
+    const-string/jumbo v0, "42666"
+    const-string/jumbo v0, "42667"
+    const-string/jumbo v0, "42668"
+    const-string/jumbo v0, "42669"
+    const-string/jumbo v0, "42670"
+    const-string/jumbo v0, "42671"
+    const-string/jumbo v0, "42672"
+    const-string/jumbo v0, "42673"
+    const-string/jumbo v0, "42674"
+    const-string/jumbo v0, "42675"
+    const-string/jumbo v0, "42676"
+    const-string/jumbo v0, "42677"
+    const-string/jumbo v0, "42678"
+    const-string/jumbo v0, "42679"
+    const-string/jumbo v0, "42680"
+    const-string/jumbo v0, "42681"
+    const-string/jumbo v0, "42682"
+    const-string/jumbo v0, "42683"
+    const-string/jumbo v0, "42684"
+    const-string/jumbo v0, "42685"
+    const-string/jumbo v0, "42686"
+    const-string/jumbo v0, "42687"
+    const-string/jumbo v0, "42688"
+    const-string/jumbo v0, "42689"
+    const-string/jumbo v0, "42690"
+    const-string/jumbo v0, "42691"
+    const-string/jumbo v0, "42692"
+    const-string/jumbo v0, "42693"
+    const-string/jumbo v0, "42694"
+    const-string/jumbo v0, "42695"
+    const-string/jumbo v0, "42696"
+    const-string/jumbo v0, "42697"
+    const-string/jumbo v0, "42698"
+    const-string/jumbo v0, "42699"
+    const-string/jumbo v0, "42700"
+    const-string/jumbo v0, "42701"
+    const-string/jumbo v0, "42702"
+    const-string/jumbo v0, "42703"
+    const-string/jumbo v0, "42704"
+    const-string/jumbo v0, "42705"
+    const-string/jumbo v0, "42706"
+    const-string/jumbo v0, "42707"
+    const-string/jumbo v0, "42708"
+    const-string/jumbo v0, "42709"
+    const-string/jumbo v0, "42710"
+    const-string/jumbo v0, "42711"
+    const-string/jumbo v0, "42712"
+    const-string/jumbo v0, "42713"
+    const-string/jumbo v0, "42714"
+    const-string/jumbo v0, "42715"
+    const-string/jumbo v0, "42716"
+    const-string/jumbo v0, "42717"
+    const-string/jumbo v0, "42718"
+    const-string/jumbo v0, "42719"
+    const-string/jumbo v0, "42720"
+    const-string/jumbo v0, "42721"
+    const-string/jumbo v0, "42722"
+    const-string/jumbo v0, "42723"
+    const-string/jumbo v0, "42724"
+    const-string/jumbo v0, "42725"
+    const-string/jumbo v0, "42726"
+    const-string/jumbo v0, "42727"
+    const-string/jumbo v0, "42728"
+    const-string/jumbo v0, "42729"
+    const-string/jumbo v0, "42730"
+    const-string/jumbo v0, "42731"
+    const-string/jumbo v0, "42732"
+    const-string/jumbo v0, "42733"
+    const-string/jumbo v0, "42734"
+    const-string/jumbo v0, "42735"
+    const-string/jumbo v0, "42736"
+    const-string/jumbo v0, "42737"
+    const-string/jumbo v0, "42738"
+    const-string/jumbo v0, "42739"
+    const-string/jumbo v0, "42740"
+    const-string/jumbo v0, "42741"
+    const-string/jumbo v0, "42742"
+    const-string/jumbo v0, "42743"
+    const-string/jumbo v0, "42744"
+    const-string/jumbo v0, "42745"
+    const-string/jumbo v0, "42746"
+    const-string/jumbo v0, "42747"
+    const-string/jumbo v0, "42748"
+    const-string/jumbo v0, "42749"
+    const-string/jumbo v0, "42750"
+    const-string/jumbo v0, "42751"
+    const-string/jumbo v0, "42752"
+    const-string/jumbo v0, "42753"
+    const-string/jumbo v0, "42754"
+    const-string/jumbo v0, "42755"
+    const-string/jumbo v0, "42756"
+    const-string/jumbo v0, "42757"
+    const-string/jumbo v0, "42758"
+    const-string/jumbo v0, "42759"
+    const-string/jumbo v0, "42760"
+    const-string/jumbo v0, "42761"
+    const-string/jumbo v0, "42762"
+    const-string/jumbo v0, "42763"
+    const-string/jumbo v0, "42764"
+    const-string/jumbo v0, "42765"
+    const-string/jumbo v0, "42766"
+    const-string/jumbo v0, "42767"
+    const-string/jumbo v0, "42768"
+    const-string/jumbo v0, "42769"
+    const-string/jumbo v0, "42770"
+    const-string/jumbo v0, "42771"
+    const-string/jumbo v0, "42772"
+    const-string/jumbo v0, "42773"
+    const-string/jumbo v0, "42774"
+    const-string/jumbo v0, "42775"
+    const-string/jumbo v0, "42776"
+    const-string/jumbo v0, "42777"
+    const-string/jumbo v0, "42778"
+    const-string/jumbo v0, "42779"
+    const-string/jumbo v0, "42780"
+    const-string/jumbo v0, "42781"
+    const-string/jumbo v0, "42782"
+    const-string/jumbo v0, "42783"
+    const-string/jumbo v0, "42784"
+    const-string/jumbo v0, "42785"
+    const-string/jumbo v0, "42786"
+    const-string/jumbo v0, "42787"
+    const-string/jumbo v0, "42788"
+    const-string/jumbo v0, "42789"
+    const-string/jumbo v0, "42790"
+    const-string/jumbo v0, "42791"
+    const-string/jumbo v0, "42792"
+    const-string/jumbo v0, "42793"
+    const-string/jumbo v0, "42794"
+    const-string/jumbo v0, "42795"
+    const-string/jumbo v0, "42796"
+    const-string/jumbo v0, "42797"
+    const-string/jumbo v0, "42798"
+    const-string/jumbo v0, "42799"
+    const-string/jumbo v0, "42800"
+    const-string/jumbo v0, "42801"
+    const-string/jumbo v0, "42802"
+    const-string/jumbo v0, "42803"
+    const-string/jumbo v0, "42804"
+    const-string/jumbo v0, "42805"
+    const-string/jumbo v0, "42806"
+    const-string/jumbo v0, "42807"
+    const-string/jumbo v0, "42808"
+    const-string/jumbo v0, "42809"
+    const-string/jumbo v0, "42810"
+    const-string/jumbo v0, "42811"
+    const-string/jumbo v0, "42812"
+    const-string/jumbo v0, "42813"
+    const-string/jumbo v0, "42814"
+    const-string/jumbo v0, "42815"
+    const-string/jumbo v0, "42816"
+    const-string/jumbo v0, "42817"
+    const-string/jumbo v0, "42818"
+    const-string/jumbo v0, "42819"
+    const-string/jumbo v0, "42820"
+    const-string/jumbo v0, "42821"
+    const-string/jumbo v0, "42822"
+    const-string/jumbo v0, "42823"
+    const-string/jumbo v0, "42824"
+    const-string/jumbo v0, "42825"
+    const-string/jumbo v0, "42826"
+    const-string/jumbo v0, "42827"
+    const-string/jumbo v0, "42828"
+    const-string/jumbo v0, "42829"
+    const-string/jumbo v0, "42830"
+    const-string/jumbo v0, "42831"
+    const-string/jumbo v0, "42832"
+    const-string/jumbo v0, "42833"
+    const-string/jumbo v0, "42834"
+    const-string/jumbo v0, "42835"
+    const-string/jumbo v0, "42836"
+    const-string/jumbo v0, "42837"
+    const-string/jumbo v0, "42838"
+    const-string/jumbo v0, "42839"
+    const-string/jumbo v0, "42840"
+    const-string/jumbo v0, "42841"
+    const-string/jumbo v0, "42842"
+    const-string/jumbo v0, "42843"
+    const-string/jumbo v0, "42844"
+    const-string/jumbo v0, "42845"
+    const-string/jumbo v0, "42846"
+    const-string/jumbo v0, "42847"
+    const-string/jumbo v0, "42848"
+    const-string/jumbo v0, "42849"
+    const-string/jumbo v0, "42850"
+    const-string/jumbo v0, "42851"
+    const-string/jumbo v0, "42852"
+    const-string/jumbo v0, "42853"
+    const-string/jumbo v0, "42854"
+    const-string/jumbo v0, "42855"
+    const-string/jumbo v0, "42856"
+    const-string/jumbo v0, "42857"
+    const-string/jumbo v0, "42858"
+    const-string/jumbo v0, "42859"
+    const-string/jumbo v0, "42860"
+    const-string/jumbo v0, "42861"
+    const-string/jumbo v0, "42862"
+    const-string/jumbo v0, "42863"
+    const-string/jumbo v0, "42864"
+    const-string/jumbo v0, "42865"
+    const-string/jumbo v0, "42866"
+    const-string/jumbo v0, "42867"
+    const-string/jumbo v0, "42868"
+    const-string/jumbo v0, "42869"
+    const-string/jumbo v0, "42870"
+    const-string/jumbo v0, "42871"
+    const-string/jumbo v0, "42872"
+    const-string/jumbo v0, "42873"
+    const-string/jumbo v0, "42874"
+    const-string/jumbo v0, "42875"
+    const-string/jumbo v0, "42876"
+    const-string/jumbo v0, "42877"
+    const-string/jumbo v0, "42878"
+    const-string/jumbo v0, "42879"
+    const-string/jumbo v0, "42880"
+    const-string/jumbo v0, "42881"
+    const-string/jumbo v0, "42882"
+    const-string/jumbo v0, "42883"
+    const-string/jumbo v0, "42884"
+    const-string/jumbo v0, "42885"
+    const-string/jumbo v0, "42886"
+    const-string/jumbo v0, "42887"
+    const-string/jumbo v0, "42888"
+    const-string/jumbo v0, "42889"
+    const-string/jumbo v0, "42890"
+    const-string/jumbo v0, "42891"
+    const-string/jumbo v0, "42892"
+    const-string/jumbo v0, "42893"
+    const-string/jumbo v0, "42894"
+    const-string/jumbo v0, "42895"
+    const-string/jumbo v0, "42896"
+    const-string/jumbo v0, "42897"
+    const-string/jumbo v0, "42898"
+    const-string/jumbo v0, "42899"
+    const-string/jumbo v0, "42900"
+    const-string/jumbo v0, "42901"
+    const-string/jumbo v0, "42902"
+    const-string/jumbo v0, "42903"
+    const-string/jumbo v0, "42904"
+    const-string/jumbo v0, "42905"
+    const-string/jumbo v0, "42906"
+    const-string/jumbo v0, "42907"
+    const-string/jumbo v0, "42908"
+    const-string/jumbo v0, "42909"
+    const-string/jumbo v0, "42910"
+    const-string/jumbo v0, "42911"
+    const-string/jumbo v0, "42912"
+    const-string/jumbo v0, "42913"
+    const-string/jumbo v0, "42914"
+    const-string/jumbo v0, "42915"
+    const-string/jumbo v0, "42916"
+    const-string/jumbo v0, "42917"
+    const-string/jumbo v0, "42918"
+    const-string/jumbo v0, "42919"
+    const-string/jumbo v0, "42920"
+    const-string/jumbo v0, "42921"
+    const-string/jumbo v0, "42922"
+    const-string/jumbo v0, "42923"
+    const-string/jumbo v0, "42924"
+    const-string/jumbo v0, "42925"
+    const-string/jumbo v0, "42926"
+    const-string/jumbo v0, "42927"
+    const-string/jumbo v0, "42928"
+    const-string/jumbo v0, "42929"
+    const-string/jumbo v0, "42930"
+    const-string/jumbo v0, "42931"
+    const-string/jumbo v0, "42932"
+    const-string/jumbo v0, "42933"
+    const-string/jumbo v0, "42934"
+    const-string/jumbo v0, "42935"
+    const-string/jumbo v0, "42936"
+    const-string/jumbo v0, "42937"
+    const-string/jumbo v0, "42938"
+    const-string/jumbo v0, "42939"
+    const-string/jumbo v0, "42940"
+    const-string/jumbo v0, "42941"
+    const-string/jumbo v0, "42942"
+    const-string/jumbo v0, "42943"
+    const-string/jumbo v0, "42944"
+    const-string/jumbo v0, "42945"
+    const-string/jumbo v0, "42946"
+    const-string/jumbo v0, "42947"
+    const-string/jumbo v0, "42948"
+    const-string/jumbo v0, "42949"
+    const-string/jumbo v0, "42950"
+    const-string/jumbo v0, "42951"
+    const-string/jumbo v0, "42952"
+    const-string/jumbo v0, "42953"
+    const-string/jumbo v0, "42954"
+    const-string/jumbo v0, "42955"
+    const-string/jumbo v0, "42956"
+    const-string/jumbo v0, "42957"
+    const-string/jumbo v0, "42958"
+    const-string/jumbo v0, "42959"
+    const-string/jumbo v0, "42960"
+    const-string/jumbo v0, "42961"
+    const-string/jumbo v0, "42962"
+    const-string/jumbo v0, "42963"
+    const-string/jumbo v0, "42964"
+    const-string/jumbo v0, "42965"
+    const-string/jumbo v0, "42966"
+    const-string/jumbo v0, "42967"
+    const-string/jumbo v0, "42968"
+    const-string/jumbo v0, "42969"
+    const-string/jumbo v0, "42970"
+    const-string/jumbo v0, "42971"
+    const-string/jumbo v0, "42972"
+    const-string/jumbo v0, "42973"
+    const-string/jumbo v0, "42974"
+    const-string/jumbo v0, "42975"
+    const-string/jumbo v0, "42976"
+    const-string/jumbo v0, "42977"
+    const-string/jumbo v0, "42978"
+    const-string/jumbo v0, "42979"
+    const-string/jumbo v0, "42980"
+    const-string/jumbo v0, "42981"
+    const-string/jumbo v0, "42982"
+    const-string/jumbo v0, "42983"
+    const-string/jumbo v0, "42984"
+    const-string/jumbo v0, "42985"
+    const-string/jumbo v0, "42986"
+    const-string/jumbo v0, "42987"
+    const-string/jumbo v0, "42988"
+    const-string/jumbo v0, "42989"
+    const-string/jumbo v0, "42990"
+    const-string/jumbo v0, "42991"
+    const-string/jumbo v0, "42992"
+    const-string/jumbo v0, "42993"
+    const-string/jumbo v0, "42994"
+    const-string/jumbo v0, "42995"
+    const-string/jumbo v0, "42996"
+    const-string/jumbo v0, "42997"
+    const-string/jumbo v0, "42998"
+    const-string/jumbo v0, "42999"
+    const-string/jumbo v0, "43000"
+    const-string/jumbo v0, "43001"
+    const-string/jumbo v0, "43002"
+    const-string/jumbo v0, "43003"
+    const-string/jumbo v0, "43004"
+    const-string/jumbo v0, "43005"
+    const-string/jumbo v0, "43006"
+    const-string/jumbo v0, "43007"
+    const-string/jumbo v0, "43008"
+    const-string/jumbo v0, "43009"
+    const-string/jumbo v0, "43010"
+    const-string/jumbo v0, "43011"
+    const-string/jumbo v0, "43012"
+    const-string/jumbo v0, "43013"
+    const-string/jumbo v0, "43014"
+    const-string/jumbo v0, "43015"
+    const-string/jumbo v0, "43016"
+    const-string/jumbo v0, "43017"
+    const-string/jumbo v0, "43018"
+    const-string/jumbo v0, "43019"
+    const-string/jumbo v0, "43020"
+    const-string/jumbo v0, "43021"
+    const-string/jumbo v0, "43022"
+    const-string/jumbo v0, "43023"
+    const-string/jumbo v0, "43024"
+    const-string/jumbo v0, "43025"
+    const-string/jumbo v0, "43026"
+    const-string/jumbo v0, "43027"
+    const-string/jumbo v0, "43028"
+    const-string/jumbo v0, "43029"
+    const-string/jumbo v0, "43030"
+    const-string/jumbo v0, "43031"
+    const-string/jumbo v0, "43032"
+    const-string/jumbo v0, "43033"
+    const-string/jumbo v0, "43034"
+    const-string/jumbo v0, "43035"
+    const-string/jumbo v0, "43036"
+    const-string/jumbo v0, "43037"
+    const-string/jumbo v0, "43038"
+    const-string/jumbo v0, "43039"
+    const-string/jumbo v0, "43040"
+    const-string/jumbo v0, "43041"
+    const-string/jumbo v0, "43042"
+    const-string/jumbo v0, "43043"
+    const-string/jumbo v0, "43044"
+    const-string/jumbo v0, "43045"
+    const-string/jumbo v0, "43046"
+    const-string/jumbo v0, "43047"
+    const-string/jumbo v0, "43048"
+    const-string/jumbo v0, "43049"
+    const-string/jumbo v0, "43050"
+    const-string/jumbo v0, "43051"
+    const-string/jumbo v0, "43052"
+    const-string/jumbo v0, "43053"
+    const-string/jumbo v0, "43054"
+    const-string/jumbo v0, "43055"
+    const-string/jumbo v0, "43056"
+    const-string/jumbo v0, "43057"
+    const-string/jumbo v0, "43058"
+    const-string/jumbo v0, "43059"
+    const-string/jumbo v0, "43060"
+    const-string/jumbo v0, "43061"
+    const-string/jumbo v0, "43062"
+    const-string/jumbo v0, "43063"
+    const-string/jumbo v0, "43064"
+    const-string/jumbo v0, "43065"
+    const-string/jumbo v0, "43066"
+    const-string/jumbo v0, "43067"
+    const-string/jumbo v0, "43068"
+    const-string/jumbo v0, "43069"
+    const-string/jumbo v0, "43070"
+    const-string/jumbo v0, "43071"
+    const-string/jumbo v0, "43072"
+    const-string/jumbo v0, "43073"
+    const-string/jumbo v0, "43074"
+    const-string/jumbo v0, "43075"
+    const-string/jumbo v0, "43076"
+    const-string/jumbo v0, "43077"
+    const-string/jumbo v0, "43078"
+    const-string/jumbo v0, "43079"
+    const-string/jumbo v0, "43080"
+    const-string/jumbo v0, "43081"
+    const-string/jumbo v0, "43082"
+    const-string/jumbo v0, "43083"
+    const-string/jumbo v0, "43084"
+    const-string/jumbo v0, "43085"
+    const-string/jumbo v0, "43086"
+    const-string/jumbo v0, "43087"
+    const-string/jumbo v0, "43088"
+    const-string/jumbo v0, "43089"
+    const-string/jumbo v0, "43090"
+    const-string/jumbo v0, "43091"
+    const-string/jumbo v0, "43092"
+    const-string/jumbo v0, "43093"
+    const-string/jumbo v0, "43094"
+    const-string/jumbo v0, "43095"
+    const-string/jumbo v0, "43096"
+    const-string/jumbo v0, "43097"
+    const-string/jumbo v0, "43098"
+    const-string/jumbo v0, "43099"
+    const-string/jumbo v0, "43100"
+    const-string/jumbo v0, "43101"
+    const-string/jumbo v0, "43102"
+    const-string/jumbo v0, "43103"
+    const-string/jumbo v0, "43104"
+    const-string/jumbo v0, "43105"
+    const-string/jumbo v0, "43106"
+    const-string/jumbo v0, "43107"
+    const-string/jumbo v0, "43108"
+    const-string/jumbo v0, "43109"
+    const-string/jumbo v0, "43110"
+    const-string/jumbo v0, "43111"
+    const-string/jumbo v0, "43112"
+    const-string/jumbo v0, "43113"
+    const-string/jumbo v0, "43114"
+    const-string/jumbo v0, "43115"
+    const-string/jumbo v0, "43116"
+    const-string/jumbo v0, "43117"
+    const-string/jumbo v0, "43118"
+    const-string/jumbo v0, "43119"
+    const-string/jumbo v0, "43120"
+    const-string/jumbo v0, "43121"
+    const-string/jumbo v0, "43122"
+    const-string/jumbo v0, "43123"
+    const-string/jumbo v0, "43124"
+    const-string/jumbo v0, "43125"
+    const-string/jumbo v0, "43126"
+    const-string/jumbo v0, "43127"
+    const-string/jumbo v0, "43128"
+    const-string/jumbo v0, "43129"
+    const-string/jumbo v0, "43130"
+    const-string/jumbo v0, "43131"
+    const-string/jumbo v0, "43132"
+    const-string/jumbo v0, "43133"
+    const-string/jumbo v0, "43134"
+    const-string/jumbo v0, "43135"
+    const-string/jumbo v0, "43136"
+    const-string/jumbo v0, "43137"
+    const-string/jumbo v0, "43138"
+    const-string/jumbo v0, "43139"
+    const-string/jumbo v0, "43140"
+    const-string/jumbo v0, "43141"
+    const-string/jumbo v0, "43142"
+    const-string/jumbo v0, "43143"
+    const-string/jumbo v0, "43144"
+    const-string/jumbo v0, "43145"
+    const-string/jumbo v0, "43146"
+    const-string/jumbo v0, "43147"
+    const-string/jumbo v0, "43148"
+    const-string/jumbo v0, "43149"
+    const-string/jumbo v0, "43150"
+    const-string/jumbo v0, "43151"
+    const-string/jumbo v0, "43152"
+    const-string/jumbo v0, "43153"
+    const-string/jumbo v0, "43154"
+    const-string/jumbo v0, "43155"
+    const-string/jumbo v0, "43156"
+    const-string/jumbo v0, "43157"
+    const-string/jumbo v0, "43158"
+    const-string/jumbo v0, "43159"
+    const-string/jumbo v0, "43160"
+    const-string/jumbo v0, "43161"
+    const-string/jumbo v0, "43162"
+    const-string/jumbo v0, "43163"
+    const-string/jumbo v0, "43164"
+    const-string/jumbo v0, "43165"
+    const-string/jumbo v0, "43166"
+    const-string/jumbo v0, "43167"
+    const-string/jumbo v0, "43168"
+    const-string/jumbo v0, "43169"
+    const-string/jumbo v0, "43170"
+    const-string/jumbo v0, "43171"
+    const-string/jumbo v0, "43172"
+    const-string/jumbo v0, "43173"
+    const-string/jumbo v0, "43174"
+    const-string/jumbo v0, "43175"
+    const-string/jumbo v0, "43176"
+    const-string/jumbo v0, "43177"
+    const-string/jumbo v0, "43178"
+    const-string/jumbo v0, "43179"
+    const-string/jumbo v0, "43180"
+    const-string/jumbo v0, "43181"
+    const-string/jumbo v0, "43182"
+    const-string/jumbo v0, "43183"
+    const-string/jumbo v0, "43184"
+    const-string/jumbo v0, "43185"
+    const-string/jumbo v0, "43186"
+    const-string/jumbo v0, "43187"
+    const-string/jumbo v0, "43188"
+    const-string/jumbo v0, "43189"
+    const-string/jumbo v0, "43190"
+    const-string/jumbo v0, "43191"
+    const-string/jumbo v0, "43192"
+    const-string/jumbo v0, "43193"
+    const-string/jumbo v0, "43194"
+    const-string/jumbo v0, "43195"
+    const-string/jumbo v0, "43196"
+    const-string/jumbo v0, "43197"
+    const-string/jumbo v0, "43198"
+    const-string/jumbo v0, "43199"
+    const-string/jumbo v0, "43200"
+    const-string/jumbo v0, "43201"
+    const-string/jumbo v0, "43202"
+    const-string/jumbo v0, "43203"
+    const-string/jumbo v0, "43204"
+    const-string/jumbo v0, "43205"
+    const-string/jumbo v0, "43206"
+    const-string/jumbo v0, "43207"
+    const-string/jumbo v0, "43208"
+    const-string/jumbo v0, "43209"
+    const-string/jumbo v0, "43210"
+    const-string/jumbo v0, "43211"
+    const-string/jumbo v0, "43212"
+    const-string/jumbo v0, "43213"
+    const-string/jumbo v0, "43214"
+    const-string/jumbo v0, "43215"
+    const-string/jumbo v0, "43216"
+    const-string/jumbo v0, "43217"
+    const-string/jumbo v0, "43218"
+    const-string/jumbo v0, "43219"
+    const-string/jumbo v0, "43220"
+    const-string/jumbo v0, "43221"
+    const-string/jumbo v0, "43222"
+    const-string/jumbo v0, "43223"
+    const-string/jumbo v0, "43224"
+    const-string/jumbo v0, "43225"
+    const-string/jumbo v0, "43226"
+    const-string/jumbo v0, "43227"
+    const-string/jumbo v0, "43228"
+    const-string/jumbo v0, "43229"
+    const-string/jumbo v0, "43230"
+    const-string/jumbo v0, "43231"
+    const-string/jumbo v0, "43232"
+    const-string/jumbo v0, "43233"
+    const-string/jumbo v0, "43234"
+    const-string/jumbo v0, "43235"
+    const-string/jumbo v0, "43236"
+    const-string/jumbo v0, "43237"
+    const-string/jumbo v0, "43238"
+    const-string/jumbo v0, "43239"
+    const-string/jumbo v0, "43240"
+    const-string/jumbo v0, "43241"
+    const-string/jumbo v0, "43242"
+    const-string/jumbo v0, "43243"
+    const-string/jumbo v0, "43244"
+    const-string/jumbo v0, "43245"
+    const-string/jumbo v0, "43246"
+    const-string/jumbo v0, "43247"
+    const-string/jumbo v0, "43248"
+    const-string/jumbo v0, "43249"
+    const-string/jumbo v0, "43250"
+    const-string/jumbo v0, "43251"
+    const-string/jumbo v0, "43252"
+    const-string/jumbo v0, "43253"
+    const-string/jumbo v0, "43254"
+    const-string/jumbo v0, "43255"
+    const-string/jumbo v0, "43256"
+    const-string/jumbo v0, "43257"
+    const-string/jumbo v0, "43258"
+    const-string/jumbo v0, "43259"
+    const-string/jumbo v0, "43260"
+    const-string/jumbo v0, "43261"
+    const-string/jumbo v0, "43262"
+    const-string/jumbo v0, "43263"
+    const-string/jumbo v0, "43264"
+    const-string/jumbo v0, "43265"
+    const-string/jumbo v0, "43266"
+    const-string/jumbo v0, "43267"
+    const-string/jumbo v0, "43268"
+    const-string/jumbo v0, "43269"
+    const-string/jumbo v0, "43270"
+    const-string/jumbo v0, "43271"
+    const-string/jumbo v0, "43272"
+    const-string/jumbo v0, "43273"
+    const-string/jumbo v0, "43274"
+    const-string/jumbo v0, "43275"
+    const-string/jumbo v0, "43276"
+    const-string/jumbo v0, "43277"
+    const-string/jumbo v0, "43278"
+    const-string/jumbo v0, "43279"
+    const-string/jumbo v0, "43280"
+    const-string/jumbo v0, "43281"
+    const-string/jumbo v0, "43282"
+    const-string/jumbo v0, "43283"
+    const-string/jumbo v0, "43284"
+    const-string/jumbo v0, "43285"
+    const-string/jumbo v0, "43286"
+    const-string/jumbo v0, "43287"
+    const-string/jumbo v0, "43288"
+    const-string/jumbo v0, "43289"
+    const-string/jumbo v0, "43290"
+    const-string/jumbo v0, "43291"
+    const-string/jumbo v0, "43292"
+    const-string/jumbo v0, "43293"
+    const-string/jumbo v0, "43294"
+    const-string/jumbo v0, "43295"
+    const-string/jumbo v0, "43296"
+    const-string/jumbo v0, "43297"
+    const-string/jumbo v0, "43298"
+    const-string/jumbo v0, "43299"
+    const-string/jumbo v0, "43300"
+    const-string/jumbo v0, "43301"
+    const-string/jumbo v0, "43302"
+    const-string/jumbo v0, "43303"
+    const-string/jumbo v0, "43304"
+    const-string/jumbo v0, "43305"
+    const-string/jumbo v0, "43306"
+    const-string/jumbo v0, "43307"
+    const-string/jumbo v0, "43308"
+    const-string/jumbo v0, "43309"
+    const-string/jumbo v0, "43310"
+    const-string/jumbo v0, "43311"
+    const-string/jumbo v0, "43312"
+    const-string/jumbo v0, "43313"
+    const-string/jumbo v0, "43314"
+    const-string/jumbo v0, "43315"
+    const-string/jumbo v0, "43316"
+    const-string/jumbo v0, "43317"
+    const-string/jumbo v0, "43318"
+    const-string/jumbo v0, "43319"
+    const-string/jumbo v0, "43320"
+    const-string/jumbo v0, "43321"
+    const-string/jumbo v0, "43322"
+    const-string/jumbo v0, "43323"
+    const-string/jumbo v0, "43324"
+    const-string/jumbo v0, "43325"
+    const-string/jumbo v0, "43326"
+    const-string/jumbo v0, "43327"
+    const-string/jumbo v0, "43328"
+    const-string/jumbo v0, "43329"
+    const-string/jumbo v0, "43330"
+    const-string/jumbo v0, "43331"
+    const-string/jumbo v0, "43332"
+    const-string/jumbo v0, "43333"
+    const-string/jumbo v0, "43334"
+    const-string/jumbo v0, "43335"
+    const-string/jumbo v0, "43336"
+    const-string/jumbo v0, "43337"
+    const-string/jumbo v0, "43338"
+    const-string/jumbo v0, "43339"
+    const-string/jumbo v0, "43340"
+    const-string/jumbo v0, "43341"
+    const-string/jumbo v0, "43342"
+    const-string/jumbo v0, "43343"
+    const-string/jumbo v0, "43344"
+    const-string/jumbo v0, "43345"
+    const-string/jumbo v0, "43346"
+    const-string/jumbo v0, "43347"
+    const-string/jumbo v0, "43348"
+    const-string/jumbo v0, "43349"
+    const-string/jumbo v0, "43350"
+    const-string/jumbo v0, "43351"
+    const-string/jumbo v0, "43352"
+    const-string/jumbo v0, "43353"
+    const-string/jumbo v0, "43354"
+    const-string/jumbo v0, "43355"
+    const-string/jumbo v0, "43356"
+    const-string/jumbo v0, "43357"
+    const-string/jumbo v0, "43358"
+    const-string/jumbo v0, "43359"
+    const-string/jumbo v0, "43360"
+    const-string/jumbo v0, "43361"
+    const-string/jumbo v0, "43362"
+    const-string/jumbo v0, "43363"
+    const-string/jumbo v0, "43364"
+    const-string/jumbo v0, "43365"
+    const-string/jumbo v0, "43366"
+    const-string/jumbo v0, "43367"
+    const-string/jumbo v0, "43368"
+    const-string/jumbo v0, "43369"
+    const-string/jumbo v0, "43370"
+    const-string/jumbo v0, "43371"
+    const-string/jumbo v0, "43372"
+    const-string/jumbo v0, "43373"
+    const-string/jumbo v0, "43374"
+    const-string/jumbo v0, "43375"
+    const-string/jumbo v0, "43376"
+    const-string/jumbo v0, "43377"
+    const-string/jumbo v0, "43378"
+    const-string/jumbo v0, "43379"
+    const-string/jumbo v0, "43380"
+    const-string/jumbo v0, "43381"
+    const-string/jumbo v0, "43382"
+    const-string/jumbo v0, "43383"
+    const-string/jumbo v0, "43384"
+    const-string/jumbo v0, "43385"
+    const-string/jumbo v0, "43386"
+    const-string/jumbo v0, "43387"
+    const-string/jumbo v0, "43388"
+    const-string/jumbo v0, "43389"
+    const-string/jumbo v0, "43390"
+    const-string/jumbo v0, "43391"
+    const-string/jumbo v0, "43392"
+    const-string/jumbo v0, "43393"
+    const-string/jumbo v0, "43394"
+    const-string/jumbo v0, "43395"
+    const-string/jumbo v0, "43396"
+    const-string/jumbo v0, "43397"
+    const-string/jumbo v0, "43398"
+    const-string/jumbo v0, "43399"
+    const-string/jumbo v0, "43400"
+    const-string/jumbo v0, "43401"
+    const-string/jumbo v0, "43402"
+    const-string/jumbo v0, "43403"
+    const-string/jumbo v0, "43404"
+    const-string/jumbo v0, "43405"
+    const-string/jumbo v0, "43406"
+    const-string/jumbo v0, "43407"
+    const-string/jumbo v0, "43408"
+    const-string/jumbo v0, "43409"
+    const-string/jumbo v0, "43410"
+    const-string/jumbo v0, "43411"
+    const-string/jumbo v0, "43412"
+    const-string/jumbo v0, "43413"
+    const-string/jumbo v0, "43414"
+    const-string/jumbo v0, "43415"
+    const-string/jumbo v0, "43416"
+    const-string/jumbo v0, "43417"
+    const-string/jumbo v0, "43418"
+    const-string/jumbo v0, "43419"
+    const-string/jumbo v0, "43420"
+    const-string/jumbo v0, "43421"
+    const-string/jumbo v0, "43422"
+    const-string/jumbo v0, "43423"
+    const-string/jumbo v0, "43424"
+    const-string/jumbo v0, "43425"
+    const-string/jumbo v0, "43426"
+    const-string/jumbo v0, "43427"
+    const-string/jumbo v0, "43428"
+    const-string/jumbo v0, "43429"
+    const-string/jumbo v0, "43430"
+    const-string/jumbo v0, "43431"
+    const-string/jumbo v0, "43432"
+    const-string/jumbo v0, "43433"
+    const-string/jumbo v0, "43434"
+    const-string/jumbo v0, "43435"
+    const-string/jumbo v0, "43436"
+    const-string/jumbo v0, "43437"
+    const-string/jumbo v0, "43438"
+    const-string/jumbo v0, "43439"
+    const-string/jumbo v0, "43440"
+    const-string/jumbo v0, "43441"
+    const-string/jumbo v0, "43442"
+    const-string/jumbo v0, "43443"
+    const-string/jumbo v0, "43444"
+    const-string/jumbo v0, "43445"
+    const-string/jumbo v0, "43446"
+    const-string/jumbo v0, "43447"
+    const-string/jumbo v0, "43448"
+    const-string/jumbo v0, "43449"
+    const-string/jumbo v0, "43450"
+    const-string/jumbo v0, "43451"
+    const-string/jumbo v0, "43452"
+    const-string/jumbo v0, "43453"
+    const-string/jumbo v0, "43454"
+    const-string/jumbo v0, "43455"
+    const-string/jumbo v0, "43456"
+    const-string/jumbo v0, "43457"
+    const-string/jumbo v0, "43458"
+    const-string/jumbo v0, "43459"
+    const-string/jumbo v0, "43460"
+    const-string/jumbo v0, "43461"
+    const-string/jumbo v0, "43462"
+    const-string/jumbo v0, "43463"
+    const-string/jumbo v0, "43464"
+    const-string/jumbo v0, "43465"
+    const-string/jumbo v0, "43466"
+    const-string/jumbo v0, "43467"
+    const-string/jumbo v0, "43468"
+    const-string/jumbo v0, "43469"
+    const-string/jumbo v0, "43470"
+    const-string/jumbo v0, "43471"
+    const-string/jumbo v0, "43472"
+    const-string/jumbo v0, "43473"
+    const-string/jumbo v0, "43474"
+    const-string/jumbo v0, "43475"
+    const-string/jumbo v0, "43476"
+    const-string/jumbo v0, "43477"
+    const-string/jumbo v0, "43478"
+    const-string/jumbo v0, "43479"
+    const-string/jumbo v0, "43480"
+    const-string/jumbo v0, "43481"
+    const-string/jumbo v0, "43482"
+    const-string/jumbo v0, "43483"
+    const-string/jumbo v0, "43484"
+    const-string/jumbo v0, "43485"
+    const-string/jumbo v0, "43486"
+    const-string/jumbo v0, "43487"
+    const-string/jumbo v0, "43488"
+    const-string/jumbo v0, "43489"
+    const-string/jumbo v0, "43490"
+    const-string/jumbo v0, "43491"
+    const-string/jumbo v0, "43492"
+    const-string/jumbo v0, "43493"
+    const-string/jumbo v0, "43494"
+    const-string/jumbo v0, "43495"
+    const-string/jumbo v0, "43496"
+    const-string/jumbo v0, "43497"
+    const-string/jumbo v0, "43498"
+    const-string/jumbo v0, "43499"
+    const-string/jumbo v0, "43500"
+    const-string/jumbo v0, "43501"
+    const-string/jumbo v0, "43502"
+    const-string/jumbo v0, "43503"
+    const-string/jumbo v0, "43504"
+    const-string/jumbo v0, "43505"
+    const-string/jumbo v0, "43506"
+    const-string/jumbo v0, "43507"
+    const-string/jumbo v0, "43508"
+    const-string/jumbo v0, "43509"
+    const-string/jumbo v0, "43510"
+    const-string/jumbo v0, "43511"
+    const-string/jumbo v0, "43512"
+    const-string/jumbo v0, "43513"
+    const-string/jumbo v0, "43514"
+    const-string/jumbo v0, "43515"
+    const-string/jumbo v0, "43516"
+    const-string/jumbo v0, "43517"
+    const-string/jumbo v0, "43518"
+    const-string/jumbo v0, "43519"
+    const-string/jumbo v0, "43520"
+    const-string/jumbo v0, "43521"
+    const-string/jumbo v0, "43522"
+    const-string/jumbo v0, "43523"
+    const-string/jumbo v0, "43524"
+    const-string/jumbo v0, "43525"
+    const-string/jumbo v0, "43526"
+    const-string/jumbo v0, "43527"
+    const-string/jumbo v0, "43528"
+    const-string/jumbo v0, "43529"
+    const-string/jumbo v0, "43530"
+    const-string/jumbo v0, "43531"
+    const-string/jumbo v0, "43532"
+    const-string/jumbo v0, "43533"
+    const-string/jumbo v0, "43534"
+    const-string/jumbo v0, "43535"
+    const-string/jumbo v0, "43536"
+    const-string/jumbo v0, "43537"
+    const-string/jumbo v0, "43538"
+    const-string/jumbo v0, "43539"
+    const-string/jumbo v0, "43540"
+    const-string/jumbo v0, "43541"
+    const-string/jumbo v0, "43542"
+    const-string/jumbo v0, "43543"
+    const-string/jumbo v0, "43544"
+    const-string/jumbo v0, "43545"
+    const-string/jumbo v0, "43546"
+    const-string/jumbo v0, "43547"
+    const-string/jumbo v0, "43548"
+    const-string/jumbo v0, "43549"
+    const-string/jumbo v0, "43550"
+    const-string/jumbo v0, "43551"
+    const-string/jumbo v0, "43552"
+    const-string/jumbo v0, "43553"
+    const-string/jumbo v0, "43554"
+    const-string/jumbo v0, "43555"
+    const-string/jumbo v0, "43556"
+    const-string/jumbo v0, "43557"
+    const-string/jumbo v0, "43558"
+    const-string/jumbo v0, "43559"
+    const-string/jumbo v0, "43560"
+    const-string/jumbo v0, "43561"
+    const-string/jumbo v0, "43562"
+    const-string/jumbo v0, "43563"
+    const-string/jumbo v0, "43564"
+    const-string/jumbo v0, "43565"
+    const-string/jumbo v0, "43566"
+    const-string/jumbo v0, "43567"
+    const-string/jumbo v0, "43568"
+    const-string/jumbo v0, "43569"
+    const-string/jumbo v0, "43570"
+    const-string/jumbo v0, "43571"
+    const-string/jumbo v0, "43572"
+    const-string/jumbo v0, "43573"
+    const-string/jumbo v0, "43574"
+    const-string/jumbo v0, "43575"
+    const-string/jumbo v0, "43576"
+    const-string/jumbo v0, "43577"
+    const-string/jumbo v0, "43578"
+    const-string/jumbo v0, "43579"
+    const-string/jumbo v0, "43580"
+    const-string/jumbo v0, "43581"
+    const-string/jumbo v0, "43582"
+    const-string/jumbo v0, "43583"
+    const-string/jumbo v0, "43584"
+    const-string/jumbo v0, "43585"
+    const-string/jumbo v0, "43586"
+    const-string/jumbo v0, "43587"
+    const-string/jumbo v0, "43588"
+    const-string/jumbo v0, "43589"
+    const-string/jumbo v0, "43590"
+    const-string/jumbo v0, "43591"
+    const-string/jumbo v0, "43592"
+    const-string/jumbo v0, "43593"
+    const-string/jumbo v0, "43594"
+    const-string/jumbo v0, "43595"
+    const-string/jumbo v0, "43596"
+    const-string/jumbo v0, "43597"
+    const-string/jumbo v0, "43598"
+    const-string/jumbo v0, "43599"
+    const-string/jumbo v0, "43600"
+    const-string/jumbo v0, "43601"
+    const-string/jumbo v0, "43602"
+    const-string/jumbo v0, "43603"
+    const-string/jumbo v0, "43604"
+    const-string/jumbo v0, "43605"
+    const-string/jumbo v0, "43606"
+    const-string/jumbo v0, "43607"
+    const-string/jumbo v0, "43608"
+    const-string/jumbo v0, "43609"
+    const-string/jumbo v0, "43610"
+    const-string/jumbo v0, "43611"
+    const-string/jumbo v0, "43612"
+    const-string/jumbo v0, "43613"
+    const-string/jumbo v0, "43614"
+    const-string/jumbo v0, "43615"
+    const-string/jumbo v0, "43616"
+    const-string/jumbo v0, "43617"
+    const-string/jumbo v0, "43618"
+    const-string/jumbo v0, "43619"
+    const-string/jumbo v0, "43620"
+    const-string/jumbo v0, "43621"
+    const-string/jumbo v0, "43622"
+    const-string/jumbo v0, "43623"
+    const-string/jumbo v0, "43624"
+    const-string/jumbo v0, "43625"
+    const-string/jumbo v0, "43626"
+    const-string/jumbo v0, "43627"
+    const-string/jumbo v0, "43628"
+    const-string/jumbo v0, "43629"
+    const-string/jumbo v0, "43630"
+    const-string/jumbo v0, "43631"
+    const-string/jumbo v0, "43632"
+    const-string/jumbo v0, "43633"
+    const-string/jumbo v0, "43634"
+    const-string/jumbo v0, "43635"
+    const-string/jumbo v0, "43636"
+    const-string/jumbo v0, "43637"
+    const-string/jumbo v0, "43638"
+    const-string/jumbo v0, "43639"
+    const-string/jumbo v0, "43640"
+    const-string/jumbo v0, "43641"
+    const-string/jumbo v0, "43642"
+    const-string/jumbo v0, "43643"
+    const-string/jumbo v0, "43644"
+    const-string/jumbo v0, "43645"
+    const-string/jumbo v0, "43646"
+    const-string/jumbo v0, "43647"
+    const-string/jumbo v0, "43648"
+    const-string/jumbo v0, "43649"
+    const-string/jumbo v0, "43650"
+    const-string/jumbo v0, "43651"
+    const-string/jumbo v0, "43652"
+    const-string/jumbo v0, "43653"
+    const-string/jumbo v0, "43654"
+    const-string/jumbo v0, "43655"
+    const-string/jumbo v0, "43656"
+    const-string/jumbo v0, "43657"
+    const-string/jumbo v0, "43658"
+    const-string/jumbo v0, "43659"
+    const-string/jumbo v0, "43660"
+    const-string/jumbo v0, "43661"
+    const-string/jumbo v0, "43662"
+    const-string/jumbo v0, "43663"
+    const-string/jumbo v0, "43664"
+    const-string/jumbo v0, "43665"
+    const-string/jumbo v0, "43666"
+    const-string/jumbo v0, "43667"
+    const-string/jumbo v0, "43668"
+    const-string/jumbo v0, "43669"
+    const-string/jumbo v0, "43670"
+    const-string/jumbo v0, "43671"
+    const-string/jumbo v0, "43672"
+    const-string/jumbo v0, "43673"
+    const-string/jumbo v0, "43674"
+    const-string/jumbo v0, "43675"
+    const-string/jumbo v0, "43676"
+    const-string/jumbo v0, "43677"
+    const-string/jumbo v0, "43678"
+    const-string/jumbo v0, "43679"
+    const-string/jumbo v0, "43680"
+    const-string/jumbo v0, "43681"
+    const-string/jumbo v0, "43682"
+    const-string/jumbo v0, "43683"
+    const-string/jumbo v0, "43684"
+    const-string/jumbo v0, "43685"
+    const-string/jumbo v0, "43686"
+    const-string/jumbo v0, "43687"
+    const-string/jumbo v0, "43688"
+    const-string/jumbo v0, "43689"
+    const-string/jumbo v0, "43690"
+    const-string/jumbo v0, "43691"
+    const-string/jumbo v0, "43692"
+    const-string/jumbo v0, "43693"
+    const-string/jumbo v0, "43694"
+    const-string/jumbo v0, "43695"
+    const-string/jumbo v0, "43696"
+    const-string/jumbo v0, "43697"
+    const-string/jumbo v0, "43698"
+    const-string/jumbo v0, "43699"
+    const-string/jumbo v0, "43700"
+    const-string/jumbo v0, "43701"
+    const-string/jumbo v0, "43702"
+    const-string/jumbo v0, "43703"
+    const-string/jumbo v0, "43704"
+    const-string/jumbo v0, "43705"
+    const-string/jumbo v0, "43706"
+    const-string/jumbo v0, "43707"
+    const-string/jumbo v0, "43708"
+    const-string/jumbo v0, "43709"
+    const-string/jumbo v0, "43710"
+    const-string/jumbo v0, "43711"
+    const-string/jumbo v0, "43712"
+    const-string/jumbo v0, "43713"
+    const-string/jumbo v0, "43714"
+    const-string/jumbo v0, "43715"
+    const-string/jumbo v0, "43716"
+    const-string/jumbo v0, "43717"
+    const-string/jumbo v0, "43718"
+    const-string/jumbo v0, "43719"
+    const-string/jumbo v0, "43720"
+    const-string/jumbo v0, "43721"
+    const-string/jumbo v0, "43722"
+    const-string/jumbo v0, "43723"
+    const-string/jumbo v0, "43724"
+    const-string/jumbo v0, "43725"
+    const-string/jumbo v0, "43726"
+    const-string/jumbo v0, "43727"
+    const-string/jumbo v0, "43728"
+    const-string/jumbo v0, "43729"
+    const-string/jumbo v0, "43730"
+    const-string/jumbo v0, "43731"
+    const-string/jumbo v0, "43732"
+    const-string/jumbo v0, "43733"
+    const-string/jumbo v0, "43734"
+    const-string/jumbo v0, "43735"
+    const-string/jumbo v0, "43736"
+    const-string/jumbo v0, "43737"
+    const-string/jumbo v0, "43738"
+    const-string/jumbo v0, "43739"
+    const-string/jumbo v0, "43740"
+    const-string/jumbo v0, "43741"
+    const-string/jumbo v0, "43742"
+    const-string/jumbo v0, "43743"
+    const-string/jumbo v0, "43744"
+    const-string/jumbo v0, "43745"
+    const-string/jumbo v0, "43746"
+    const-string/jumbo v0, "43747"
+    const-string/jumbo v0, "43748"
+    const-string/jumbo v0, "43749"
+    const-string/jumbo v0, "43750"
+    const-string/jumbo v0, "43751"
+    const-string/jumbo v0, "43752"
+    const-string/jumbo v0, "43753"
+    const-string/jumbo v0, "43754"
+    const-string/jumbo v0, "43755"
+    const-string/jumbo v0, "43756"
+    const-string/jumbo v0, "43757"
+    const-string/jumbo v0, "43758"
+    const-string/jumbo v0, "43759"
+    const-string/jumbo v0, "43760"
+    const-string/jumbo v0, "43761"
+    const-string/jumbo v0, "43762"
+    const-string/jumbo v0, "43763"
+    const-string/jumbo v0, "43764"
+    const-string/jumbo v0, "43765"
+    const-string/jumbo v0, "43766"
+    const-string/jumbo v0, "43767"
+    const-string/jumbo v0, "43768"
+    const-string/jumbo v0, "43769"
+    const-string/jumbo v0, "43770"
+    const-string/jumbo v0, "43771"
+    const-string/jumbo v0, "43772"
+    const-string/jumbo v0, "43773"
+    const-string/jumbo v0, "43774"
+    const-string/jumbo v0, "43775"
+    const-string/jumbo v0, "43776"
+    const-string/jumbo v0, "43777"
+    const-string/jumbo v0, "43778"
+    const-string/jumbo v0, "43779"
+    const-string/jumbo v0, "43780"
+    const-string/jumbo v0, "43781"
+    const-string/jumbo v0, "43782"
+    const-string/jumbo v0, "43783"
+    const-string/jumbo v0, "43784"
+    const-string/jumbo v0, "43785"
+    const-string/jumbo v0, "43786"
+    const-string/jumbo v0, "43787"
+    const-string/jumbo v0, "43788"
+    const-string/jumbo v0, "43789"
+    const-string/jumbo v0, "43790"
+    const-string/jumbo v0, "43791"
+    const-string/jumbo v0, "43792"
+    const-string/jumbo v0, "43793"
+    const-string/jumbo v0, "43794"
+    const-string/jumbo v0, "43795"
+    const-string/jumbo v0, "43796"
+    const-string/jumbo v0, "43797"
+    const-string/jumbo v0, "43798"
+    const-string/jumbo v0, "43799"
+    const-string/jumbo v0, "43800"
+    const-string/jumbo v0, "43801"
+    const-string/jumbo v0, "43802"
+    const-string/jumbo v0, "43803"
+    const-string/jumbo v0, "43804"
+    const-string/jumbo v0, "43805"
+    const-string/jumbo v0, "43806"
+    const-string/jumbo v0, "43807"
+    const-string/jumbo v0, "43808"
+    const-string/jumbo v0, "43809"
+    const-string/jumbo v0, "43810"
+    const-string/jumbo v0, "43811"
+    const-string/jumbo v0, "43812"
+    const-string/jumbo v0, "43813"
+    const-string/jumbo v0, "43814"
+    const-string/jumbo v0, "43815"
+    const-string/jumbo v0, "43816"
+    const-string/jumbo v0, "43817"
+    const-string/jumbo v0, "43818"
+    const-string/jumbo v0, "43819"
+    const-string/jumbo v0, "43820"
+    const-string/jumbo v0, "43821"
+    const-string/jumbo v0, "43822"
+    const-string/jumbo v0, "43823"
+    const-string/jumbo v0, "43824"
+    const-string/jumbo v0, "43825"
+    const-string/jumbo v0, "43826"
+    const-string/jumbo v0, "43827"
+    const-string/jumbo v0, "43828"
+    const-string/jumbo v0, "43829"
+    const-string/jumbo v0, "43830"
+    const-string/jumbo v0, "43831"
+    const-string/jumbo v0, "43832"
+    const-string/jumbo v0, "43833"
+    const-string/jumbo v0, "43834"
+    const-string/jumbo v0, "43835"
+    const-string/jumbo v0, "43836"
+    const-string/jumbo v0, "43837"
+    const-string/jumbo v0, "43838"
+    const-string/jumbo v0, "43839"
+    const-string/jumbo v0, "43840"
+    const-string/jumbo v0, "43841"
+    const-string/jumbo v0, "43842"
+    const-string/jumbo v0, "43843"
+    const-string/jumbo v0, "43844"
+    const-string/jumbo v0, "43845"
+    const-string/jumbo v0, "43846"
+    const-string/jumbo v0, "43847"
+    const-string/jumbo v0, "43848"
+    const-string/jumbo v0, "43849"
+    const-string/jumbo v0, "43850"
+    const-string/jumbo v0, "43851"
+    const-string/jumbo v0, "43852"
+    const-string/jumbo v0, "43853"
+    const-string/jumbo v0, "43854"
+    const-string/jumbo v0, "43855"
+    const-string/jumbo v0, "43856"
+    const-string/jumbo v0, "43857"
+    const-string/jumbo v0, "43858"
+    const-string/jumbo v0, "43859"
+    const-string/jumbo v0, "43860"
+    const-string/jumbo v0, "43861"
+    const-string/jumbo v0, "43862"
+    const-string/jumbo v0, "43863"
+    const-string/jumbo v0, "43864"
+    const-string/jumbo v0, "43865"
+    const-string/jumbo v0, "43866"
+    const-string/jumbo v0, "43867"
+    const-string/jumbo v0, "43868"
+    const-string/jumbo v0, "43869"
+    const-string/jumbo v0, "43870"
+    const-string/jumbo v0, "43871"
+    const-string/jumbo v0, "43872"
+    const-string/jumbo v0, "43873"
+    const-string/jumbo v0, "43874"
+    const-string/jumbo v0, "43875"
+    const-string/jumbo v0, "43876"
+    const-string/jumbo v0, "43877"
+    const-string/jumbo v0, "43878"
+    const-string/jumbo v0, "43879"
+    const-string/jumbo v0, "43880"
+    const-string/jumbo v0, "43881"
+    const-string/jumbo v0, "43882"
+    const-string/jumbo v0, "43883"
+    const-string/jumbo v0, "43884"
+    const-string/jumbo v0, "43885"
+    const-string/jumbo v0, "43886"
+    const-string/jumbo v0, "43887"
+    const-string/jumbo v0, "43888"
+    const-string/jumbo v0, "43889"
+    const-string/jumbo v0, "43890"
+    const-string/jumbo v0, "43891"
+    const-string/jumbo v0, "43892"
+    const-string/jumbo v0, "43893"
+    const-string/jumbo v0, "43894"
+    const-string/jumbo v0, "43895"
+    const-string/jumbo v0, "43896"
+    const-string/jumbo v0, "43897"
+    const-string/jumbo v0, "43898"
+    const-string/jumbo v0, "43899"
+    const-string/jumbo v0, "43900"
+    const-string/jumbo v0, "43901"
+    const-string/jumbo v0, "43902"
+    const-string/jumbo v0, "43903"
+    const-string/jumbo v0, "43904"
+    const-string/jumbo v0, "43905"
+    const-string/jumbo v0, "43906"
+    const-string/jumbo v0, "43907"
+    const-string/jumbo v0, "43908"
+    const-string/jumbo v0, "43909"
+    const-string/jumbo v0, "43910"
+    const-string/jumbo v0, "43911"
+    const-string/jumbo v0, "43912"
+    const-string/jumbo v0, "43913"
+    const-string/jumbo v0, "43914"
+    const-string/jumbo v0, "43915"
+    const-string/jumbo v0, "43916"
+    const-string/jumbo v0, "43917"
+    const-string/jumbo v0, "43918"
+    const-string/jumbo v0, "43919"
+    const-string/jumbo v0, "43920"
+    const-string/jumbo v0, "43921"
+    const-string/jumbo v0, "43922"
+    const-string/jumbo v0, "43923"
+    const-string/jumbo v0, "43924"
+    const-string/jumbo v0, "43925"
+    const-string/jumbo v0, "43926"
+    const-string/jumbo v0, "43927"
+    const-string/jumbo v0, "43928"
+    const-string/jumbo v0, "43929"
+    const-string/jumbo v0, "43930"
+    const-string/jumbo v0, "43931"
+    const-string/jumbo v0, "43932"
+    const-string/jumbo v0, "43933"
+    const-string/jumbo v0, "43934"
+    const-string/jumbo v0, "43935"
+    const-string/jumbo v0, "43936"
+    const-string/jumbo v0, "43937"
+    const-string/jumbo v0, "43938"
+    const-string/jumbo v0, "43939"
+    const-string/jumbo v0, "43940"
+    const-string/jumbo v0, "43941"
+    const-string/jumbo v0, "43942"
+    const-string/jumbo v0, "43943"
+    const-string/jumbo v0, "43944"
+    const-string/jumbo v0, "43945"
+    const-string/jumbo v0, "43946"
+    const-string/jumbo v0, "43947"
+    const-string/jumbo v0, "43948"
+    const-string/jumbo v0, "43949"
+    const-string/jumbo v0, "43950"
+    const-string/jumbo v0, "43951"
+    const-string/jumbo v0, "43952"
+    const-string/jumbo v0, "43953"
+    const-string/jumbo v0, "43954"
+    const-string/jumbo v0, "43955"
+    const-string/jumbo v0, "43956"
+    const-string/jumbo v0, "43957"
+    const-string/jumbo v0, "43958"
+    const-string/jumbo v0, "43959"
+    const-string/jumbo v0, "43960"
+    const-string/jumbo v0, "43961"
+    const-string/jumbo v0, "43962"
+    const-string/jumbo v0, "43963"
+    const-string/jumbo v0, "43964"
+    const-string/jumbo v0, "43965"
+    const-string/jumbo v0, "43966"
+    const-string/jumbo v0, "43967"
+    const-string/jumbo v0, "43968"
+    const-string/jumbo v0, "43969"
+    const-string/jumbo v0, "43970"
+    const-string/jumbo v0, "43971"
+    const-string/jumbo v0, "43972"
+    const-string/jumbo v0, "43973"
+    const-string/jumbo v0, "43974"
+    const-string/jumbo v0, "43975"
+    const-string/jumbo v0, "43976"
+    const-string/jumbo v0, "43977"
+    const-string/jumbo v0, "43978"
+    const-string/jumbo v0, "43979"
+    const-string/jumbo v0, "43980"
+    const-string/jumbo v0, "43981"
+    const-string/jumbo v0, "43982"
+    const-string/jumbo v0, "43983"
+    const-string/jumbo v0, "43984"
+    const-string/jumbo v0, "43985"
+    const-string/jumbo v0, "43986"
+    const-string/jumbo v0, "43987"
+    const-string/jumbo v0, "43988"
+    const-string/jumbo v0, "43989"
+    const-string/jumbo v0, "43990"
+    const-string/jumbo v0, "43991"
+    const-string/jumbo v0, "43992"
+    const-string/jumbo v0, "43993"
+    const-string/jumbo v0, "43994"
+    const-string/jumbo v0, "43995"
+    const-string/jumbo v0, "43996"
+    const-string/jumbo v0, "43997"
+    const-string/jumbo v0, "43998"
+    const-string/jumbo v0, "43999"
+    const-string/jumbo v0, "44000"
+    const-string/jumbo v0, "44001"
+    const-string/jumbo v0, "44002"
+    const-string/jumbo v0, "44003"
+    const-string/jumbo v0, "44004"
+    const-string/jumbo v0, "44005"
+    const-string/jumbo v0, "44006"
+    const-string/jumbo v0, "44007"
+    const-string/jumbo v0, "44008"
+    const-string/jumbo v0, "44009"
+    const-string/jumbo v0, "44010"
+    const-string/jumbo v0, "44011"
+    const-string/jumbo v0, "44012"
+    const-string/jumbo v0, "44013"
+    const-string/jumbo v0, "44014"
+    const-string/jumbo v0, "44015"
+    const-string/jumbo v0, "44016"
+    const-string/jumbo v0, "44017"
+    const-string/jumbo v0, "44018"
+    const-string/jumbo v0, "44019"
+    const-string/jumbo v0, "44020"
+    const-string/jumbo v0, "44021"
+    const-string/jumbo v0, "44022"
+    const-string/jumbo v0, "44023"
+    const-string/jumbo v0, "44024"
+    const-string/jumbo v0, "44025"
+    const-string/jumbo v0, "44026"
+    const-string/jumbo v0, "44027"
+    const-string/jumbo v0, "44028"
+    const-string/jumbo v0, "44029"
+    const-string/jumbo v0, "44030"
+    const-string/jumbo v0, "44031"
+    const-string/jumbo v0, "44032"
+    const-string/jumbo v0, "44033"
+    const-string/jumbo v0, "44034"
+    const-string/jumbo v0, "44035"
+    const-string/jumbo v0, "44036"
+    const-string/jumbo v0, "44037"
+    const-string/jumbo v0, "44038"
+    const-string/jumbo v0, "44039"
+    const-string/jumbo v0, "44040"
+    const-string/jumbo v0, "44041"
+    const-string/jumbo v0, "44042"
+    const-string/jumbo v0, "44043"
+    const-string/jumbo v0, "44044"
+    const-string/jumbo v0, "44045"
+    const-string/jumbo v0, "44046"
+    const-string/jumbo v0, "44047"
+    const-string/jumbo v0, "44048"
+    const-string/jumbo v0, "44049"
+    const-string/jumbo v0, "44050"
+    const-string/jumbo v0, "44051"
+    const-string/jumbo v0, "44052"
+    const-string/jumbo v0, "44053"
+    const-string/jumbo v0, "44054"
+    const-string/jumbo v0, "44055"
+    const-string/jumbo v0, "44056"
+    const-string/jumbo v0, "44057"
+    const-string/jumbo v0, "44058"
+    const-string/jumbo v0, "44059"
+    const-string/jumbo v0, "44060"
+    const-string/jumbo v0, "44061"
+    const-string/jumbo v0, "44062"
+    const-string/jumbo v0, "44063"
+    const-string/jumbo v0, "44064"
+    const-string/jumbo v0, "44065"
+    const-string/jumbo v0, "44066"
+    const-string/jumbo v0, "44067"
+    const-string/jumbo v0, "44068"
+    const-string/jumbo v0, "44069"
+    const-string/jumbo v0, "44070"
+    const-string/jumbo v0, "44071"
+    const-string/jumbo v0, "44072"
+    const-string/jumbo v0, "44073"
+    const-string/jumbo v0, "44074"
+    const-string/jumbo v0, "44075"
+    const-string/jumbo v0, "44076"
+    const-string/jumbo v0, "44077"
+    const-string/jumbo v0, "44078"
+    const-string/jumbo v0, "44079"
+    const-string/jumbo v0, "44080"
+    const-string/jumbo v0, "44081"
+    const-string/jumbo v0, "44082"
+    const-string/jumbo v0, "44083"
+    const-string/jumbo v0, "44084"
+    const-string/jumbo v0, "44085"
+    const-string/jumbo v0, "44086"
+    const-string/jumbo v0, "44087"
+    const-string/jumbo v0, "44088"
+    const-string/jumbo v0, "44089"
+    const-string/jumbo v0, "44090"
+    const-string/jumbo v0, "44091"
+    const-string/jumbo v0, "44092"
+    const-string/jumbo v0, "44093"
+    const-string/jumbo v0, "44094"
+    const-string/jumbo v0, "44095"
+    const-string/jumbo v0, "44096"
+    const-string/jumbo v0, "44097"
+    const-string/jumbo v0, "44098"
+    const-string/jumbo v0, "44099"
+    const-string/jumbo v0, "44100"
+    const-string/jumbo v0, "44101"
+    const-string/jumbo v0, "44102"
+    const-string/jumbo v0, "44103"
+    const-string/jumbo v0, "44104"
+    const-string/jumbo v0, "44105"
+    const-string/jumbo v0, "44106"
+    const-string/jumbo v0, "44107"
+    const-string/jumbo v0, "44108"
+    const-string/jumbo v0, "44109"
+    const-string/jumbo v0, "44110"
+    const-string/jumbo v0, "44111"
+    const-string/jumbo v0, "44112"
+    const-string/jumbo v0, "44113"
+    const-string/jumbo v0, "44114"
+    const-string/jumbo v0, "44115"
+    const-string/jumbo v0, "44116"
+    const-string/jumbo v0, "44117"
+    const-string/jumbo v0, "44118"
+    const-string/jumbo v0, "44119"
+    const-string/jumbo v0, "44120"
+    const-string/jumbo v0, "44121"
+    const-string/jumbo v0, "44122"
+    const-string/jumbo v0, "44123"
+    const-string/jumbo v0, "44124"
+    const-string/jumbo v0, "44125"
+    const-string/jumbo v0, "44126"
+    const-string/jumbo v0, "44127"
+    const-string/jumbo v0, "44128"
+    const-string/jumbo v0, "44129"
+    const-string/jumbo v0, "44130"
+    const-string/jumbo v0, "44131"
+    const-string/jumbo v0, "44132"
+    const-string/jumbo v0, "44133"
+    const-string/jumbo v0, "44134"
+    const-string/jumbo v0, "44135"
+    const-string/jumbo v0, "44136"
+    const-string/jumbo v0, "44137"
+    const-string/jumbo v0, "44138"
+    const-string/jumbo v0, "44139"
+    const-string/jumbo v0, "44140"
+    const-string/jumbo v0, "44141"
+    const-string/jumbo v0, "44142"
+    const-string/jumbo v0, "44143"
+    const-string/jumbo v0, "44144"
+    const-string/jumbo v0, "44145"
+    const-string/jumbo v0, "44146"
+    const-string/jumbo v0, "44147"
+    const-string/jumbo v0, "44148"
+    const-string/jumbo v0, "44149"
+    const-string/jumbo v0, "44150"
+    const-string/jumbo v0, "44151"
+    const-string/jumbo v0, "44152"
+    const-string/jumbo v0, "44153"
+    const-string/jumbo v0, "44154"
+    const-string/jumbo v0, "44155"
+    const-string/jumbo v0, "44156"
+    const-string/jumbo v0, "44157"
+    const-string/jumbo v0, "44158"
+    const-string/jumbo v0, "44159"
+    const-string/jumbo v0, "44160"
+    const-string/jumbo v0, "44161"
+    const-string/jumbo v0, "44162"
+    const-string/jumbo v0, "44163"
+    const-string/jumbo v0, "44164"
+    const-string/jumbo v0, "44165"
+    const-string/jumbo v0, "44166"
+    const-string/jumbo v0, "44167"
+    const-string/jumbo v0, "44168"
+    const-string/jumbo v0, "44169"
+    const-string/jumbo v0, "44170"
+    const-string/jumbo v0, "44171"
+    const-string/jumbo v0, "44172"
+    const-string/jumbo v0, "44173"
+    const-string/jumbo v0, "44174"
+    const-string/jumbo v0, "44175"
+    const-string/jumbo v0, "44176"
+    const-string/jumbo v0, "44177"
+    const-string/jumbo v0, "44178"
+    const-string/jumbo v0, "44179"
+    const-string/jumbo v0, "44180"
+    const-string/jumbo v0, "44181"
+    const-string/jumbo v0, "44182"
+    const-string/jumbo v0, "44183"
+    const-string/jumbo v0, "44184"
+    const-string/jumbo v0, "44185"
+    const-string/jumbo v0, "44186"
+    const-string/jumbo v0, "44187"
+    const-string/jumbo v0, "44188"
+    const-string/jumbo v0, "44189"
+    const-string/jumbo v0, "44190"
+    const-string/jumbo v0, "44191"
+    const-string/jumbo v0, "44192"
+    const-string/jumbo v0, "44193"
+    const-string/jumbo v0, "44194"
+    const-string/jumbo v0, "44195"
+    const-string/jumbo v0, "44196"
+    const-string/jumbo v0, "44197"
+    const-string/jumbo v0, "44198"
+    const-string/jumbo v0, "44199"
+    const-string/jumbo v0, "44200"
+    const-string/jumbo v0, "44201"
+    const-string/jumbo v0, "44202"
+    const-string/jumbo v0, "44203"
+    const-string/jumbo v0, "44204"
+    const-string/jumbo v0, "44205"
+    const-string/jumbo v0, "44206"
+    const-string/jumbo v0, "44207"
+    const-string/jumbo v0, "44208"
+    const-string/jumbo v0, "44209"
+    const-string/jumbo v0, "44210"
+    const-string/jumbo v0, "44211"
+    const-string/jumbo v0, "44212"
+    const-string/jumbo v0, "44213"
+    const-string/jumbo v0, "44214"
+    const-string/jumbo v0, "44215"
+    const-string/jumbo v0, "44216"
+    const-string/jumbo v0, "44217"
+    const-string/jumbo v0, "44218"
+    const-string/jumbo v0, "44219"
+    const-string/jumbo v0, "44220"
+    const-string/jumbo v0, "44221"
+    const-string/jumbo v0, "44222"
+    const-string/jumbo v0, "44223"
+    const-string/jumbo v0, "44224"
+    const-string/jumbo v0, "44225"
+    const-string/jumbo v0, "44226"
+    const-string/jumbo v0, "44227"
+    const-string/jumbo v0, "44228"
+    const-string/jumbo v0, "44229"
+    const-string/jumbo v0, "44230"
+    const-string/jumbo v0, "44231"
+    const-string/jumbo v0, "44232"
+    const-string/jumbo v0, "44233"
+    const-string/jumbo v0, "44234"
+    const-string/jumbo v0, "44235"
+    const-string/jumbo v0, "44236"
+    const-string/jumbo v0, "44237"
+    const-string/jumbo v0, "44238"
+    const-string/jumbo v0, "44239"
+    const-string/jumbo v0, "44240"
+    const-string/jumbo v0, "44241"
+    const-string/jumbo v0, "44242"
+    const-string/jumbo v0, "44243"
+    const-string/jumbo v0, "44244"
+    const-string/jumbo v0, "44245"
+    const-string/jumbo v0, "44246"
+    const-string/jumbo v0, "44247"
+    const-string/jumbo v0, "44248"
+    const-string/jumbo v0, "44249"
+    const-string/jumbo v0, "44250"
+    const-string/jumbo v0, "44251"
+    const-string/jumbo v0, "44252"
+    const-string/jumbo v0, "44253"
+    const-string/jumbo v0, "44254"
+    const-string/jumbo v0, "44255"
+    const-string/jumbo v0, "44256"
+    const-string/jumbo v0, "44257"
+    const-string/jumbo v0, "44258"
+    const-string/jumbo v0, "44259"
+    const-string/jumbo v0, "44260"
+    const-string/jumbo v0, "44261"
+    const-string/jumbo v0, "44262"
+    const-string/jumbo v0, "44263"
+    const-string/jumbo v0, "44264"
+    const-string/jumbo v0, "44265"
+    const-string/jumbo v0, "44266"
+    const-string/jumbo v0, "44267"
+    const-string/jumbo v0, "44268"
+    const-string/jumbo v0, "44269"
+    const-string/jumbo v0, "44270"
+    const-string/jumbo v0, "44271"
+    const-string/jumbo v0, "44272"
+    const-string/jumbo v0, "44273"
+    const-string/jumbo v0, "44274"
+    const-string/jumbo v0, "44275"
+    const-string/jumbo v0, "44276"
+    const-string/jumbo v0, "44277"
+    const-string/jumbo v0, "44278"
+    const-string/jumbo v0, "44279"
+    const-string/jumbo v0, "44280"
+    const-string/jumbo v0, "44281"
+    const-string/jumbo v0, "44282"
+    const-string/jumbo v0, "44283"
+    const-string/jumbo v0, "44284"
+    const-string/jumbo v0, "44285"
+    const-string/jumbo v0, "44286"
+    const-string/jumbo v0, "44287"
+    const-string/jumbo v0, "44288"
+    const-string/jumbo v0, "44289"
+    const-string/jumbo v0, "44290"
+    const-string/jumbo v0, "44291"
+    const-string/jumbo v0, "44292"
+    const-string/jumbo v0, "44293"
+    const-string/jumbo v0, "44294"
+    const-string/jumbo v0, "44295"
+    const-string/jumbo v0, "44296"
+    const-string/jumbo v0, "44297"
+    const-string/jumbo v0, "44298"
+    const-string/jumbo v0, "44299"
+    const-string/jumbo v0, "44300"
+    const-string/jumbo v0, "44301"
+    const-string/jumbo v0, "44302"
+    const-string/jumbo v0, "44303"
+    const-string/jumbo v0, "44304"
+    const-string/jumbo v0, "44305"
+    const-string/jumbo v0, "44306"
+    const-string/jumbo v0, "44307"
+    const-string/jumbo v0, "44308"
+    const-string/jumbo v0, "44309"
+    const-string/jumbo v0, "44310"
+    const-string/jumbo v0, "44311"
+    const-string/jumbo v0, "44312"
+    const-string/jumbo v0, "44313"
+    const-string/jumbo v0, "44314"
+    const-string/jumbo v0, "44315"
+    const-string/jumbo v0, "44316"
+    const-string/jumbo v0, "44317"
+    const-string/jumbo v0, "44318"
+    const-string/jumbo v0, "44319"
+    const-string/jumbo v0, "44320"
+    const-string/jumbo v0, "44321"
+    const-string/jumbo v0, "44322"
+    const-string/jumbo v0, "44323"
+    const-string/jumbo v0, "44324"
+    const-string/jumbo v0, "44325"
+    const-string/jumbo v0, "44326"
+    const-string/jumbo v0, "44327"
+    const-string/jumbo v0, "44328"
+    const-string/jumbo v0, "44329"
+    const-string/jumbo v0, "44330"
+    const-string/jumbo v0, "44331"
+    const-string/jumbo v0, "44332"
+    const-string/jumbo v0, "44333"
+    const-string/jumbo v0, "44334"
+    const-string/jumbo v0, "44335"
+    const-string/jumbo v0, "44336"
+    const-string/jumbo v0, "44337"
+    const-string/jumbo v0, "44338"
+    const-string/jumbo v0, "44339"
+    const-string/jumbo v0, "44340"
+    const-string/jumbo v0, "44341"
+    const-string/jumbo v0, "44342"
+    const-string/jumbo v0, "44343"
+    const-string/jumbo v0, "44344"
+    const-string/jumbo v0, "44345"
+    const-string/jumbo v0, "44346"
+    const-string/jumbo v0, "44347"
+    const-string/jumbo v0, "44348"
+    const-string/jumbo v0, "44349"
+    const-string/jumbo v0, "44350"
+    const-string/jumbo v0, "44351"
+    const-string/jumbo v0, "44352"
+    const-string/jumbo v0, "44353"
+    const-string/jumbo v0, "44354"
+    const-string/jumbo v0, "44355"
+    const-string/jumbo v0, "44356"
+    const-string/jumbo v0, "44357"
+    const-string/jumbo v0, "44358"
+    const-string/jumbo v0, "44359"
+    const-string/jumbo v0, "44360"
+    const-string/jumbo v0, "44361"
+    const-string/jumbo v0, "44362"
+    const-string/jumbo v0, "44363"
+    const-string/jumbo v0, "44364"
+    const-string/jumbo v0, "44365"
+    const-string/jumbo v0, "44366"
+    const-string/jumbo v0, "44367"
+    const-string/jumbo v0, "44368"
+    const-string/jumbo v0, "44369"
+    const-string/jumbo v0, "44370"
+    const-string/jumbo v0, "44371"
+    const-string/jumbo v0, "44372"
+    const-string/jumbo v0, "44373"
+    const-string/jumbo v0, "44374"
+    const-string/jumbo v0, "44375"
+    const-string/jumbo v0, "44376"
+    const-string/jumbo v0, "44377"
+    const-string/jumbo v0, "44378"
+    const-string/jumbo v0, "44379"
+    const-string/jumbo v0, "44380"
+    const-string/jumbo v0, "44381"
+    const-string/jumbo v0, "44382"
+    const-string/jumbo v0, "44383"
+    const-string/jumbo v0, "44384"
+    const-string/jumbo v0, "44385"
+    const-string/jumbo v0, "44386"
+    const-string/jumbo v0, "44387"
+    const-string/jumbo v0, "44388"
+    const-string/jumbo v0, "44389"
+    const-string/jumbo v0, "44390"
+    const-string/jumbo v0, "44391"
+    const-string/jumbo v0, "44392"
+    const-string/jumbo v0, "44393"
+    const-string/jumbo v0, "44394"
+    const-string/jumbo v0, "44395"
+    const-string/jumbo v0, "44396"
+    const-string/jumbo v0, "44397"
+    const-string/jumbo v0, "44398"
+    const-string/jumbo v0, "44399"
+    const-string/jumbo v0, "44400"
+    const-string/jumbo v0, "44401"
+    const-string/jumbo v0, "44402"
+    const-string/jumbo v0, "44403"
+    const-string/jumbo v0, "44404"
+    const-string/jumbo v0, "44405"
+    const-string/jumbo v0, "44406"
+    const-string/jumbo v0, "44407"
+    const-string/jumbo v0, "44408"
+    const-string/jumbo v0, "44409"
+    const-string/jumbo v0, "44410"
+    const-string/jumbo v0, "44411"
+    const-string/jumbo v0, "44412"
+    const-string/jumbo v0, "44413"
+    const-string/jumbo v0, "44414"
+    const-string/jumbo v0, "44415"
+    const-string/jumbo v0, "44416"
+    const-string/jumbo v0, "44417"
+    const-string/jumbo v0, "44418"
+    const-string/jumbo v0, "44419"
+    const-string/jumbo v0, "44420"
+    const-string/jumbo v0, "44421"
+    const-string/jumbo v0, "44422"
+    const-string/jumbo v0, "44423"
+    const-string/jumbo v0, "44424"
+    const-string/jumbo v0, "44425"
+    const-string/jumbo v0, "44426"
+    const-string/jumbo v0, "44427"
+    const-string/jumbo v0, "44428"
+    const-string/jumbo v0, "44429"
+    const-string/jumbo v0, "44430"
+    const-string/jumbo v0, "44431"
+    const-string/jumbo v0, "44432"
+    const-string/jumbo v0, "44433"
+    const-string/jumbo v0, "44434"
+    const-string/jumbo v0, "44435"
+    const-string/jumbo v0, "44436"
+    const-string/jumbo v0, "44437"
+    const-string/jumbo v0, "44438"
+    const-string/jumbo v0, "44439"
+    const-string/jumbo v0, "44440"
+    const-string/jumbo v0, "44441"
+    const-string/jumbo v0, "44442"
+    const-string/jumbo v0, "44443"
+    const-string/jumbo v0, "44444"
+    const-string/jumbo v0, "44445"
+    const-string/jumbo v0, "44446"
+    const-string/jumbo v0, "44447"
+    const-string/jumbo v0, "44448"
+    const-string/jumbo v0, "44449"
+    const-string/jumbo v0, "44450"
+    const-string/jumbo v0, "44451"
+    const-string/jumbo v0, "44452"
+    const-string/jumbo v0, "44453"
+    const-string/jumbo v0, "44454"
+    const-string/jumbo v0, "44455"
+    const-string/jumbo v0, "44456"
+    const-string/jumbo v0, "44457"
+    const-string/jumbo v0, "44458"
+    const-string/jumbo v0, "44459"
+    const-string/jumbo v0, "44460"
+    const-string/jumbo v0, "44461"
+    const-string/jumbo v0, "44462"
+    const-string/jumbo v0, "44463"
+    const-string/jumbo v0, "44464"
+    const-string/jumbo v0, "44465"
+    const-string/jumbo v0, "44466"
+    const-string/jumbo v0, "44467"
+    const-string/jumbo v0, "44468"
+    const-string/jumbo v0, "44469"
+    const-string/jumbo v0, "44470"
+    const-string/jumbo v0, "44471"
+    const-string/jumbo v0, "44472"
+    const-string/jumbo v0, "44473"
+    const-string/jumbo v0, "44474"
+    const-string/jumbo v0, "44475"
+    const-string/jumbo v0, "44476"
+    const-string/jumbo v0, "44477"
+    const-string/jumbo v0, "44478"
+    const-string/jumbo v0, "44479"
+    const-string/jumbo v0, "44480"
+    const-string/jumbo v0, "44481"
+    const-string/jumbo v0, "44482"
+    const-string/jumbo v0, "44483"
+    const-string/jumbo v0, "44484"
+    const-string/jumbo v0, "44485"
+    const-string/jumbo v0, "44486"
+    const-string/jumbo v0, "44487"
+    const-string/jumbo v0, "44488"
+    const-string/jumbo v0, "44489"
+    const-string/jumbo v0, "44490"
+    const-string/jumbo v0, "44491"
+    const-string/jumbo v0, "44492"
+    const-string/jumbo v0, "44493"
+    const-string/jumbo v0, "44494"
+    const-string/jumbo v0, "44495"
+    const-string/jumbo v0, "44496"
+    const-string/jumbo v0, "44497"
+    const-string/jumbo v0, "44498"
+    const-string/jumbo v0, "44499"
+    const-string/jumbo v0, "44500"
+    const-string/jumbo v0, "44501"
+    const-string/jumbo v0, "44502"
+    const-string/jumbo v0, "44503"
+    const-string/jumbo v0, "44504"
+    const-string/jumbo v0, "44505"
+    const-string/jumbo v0, "44506"
+    const-string/jumbo v0, "44507"
+    const-string/jumbo v0, "44508"
+    const-string/jumbo v0, "44509"
+    const-string/jumbo v0, "44510"
+    const-string/jumbo v0, "44511"
+    const-string/jumbo v0, "44512"
+    const-string/jumbo v0, "44513"
+    const-string/jumbo v0, "44514"
+    const-string/jumbo v0, "44515"
+    const-string/jumbo v0, "44516"
+    const-string/jumbo v0, "44517"
+    const-string/jumbo v0, "44518"
+    const-string/jumbo v0, "44519"
+    const-string/jumbo v0, "44520"
+    const-string/jumbo v0, "44521"
+    const-string/jumbo v0, "44522"
+    const-string/jumbo v0, "44523"
+    const-string/jumbo v0, "44524"
+    const-string/jumbo v0, "44525"
+    const-string/jumbo v0, "44526"
+    const-string/jumbo v0, "44527"
+    const-string/jumbo v0, "44528"
+    const-string/jumbo v0, "44529"
+    const-string/jumbo v0, "44530"
+    const-string/jumbo v0, "44531"
+    const-string/jumbo v0, "44532"
+    const-string/jumbo v0, "44533"
+    const-string/jumbo v0, "44534"
+    const-string/jumbo v0, "44535"
+    const-string/jumbo v0, "44536"
+    const-string/jumbo v0, "44537"
+    const-string/jumbo v0, "44538"
+    const-string/jumbo v0, "44539"
+    const-string/jumbo v0, "44540"
+    const-string/jumbo v0, "44541"
+    const-string/jumbo v0, "44542"
+    const-string/jumbo v0, "44543"
+    const-string/jumbo v0, "44544"
+    const-string/jumbo v0, "44545"
+    const-string/jumbo v0, "44546"
+    const-string/jumbo v0, "44547"
+    const-string/jumbo v0, "44548"
+    const-string/jumbo v0, "44549"
+    const-string/jumbo v0, "44550"
+    const-string/jumbo v0, "44551"
+    const-string/jumbo v0, "44552"
+    const-string/jumbo v0, "44553"
+    const-string/jumbo v0, "44554"
+    const-string/jumbo v0, "44555"
+    const-string/jumbo v0, "44556"
+    const-string/jumbo v0, "44557"
+    const-string/jumbo v0, "44558"
+    const-string/jumbo v0, "44559"
+    const-string/jumbo v0, "44560"
+    const-string/jumbo v0, "44561"
+    const-string/jumbo v0, "44562"
+    const-string/jumbo v0, "44563"
+    const-string/jumbo v0, "44564"
+    const-string/jumbo v0, "44565"
+    const-string/jumbo v0, "44566"
+    const-string/jumbo v0, "44567"
+    const-string/jumbo v0, "44568"
+    const-string/jumbo v0, "44569"
+    const-string/jumbo v0, "44570"
+    const-string/jumbo v0, "44571"
+    const-string/jumbo v0, "44572"
+    const-string/jumbo v0, "44573"
+    const-string/jumbo v0, "44574"
+    const-string/jumbo v0, "44575"
+    const-string/jumbo v0, "44576"
+    const-string/jumbo v0, "44577"
+    const-string/jumbo v0, "44578"
+    const-string/jumbo v0, "44579"
+    const-string/jumbo v0, "44580"
+    const-string/jumbo v0, "44581"
+    const-string/jumbo v0, "44582"
+    const-string/jumbo v0, "44583"
+    const-string/jumbo v0, "44584"
+    const-string/jumbo v0, "44585"
+    const-string/jumbo v0, "44586"
+    const-string/jumbo v0, "44587"
+    const-string/jumbo v0, "44588"
+    const-string/jumbo v0, "44589"
+    const-string/jumbo v0, "44590"
+    const-string/jumbo v0, "44591"
+    const-string/jumbo v0, "44592"
+    const-string/jumbo v0, "44593"
+    const-string/jumbo v0, "44594"
+    const-string/jumbo v0, "44595"
+    const-string/jumbo v0, "44596"
+    const-string/jumbo v0, "44597"
+    const-string/jumbo v0, "44598"
+    const-string/jumbo v0, "44599"
+    const-string/jumbo v0, "44600"
+    const-string/jumbo v0, "44601"
+    const-string/jumbo v0, "44602"
+    const-string/jumbo v0, "44603"
+    const-string/jumbo v0, "44604"
+    const-string/jumbo v0, "44605"
+    const-string/jumbo v0, "44606"
+    const-string/jumbo v0, "44607"
+    const-string/jumbo v0, "44608"
+    const-string/jumbo v0, "44609"
+    const-string/jumbo v0, "44610"
+    const-string/jumbo v0, "44611"
+    const-string/jumbo v0, "44612"
+    const-string/jumbo v0, "44613"
+    const-string/jumbo v0, "44614"
+    const-string/jumbo v0, "44615"
+    const-string/jumbo v0, "44616"
+    const-string/jumbo v0, "44617"
+    const-string/jumbo v0, "44618"
+    const-string/jumbo v0, "44619"
+    const-string/jumbo v0, "44620"
+    const-string/jumbo v0, "44621"
+    const-string/jumbo v0, "44622"
+    const-string/jumbo v0, "44623"
+    const-string/jumbo v0, "44624"
+    const-string/jumbo v0, "44625"
+    const-string/jumbo v0, "44626"
+    const-string/jumbo v0, "44627"
+    const-string/jumbo v0, "44628"
+    const-string/jumbo v0, "44629"
+    const-string/jumbo v0, "44630"
+    const-string/jumbo v0, "44631"
+    const-string/jumbo v0, "44632"
+    const-string/jumbo v0, "44633"
+    const-string/jumbo v0, "44634"
+    const-string/jumbo v0, "44635"
+    const-string/jumbo v0, "44636"
+    const-string/jumbo v0, "44637"
+    const-string/jumbo v0, "44638"
+    const-string/jumbo v0, "44639"
+    const-string/jumbo v0, "44640"
+    const-string/jumbo v0, "44641"
+    const-string/jumbo v0, "44642"
+    const-string/jumbo v0, "44643"
+    const-string/jumbo v0, "44644"
+    const-string/jumbo v0, "44645"
+    const-string/jumbo v0, "44646"
+    const-string/jumbo v0, "44647"
+    const-string/jumbo v0, "44648"
+    const-string/jumbo v0, "44649"
+    const-string/jumbo v0, "44650"
+    const-string/jumbo v0, "44651"
+    const-string/jumbo v0, "44652"
+    const-string/jumbo v0, "44653"
+    const-string/jumbo v0, "44654"
+    const-string/jumbo v0, "44655"
+    const-string/jumbo v0, "44656"
+    const-string/jumbo v0, "44657"
+    const-string/jumbo v0, "44658"
+    const-string/jumbo v0, "44659"
+    const-string/jumbo v0, "44660"
+    const-string/jumbo v0, "44661"
+    const-string/jumbo v0, "44662"
+    const-string/jumbo v0, "44663"
+    const-string/jumbo v0, "44664"
+    const-string/jumbo v0, "44665"
+    const-string/jumbo v0, "44666"
+    const-string/jumbo v0, "44667"
+    const-string/jumbo v0, "44668"
+    const-string/jumbo v0, "44669"
+    const-string/jumbo v0, "44670"
+    const-string/jumbo v0, "44671"
+    const-string/jumbo v0, "44672"
+    const-string/jumbo v0, "44673"
+    const-string/jumbo v0, "44674"
+    const-string/jumbo v0, "44675"
+    const-string/jumbo v0, "44676"
+    const-string/jumbo v0, "44677"
+    const-string/jumbo v0, "44678"
+    const-string/jumbo v0, "44679"
+    const-string/jumbo v0, "44680"
+    const-string/jumbo v0, "44681"
+    const-string/jumbo v0, "44682"
+    const-string/jumbo v0, "44683"
+    const-string/jumbo v0, "44684"
+    const-string/jumbo v0, "44685"
+    const-string/jumbo v0, "44686"
+    const-string/jumbo v0, "44687"
+    const-string/jumbo v0, "44688"
+    const-string/jumbo v0, "44689"
+    const-string/jumbo v0, "44690"
+    const-string/jumbo v0, "44691"
+    const-string/jumbo v0, "44692"
+    const-string/jumbo v0, "44693"
+    const-string/jumbo v0, "44694"
+    const-string/jumbo v0, "44695"
+    const-string/jumbo v0, "44696"
+    const-string/jumbo v0, "44697"
+    const-string/jumbo v0, "44698"
+    const-string/jumbo v0, "44699"
+    const-string/jumbo v0, "44700"
+    const-string/jumbo v0, "44701"
+    const-string/jumbo v0, "44702"
+    const-string/jumbo v0, "44703"
+    const-string/jumbo v0, "44704"
+    const-string/jumbo v0, "44705"
+    const-string/jumbo v0, "44706"
+    const-string/jumbo v0, "44707"
+    const-string/jumbo v0, "44708"
+    const-string/jumbo v0, "44709"
+    const-string/jumbo v0, "44710"
+    const-string/jumbo v0, "44711"
+    const-string/jumbo v0, "44712"
+    const-string/jumbo v0, "44713"
+    const-string/jumbo v0, "44714"
+    const-string/jumbo v0, "44715"
+    const-string/jumbo v0, "44716"
+    const-string/jumbo v0, "44717"
+    const-string/jumbo v0, "44718"
+    const-string/jumbo v0, "44719"
+    const-string/jumbo v0, "44720"
+    const-string/jumbo v0, "44721"
+    const-string/jumbo v0, "44722"
+    const-string/jumbo v0, "44723"
+    const-string/jumbo v0, "44724"
+    const-string/jumbo v0, "44725"
+    const-string/jumbo v0, "44726"
+    const-string/jumbo v0, "44727"
+    const-string/jumbo v0, "44728"
+    const-string/jumbo v0, "44729"
+    const-string/jumbo v0, "44730"
+    const-string/jumbo v0, "44731"
+    const-string/jumbo v0, "44732"
+    const-string/jumbo v0, "44733"
+    const-string/jumbo v0, "44734"
+    const-string/jumbo v0, "44735"
+    const-string/jumbo v0, "44736"
+    const-string/jumbo v0, "44737"
+    const-string/jumbo v0, "44738"
+    const-string/jumbo v0, "44739"
+    const-string/jumbo v0, "44740"
+    const-string/jumbo v0, "44741"
+    const-string/jumbo v0, "44742"
+    const-string/jumbo v0, "44743"
+    const-string/jumbo v0, "44744"
+    const-string/jumbo v0, "44745"
+    const-string/jumbo v0, "44746"
+    const-string/jumbo v0, "44747"
+    const-string/jumbo v0, "44748"
+    const-string/jumbo v0, "44749"
+    const-string/jumbo v0, "44750"
+    const-string/jumbo v0, "44751"
+    const-string/jumbo v0, "44752"
+    const-string/jumbo v0, "44753"
+    const-string/jumbo v0, "44754"
+    const-string/jumbo v0, "44755"
+    const-string/jumbo v0, "44756"
+    const-string/jumbo v0, "44757"
+    const-string/jumbo v0, "44758"
+    const-string/jumbo v0, "44759"
+    const-string/jumbo v0, "44760"
+    const-string/jumbo v0, "44761"
+    const-string/jumbo v0, "44762"
+    const-string/jumbo v0, "44763"
+    const-string/jumbo v0, "44764"
+    const-string/jumbo v0, "44765"
+    const-string/jumbo v0, "44766"
+    const-string/jumbo v0, "44767"
+    const-string/jumbo v0, "44768"
+    const-string/jumbo v0, "44769"
+    const-string/jumbo v0, "44770"
+    const-string/jumbo v0, "44771"
+    const-string/jumbo v0, "44772"
+    const-string/jumbo v0, "44773"
+    const-string/jumbo v0, "44774"
+    const-string/jumbo v0, "44775"
+    const-string/jumbo v0, "44776"
+    const-string/jumbo v0, "44777"
+    const-string/jumbo v0, "44778"
+    const-string/jumbo v0, "44779"
+    const-string/jumbo v0, "44780"
+    const-string/jumbo v0, "44781"
+    const-string/jumbo v0, "44782"
+    const-string/jumbo v0, "44783"
+    const-string/jumbo v0, "44784"
+    const-string/jumbo v0, "44785"
+    const-string/jumbo v0, "44786"
+    const-string/jumbo v0, "44787"
+    const-string/jumbo v0, "44788"
+    const-string/jumbo v0, "44789"
+    const-string/jumbo v0, "44790"
+    const-string/jumbo v0, "44791"
+    const-string/jumbo v0, "44792"
+    const-string/jumbo v0, "44793"
+    const-string/jumbo v0, "44794"
+    const-string/jumbo v0, "44795"
+    const-string/jumbo v0, "44796"
+    const-string/jumbo v0, "44797"
+    const-string/jumbo v0, "44798"
+    const-string/jumbo v0, "44799"
+    const-string/jumbo v0, "44800"
+    const-string/jumbo v0, "44801"
+    const-string/jumbo v0, "44802"
+    const-string/jumbo v0, "44803"
+    const-string/jumbo v0, "44804"
+    const-string/jumbo v0, "44805"
+    const-string/jumbo v0, "44806"
+    const-string/jumbo v0, "44807"
+    const-string/jumbo v0, "44808"
+    const-string/jumbo v0, "44809"
+    const-string/jumbo v0, "44810"
+    const-string/jumbo v0, "44811"
+    const-string/jumbo v0, "44812"
+    const-string/jumbo v0, "44813"
+    const-string/jumbo v0, "44814"
+    const-string/jumbo v0, "44815"
+    const-string/jumbo v0, "44816"
+    const-string/jumbo v0, "44817"
+    const-string/jumbo v0, "44818"
+    const-string/jumbo v0, "44819"
+    const-string/jumbo v0, "44820"
+    const-string/jumbo v0, "44821"
+    const-string/jumbo v0, "44822"
+    const-string/jumbo v0, "44823"
+    const-string/jumbo v0, "44824"
+    const-string/jumbo v0, "44825"
+    const-string/jumbo v0, "44826"
+    const-string/jumbo v0, "44827"
+    const-string/jumbo v0, "44828"
+    const-string/jumbo v0, "44829"
+    const-string/jumbo v0, "44830"
+    const-string/jumbo v0, "44831"
+    const-string/jumbo v0, "44832"
+    const-string/jumbo v0, "44833"
+    const-string/jumbo v0, "44834"
+    const-string/jumbo v0, "44835"
+    const-string/jumbo v0, "44836"
+    const-string/jumbo v0, "44837"
+    const-string/jumbo v0, "44838"
+    const-string/jumbo v0, "44839"
+    const-string/jumbo v0, "44840"
+    const-string/jumbo v0, "44841"
+    const-string/jumbo v0, "44842"
+    const-string/jumbo v0, "44843"
+    const-string/jumbo v0, "44844"
+    const-string/jumbo v0, "44845"
+    const-string/jumbo v0, "44846"
+    const-string/jumbo v0, "44847"
+    const-string/jumbo v0, "44848"
+    const-string/jumbo v0, "44849"
+    const-string/jumbo v0, "44850"
+    const-string/jumbo v0, "44851"
+    const-string/jumbo v0, "44852"
+    const-string/jumbo v0, "44853"
+    const-string/jumbo v0, "44854"
+    const-string/jumbo v0, "44855"
+    const-string/jumbo v0, "44856"
+    const-string/jumbo v0, "44857"
+    const-string/jumbo v0, "44858"
+    const-string/jumbo v0, "44859"
+    const-string/jumbo v0, "44860"
+    const-string/jumbo v0, "44861"
+    const-string/jumbo v0, "44862"
+    const-string/jumbo v0, "44863"
+    const-string/jumbo v0, "44864"
+    const-string/jumbo v0, "44865"
+    const-string/jumbo v0, "44866"
+    const-string/jumbo v0, "44867"
+    const-string/jumbo v0, "44868"
+    const-string/jumbo v0, "44869"
+    const-string/jumbo v0, "44870"
+    const-string/jumbo v0, "44871"
+    const-string/jumbo v0, "44872"
+    const-string/jumbo v0, "44873"
+    const-string/jumbo v0, "44874"
+    const-string/jumbo v0, "44875"
+    const-string/jumbo v0, "44876"
+    const-string/jumbo v0, "44877"
+    const-string/jumbo v0, "44878"
+    const-string/jumbo v0, "44879"
+    const-string/jumbo v0, "44880"
+    const-string/jumbo v0, "44881"
+    const-string/jumbo v0, "44882"
+    const-string/jumbo v0, "44883"
+    const-string/jumbo v0, "44884"
+    const-string/jumbo v0, "44885"
+    const-string/jumbo v0, "44886"
+    const-string/jumbo v0, "44887"
+    const-string/jumbo v0, "44888"
+    const-string/jumbo v0, "44889"
+    const-string/jumbo v0, "44890"
+    const-string/jumbo v0, "44891"
+    const-string/jumbo v0, "44892"
+    const-string/jumbo v0, "44893"
+    const-string/jumbo v0, "44894"
+    const-string/jumbo v0, "44895"
+    const-string/jumbo v0, "44896"
+    const-string/jumbo v0, "44897"
+    const-string/jumbo v0, "44898"
+    const-string/jumbo v0, "44899"
+    const-string/jumbo v0, "44900"
+    const-string/jumbo v0, "44901"
+    const-string/jumbo v0, "44902"
+    const-string/jumbo v0, "44903"
+    const-string/jumbo v0, "44904"
+    const-string/jumbo v0, "44905"
+    const-string/jumbo v0, "44906"
+    const-string/jumbo v0, "44907"
+    const-string/jumbo v0, "44908"
+    const-string/jumbo v0, "44909"
+    const-string/jumbo v0, "44910"
+    const-string/jumbo v0, "44911"
+    const-string/jumbo v0, "44912"
+    const-string/jumbo v0, "44913"
+    const-string/jumbo v0, "44914"
+    const-string/jumbo v0, "44915"
+    const-string/jumbo v0, "44916"
+    const-string/jumbo v0, "44917"
+    const-string/jumbo v0, "44918"
+    const-string/jumbo v0, "44919"
+    const-string/jumbo v0, "44920"
+    const-string/jumbo v0, "44921"
+    const-string/jumbo v0, "44922"
+    const-string/jumbo v0, "44923"
+    const-string/jumbo v0, "44924"
+    const-string/jumbo v0, "44925"
+    const-string/jumbo v0, "44926"
+    const-string/jumbo v0, "44927"
+    const-string/jumbo v0, "44928"
+    const-string/jumbo v0, "44929"
+    const-string/jumbo v0, "44930"
+    const-string/jumbo v0, "44931"
+    const-string/jumbo v0, "44932"
+    const-string/jumbo v0, "44933"
+    const-string/jumbo v0, "44934"
+    const-string/jumbo v0, "44935"
+    const-string/jumbo v0, "44936"
+    const-string/jumbo v0, "44937"
+    const-string/jumbo v0, "44938"
+    const-string/jumbo v0, "44939"
+    const-string/jumbo v0, "44940"
+    const-string/jumbo v0, "44941"
+    const-string/jumbo v0, "44942"
+    const-string/jumbo v0, "44943"
+    const-string/jumbo v0, "44944"
+    const-string/jumbo v0, "44945"
+    const-string/jumbo v0, "44946"
+    const-string/jumbo v0, "44947"
+    const-string/jumbo v0, "44948"
+    const-string/jumbo v0, "44949"
+    const-string/jumbo v0, "44950"
+    const-string/jumbo v0, "44951"
+    const-string/jumbo v0, "44952"
+    const-string/jumbo v0, "44953"
+    const-string/jumbo v0, "44954"
+    const-string/jumbo v0, "44955"
+    const-string/jumbo v0, "44956"
+    const-string/jumbo v0, "44957"
+    const-string/jumbo v0, "44958"
+    const-string/jumbo v0, "44959"
+    const-string/jumbo v0, "44960"
+    const-string/jumbo v0, "44961"
+    const-string/jumbo v0, "44962"
+    const-string/jumbo v0, "44963"
+    const-string/jumbo v0, "44964"
+    const-string/jumbo v0, "44965"
+    const-string/jumbo v0, "44966"
+    const-string/jumbo v0, "44967"
+    const-string/jumbo v0, "44968"
+    const-string/jumbo v0, "44969"
+    const-string/jumbo v0, "44970"
+    const-string/jumbo v0, "44971"
+    const-string/jumbo v0, "44972"
+    const-string/jumbo v0, "44973"
+    const-string/jumbo v0, "44974"
+    const-string/jumbo v0, "44975"
+    const-string/jumbo v0, "44976"
+    const-string/jumbo v0, "44977"
+    const-string/jumbo v0, "44978"
+    const-string/jumbo v0, "44979"
+    const-string/jumbo v0, "44980"
+    const-string/jumbo v0, "44981"
+    const-string/jumbo v0, "44982"
+    const-string/jumbo v0, "44983"
+    const-string/jumbo v0, "44984"
+    const-string/jumbo v0, "44985"
+    const-string/jumbo v0, "44986"
+    const-string/jumbo v0, "44987"
+    const-string/jumbo v0, "44988"
+    const-string/jumbo v0, "44989"
+    const-string/jumbo v0, "44990"
+    const-string/jumbo v0, "44991"
+    const-string/jumbo v0, "44992"
+    const-string/jumbo v0, "44993"
+    const-string/jumbo v0, "44994"
+    const-string/jumbo v0, "44995"
+    const-string/jumbo v0, "44996"
+    const-string/jumbo v0, "44997"
+    const-string/jumbo v0, "44998"
+    const-string/jumbo v0, "44999"
+    const-string/jumbo v0, "45000"
+    const-string/jumbo v0, "45001"
+    const-string/jumbo v0, "45002"
+    const-string/jumbo v0, "45003"
+    const-string/jumbo v0, "45004"
+    const-string/jumbo v0, "45005"
+    const-string/jumbo v0, "45006"
+    const-string/jumbo v0, "45007"
+    const-string/jumbo v0, "45008"
+    const-string/jumbo v0, "45009"
+    const-string/jumbo v0, "45010"
+    const-string/jumbo v0, "45011"
+    const-string/jumbo v0, "45012"
+    const-string/jumbo v0, "45013"
+    const-string/jumbo v0, "45014"
+    const-string/jumbo v0, "45015"
+    const-string/jumbo v0, "45016"
+    const-string/jumbo v0, "45017"
+    const-string/jumbo v0, "45018"
+    const-string/jumbo v0, "45019"
+    const-string/jumbo v0, "45020"
+    const-string/jumbo v0, "45021"
+    const-string/jumbo v0, "45022"
+    const-string/jumbo v0, "45023"
+    const-string/jumbo v0, "45024"
+    const-string/jumbo v0, "45025"
+    const-string/jumbo v0, "45026"
+    const-string/jumbo v0, "45027"
+    const-string/jumbo v0, "45028"
+    const-string/jumbo v0, "45029"
+    const-string/jumbo v0, "45030"
+    const-string/jumbo v0, "45031"
+    const-string/jumbo v0, "45032"
+    const-string/jumbo v0, "45033"
+    const-string/jumbo v0, "45034"
+    const-string/jumbo v0, "45035"
+    const-string/jumbo v0, "45036"
+    const-string/jumbo v0, "45037"
+    const-string/jumbo v0, "45038"
+    const-string/jumbo v0, "45039"
+    const-string/jumbo v0, "45040"
+    const-string/jumbo v0, "45041"
+    const-string/jumbo v0, "45042"
+    const-string/jumbo v0, "45043"
+    const-string/jumbo v0, "45044"
+    const-string/jumbo v0, "45045"
+    const-string/jumbo v0, "45046"
+    const-string/jumbo v0, "45047"
+    const-string/jumbo v0, "45048"
+    const-string/jumbo v0, "45049"
+    const-string/jumbo v0, "45050"
+    const-string/jumbo v0, "45051"
+    const-string/jumbo v0, "45052"
+    const-string/jumbo v0, "45053"
+    const-string/jumbo v0, "45054"
+    const-string/jumbo v0, "45055"
+    const-string/jumbo v0, "45056"
+    const-string/jumbo v0, "45057"
+    const-string/jumbo v0, "45058"
+    const-string/jumbo v0, "45059"
+    const-string/jumbo v0, "45060"
+    const-string/jumbo v0, "45061"
+    const-string/jumbo v0, "45062"
+    const-string/jumbo v0, "45063"
+    const-string/jumbo v0, "45064"
+    const-string/jumbo v0, "45065"
+    const-string/jumbo v0, "45066"
+    const-string/jumbo v0, "45067"
+    const-string/jumbo v0, "45068"
+    const-string/jumbo v0, "45069"
+    const-string/jumbo v0, "45070"
+    const-string/jumbo v0, "45071"
+    const-string/jumbo v0, "45072"
+    const-string/jumbo v0, "45073"
+    const-string/jumbo v0, "45074"
+    const-string/jumbo v0, "45075"
+    const-string/jumbo v0, "45076"
+    const-string/jumbo v0, "45077"
+    const-string/jumbo v0, "45078"
+    const-string/jumbo v0, "45079"
+    const-string/jumbo v0, "45080"
+    const-string/jumbo v0, "45081"
+    const-string/jumbo v0, "45082"
+    const-string/jumbo v0, "45083"
+    const-string/jumbo v0, "45084"
+    const-string/jumbo v0, "45085"
+    const-string/jumbo v0, "45086"
+    const-string/jumbo v0, "45087"
+    const-string/jumbo v0, "45088"
+    const-string/jumbo v0, "45089"
+    const-string/jumbo v0, "45090"
+    const-string/jumbo v0, "45091"
+    const-string/jumbo v0, "45092"
+    const-string/jumbo v0, "45093"
+    const-string/jumbo v0, "45094"
+    const-string/jumbo v0, "45095"
+    const-string/jumbo v0, "45096"
+    const-string/jumbo v0, "45097"
+    const-string/jumbo v0, "45098"
+    const-string/jumbo v0, "45099"
+    const-string/jumbo v0, "45100"
+    const-string/jumbo v0, "45101"
+    const-string/jumbo v0, "45102"
+    const-string/jumbo v0, "45103"
+    const-string/jumbo v0, "45104"
+    const-string/jumbo v0, "45105"
+    const-string/jumbo v0, "45106"
+    const-string/jumbo v0, "45107"
+    const-string/jumbo v0, "45108"
+    const-string/jumbo v0, "45109"
+    const-string/jumbo v0, "45110"
+    const-string/jumbo v0, "45111"
+    const-string/jumbo v0, "45112"
+    const-string/jumbo v0, "45113"
+    const-string/jumbo v0, "45114"
+    const-string/jumbo v0, "45115"
+    const-string/jumbo v0, "45116"
+    const-string/jumbo v0, "45117"
+    const-string/jumbo v0, "45118"
+    const-string/jumbo v0, "45119"
+    const-string/jumbo v0, "45120"
+    const-string/jumbo v0, "45121"
+    const-string/jumbo v0, "45122"
+    const-string/jumbo v0, "45123"
+    const-string/jumbo v0, "45124"
+    const-string/jumbo v0, "45125"
+    const-string/jumbo v0, "45126"
+    const-string/jumbo v0, "45127"
+    const-string/jumbo v0, "45128"
+    const-string/jumbo v0, "45129"
+    const-string/jumbo v0, "45130"
+    const-string/jumbo v0, "45131"
+    const-string/jumbo v0, "45132"
+    const-string/jumbo v0, "45133"
+    const-string/jumbo v0, "45134"
+    const-string/jumbo v0, "45135"
+    const-string/jumbo v0, "45136"
+    const-string/jumbo v0, "45137"
+    const-string/jumbo v0, "45138"
+    const-string/jumbo v0, "45139"
+    const-string/jumbo v0, "45140"
+    const-string/jumbo v0, "45141"
+    const-string/jumbo v0, "45142"
+    const-string/jumbo v0, "45143"
+    const-string/jumbo v0, "45144"
+    const-string/jumbo v0, "45145"
+    const-string/jumbo v0, "45146"
+    const-string/jumbo v0, "45147"
+    const-string/jumbo v0, "45148"
+    const-string/jumbo v0, "45149"
+    const-string/jumbo v0, "45150"
+    const-string/jumbo v0, "45151"
+    const-string/jumbo v0, "45152"
+    const-string/jumbo v0, "45153"
+    const-string/jumbo v0, "45154"
+    const-string/jumbo v0, "45155"
+    const-string/jumbo v0, "45156"
+    const-string/jumbo v0, "45157"
+    const-string/jumbo v0, "45158"
+    const-string/jumbo v0, "45159"
+    const-string/jumbo v0, "45160"
+    const-string/jumbo v0, "45161"
+    const-string/jumbo v0, "45162"
+    const-string/jumbo v0, "45163"
+    const-string/jumbo v0, "45164"
+    const-string/jumbo v0, "45165"
+    const-string/jumbo v0, "45166"
+    const-string/jumbo v0, "45167"
+    const-string/jumbo v0, "45168"
+    const-string/jumbo v0, "45169"
+    const-string/jumbo v0, "45170"
+    const-string/jumbo v0, "45171"
+    const-string/jumbo v0, "45172"
+    const-string/jumbo v0, "45173"
+    const-string/jumbo v0, "45174"
+    const-string/jumbo v0, "45175"
+    const-string/jumbo v0, "45176"
+    const-string/jumbo v0, "45177"
+    const-string/jumbo v0, "45178"
+    const-string/jumbo v0, "45179"
+    const-string/jumbo v0, "45180"
+    const-string/jumbo v0, "45181"
+    const-string/jumbo v0, "45182"
+    const-string/jumbo v0, "45183"
+    const-string/jumbo v0, "45184"
+    const-string/jumbo v0, "45185"
+    const-string/jumbo v0, "45186"
+    const-string/jumbo v0, "45187"
+    const-string/jumbo v0, "45188"
+    const-string/jumbo v0, "45189"
+    const-string/jumbo v0, "45190"
+    const-string/jumbo v0, "45191"
+    const-string/jumbo v0, "45192"
+    const-string/jumbo v0, "45193"
+    const-string/jumbo v0, "45194"
+    const-string/jumbo v0, "45195"
+    const-string/jumbo v0, "45196"
+    const-string/jumbo v0, "45197"
+    const-string/jumbo v0, "45198"
+    const-string/jumbo v0, "45199"
+    const-string/jumbo v0, "45200"
+    const-string/jumbo v0, "45201"
+    const-string/jumbo v0, "45202"
+    const-string/jumbo v0, "45203"
+    const-string/jumbo v0, "45204"
+    const-string/jumbo v0, "45205"
+    const-string/jumbo v0, "45206"
+    const-string/jumbo v0, "45207"
+    const-string/jumbo v0, "45208"
+    const-string/jumbo v0, "45209"
+    const-string/jumbo v0, "45210"
+    const-string/jumbo v0, "45211"
+    const-string/jumbo v0, "45212"
+    const-string/jumbo v0, "45213"
+    const-string/jumbo v0, "45214"
+    const-string/jumbo v0, "45215"
+    const-string/jumbo v0, "45216"
+    const-string/jumbo v0, "45217"
+    const-string/jumbo v0, "45218"
+    const-string/jumbo v0, "45219"
+    const-string/jumbo v0, "45220"
+    const-string/jumbo v0, "45221"
+    const-string/jumbo v0, "45222"
+    const-string/jumbo v0, "45223"
+    const-string/jumbo v0, "45224"
+    const-string/jumbo v0, "45225"
+    const-string/jumbo v0, "45226"
+    const-string/jumbo v0, "45227"
+    const-string/jumbo v0, "45228"
+    const-string/jumbo v0, "45229"
+    const-string/jumbo v0, "45230"
+    const-string/jumbo v0, "45231"
+    const-string/jumbo v0, "45232"
+    const-string/jumbo v0, "45233"
+    const-string/jumbo v0, "45234"
+    const-string/jumbo v0, "45235"
+    const-string/jumbo v0, "45236"
+    const-string/jumbo v0, "45237"
+    const-string/jumbo v0, "45238"
+    const-string/jumbo v0, "45239"
+    const-string/jumbo v0, "45240"
+    const-string/jumbo v0, "45241"
+    const-string/jumbo v0, "45242"
+    const-string/jumbo v0, "45243"
+    const-string/jumbo v0, "45244"
+    const-string/jumbo v0, "45245"
+    const-string/jumbo v0, "45246"
+    const-string/jumbo v0, "45247"
+    const-string/jumbo v0, "45248"
+    const-string/jumbo v0, "45249"
+    const-string/jumbo v0, "45250"
+    const-string/jumbo v0, "45251"
+    const-string/jumbo v0, "45252"
+    const-string/jumbo v0, "45253"
+    const-string/jumbo v0, "45254"
+    const-string/jumbo v0, "45255"
+    const-string/jumbo v0, "45256"
+    const-string/jumbo v0, "45257"
+    const-string/jumbo v0, "45258"
+    const-string/jumbo v0, "45259"
+    const-string/jumbo v0, "45260"
+    const-string/jumbo v0, "45261"
+    const-string/jumbo v0, "45262"
+    const-string/jumbo v0, "45263"
+    const-string/jumbo v0, "45264"
+    const-string/jumbo v0, "45265"
+    const-string/jumbo v0, "45266"
+    const-string/jumbo v0, "45267"
+    const-string/jumbo v0, "45268"
+    const-string/jumbo v0, "45269"
+    const-string/jumbo v0, "45270"
+    const-string/jumbo v0, "45271"
+    const-string/jumbo v0, "45272"
+    const-string/jumbo v0, "45273"
+    const-string/jumbo v0, "45274"
+    const-string/jumbo v0, "45275"
+    const-string/jumbo v0, "45276"
+    const-string/jumbo v0, "45277"
+    const-string/jumbo v0, "45278"
+    const-string/jumbo v0, "45279"
+    const-string/jumbo v0, "45280"
+    const-string/jumbo v0, "45281"
+    const-string/jumbo v0, "45282"
+    const-string/jumbo v0, "45283"
+    const-string/jumbo v0, "45284"
+    const-string/jumbo v0, "45285"
+    const-string/jumbo v0, "45286"
+    const-string/jumbo v0, "45287"
+    const-string/jumbo v0, "45288"
+    const-string/jumbo v0, "45289"
+    const-string/jumbo v0, "45290"
+    const-string/jumbo v0, "45291"
+    const-string/jumbo v0, "45292"
+    const-string/jumbo v0, "45293"
+    const-string/jumbo v0, "45294"
+    const-string/jumbo v0, "45295"
+    const-string/jumbo v0, "45296"
+    const-string/jumbo v0, "45297"
+    const-string/jumbo v0, "45298"
+    const-string/jumbo v0, "45299"
+    const-string/jumbo v0, "45300"
+    const-string/jumbo v0, "45301"
+    const-string/jumbo v0, "45302"
+    const-string/jumbo v0, "45303"
+    const-string/jumbo v0, "45304"
+    const-string/jumbo v0, "45305"
+    const-string/jumbo v0, "45306"
+    const-string/jumbo v0, "45307"
+    const-string/jumbo v0, "45308"
+    const-string/jumbo v0, "45309"
+    const-string/jumbo v0, "45310"
+    const-string/jumbo v0, "45311"
+    const-string/jumbo v0, "45312"
+    const-string/jumbo v0, "45313"
+    const-string/jumbo v0, "45314"
+    const-string/jumbo v0, "45315"
+    const-string/jumbo v0, "45316"
+    const-string/jumbo v0, "45317"
+    const-string/jumbo v0, "45318"
+    const-string/jumbo v0, "45319"
+    const-string/jumbo v0, "45320"
+    const-string/jumbo v0, "45321"
+    const-string/jumbo v0, "45322"
+    const-string/jumbo v0, "45323"
+    const-string/jumbo v0, "45324"
+    const-string/jumbo v0, "45325"
+    const-string/jumbo v0, "45326"
+    const-string/jumbo v0, "45327"
+    const-string/jumbo v0, "45328"
+    const-string/jumbo v0, "45329"
+    const-string/jumbo v0, "45330"
+    const-string/jumbo v0, "45331"
+    const-string/jumbo v0, "45332"
+    const-string/jumbo v0, "45333"
+    const-string/jumbo v0, "45334"
+    const-string/jumbo v0, "45335"
+    const-string/jumbo v0, "45336"
+    const-string/jumbo v0, "45337"
+    const-string/jumbo v0, "45338"
+    const-string/jumbo v0, "45339"
+    const-string/jumbo v0, "45340"
+    const-string/jumbo v0, "45341"
+    const-string/jumbo v0, "45342"
+    const-string/jumbo v0, "45343"
+    const-string/jumbo v0, "45344"
+    const-string/jumbo v0, "45345"
+    const-string/jumbo v0, "45346"
+    const-string/jumbo v0, "45347"
+    const-string/jumbo v0, "45348"
+    const-string/jumbo v0, "45349"
+    const-string/jumbo v0, "45350"
+    const-string/jumbo v0, "45351"
+    const-string/jumbo v0, "45352"
+    const-string/jumbo v0, "45353"
+    const-string/jumbo v0, "45354"
+    const-string/jumbo v0, "45355"
+    const-string/jumbo v0, "45356"
+    const-string/jumbo v0, "45357"
+    const-string/jumbo v0, "45358"
+    const-string/jumbo v0, "45359"
+    const-string/jumbo v0, "45360"
+    const-string/jumbo v0, "45361"
+    const-string/jumbo v0, "45362"
+    const-string/jumbo v0, "45363"
+    const-string/jumbo v0, "45364"
+    const-string/jumbo v0, "45365"
+    const-string/jumbo v0, "45366"
+    const-string/jumbo v0, "45367"
+    const-string/jumbo v0, "45368"
+    const-string/jumbo v0, "45369"
+    const-string/jumbo v0, "45370"
+    const-string/jumbo v0, "45371"
+    const-string/jumbo v0, "45372"
+    const-string/jumbo v0, "45373"
+    const-string/jumbo v0, "45374"
+    const-string/jumbo v0, "45375"
+    const-string/jumbo v0, "45376"
+    const-string/jumbo v0, "45377"
+    const-string/jumbo v0, "45378"
+    const-string/jumbo v0, "45379"
+    const-string/jumbo v0, "45380"
+    const-string/jumbo v0, "45381"
+    const-string/jumbo v0, "45382"
+    const-string/jumbo v0, "45383"
+    const-string/jumbo v0, "45384"
+    const-string/jumbo v0, "45385"
+    const-string/jumbo v0, "45386"
+    const-string/jumbo v0, "45387"
+    const-string/jumbo v0, "45388"
+    const-string/jumbo v0, "45389"
+    const-string/jumbo v0, "45390"
+    const-string/jumbo v0, "45391"
+    const-string/jumbo v0, "45392"
+    const-string/jumbo v0, "45393"
+    const-string/jumbo v0, "45394"
+    const-string/jumbo v0, "45395"
+    const-string/jumbo v0, "45396"
+    const-string/jumbo v0, "45397"
+    const-string/jumbo v0, "45398"
+    const-string/jumbo v0, "45399"
+    const-string/jumbo v0, "45400"
+    const-string/jumbo v0, "45401"
+    const-string/jumbo v0, "45402"
+    const-string/jumbo v0, "45403"
+    const-string/jumbo v0, "45404"
+    const-string/jumbo v0, "45405"
+    const-string/jumbo v0, "45406"
+    const-string/jumbo v0, "45407"
+    const-string/jumbo v0, "45408"
+    const-string/jumbo v0, "45409"
+    const-string/jumbo v0, "45410"
+    const-string/jumbo v0, "45411"
+    const-string/jumbo v0, "45412"
+    const-string/jumbo v0, "45413"
+    const-string/jumbo v0, "45414"
+    const-string/jumbo v0, "45415"
+    const-string/jumbo v0, "45416"
+    const-string/jumbo v0, "45417"
+    const-string/jumbo v0, "45418"
+    const-string/jumbo v0, "45419"
+    const-string/jumbo v0, "45420"
+    const-string/jumbo v0, "45421"
+    const-string/jumbo v0, "45422"
+    const-string/jumbo v0, "45423"
+    const-string/jumbo v0, "45424"
+    const-string/jumbo v0, "45425"
+    const-string/jumbo v0, "45426"
+    const-string/jumbo v0, "45427"
+    const-string/jumbo v0, "45428"
+    const-string/jumbo v0, "45429"
+    const-string/jumbo v0, "45430"
+    const-string/jumbo v0, "45431"
+    const-string/jumbo v0, "45432"
+    const-string/jumbo v0, "45433"
+    const-string/jumbo v0, "45434"
+    const-string/jumbo v0, "45435"
+    const-string/jumbo v0, "45436"
+    const-string/jumbo v0, "45437"
+    const-string/jumbo v0, "45438"
+    const-string/jumbo v0, "45439"
+    const-string/jumbo v0, "45440"
+    const-string/jumbo v0, "45441"
+    const-string/jumbo v0, "45442"
+    const-string/jumbo v0, "45443"
+    const-string/jumbo v0, "45444"
+    const-string/jumbo v0, "45445"
+    const-string/jumbo v0, "45446"
+    const-string/jumbo v0, "45447"
+    const-string/jumbo v0, "45448"
+    const-string/jumbo v0, "45449"
+    const-string/jumbo v0, "45450"
+    const-string/jumbo v0, "45451"
+    const-string/jumbo v0, "45452"
+    const-string/jumbo v0, "45453"
+    const-string/jumbo v0, "45454"
+    const-string/jumbo v0, "45455"
+    const-string/jumbo v0, "45456"
+    const-string/jumbo v0, "45457"
+    const-string/jumbo v0, "45458"
+    const-string/jumbo v0, "45459"
+    const-string/jumbo v0, "45460"
+    const-string/jumbo v0, "45461"
+    const-string/jumbo v0, "45462"
+    const-string/jumbo v0, "45463"
+    const-string/jumbo v0, "45464"
+    const-string/jumbo v0, "45465"
+    const-string/jumbo v0, "45466"
+    const-string/jumbo v0, "45467"
+    const-string/jumbo v0, "45468"
+    const-string/jumbo v0, "45469"
+    const-string/jumbo v0, "45470"
+    const-string/jumbo v0, "45471"
+    const-string/jumbo v0, "45472"
+    const-string/jumbo v0, "45473"
+    const-string/jumbo v0, "45474"
+    const-string/jumbo v0, "45475"
+    const-string/jumbo v0, "45476"
+    const-string/jumbo v0, "45477"
+    const-string/jumbo v0, "45478"
+    const-string/jumbo v0, "45479"
+    const-string/jumbo v0, "45480"
+    const-string/jumbo v0, "45481"
+    const-string/jumbo v0, "45482"
+    const-string/jumbo v0, "45483"
+    const-string/jumbo v0, "45484"
+    const-string/jumbo v0, "45485"
+    const-string/jumbo v0, "45486"
+    const-string/jumbo v0, "45487"
+    const-string/jumbo v0, "45488"
+    const-string/jumbo v0, "45489"
+    const-string/jumbo v0, "45490"
+    const-string/jumbo v0, "45491"
+    const-string/jumbo v0, "45492"
+    const-string/jumbo v0, "45493"
+    const-string/jumbo v0, "45494"
+    const-string/jumbo v0, "45495"
+    const-string/jumbo v0, "45496"
+    const-string/jumbo v0, "45497"
+    const-string/jumbo v0, "45498"
+    const-string/jumbo v0, "45499"
+    const-string/jumbo v0, "45500"
+    const-string/jumbo v0, "45501"
+    const-string/jumbo v0, "45502"
+    const-string/jumbo v0, "45503"
+    const-string/jumbo v0, "45504"
+    const-string/jumbo v0, "45505"
+    const-string/jumbo v0, "45506"
+    const-string/jumbo v0, "45507"
+    const-string/jumbo v0, "45508"
+    const-string/jumbo v0, "45509"
+    const-string/jumbo v0, "45510"
+    const-string/jumbo v0, "45511"
+    const-string/jumbo v0, "45512"
+    const-string/jumbo v0, "45513"
+    const-string/jumbo v0, "45514"
+    const-string/jumbo v0, "45515"
+    const-string/jumbo v0, "45516"
+    const-string/jumbo v0, "45517"
+    const-string/jumbo v0, "45518"
+    const-string/jumbo v0, "45519"
+    const-string/jumbo v0, "45520"
+    const-string/jumbo v0, "45521"
+    const-string/jumbo v0, "45522"
+    const-string/jumbo v0, "45523"
+    const-string/jumbo v0, "45524"
+    const-string/jumbo v0, "45525"
+    const-string/jumbo v0, "45526"
+    const-string/jumbo v0, "45527"
+    const-string/jumbo v0, "45528"
+    const-string/jumbo v0, "45529"
+    const-string/jumbo v0, "45530"
+    const-string/jumbo v0, "45531"
+    const-string/jumbo v0, "45532"
+    const-string/jumbo v0, "45533"
+    const-string/jumbo v0, "45534"
+    const-string/jumbo v0, "45535"
+    const-string/jumbo v0, "45536"
+    const-string/jumbo v0, "45537"
+    const-string/jumbo v0, "45538"
+    const-string/jumbo v0, "45539"
+    const-string/jumbo v0, "45540"
+    const-string/jumbo v0, "45541"
+    const-string/jumbo v0, "45542"
+    const-string/jumbo v0, "45543"
+    const-string/jumbo v0, "45544"
+    const-string/jumbo v0, "45545"
+    const-string/jumbo v0, "45546"
+    const-string/jumbo v0, "45547"
+    const-string/jumbo v0, "45548"
+    const-string/jumbo v0, "45549"
+    const-string/jumbo v0, "45550"
+    const-string/jumbo v0, "45551"
+    const-string/jumbo v0, "45552"
+    const-string/jumbo v0, "45553"
+    const-string/jumbo v0, "45554"
+    const-string/jumbo v0, "45555"
+    const-string/jumbo v0, "45556"
+    const-string/jumbo v0, "45557"
+    const-string/jumbo v0, "45558"
+    const-string/jumbo v0, "45559"
+    const-string/jumbo v0, "45560"
+    const-string/jumbo v0, "45561"
+    const-string/jumbo v0, "45562"
+    const-string/jumbo v0, "45563"
+    const-string/jumbo v0, "45564"
+    const-string/jumbo v0, "45565"
+    const-string/jumbo v0, "45566"
+    const-string/jumbo v0, "45567"
+    const-string/jumbo v0, "45568"
+    const-string/jumbo v0, "45569"
+    const-string/jumbo v0, "45570"
+    const-string/jumbo v0, "45571"
+    const-string/jumbo v0, "45572"
+    const-string/jumbo v0, "45573"
+    const-string/jumbo v0, "45574"
+    const-string/jumbo v0, "45575"
+    const-string/jumbo v0, "45576"
+    const-string/jumbo v0, "45577"
+    const-string/jumbo v0, "45578"
+    const-string/jumbo v0, "45579"
+    const-string/jumbo v0, "45580"
+    const-string/jumbo v0, "45581"
+    const-string/jumbo v0, "45582"
+    const-string/jumbo v0, "45583"
+    const-string/jumbo v0, "45584"
+    const-string/jumbo v0, "45585"
+    const-string/jumbo v0, "45586"
+    const-string/jumbo v0, "45587"
+    const-string/jumbo v0, "45588"
+    const-string/jumbo v0, "45589"
+    const-string/jumbo v0, "45590"
+    const-string/jumbo v0, "45591"
+    const-string/jumbo v0, "45592"
+    const-string/jumbo v0, "45593"
+    const-string/jumbo v0, "45594"
+    const-string/jumbo v0, "45595"
+    const-string/jumbo v0, "45596"
+    const-string/jumbo v0, "45597"
+    const-string/jumbo v0, "45598"
+    const-string/jumbo v0, "45599"
+    const-string/jumbo v0, "45600"
+    const-string/jumbo v0, "45601"
+    const-string/jumbo v0, "45602"
+    const-string/jumbo v0, "45603"
+    const-string/jumbo v0, "45604"
+    const-string/jumbo v0, "45605"
+    const-string/jumbo v0, "45606"
+    const-string/jumbo v0, "45607"
+    const-string/jumbo v0, "45608"
+    const-string/jumbo v0, "45609"
+    const-string/jumbo v0, "45610"
+    const-string/jumbo v0, "45611"
+    const-string/jumbo v0, "45612"
+    const-string/jumbo v0, "45613"
+    const-string/jumbo v0, "45614"
+    const-string/jumbo v0, "45615"
+    const-string/jumbo v0, "45616"
+    const-string/jumbo v0, "45617"
+    const-string/jumbo v0, "45618"
+    const-string/jumbo v0, "45619"
+    const-string/jumbo v0, "45620"
+    const-string/jumbo v0, "45621"
+    const-string/jumbo v0, "45622"
+    const-string/jumbo v0, "45623"
+    const-string/jumbo v0, "45624"
+    const-string/jumbo v0, "45625"
+    const-string/jumbo v0, "45626"
+    const-string/jumbo v0, "45627"
+    const-string/jumbo v0, "45628"
+    const-string/jumbo v0, "45629"
+    const-string/jumbo v0, "45630"
+    const-string/jumbo v0, "45631"
+    const-string/jumbo v0, "45632"
+    const-string/jumbo v0, "45633"
+    const-string/jumbo v0, "45634"
+    const-string/jumbo v0, "45635"
+    const-string/jumbo v0, "45636"
+    const-string/jumbo v0, "45637"
+    const-string/jumbo v0, "45638"
+    const-string/jumbo v0, "45639"
+    const-string/jumbo v0, "45640"
+    const-string/jumbo v0, "45641"
+    const-string/jumbo v0, "45642"
+    const-string/jumbo v0, "45643"
+    const-string/jumbo v0, "45644"
+    const-string/jumbo v0, "45645"
+    const-string/jumbo v0, "45646"
+    const-string/jumbo v0, "45647"
+    const-string/jumbo v0, "45648"
+    const-string/jumbo v0, "45649"
+    const-string/jumbo v0, "45650"
+    const-string/jumbo v0, "45651"
+    const-string/jumbo v0, "45652"
+    const-string/jumbo v0, "45653"
+    const-string/jumbo v0, "45654"
+    const-string/jumbo v0, "45655"
+    const-string/jumbo v0, "45656"
+    const-string/jumbo v0, "45657"
+    const-string/jumbo v0, "45658"
+    const-string/jumbo v0, "45659"
+    const-string/jumbo v0, "45660"
+    const-string/jumbo v0, "45661"
+    const-string/jumbo v0, "45662"
+    const-string/jumbo v0, "45663"
+    const-string/jumbo v0, "45664"
+    const-string/jumbo v0, "45665"
+    const-string/jumbo v0, "45666"
+    const-string/jumbo v0, "45667"
+    const-string/jumbo v0, "45668"
+    const-string/jumbo v0, "45669"
+    const-string/jumbo v0, "45670"
+    const-string/jumbo v0, "45671"
+    const-string/jumbo v0, "45672"
+    const-string/jumbo v0, "45673"
+    const-string/jumbo v0, "45674"
+    const-string/jumbo v0, "45675"
+    const-string/jumbo v0, "45676"
+    const-string/jumbo v0, "45677"
+    const-string/jumbo v0, "45678"
+    const-string/jumbo v0, "45679"
+    const-string/jumbo v0, "45680"
+    const-string/jumbo v0, "45681"
+    const-string/jumbo v0, "45682"
+    const-string/jumbo v0, "45683"
+    const-string/jumbo v0, "45684"
+    const-string/jumbo v0, "45685"
+    const-string/jumbo v0, "45686"
+    const-string/jumbo v0, "45687"
+    const-string/jumbo v0, "45688"
+    const-string/jumbo v0, "45689"
+    const-string/jumbo v0, "45690"
+    const-string/jumbo v0, "45691"
+    const-string/jumbo v0, "45692"
+    const-string/jumbo v0, "45693"
+    const-string/jumbo v0, "45694"
+    const-string/jumbo v0, "45695"
+    const-string/jumbo v0, "45696"
+    const-string/jumbo v0, "45697"
+    const-string/jumbo v0, "45698"
+    const-string/jumbo v0, "45699"
+    const-string/jumbo v0, "45700"
+    const-string/jumbo v0, "45701"
+    const-string/jumbo v0, "45702"
+    const-string/jumbo v0, "45703"
+    const-string/jumbo v0, "45704"
+    const-string/jumbo v0, "45705"
+    const-string/jumbo v0, "45706"
+    const-string/jumbo v0, "45707"
+    const-string/jumbo v0, "45708"
+    const-string/jumbo v0, "45709"
+    const-string/jumbo v0, "45710"
+    const-string/jumbo v0, "45711"
+    const-string/jumbo v0, "45712"
+    const-string/jumbo v0, "45713"
+    const-string/jumbo v0, "45714"
+    const-string/jumbo v0, "45715"
+    const-string/jumbo v0, "45716"
+    const-string/jumbo v0, "45717"
+    const-string/jumbo v0, "45718"
+    const-string/jumbo v0, "45719"
+    const-string/jumbo v0, "45720"
+    const-string/jumbo v0, "45721"
+    const-string/jumbo v0, "45722"
+    const-string/jumbo v0, "45723"
+    const-string/jumbo v0, "45724"
+    const-string/jumbo v0, "45725"
+    const-string/jumbo v0, "45726"
+    const-string/jumbo v0, "45727"
+    const-string/jumbo v0, "45728"
+    const-string/jumbo v0, "45729"
+    const-string/jumbo v0, "45730"
+    const-string/jumbo v0, "45731"
+    const-string/jumbo v0, "45732"
+    const-string/jumbo v0, "45733"
+    const-string/jumbo v0, "45734"
+    const-string/jumbo v0, "45735"
+    const-string/jumbo v0, "45736"
+    const-string/jumbo v0, "45737"
+    const-string/jumbo v0, "45738"
+    const-string/jumbo v0, "45739"
+    const-string/jumbo v0, "45740"
+    const-string/jumbo v0, "45741"
+    const-string/jumbo v0, "45742"
+    const-string/jumbo v0, "45743"
+    const-string/jumbo v0, "45744"
+    const-string/jumbo v0, "45745"
+    const-string/jumbo v0, "45746"
+    const-string/jumbo v0, "45747"
+    const-string/jumbo v0, "45748"
+    const-string/jumbo v0, "45749"
+    const-string/jumbo v0, "45750"
+    const-string/jumbo v0, "45751"
+    const-string/jumbo v0, "45752"
+    const-string/jumbo v0, "45753"
+    const-string/jumbo v0, "45754"
+    const-string/jumbo v0, "45755"
+    const-string/jumbo v0, "45756"
+    const-string/jumbo v0, "45757"
+    const-string/jumbo v0, "45758"
+    const-string/jumbo v0, "45759"
+    const-string/jumbo v0, "45760"
+    const-string/jumbo v0, "45761"
+    const-string/jumbo v0, "45762"
+    const-string/jumbo v0, "45763"
+    const-string/jumbo v0, "45764"
+    const-string/jumbo v0, "45765"
+    const-string/jumbo v0, "45766"
+    const-string/jumbo v0, "45767"
+    const-string/jumbo v0, "45768"
+    const-string/jumbo v0, "45769"
+    const-string/jumbo v0, "45770"
+    const-string/jumbo v0, "45771"
+    const-string/jumbo v0, "45772"
+    const-string/jumbo v0, "45773"
+    const-string/jumbo v0, "45774"
+    const-string/jumbo v0, "45775"
+    const-string/jumbo v0, "45776"
+    const-string/jumbo v0, "45777"
+    const-string/jumbo v0, "45778"
+    const-string/jumbo v0, "45779"
+    const-string/jumbo v0, "45780"
+    const-string/jumbo v0, "45781"
+    const-string/jumbo v0, "45782"
+    const-string/jumbo v0, "45783"
+    const-string/jumbo v0, "45784"
+    const-string/jumbo v0, "45785"
+    const-string/jumbo v0, "45786"
+    const-string/jumbo v0, "45787"
+    const-string/jumbo v0, "45788"
+    const-string/jumbo v0, "45789"
+    const-string/jumbo v0, "45790"
+    const-string/jumbo v0, "45791"
+    const-string/jumbo v0, "45792"
+    const-string/jumbo v0, "45793"
+    const-string/jumbo v0, "45794"
+    const-string/jumbo v0, "45795"
+    const-string/jumbo v0, "45796"
+    const-string/jumbo v0, "45797"
+    const-string/jumbo v0, "45798"
+    const-string/jumbo v0, "45799"
+    const-string/jumbo v0, "45800"
+    const-string/jumbo v0, "45801"
+    const-string/jumbo v0, "45802"
+    const-string/jumbo v0, "45803"
+    const-string/jumbo v0, "45804"
+    const-string/jumbo v0, "45805"
+    const-string/jumbo v0, "45806"
+    const-string/jumbo v0, "45807"
+    const-string/jumbo v0, "45808"
+    const-string/jumbo v0, "45809"
+    const-string/jumbo v0, "45810"
+    const-string/jumbo v0, "45811"
+    const-string/jumbo v0, "45812"
+    const-string/jumbo v0, "45813"
+    const-string/jumbo v0, "45814"
+    const-string/jumbo v0, "45815"
+    const-string/jumbo v0, "45816"
+    const-string/jumbo v0, "45817"
+    const-string/jumbo v0, "45818"
+    const-string/jumbo v0, "45819"
+    const-string/jumbo v0, "45820"
+    const-string/jumbo v0, "45821"
+    const-string/jumbo v0, "45822"
+    const-string/jumbo v0, "45823"
+    const-string/jumbo v0, "45824"
+    const-string/jumbo v0, "45825"
+    const-string/jumbo v0, "45826"
+    const-string/jumbo v0, "45827"
+    const-string/jumbo v0, "45828"
+    const-string/jumbo v0, "45829"
+    const-string/jumbo v0, "45830"
+    const-string/jumbo v0, "45831"
+    const-string/jumbo v0, "45832"
+    const-string/jumbo v0, "45833"
+    const-string/jumbo v0, "45834"
+    const-string/jumbo v0, "45835"
+    const-string/jumbo v0, "45836"
+    const-string/jumbo v0, "45837"
+    const-string/jumbo v0, "45838"
+    const-string/jumbo v0, "45839"
+    const-string/jumbo v0, "45840"
+    const-string/jumbo v0, "45841"
+    const-string/jumbo v0, "45842"
+    const-string/jumbo v0, "45843"
+    const-string/jumbo v0, "45844"
+    const-string/jumbo v0, "45845"
+    const-string/jumbo v0, "45846"
+    const-string/jumbo v0, "45847"
+    const-string/jumbo v0, "45848"
+    const-string/jumbo v0, "45849"
+    const-string/jumbo v0, "45850"
+    const-string/jumbo v0, "45851"
+    const-string/jumbo v0, "45852"
+    const-string/jumbo v0, "45853"
+    const-string/jumbo v0, "45854"
+    const-string/jumbo v0, "45855"
+    const-string/jumbo v0, "45856"
+    const-string/jumbo v0, "45857"
+    const-string/jumbo v0, "45858"
+    const-string/jumbo v0, "45859"
+    const-string/jumbo v0, "45860"
+    const-string/jumbo v0, "45861"
+    const-string/jumbo v0, "45862"
+    const-string/jumbo v0, "45863"
+    const-string/jumbo v0, "45864"
+    const-string/jumbo v0, "45865"
+    const-string/jumbo v0, "45866"
+    const-string/jumbo v0, "45867"
+    const-string/jumbo v0, "45868"
+    const-string/jumbo v0, "45869"
+    const-string/jumbo v0, "45870"
+    const-string/jumbo v0, "45871"
+    const-string/jumbo v0, "45872"
+    const-string/jumbo v0, "45873"
+    const-string/jumbo v0, "45874"
+    const-string/jumbo v0, "45875"
+    const-string/jumbo v0, "45876"
+    const-string/jumbo v0, "45877"
+    const-string/jumbo v0, "45878"
+    const-string/jumbo v0, "45879"
+    const-string/jumbo v0, "45880"
+    const-string/jumbo v0, "45881"
+    const-string/jumbo v0, "45882"
+    const-string/jumbo v0, "45883"
+    const-string/jumbo v0, "45884"
+    const-string/jumbo v0, "45885"
+    const-string/jumbo v0, "45886"
+    const-string/jumbo v0, "45887"
+    const-string/jumbo v0, "45888"
+    const-string/jumbo v0, "45889"
+    const-string/jumbo v0, "45890"
+    const-string/jumbo v0, "45891"
+    const-string/jumbo v0, "45892"
+    const-string/jumbo v0, "45893"
+    const-string/jumbo v0, "45894"
+    const-string/jumbo v0, "45895"
+    const-string/jumbo v0, "45896"
+    const-string/jumbo v0, "45897"
+    const-string/jumbo v0, "45898"
+    const-string/jumbo v0, "45899"
+    const-string/jumbo v0, "45900"
+    const-string/jumbo v0, "45901"
+    const-string/jumbo v0, "45902"
+    const-string/jumbo v0, "45903"
+    const-string/jumbo v0, "45904"
+    const-string/jumbo v0, "45905"
+    const-string/jumbo v0, "45906"
+    const-string/jumbo v0, "45907"
+    const-string/jumbo v0, "45908"
+    const-string/jumbo v0, "45909"
+    const-string/jumbo v0, "45910"
+    const-string/jumbo v0, "45911"
+    const-string/jumbo v0, "45912"
+    const-string/jumbo v0, "45913"
+    const-string/jumbo v0, "45914"
+    const-string/jumbo v0, "45915"
+    const-string/jumbo v0, "45916"
+    const-string/jumbo v0, "45917"
+    const-string/jumbo v0, "45918"
+    const-string/jumbo v0, "45919"
+    const-string/jumbo v0, "45920"
+    const-string/jumbo v0, "45921"
+    const-string/jumbo v0, "45922"
+    const-string/jumbo v0, "45923"
+    const-string/jumbo v0, "45924"
+    const-string/jumbo v0, "45925"
+    const-string/jumbo v0, "45926"
+    const-string/jumbo v0, "45927"
+    const-string/jumbo v0, "45928"
+    const-string/jumbo v0, "45929"
+    const-string/jumbo v0, "45930"
+    const-string/jumbo v0, "45931"
+    const-string/jumbo v0, "45932"
+    const-string/jumbo v0, "45933"
+    const-string/jumbo v0, "45934"
+    const-string/jumbo v0, "45935"
+    const-string/jumbo v0, "45936"
+    const-string/jumbo v0, "45937"
+    const-string/jumbo v0, "45938"
+    const-string/jumbo v0, "45939"
+    const-string/jumbo v0, "45940"
+    const-string/jumbo v0, "45941"
+    const-string/jumbo v0, "45942"
+    const-string/jumbo v0, "45943"
+    const-string/jumbo v0, "45944"
+    const-string/jumbo v0, "45945"
+    const-string/jumbo v0, "45946"
+    const-string/jumbo v0, "45947"
+    const-string/jumbo v0, "45948"
+    const-string/jumbo v0, "45949"
+    const-string/jumbo v0, "45950"
+    const-string/jumbo v0, "45951"
+    const-string/jumbo v0, "45952"
+    const-string/jumbo v0, "45953"
+    const-string/jumbo v0, "45954"
+    const-string/jumbo v0, "45955"
+    const-string/jumbo v0, "45956"
+    const-string/jumbo v0, "45957"
+    const-string/jumbo v0, "45958"
+    const-string/jumbo v0, "45959"
+    const-string/jumbo v0, "45960"
+    const-string/jumbo v0, "45961"
+    const-string/jumbo v0, "45962"
+    const-string/jumbo v0, "45963"
+    const-string/jumbo v0, "45964"
+    const-string/jumbo v0, "45965"
+    const-string/jumbo v0, "45966"
+    const-string/jumbo v0, "45967"
+    const-string/jumbo v0, "45968"
+    const-string/jumbo v0, "45969"
+    const-string/jumbo v0, "45970"
+    const-string/jumbo v0, "45971"
+    const-string/jumbo v0, "45972"
+    const-string/jumbo v0, "45973"
+    const-string/jumbo v0, "45974"
+    const-string/jumbo v0, "45975"
+    const-string/jumbo v0, "45976"
+    const-string/jumbo v0, "45977"
+    const-string/jumbo v0, "45978"
+    const-string/jumbo v0, "45979"
+    const-string/jumbo v0, "45980"
+    const-string/jumbo v0, "45981"
+    const-string/jumbo v0, "45982"
+    const-string/jumbo v0, "45983"
+    const-string/jumbo v0, "45984"
+    const-string/jumbo v0, "45985"
+    const-string/jumbo v0, "45986"
+    const-string/jumbo v0, "45987"
+    const-string/jumbo v0, "45988"
+    const-string/jumbo v0, "45989"
+    const-string/jumbo v0, "45990"
+    const-string/jumbo v0, "45991"
+    const-string/jumbo v0, "45992"
+    const-string/jumbo v0, "45993"
+    const-string/jumbo v0, "45994"
+    const-string/jumbo v0, "45995"
+    const-string/jumbo v0, "45996"
+    const-string/jumbo v0, "45997"
+    const-string/jumbo v0, "45998"
+    const-string/jumbo v0, "45999"
+    const-string/jumbo v0, "46000"
+    const-string/jumbo v0, "46001"
+    const-string/jumbo v0, "46002"
+    const-string/jumbo v0, "46003"
+    const-string/jumbo v0, "46004"
+    const-string/jumbo v0, "46005"
+    const-string/jumbo v0, "46006"
+    const-string/jumbo v0, "46007"
+    const-string/jumbo v0, "46008"
+    const-string/jumbo v0, "46009"
+    const-string/jumbo v0, "46010"
+    const-string/jumbo v0, "46011"
+    const-string/jumbo v0, "46012"
+    const-string/jumbo v0, "46013"
+    const-string/jumbo v0, "46014"
+    const-string/jumbo v0, "46015"
+    const-string/jumbo v0, "46016"
+    const-string/jumbo v0, "46017"
+    const-string/jumbo v0, "46018"
+    const-string/jumbo v0, "46019"
+    const-string/jumbo v0, "46020"
+    const-string/jumbo v0, "46021"
+    const-string/jumbo v0, "46022"
+    const-string/jumbo v0, "46023"
+    const-string/jumbo v0, "46024"
+    const-string/jumbo v0, "46025"
+    const-string/jumbo v0, "46026"
+    const-string/jumbo v0, "46027"
+    const-string/jumbo v0, "46028"
+    const-string/jumbo v0, "46029"
+    const-string/jumbo v0, "46030"
+    const-string/jumbo v0, "46031"
+    const-string/jumbo v0, "46032"
+    const-string/jumbo v0, "46033"
+    const-string/jumbo v0, "46034"
+    const-string/jumbo v0, "46035"
+    const-string/jumbo v0, "46036"
+    const-string/jumbo v0, "46037"
+    const-string/jumbo v0, "46038"
+    const-string/jumbo v0, "46039"
+    const-string/jumbo v0, "46040"
+    const-string/jumbo v0, "46041"
+    const-string/jumbo v0, "46042"
+    const-string/jumbo v0, "46043"
+    const-string/jumbo v0, "46044"
+    const-string/jumbo v0, "46045"
+    const-string/jumbo v0, "46046"
+    const-string/jumbo v0, "46047"
+    const-string/jumbo v0, "46048"
+    const-string/jumbo v0, "46049"
+    const-string/jumbo v0, "46050"
+    const-string/jumbo v0, "46051"
+    const-string/jumbo v0, "46052"
+    const-string/jumbo v0, "46053"
+    const-string/jumbo v0, "46054"
+    const-string/jumbo v0, "46055"
+    const-string/jumbo v0, "46056"
+    const-string/jumbo v0, "46057"
+    const-string/jumbo v0, "46058"
+    const-string/jumbo v0, "46059"
+    const-string/jumbo v0, "46060"
+    const-string/jumbo v0, "46061"
+    const-string/jumbo v0, "46062"
+    const-string/jumbo v0, "46063"
+    const-string/jumbo v0, "46064"
+    const-string/jumbo v0, "46065"
+    const-string/jumbo v0, "46066"
+    const-string/jumbo v0, "46067"
+    const-string/jumbo v0, "46068"
+    const-string/jumbo v0, "46069"
+    const-string/jumbo v0, "46070"
+    const-string/jumbo v0, "46071"
+    const-string/jumbo v0, "46072"
+    const-string/jumbo v0, "46073"
+    const-string/jumbo v0, "46074"
+    const-string/jumbo v0, "46075"
+    const-string/jumbo v0, "46076"
+    const-string/jumbo v0, "46077"
+    const-string/jumbo v0, "46078"
+    const-string/jumbo v0, "46079"
+    const-string/jumbo v0, "46080"
+    const-string/jumbo v0, "46081"
+    const-string/jumbo v0, "46082"
+    const-string/jumbo v0, "46083"
+    const-string/jumbo v0, "46084"
+    const-string/jumbo v0, "46085"
+    const-string/jumbo v0, "46086"
+    const-string/jumbo v0, "46087"
+    const-string/jumbo v0, "46088"
+    const-string/jumbo v0, "46089"
+    const-string/jumbo v0, "46090"
+    const-string/jumbo v0, "46091"
+    const-string/jumbo v0, "46092"
+    const-string/jumbo v0, "46093"
+    const-string/jumbo v0, "46094"
+    const-string/jumbo v0, "46095"
+    const-string/jumbo v0, "46096"
+    const-string/jumbo v0, "46097"
+    const-string/jumbo v0, "46098"
+    const-string/jumbo v0, "46099"
+    const-string/jumbo v0, "46100"
+    const-string/jumbo v0, "46101"
+    const-string/jumbo v0, "46102"
+    const-string/jumbo v0, "46103"
+    const-string/jumbo v0, "46104"
+    const-string/jumbo v0, "46105"
+    const-string/jumbo v0, "46106"
+    const-string/jumbo v0, "46107"
+    const-string/jumbo v0, "46108"
+    const-string/jumbo v0, "46109"
+    const-string/jumbo v0, "46110"
+    const-string/jumbo v0, "46111"
+    const-string/jumbo v0, "46112"
+    const-string/jumbo v0, "46113"
+    const-string/jumbo v0, "46114"
+    const-string/jumbo v0, "46115"
+    const-string/jumbo v0, "46116"
+    const-string/jumbo v0, "46117"
+    const-string/jumbo v0, "46118"
+    const-string/jumbo v0, "46119"
+    const-string/jumbo v0, "46120"
+    const-string/jumbo v0, "46121"
+    const-string/jumbo v0, "46122"
+    const-string/jumbo v0, "46123"
+    const-string/jumbo v0, "46124"
+    const-string/jumbo v0, "46125"
+    const-string/jumbo v0, "46126"
+    const-string/jumbo v0, "46127"
+    const-string/jumbo v0, "46128"
+    const-string/jumbo v0, "46129"
+    const-string/jumbo v0, "46130"
+    const-string/jumbo v0, "46131"
+    const-string/jumbo v0, "46132"
+    const-string/jumbo v0, "46133"
+    const-string/jumbo v0, "46134"
+    const-string/jumbo v0, "46135"
+    const-string/jumbo v0, "46136"
+    const-string/jumbo v0, "46137"
+    const-string/jumbo v0, "46138"
+    const-string/jumbo v0, "46139"
+    const-string/jumbo v0, "46140"
+    const-string/jumbo v0, "46141"
+    const-string/jumbo v0, "46142"
+    const-string/jumbo v0, "46143"
+    const-string/jumbo v0, "46144"
+    const-string/jumbo v0, "46145"
+    const-string/jumbo v0, "46146"
+    const-string/jumbo v0, "46147"
+    const-string/jumbo v0, "46148"
+    const-string/jumbo v0, "46149"
+    const-string/jumbo v0, "46150"
+    const-string/jumbo v0, "46151"
+    const-string/jumbo v0, "46152"
+    const-string/jumbo v0, "46153"
+    const-string/jumbo v0, "46154"
+    const-string/jumbo v0, "46155"
+    const-string/jumbo v0, "46156"
+    const-string/jumbo v0, "46157"
+    const-string/jumbo v0, "46158"
+    const-string/jumbo v0, "46159"
+    const-string/jumbo v0, "46160"
+    const-string/jumbo v0, "46161"
+    const-string/jumbo v0, "46162"
+    const-string/jumbo v0, "46163"
+    const-string/jumbo v0, "46164"
+    const-string/jumbo v0, "46165"
+    const-string/jumbo v0, "46166"
+    const-string/jumbo v0, "46167"
+    const-string/jumbo v0, "46168"
+    const-string/jumbo v0, "46169"
+    const-string/jumbo v0, "46170"
+    const-string/jumbo v0, "46171"
+    const-string/jumbo v0, "46172"
+    const-string/jumbo v0, "46173"
+    const-string/jumbo v0, "46174"
+    const-string/jumbo v0, "46175"
+    const-string/jumbo v0, "46176"
+    const-string/jumbo v0, "46177"
+    const-string/jumbo v0, "46178"
+    const-string/jumbo v0, "46179"
+    const-string/jumbo v0, "46180"
+    const-string/jumbo v0, "46181"
+    const-string/jumbo v0, "46182"
+    const-string/jumbo v0, "46183"
+    const-string/jumbo v0, "46184"
+    const-string/jumbo v0, "46185"
+    const-string/jumbo v0, "46186"
+    const-string/jumbo v0, "46187"
+    const-string/jumbo v0, "46188"
+    const-string/jumbo v0, "46189"
+    const-string/jumbo v0, "46190"
+    const-string/jumbo v0, "46191"
+    const-string/jumbo v0, "46192"
+    const-string/jumbo v0, "46193"
+    const-string/jumbo v0, "46194"
+    const-string/jumbo v0, "46195"
+    const-string/jumbo v0, "46196"
+    const-string/jumbo v0, "46197"
+    const-string/jumbo v0, "46198"
+    const-string/jumbo v0, "46199"
+    const-string/jumbo v0, "46200"
+    const-string/jumbo v0, "46201"
+    const-string/jumbo v0, "46202"
+    const-string/jumbo v0, "46203"
+    const-string/jumbo v0, "46204"
+    const-string/jumbo v0, "46205"
+    const-string/jumbo v0, "46206"
+    const-string/jumbo v0, "46207"
+    const-string/jumbo v0, "46208"
+    const-string/jumbo v0, "46209"
+    const-string/jumbo v0, "46210"
+    const-string/jumbo v0, "46211"
+    const-string/jumbo v0, "46212"
+    const-string/jumbo v0, "46213"
+    const-string/jumbo v0, "46214"
+    const-string/jumbo v0, "46215"
+    const-string/jumbo v0, "46216"
+    const-string/jumbo v0, "46217"
+    const-string/jumbo v0, "46218"
+    const-string/jumbo v0, "46219"
+    const-string/jumbo v0, "46220"
+    const-string/jumbo v0, "46221"
+    const-string/jumbo v0, "46222"
+    const-string/jumbo v0, "46223"
+    const-string/jumbo v0, "46224"
+    const-string/jumbo v0, "46225"
+    const-string/jumbo v0, "46226"
+    const-string/jumbo v0, "46227"
+    const-string/jumbo v0, "46228"
+    const-string/jumbo v0, "46229"
+    const-string/jumbo v0, "46230"
+    const-string/jumbo v0, "46231"
+    const-string/jumbo v0, "46232"
+    const-string/jumbo v0, "46233"
+    const-string/jumbo v0, "46234"
+    const-string/jumbo v0, "46235"
+    const-string/jumbo v0, "46236"
+    const-string/jumbo v0, "46237"
+    const-string/jumbo v0, "46238"
+    const-string/jumbo v0, "46239"
+    const-string/jumbo v0, "46240"
+    const-string/jumbo v0, "46241"
+    const-string/jumbo v0, "46242"
+    const-string/jumbo v0, "46243"
+    const-string/jumbo v0, "46244"
+    const-string/jumbo v0, "46245"
+    const-string/jumbo v0, "46246"
+    const-string/jumbo v0, "46247"
+    const-string/jumbo v0, "46248"
+    const-string/jumbo v0, "46249"
+    const-string/jumbo v0, "46250"
+    const-string/jumbo v0, "46251"
+    const-string/jumbo v0, "46252"
+    const-string/jumbo v0, "46253"
+    const-string/jumbo v0, "46254"
+    const-string/jumbo v0, "46255"
+    const-string/jumbo v0, "46256"
+    const-string/jumbo v0, "46257"
+    const-string/jumbo v0, "46258"
+    const-string/jumbo v0, "46259"
+    const-string/jumbo v0, "46260"
+    const-string/jumbo v0, "46261"
+    const-string/jumbo v0, "46262"
+    const-string/jumbo v0, "46263"
+    const-string/jumbo v0, "46264"
+    const-string/jumbo v0, "46265"
+    const-string/jumbo v0, "46266"
+    const-string/jumbo v0, "46267"
+    const-string/jumbo v0, "46268"
+    const-string/jumbo v0, "46269"
+    const-string/jumbo v0, "46270"
+    const-string/jumbo v0, "46271"
+    const-string/jumbo v0, "46272"
+    const-string/jumbo v0, "46273"
+    const-string/jumbo v0, "46274"
+    const-string/jumbo v0, "46275"
+    const-string/jumbo v0, "46276"
+    const-string/jumbo v0, "46277"
+    const-string/jumbo v0, "46278"
+    const-string/jumbo v0, "46279"
+    const-string/jumbo v0, "46280"
+    const-string/jumbo v0, "46281"
+    const-string/jumbo v0, "46282"
+    const-string/jumbo v0, "46283"
+    const-string/jumbo v0, "46284"
+    const-string/jumbo v0, "46285"
+    const-string/jumbo v0, "46286"
+    const-string/jumbo v0, "46287"
+    const-string/jumbo v0, "46288"
+    const-string/jumbo v0, "46289"
+    const-string/jumbo v0, "46290"
+    const-string/jumbo v0, "46291"
+    const-string/jumbo v0, "46292"
+    const-string/jumbo v0, "46293"
+    const-string/jumbo v0, "46294"
+    const-string/jumbo v0, "46295"
+    const-string/jumbo v0, "46296"
+    const-string/jumbo v0, "46297"
+    const-string/jumbo v0, "46298"
+    const-string/jumbo v0, "46299"
+    const-string/jumbo v0, "46300"
+    const-string/jumbo v0, "46301"
+    const-string/jumbo v0, "46302"
+    const-string/jumbo v0, "46303"
+    const-string/jumbo v0, "46304"
+    const-string/jumbo v0, "46305"
+    const-string/jumbo v0, "46306"
+    const-string/jumbo v0, "46307"
+    const-string/jumbo v0, "46308"
+    const-string/jumbo v0, "46309"
+    const-string/jumbo v0, "46310"
+    const-string/jumbo v0, "46311"
+    const-string/jumbo v0, "46312"
+    const-string/jumbo v0, "46313"
+    const-string/jumbo v0, "46314"
+    const-string/jumbo v0, "46315"
+    const-string/jumbo v0, "46316"
+    const-string/jumbo v0, "46317"
+    const-string/jumbo v0, "46318"
+    const-string/jumbo v0, "46319"
+    const-string/jumbo v0, "46320"
+    const-string/jumbo v0, "46321"
+    const-string/jumbo v0, "46322"
+    const-string/jumbo v0, "46323"
+    const-string/jumbo v0, "46324"
+    const-string/jumbo v0, "46325"
+    const-string/jumbo v0, "46326"
+    const-string/jumbo v0, "46327"
+    const-string/jumbo v0, "46328"
+    const-string/jumbo v0, "46329"
+    const-string/jumbo v0, "46330"
+    const-string/jumbo v0, "46331"
+    const-string/jumbo v0, "46332"
+    const-string/jumbo v0, "46333"
+    const-string/jumbo v0, "46334"
+    const-string/jumbo v0, "46335"
+    const-string/jumbo v0, "46336"
+    const-string/jumbo v0, "46337"
+    const-string/jumbo v0, "46338"
+    const-string/jumbo v0, "46339"
+    const-string/jumbo v0, "46340"
+    const-string/jumbo v0, "46341"
+    const-string/jumbo v0, "46342"
+    const-string/jumbo v0, "46343"
+    const-string/jumbo v0, "46344"
+    const-string/jumbo v0, "46345"
+    const-string/jumbo v0, "46346"
+    const-string/jumbo v0, "46347"
+    const-string/jumbo v0, "46348"
+    const-string/jumbo v0, "46349"
+    const-string/jumbo v0, "46350"
+    const-string/jumbo v0, "46351"
+    const-string/jumbo v0, "46352"
+    const-string/jumbo v0, "46353"
+    const-string/jumbo v0, "46354"
+    const-string/jumbo v0, "46355"
+    const-string/jumbo v0, "46356"
+    const-string/jumbo v0, "46357"
+    const-string/jumbo v0, "46358"
+    const-string/jumbo v0, "46359"
+    const-string/jumbo v0, "46360"
+    const-string/jumbo v0, "46361"
+    const-string/jumbo v0, "46362"
+    const-string/jumbo v0, "46363"
+    const-string/jumbo v0, "46364"
+    const-string/jumbo v0, "46365"
+    const-string/jumbo v0, "46366"
+    const-string/jumbo v0, "46367"
+    const-string/jumbo v0, "46368"
+    const-string/jumbo v0, "46369"
+    const-string/jumbo v0, "46370"
+    const-string/jumbo v0, "46371"
+    const-string/jumbo v0, "46372"
+    const-string/jumbo v0, "46373"
+    const-string/jumbo v0, "46374"
+    const-string/jumbo v0, "46375"
+    const-string/jumbo v0, "46376"
+    const-string/jumbo v0, "46377"
+    const-string/jumbo v0, "46378"
+    const-string/jumbo v0, "46379"
+    const-string/jumbo v0, "46380"
+    const-string/jumbo v0, "46381"
+    const-string/jumbo v0, "46382"
+    const-string/jumbo v0, "46383"
+    const-string/jumbo v0, "46384"
+    const-string/jumbo v0, "46385"
+    const-string/jumbo v0, "46386"
+    const-string/jumbo v0, "46387"
+    const-string/jumbo v0, "46388"
+    const-string/jumbo v0, "46389"
+    const-string/jumbo v0, "46390"
+    const-string/jumbo v0, "46391"
+    const-string/jumbo v0, "46392"
+    const-string/jumbo v0, "46393"
+    const-string/jumbo v0, "46394"
+    const-string/jumbo v0, "46395"
+    const-string/jumbo v0, "46396"
+    const-string/jumbo v0, "46397"
+    const-string/jumbo v0, "46398"
+    const-string/jumbo v0, "46399"
+    const-string/jumbo v0, "46400"
+    const-string/jumbo v0, "46401"
+    const-string/jumbo v0, "46402"
+    const-string/jumbo v0, "46403"
+    const-string/jumbo v0, "46404"
+    const-string/jumbo v0, "46405"
+    const-string/jumbo v0, "46406"
+    const-string/jumbo v0, "46407"
+    const-string/jumbo v0, "46408"
+    const-string/jumbo v0, "46409"
+    const-string/jumbo v0, "46410"
+    const-string/jumbo v0, "46411"
+    const-string/jumbo v0, "46412"
+    const-string/jumbo v0, "46413"
+    const-string/jumbo v0, "46414"
+    const-string/jumbo v0, "46415"
+    const-string/jumbo v0, "46416"
+    const-string/jumbo v0, "46417"
+    const-string/jumbo v0, "46418"
+    const-string/jumbo v0, "46419"
+    const-string/jumbo v0, "46420"
+    const-string/jumbo v0, "46421"
+    const-string/jumbo v0, "46422"
+    const-string/jumbo v0, "46423"
+    const-string/jumbo v0, "46424"
+    const-string/jumbo v0, "46425"
+    const-string/jumbo v0, "46426"
+    const-string/jumbo v0, "46427"
+    const-string/jumbo v0, "46428"
+    const-string/jumbo v0, "46429"
+    const-string/jumbo v0, "46430"
+    const-string/jumbo v0, "46431"
+    const-string/jumbo v0, "46432"
+    const-string/jumbo v0, "46433"
+    const-string/jumbo v0, "46434"
+    const-string/jumbo v0, "46435"
+    const-string/jumbo v0, "46436"
+    const-string/jumbo v0, "46437"
+    const-string/jumbo v0, "46438"
+    const-string/jumbo v0, "46439"
+    const-string/jumbo v0, "46440"
+    const-string/jumbo v0, "46441"
+    const-string/jumbo v0, "46442"
+    const-string/jumbo v0, "46443"
+    const-string/jumbo v0, "46444"
+    const-string/jumbo v0, "46445"
+    const-string/jumbo v0, "46446"
+    const-string/jumbo v0, "46447"
+    const-string/jumbo v0, "46448"
+    const-string/jumbo v0, "46449"
+    const-string/jumbo v0, "46450"
+    const-string/jumbo v0, "46451"
+    const-string/jumbo v0, "46452"
+    const-string/jumbo v0, "46453"
+    const-string/jumbo v0, "46454"
+    const-string/jumbo v0, "46455"
+    const-string/jumbo v0, "46456"
+    const-string/jumbo v0, "46457"
+    const-string/jumbo v0, "46458"
+    const-string/jumbo v0, "46459"
+    const-string/jumbo v0, "46460"
+    const-string/jumbo v0, "46461"
+    const-string/jumbo v0, "46462"
+    const-string/jumbo v0, "46463"
+    const-string/jumbo v0, "46464"
+    const-string/jumbo v0, "46465"
+    const-string/jumbo v0, "46466"
+    const-string/jumbo v0, "46467"
+    const-string/jumbo v0, "46468"
+    const-string/jumbo v0, "46469"
+    const-string/jumbo v0, "46470"
+    const-string/jumbo v0, "46471"
+    const-string/jumbo v0, "46472"
+    const-string/jumbo v0, "46473"
+    const-string/jumbo v0, "46474"
+    const-string/jumbo v0, "46475"
+    const-string/jumbo v0, "46476"
+    const-string/jumbo v0, "46477"
+    const-string/jumbo v0, "46478"
+    const-string/jumbo v0, "46479"
+    const-string/jumbo v0, "46480"
+    const-string/jumbo v0, "46481"
+    const-string/jumbo v0, "46482"
+    const-string/jumbo v0, "46483"
+    const-string/jumbo v0, "46484"
+    const-string/jumbo v0, "46485"
+    const-string/jumbo v0, "46486"
+    const-string/jumbo v0, "46487"
+    const-string/jumbo v0, "46488"
+    const-string/jumbo v0, "46489"
+    const-string/jumbo v0, "46490"
+    const-string/jumbo v0, "46491"
+    const-string/jumbo v0, "46492"
+    const-string/jumbo v0, "46493"
+    const-string/jumbo v0, "46494"
+    const-string/jumbo v0, "46495"
+    const-string/jumbo v0, "46496"
+    const-string/jumbo v0, "46497"
+    const-string/jumbo v0, "46498"
+    const-string/jumbo v0, "46499"
+    const-string/jumbo v0, "46500"
+    const-string/jumbo v0, "46501"
+    const-string/jumbo v0, "46502"
+    const-string/jumbo v0, "46503"
+    const-string/jumbo v0, "46504"
+    const-string/jumbo v0, "46505"
+    const-string/jumbo v0, "46506"
+    const-string/jumbo v0, "46507"
+    const-string/jumbo v0, "46508"
+    const-string/jumbo v0, "46509"
+    const-string/jumbo v0, "46510"
+    const-string/jumbo v0, "46511"
+    const-string/jumbo v0, "46512"
+    const-string/jumbo v0, "46513"
+    const-string/jumbo v0, "46514"
+    const-string/jumbo v0, "46515"
+    const-string/jumbo v0, "46516"
+    const-string/jumbo v0, "46517"
+    const-string/jumbo v0, "46518"
+    const-string/jumbo v0, "46519"
+    const-string/jumbo v0, "46520"
+    const-string/jumbo v0, "46521"
+    const-string/jumbo v0, "46522"
+    const-string/jumbo v0, "46523"
+    const-string/jumbo v0, "46524"
+    const-string/jumbo v0, "46525"
+    const-string/jumbo v0, "46526"
+    const-string/jumbo v0, "46527"
+    const-string/jumbo v0, "46528"
+    const-string/jumbo v0, "46529"
+    const-string/jumbo v0, "46530"
+    const-string/jumbo v0, "46531"
+    const-string/jumbo v0, "46532"
+    const-string/jumbo v0, "46533"
+    const-string/jumbo v0, "46534"
+    const-string/jumbo v0, "46535"
+    const-string/jumbo v0, "46536"
+    const-string/jumbo v0, "46537"
+    const-string/jumbo v0, "46538"
+    const-string/jumbo v0, "46539"
+    const-string/jumbo v0, "46540"
+    const-string/jumbo v0, "46541"
+    const-string/jumbo v0, "46542"
+    const-string/jumbo v0, "46543"
+    const-string/jumbo v0, "46544"
+    const-string/jumbo v0, "46545"
+    const-string/jumbo v0, "46546"
+    const-string/jumbo v0, "46547"
+    const-string/jumbo v0, "46548"
+    const-string/jumbo v0, "46549"
+    const-string/jumbo v0, "46550"
+    const-string/jumbo v0, "46551"
+    const-string/jumbo v0, "46552"
+    const-string/jumbo v0, "46553"
+    const-string/jumbo v0, "46554"
+    const-string/jumbo v0, "46555"
+    const-string/jumbo v0, "46556"
+    const-string/jumbo v0, "46557"
+    const-string/jumbo v0, "46558"
+    const-string/jumbo v0, "46559"
+    const-string/jumbo v0, "46560"
+    const-string/jumbo v0, "46561"
+    const-string/jumbo v0, "46562"
+    const-string/jumbo v0, "46563"
+    const-string/jumbo v0, "46564"
+    const-string/jumbo v0, "46565"
+    const-string/jumbo v0, "46566"
+    const-string/jumbo v0, "46567"
+    const-string/jumbo v0, "46568"
+    const-string/jumbo v0, "46569"
+    const-string/jumbo v0, "46570"
+    const-string/jumbo v0, "46571"
+    const-string/jumbo v0, "46572"
+    const-string/jumbo v0, "46573"
+    const-string/jumbo v0, "46574"
+    const-string/jumbo v0, "46575"
+    const-string/jumbo v0, "46576"
+    const-string/jumbo v0, "46577"
+    const-string/jumbo v0, "46578"
+    const-string/jumbo v0, "46579"
+    const-string/jumbo v0, "46580"
+    const-string/jumbo v0, "46581"
+    const-string/jumbo v0, "46582"
+    const-string/jumbo v0, "46583"
+    const-string/jumbo v0, "46584"
+    const-string/jumbo v0, "46585"
+    const-string/jumbo v0, "46586"
+    const-string/jumbo v0, "46587"
+    const-string/jumbo v0, "46588"
+    const-string/jumbo v0, "46589"
+    const-string/jumbo v0, "46590"
+    const-string/jumbo v0, "46591"
+    const-string/jumbo v0, "46592"
+    const-string/jumbo v0, "46593"
+    const-string/jumbo v0, "46594"
+    const-string/jumbo v0, "46595"
+    const-string/jumbo v0, "46596"
+    const-string/jumbo v0, "46597"
+    const-string/jumbo v0, "46598"
+    const-string/jumbo v0, "46599"
+    const-string/jumbo v0, "46600"
+    const-string/jumbo v0, "46601"
+    const-string/jumbo v0, "46602"
+    const-string/jumbo v0, "46603"
+    const-string/jumbo v0, "46604"
+    const-string/jumbo v0, "46605"
+    const-string/jumbo v0, "46606"
+    const-string/jumbo v0, "46607"
+    const-string/jumbo v0, "46608"
+    const-string/jumbo v0, "46609"
+    const-string/jumbo v0, "46610"
+    const-string/jumbo v0, "46611"
+    const-string/jumbo v0, "46612"
+    const-string/jumbo v0, "46613"
+    const-string/jumbo v0, "46614"
+    const-string/jumbo v0, "46615"
+    const-string/jumbo v0, "46616"
+    const-string/jumbo v0, "46617"
+    const-string/jumbo v0, "46618"
+    const-string/jumbo v0, "46619"
+    const-string/jumbo v0, "46620"
+    const-string/jumbo v0, "46621"
+    const-string/jumbo v0, "46622"
+    const-string/jumbo v0, "46623"
+    const-string/jumbo v0, "46624"
+    const-string/jumbo v0, "46625"
+    const-string/jumbo v0, "46626"
+    const-string/jumbo v0, "46627"
+    const-string/jumbo v0, "46628"
+    const-string/jumbo v0, "46629"
+    const-string/jumbo v0, "46630"
+    const-string/jumbo v0, "46631"
+    const-string/jumbo v0, "46632"
+    const-string/jumbo v0, "46633"
+    const-string/jumbo v0, "46634"
+    const-string/jumbo v0, "46635"
+    const-string/jumbo v0, "46636"
+    const-string/jumbo v0, "46637"
+    const-string/jumbo v0, "46638"
+    const-string/jumbo v0, "46639"
+    const-string/jumbo v0, "46640"
+    const-string/jumbo v0, "46641"
+    const-string/jumbo v0, "46642"
+    const-string/jumbo v0, "46643"
+    const-string/jumbo v0, "46644"
+    const-string/jumbo v0, "46645"
+    const-string/jumbo v0, "46646"
+    const-string/jumbo v0, "46647"
+    const-string/jumbo v0, "46648"
+    const-string/jumbo v0, "46649"
+    const-string/jumbo v0, "46650"
+    const-string/jumbo v0, "46651"
+    const-string/jumbo v0, "46652"
+    const-string/jumbo v0, "46653"
+    const-string/jumbo v0, "46654"
+    const-string/jumbo v0, "46655"
+    const-string/jumbo v0, "46656"
+    const-string/jumbo v0, "46657"
+    const-string/jumbo v0, "46658"
+    const-string/jumbo v0, "46659"
+    const-string/jumbo v0, "46660"
+    const-string/jumbo v0, "46661"
+    const-string/jumbo v0, "46662"
+    const-string/jumbo v0, "46663"
+    const-string/jumbo v0, "46664"
+    const-string/jumbo v0, "46665"
+    const-string/jumbo v0, "46666"
+    const-string/jumbo v0, "46667"
+    const-string/jumbo v0, "46668"
+    const-string/jumbo v0, "46669"
+    const-string/jumbo v0, "46670"
+    const-string/jumbo v0, "46671"
+    const-string/jumbo v0, "46672"
+    const-string/jumbo v0, "46673"
+    const-string/jumbo v0, "46674"
+    const-string/jumbo v0, "46675"
+    const-string/jumbo v0, "46676"
+    const-string/jumbo v0, "46677"
+    const-string/jumbo v0, "46678"
+    const-string/jumbo v0, "46679"
+    const-string/jumbo v0, "46680"
+    const-string/jumbo v0, "46681"
+    const-string/jumbo v0, "46682"
+    const-string/jumbo v0, "46683"
+    const-string/jumbo v0, "46684"
+    const-string/jumbo v0, "46685"
+    const-string/jumbo v0, "46686"
+    const-string/jumbo v0, "46687"
+    const-string/jumbo v0, "46688"
+    const-string/jumbo v0, "46689"
+    const-string/jumbo v0, "46690"
+    const-string/jumbo v0, "46691"
+    const-string/jumbo v0, "46692"
+    const-string/jumbo v0, "46693"
+    const-string/jumbo v0, "46694"
+    const-string/jumbo v0, "46695"
+    const-string/jumbo v0, "46696"
+    const-string/jumbo v0, "46697"
+    const-string/jumbo v0, "46698"
+    const-string/jumbo v0, "46699"
+    const-string/jumbo v0, "46700"
+    const-string/jumbo v0, "46701"
+    const-string/jumbo v0, "46702"
+    const-string/jumbo v0, "46703"
+    const-string/jumbo v0, "46704"
+    const-string/jumbo v0, "46705"
+    const-string/jumbo v0, "46706"
+    const-string/jumbo v0, "46707"
+    const-string/jumbo v0, "46708"
+    const-string/jumbo v0, "46709"
+    const-string/jumbo v0, "46710"
+    const-string/jumbo v0, "46711"
+    const-string/jumbo v0, "46712"
+    const-string/jumbo v0, "46713"
+    const-string/jumbo v0, "46714"
+    const-string/jumbo v0, "46715"
+    const-string/jumbo v0, "46716"
+    const-string/jumbo v0, "46717"
+    const-string/jumbo v0, "46718"
+    const-string/jumbo v0, "46719"
+    const-string/jumbo v0, "46720"
+    const-string/jumbo v0, "46721"
+    const-string/jumbo v0, "46722"
+    const-string/jumbo v0, "46723"
+    const-string/jumbo v0, "46724"
+    const-string/jumbo v0, "46725"
+    const-string/jumbo v0, "46726"
+    const-string/jumbo v0, "46727"
+    const-string/jumbo v0, "46728"
+    const-string/jumbo v0, "46729"
+    const-string/jumbo v0, "46730"
+    const-string/jumbo v0, "46731"
+    const-string/jumbo v0, "46732"
+    const-string/jumbo v0, "46733"
+    const-string/jumbo v0, "46734"
+    const-string/jumbo v0, "46735"
+    const-string/jumbo v0, "46736"
+    const-string/jumbo v0, "46737"
+    const-string/jumbo v0, "46738"
+    const-string/jumbo v0, "46739"
+    const-string/jumbo v0, "46740"
+    const-string/jumbo v0, "46741"
+    const-string/jumbo v0, "46742"
+    const-string/jumbo v0, "46743"
+    const-string/jumbo v0, "46744"
+    const-string/jumbo v0, "46745"
+    const-string/jumbo v0, "46746"
+    const-string/jumbo v0, "46747"
+    const-string/jumbo v0, "46748"
+    const-string/jumbo v0, "46749"
+    const-string/jumbo v0, "46750"
+    const-string/jumbo v0, "46751"
+    const-string/jumbo v0, "46752"
+    const-string/jumbo v0, "46753"
+    const-string/jumbo v0, "46754"
+    const-string/jumbo v0, "46755"
+    const-string/jumbo v0, "46756"
+    const-string/jumbo v0, "46757"
+    const-string/jumbo v0, "46758"
+    const-string/jumbo v0, "46759"
+    const-string/jumbo v0, "46760"
+    const-string/jumbo v0, "46761"
+    const-string/jumbo v0, "46762"
+    const-string/jumbo v0, "46763"
+    const-string/jumbo v0, "46764"
+    const-string/jumbo v0, "46765"
+    const-string/jumbo v0, "46766"
+    const-string/jumbo v0, "46767"
+    const-string/jumbo v0, "46768"
+    const-string/jumbo v0, "46769"
+    const-string/jumbo v0, "46770"
+    const-string/jumbo v0, "46771"
+    const-string/jumbo v0, "46772"
+    const-string/jumbo v0, "46773"
+    const-string/jumbo v0, "46774"
+    const-string/jumbo v0, "46775"
+    const-string/jumbo v0, "46776"
+    const-string/jumbo v0, "46777"
+    const-string/jumbo v0, "46778"
+    const-string/jumbo v0, "46779"
+    const-string/jumbo v0, "46780"
+    const-string/jumbo v0, "46781"
+    const-string/jumbo v0, "46782"
+    const-string/jumbo v0, "46783"
+    const-string/jumbo v0, "46784"
+    const-string/jumbo v0, "46785"
+    const-string/jumbo v0, "46786"
+    const-string/jumbo v0, "46787"
+    const-string/jumbo v0, "46788"
+    const-string/jumbo v0, "46789"
+    const-string/jumbo v0, "46790"
+    const-string/jumbo v0, "46791"
+    const-string/jumbo v0, "46792"
+    const-string/jumbo v0, "46793"
+    const-string/jumbo v0, "46794"
+    const-string/jumbo v0, "46795"
+    const-string/jumbo v0, "46796"
+    const-string/jumbo v0, "46797"
+    const-string/jumbo v0, "46798"
+    const-string/jumbo v0, "46799"
+    const-string/jumbo v0, "46800"
+    const-string/jumbo v0, "46801"
+    const-string/jumbo v0, "46802"
+    const-string/jumbo v0, "46803"
+    const-string/jumbo v0, "46804"
+    const-string/jumbo v0, "46805"
+    const-string/jumbo v0, "46806"
+    const-string/jumbo v0, "46807"
+    const-string/jumbo v0, "46808"
+    const-string/jumbo v0, "46809"
+    const-string/jumbo v0, "46810"
+    const-string/jumbo v0, "46811"
+    const-string/jumbo v0, "46812"
+    const-string/jumbo v0, "46813"
+    const-string/jumbo v0, "46814"
+    const-string/jumbo v0, "46815"
+    const-string/jumbo v0, "46816"
+    const-string/jumbo v0, "46817"
+    const-string/jumbo v0, "46818"
+    const-string/jumbo v0, "46819"
+    const-string/jumbo v0, "46820"
+    const-string/jumbo v0, "46821"
+    const-string/jumbo v0, "46822"
+    const-string/jumbo v0, "46823"
+    const-string/jumbo v0, "46824"
+    const-string/jumbo v0, "46825"
+    const-string/jumbo v0, "46826"
+    const-string/jumbo v0, "46827"
+    const-string/jumbo v0, "46828"
+    const-string/jumbo v0, "46829"
+    const-string/jumbo v0, "46830"
+    const-string/jumbo v0, "46831"
+    const-string/jumbo v0, "46832"
+    const-string/jumbo v0, "46833"
+    const-string/jumbo v0, "46834"
+    const-string/jumbo v0, "46835"
+    const-string/jumbo v0, "46836"
+    const-string/jumbo v0, "46837"
+    const-string/jumbo v0, "46838"
+    const-string/jumbo v0, "46839"
+    const-string/jumbo v0, "46840"
+    const-string/jumbo v0, "46841"
+    const-string/jumbo v0, "46842"
+    const-string/jumbo v0, "46843"
+    const-string/jumbo v0, "46844"
+    const-string/jumbo v0, "46845"
+    const-string/jumbo v0, "46846"
+    const-string/jumbo v0, "46847"
+    const-string/jumbo v0, "46848"
+    const-string/jumbo v0, "46849"
+    const-string/jumbo v0, "46850"
+    const-string/jumbo v0, "46851"
+    const-string/jumbo v0, "46852"
+    const-string/jumbo v0, "46853"
+    const-string/jumbo v0, "46854"
+    const-string/jumbo v0, "46855"
+    const-string/jumbo v0, "46856"
+    const-string/jumbo v0, "46857"
+    const-string/jumbo v0, "46858"
+    const-string/jumbo v0, "46859"
+    const-string/jumbo v0, "46860"
+    const-string/jumbo v0, "46861"
+    const-string/jumbo v0, "46862"
+    const-string/jumbo v0, "46863"
+    const-string/jumbo v0, "46864"
+    const-string/jumbo v0, "46865"
+    const-string/jumbo v0, "46866"
+    const-string/jumbo v0, "46867"
+    const-string/jumbo v0, "46868"
+    const-string/jumbo v0, "46869"
+    const-string/jumbo v0, "46870"
+    const-string/jumbo v0, "46871"
+    const-string/jumbo v0, "46872"
+    const-string/jumbo v0, "46873"
+    const-string/jumbo v0, "46874"
+    const-string/jumbo v0, "46875"
+    const-string/jumbo v0, "46876"
+    const-string/jumbo v0, "46877"
+    const-string/jumbo v0, "46878"
+    const-string/jumbo v0, "46879"
+    const-string/jumbo v0, "46880"
+    const-string/jumbo v0, "46881"
+    const-string/jumbo v0, "46882"
+    const-string/jumbo v0, "46883"
+    const-string/jumbo v0, "46884"
+    const-string/jumbo v0, "46885"
+    const-string/jumbo v0, "46886"
+    const-string/jumbo v0, "46887"
+    const-string/jumbo v0, "46888"
+    const-string/jumbo v0, "46889"
+    const-string/jumbo v0, "46890"
+    const-string/jumbo v0, "46891"
+    const-string/jumbo v0, "46892"
+    const-string/jumbo v0, "46893"
+    const-string/jumbo v0, "46894"
+    const-string/jumbo v0, "46895"
+    const-string/jumbo v0, "46896"
+    const-string/jumbo v0, "46897"
+    const-string/jumbo v0, "46898"
+    const-string/jumbo v0, "46899"
+    const-string/jumbo v0, "46900"
+    const-string/jumbo v0, "46901"
+    const-string/jumbo v0, "46902"
+    const-string/jumbo v0, "46903"
+    const-string/jumbo v0, "46904"
+    const-string/jumbo v0, "46905"
+    const-string/jumbo v0, "46906"
+    const-string/jumbo v0, "46907"
+    const-string/jumbo v0, "46908"
+    const-string/jumbo v0, "46909"
+    const-string/jumbo v0, "46910"
+    const-string/jumbo v0, "46911"
+    const-string/jumbo v0, "46912"
+    const-string/jumbo v0, "46913"
+    const-string/jumbo v0, "46914"
+    const-string/jumbo v0, "46915"
+    const-string/jumbo v0, "46916"
+    const-string/jumbo v0, "46917"
+    const-string/jumbo v0, "46918"
+    const-string/jumbo v0, "46919"
+    const-string/jumbo v0, "46920"
+    const-string/jumbo v0, "46921"
+    const-string/jumbo v0, "46922"
+    const-string/jumbo v0, "46923"
+    const-string/jumbo v0, "46924"
+    const-string/jumbo v0, "46925"
+    const-string/jumbo v0, "46926"
+    const-string/jumbo v0, "46927"
+    const-string/jumbo v0, "46928"
+    const-string/jumbo v0, "46929"
+    const-string/jumbo v0, "46930"
+    const-string/jumbo v0, "46931"
+    const-string/jumbo v0, "46932"
+    const-string/jumbo v0, "46933"
+    const-string/jumbo v0, "46934"
+    const-string/jumbo v0, "46935"
+    const-string/jumbo v0, "46936"
+    const-string/jumbo v0, "46937"
+    const-string/jumbo v0, "46938"
+    const-string/jumbo v0, "46939"
+    const-string/jumbo v0, "46940"
+    const-string/jumbo v0, "46941"
+    const-string/jumbo v0, "46942"
+    const-string/jumbo v0, "46943"
+    const-string/jumbo v0, "46944"
+    const-string/jumbo v0, "46945"
+    const-string/jumbo v0, "46946"
+    const-string/jumbo v0, "46947"
+    const-string/jumbo v0, "46948"
+    const-string/jumbo v0, "46949"
+    const-string/jumbo v0, "46950"
+    const-string/jumbo v0, "46951"
+    const-string/jumbo v0, "46952"
+    const-string/jumbo v0, "46953"
+    const-string/jumbo v0, "46954"
+    const-string/jumbo v0, "46955"
+    const-string/jumbo v0, "46956"
+    const-string/jumbo v0, "46957"
+    const-string/jumbo v0, "46958"
+    const-string/jumbo v0, "46959"
+    const-string/jumbo v0, "46960"
+    const-string/jumbo v0, "46961"
+    const-string/jumbo v0, "46962"
+    const-string/jumbo v0, "46963"
+    const-string/jumbo v0, "46964"
+    const-string/jumbo v0, "46965"
+    const-string/jumbo v0, "46966"
+    const-string/jumbo v0, "46967"
+    const-string/jumbo v0, "46968"
+    const-string/jumbo v0, "46969"
+    const-string/jumbo v0, "46970"
+    const-string/jumbo v0, "46971"
+    const-string/jumbo v0, "46972"
+    const-string/jumbo v0, "46973"
+    const-string/jumbo v0, "46974"
+    const-string/jumbo v0, "46975"
+    const-string/jumbo v0, "46976"
+    const-string/jumbo v0, "46977"
+    const-string/jumbo v0, "46978"
+    const-string/jumbo v0, "46979"
+    const-string/jumbo v0, "46980"
+    const-string/jumbo v0, "46981"
+    const-string/jumbo v0, "46982"
+    const-string/jumbo v0, "46983"
+    const-string/jumbo v0, "46984"
+    const-string/jumbo v0, "46985"
+    const-string/jumbo v0, "46986"
+    const-string/jumbo v0, "46987"
+    const-string/jumbo v0, "46988"
+    const-string/jumbo v0, "46989"
+    const-string/jumbo v0, "46990"
+    const-string/jumbo v0, "46991"
+    const-string/jumbo v0, "46992"
+    const-string/jumbo v0, "46993"
+    const-string/jumbo v0, "46994"
+    const-string/jumbo v0, "46995"
+    const-string/jumbo v0, "46996"
+    const-string/jumbo v0, "46997"
+    const-string/jumbo v0, "46998"
+    const-string/jumbo v0, "46999"
+    const-string/jumbo v0, "47000"
+    const-string/jumbo v0, "47001"
+    const-string/jumbo v0, "47002"
+    const-string/jumbo v0, "47003"
+    const-string/jumbo v0, "47004"
+    const-string/jumbo v0, "47005"
+    const-string/jumbo v0, "47006"
+    const-string/jumbo v0, "47007"
+    const-string/jumbo v0, "47008"
+    const-string/jumbo v0, "47009"
+    const-string/jumbo v0, "47010"
+    const-string/jumbo v0, "47011"
+    const-string/jumbo v0, "47012"
+    const-string/jumbo v0, "47013"
+    const-string/jumbo v0, "47014"
+    const-string/jumbo v0, "47015"
+    const-string/jumbo v0, "47016"
+    const-string/jumbo v0, "47017"
+    const-string/jumbo v0, "47018"
+    const-string/jumbo v0, "47019"
+    const-string/jumbo v0, "47020"
+    const-string/jumbo v0, "47021"
+    const-string/jumbo v0, "47022"
+    const-string/jumbo v0, "47023"
+    const-string/jumbo v0, "47024"
+    const-string/jumbo v0, "47025"
+    const-string/jumbo v0, "47026"
+    const-string/jumbo v0, "47027"
+    const-string/jumbo v0, "47028"
+    const-string/jumbo v0, "47029"
+    const-string/jumbo v0, "47030"
+    const-string/jumbo v0, "47031"
+    const-string/jumbo v0, "47032"
+    const-string/jumbo v0, "47033"
+    const-string/jumbo v0, "47034"
+    const-string/jumbo v0, "47035"
+    const-string/jumbo v0, "47036"
+    const-string/jumbo v0, "47037"
+    const-string/jumbo v0, "47038"
+    const-string/jumbo v0, "47039"
+    const-string/jumbo v0, "47040"
+    const-string/jumbo v0, "47041"
+    const-string/jumbo v0, "47042"
+    const-string/jumbo v0, "47043"
+    const-string/jumbo v0, "47044"
+    const-string/jumbo v0, "47045"
+    const-string/jumbo v0, "47046"
+    const-string/jumbo v0, "47047"
+    const-string/jumbo v0, "47048"
+    const-string/jumbo v0, "47049"
+    const-string/jumbo v0, "47050"
+    const-string/jumbo v0, "47051"
+    const-string/jumbo v0, "47052"
+    const-string/jumbo v0, "47053"
+    const-string/jumbo v0, "47054"
+    const-string/jumbo v0, "47055"
+    const-string/jumbo v0, "47056"
+    const-string/jumbo v0, "47057"
+    const-string/jumbo v0, "47058"
+    const-string/jumbo v0, "47059"
+    const-string/jumbo v0, "47060"
+    const-string/jumbo v0, "47061"
+    const-string/jumbo v0, "47062"
+    const-string/jumbo v0, "47063"
+    const-string/jumbo v0, "47064"
+    const-string/jumbo v0, "47065"
+    const-string/jumbo v0, "47066"
+    const-string/jumbo v0, "47067"
+    const-string/jumbo v0, "47068"
+    const-string/jumbo v0, "47069"
+    const-string/jumbo v0, "47070"
+    const-string/jumbo v0, "47071"
+    const-string/jumbo v0, "47072"
+    const-string/jumbo v0, "47073"
+    const-string/jumbo v0, "47074"
+    const-string/jumbo v0, "47075"
+    const-string/jumbo v0, "47076"
+    const-string/jumbo v0, "47077"
+    const-string/jumbo v0, "47078"
+    const-string/jumbo v0, "47079"
+    const-string/jumbo v0, "47080"
+    const-string/jumbo v0, "47081"
+    const-string/jumbo v0, "47082"
+    const-string/jumbo v0, "47083"
+    const-string/jumbo v0, "47084"
+    const-string/jumbo v0, "47085"
+    const-string/jumbo v0, "47086"
+    const-string/jumbo v0, "47087"
+    const-string/jumbo v0, "47088"
+    const-string/jumbo v0, "47089"
+    const-string/jumbo v0, "47090"
+    const-string/jumbo v0, "47091"
+    const-string/jumbo v0, "47092"
+    const-string/jumbo v0, "47093"
+    const-string/jumbo v0, "47094"
+    const-string/jumbo v0, "47095"
+    const-string/jumbo v0, "47096"
+    const-string/jumbo v0, "47097"
+    const-string/jumbo v0, "47098"
+    const-string/jumbo v0, "47099"
+    const-string/jumbo v0, "47100"
+    const-string/jumbo v0, "47101"
+    const-string/jumbo v0, "47102"
+    const-string/jumbo v0, "47103"
+    const-string/jumbo v0, "47104"
+    const-string/jumbo v0, "47105"
+    const-string/jumbo v0, "47106"
+    const-string/jumbo v0, "47107"
+    const-string/jumbo v0, "47108"
+    const-string/jumbo v0, "47109"
+    const-string/jumbo v0, "47110"
+    const-string/jumbo v0, "47111"
+    const-string/jumbo v0, "47112"
+    const-string/jumbo v0, "47113"
+    const-string/jumbo v0, "47114"
+    const-string/jumbo v0, "47115"
+    const-string/jumbo v0, "47116"
+    const-string/jumbo v0, "47117"
+    const-string/jumbo v0, "47118"
+    const-string/jumbo v0, "47119"
+    const-string/jumbo v0, "47120"
+    const-string/jumbo v0, "47121"
+    const-string/jumbo v0, "47122"
+    const-string/jumbo v0, "47123"
+    const-string/jumbo v0, "47124"
+    const-string/jumbo v0, "47125"
+    const-string/jumbo v0, "47126"
+    const-string/jumbo v0, "47127"
+    const-string/jumbo v0, "47128"
+    const-string/jumbo v0, "47129"
+    const-string/jumbo v0, "47130"
+    const-string/jumbo v0, "47131"
+    const-string/jumbo v0, "47132"
+    const-string/jumbo v0, "47133"
+    const-string/jumbo v0, "47134"
+    const-string/jumbo v0, "47135"
+    const-string/jumbo v0, "47136"
+    const-string/jumbo v0, "47137"
+    const-string/jumbo v0, "47138"
+    const-string/jumbo v0, "47139"
+    const-string/jumbo v0, "47140"
+    const-string/jumbo v0, "47141"
+    const-string/jumbo v0, "47142"
+    const-string/jumbo v0, "47143"
+    const-string/jumbo v0, "47144"
+    const-string/jumbo v0, "47145"
+    const-string/jumbo v0, "47146"
+    const-string/jumbo v0, "47147"
+    const-string/jumbo v0, "47148"
+    const-string/jumbo v0, "47149"
+    const-string/jumbo v0, "47150"
+    const-string/jumbo v0, "47151"
+    const-string/jumbo v0, "47152"
+    const-string/jumbo v0, "47153"
+    const-string/jumbo v0, "47154"
+    const-string/jumbo v0, "47155"
+    const-string/jumbo v0, "47156"
+    const-string/jumbo v0, "47157"
+    const-string/jumbo v0, "47158"
+    const-string/jumbo v0, "47159"
+    const-string/jumbo v0, "47160"
+    const-string/jumbo v0, "47161"
+    const-string/jumbo v0, "47162"
+    const-string/jumbo v0, "47163"
+    const-string/jumbo v0, "47164"
+    const-string/jumbo v0, "47165"
+    const-string/jumbo v0, "47166"
+    const-string/jumbo v0, "47167"
+    const-string/jumbo v0, "47168"
+    const-string/jumbo v0, "47169"
+    const-string/jumbo v0, "47170"
+    const-string/jumbo v0, "47171"
+    const-string/jumbo v0, "47172"
+    const-string/jumbo v0, "47173"
+    const-string/jumbo v0, "47174"
+    const-string/jumbo v0, "47175"
+    const-string/jumbo v0, "47176"
+    const-string/jumbo v0, "47177"
+    const-string/jumbo v0, "47178"
+    const-string/jumbo v0, "47179"
+    const-string/jumbo v0, "47180"
+    const-string/jumbo v0, "47181"
+    const-string/jumbo v0, "47182"
+    const-string/jumbo v0, "47183"
+    const-string/jumbo v0, "47184"
+    const-string/jumbo v0, "47185"
+    const-string/jumbo v0, "47186"
+    const-string/jumbo v0, "47187"
+    const-string/jumbo v0, "47188"
+    const-string/jumbo v0, "47189"
+    const-string/jumbo v0, "47190"
+    const-string/jumbo v0, "47191"
+    const-string/jumbo v0, "47192"
+    const-string/jumbo v0, "47193"
+    const-string/jumbo v0, "47194"
+    const-string/jumbo v0, "47195"
+    const-string/jumbo v0, "47196"
+    const-string/jumbo v0, "47197"
+    const-string/jumbo v0, "47198"
+    const-string/jumbo v0, "47199"
+    const-string/jumbo v0, "47200"
+    const-string/jumbo v0, "47201"
+    const-string/jumbo v0, "47202"
+    const-string/jumbo v0, "47203"
+    const-string/jumbo v0, "47204"
+    const-string/jumbo v0, "47205"
+    const-string/jumbo v0, "47206"
+    const-string/jumbo v0, "47207"
+    const-string/jumbo v0, "47208"
+    const-string/jumbo v0, "47209"
+    const-string/jumbo v0, "47210"
+    const-string/jumbo v0, "47211"
+    const-string/jumbo v0, "47212"
+    const-string/jumbo v0, "47213"
+    const-string/jumbo v0, "47214"
+    const-string/jumbo v0, "47215"
+    const-string/jumbo v0, "47216"
+    const-string/jumbo v0, "47217"
+    const-string/jumbo v0, "47218"
+    const-string/jumbo v0, "47219"
+    const-string/jumbo v0, "47220"
+    const-string/jumbo v0, "47221"
+    const-string/jumbo v0, "47222"
+    const-string/jumbo v0, "47223"
+    const-string/jumbo v0, "47224"
+    const-string/jumbo v0, "47225"
+    const-string/jumbo v0, "47226"
+    const-string/jumbo v0, "47227"
+    const-string/jumbo v0, "47228"
+    const-string/jumbo v0, "47229"
+    const-string/jumbo v0, "47230"
+    const-string/jumbo v0, "47231"
+    const-string/jumbo v0, "47232"
+    const-string/jumbo v0, "47233"
+    const-string/jumbo v0, "47234"
+    const-string/jumbo v0, "47235"
+    const-string/jumbo v0, "47236"
+    const-string/jumbo v0, "47237"
+    const-string/jumbo v0, "47238"
+    const-string/jumbo v0, "47239"
+    const-string/jumbo v0, "47240"
+    const-string/jumbo v0, "47241"
+    const-string/jumbo v0, "47242"
+    const-string/jumbo v0, "47243"
+    const-string/jumbo v0, "47244"
+    const-string/jumbo v0, "47245"
+    const-string/jumbo v0, "47246"
+    const-string/jumbo v0, "47247"
+    const-string/jumbo v0, "47248"
+    const-string/jumbo v0, "47249"
+    const-string/jumbo v0, "47250"
+    const-string/jumbo v0, "47251"
+    const-string/jumbo v0, "47252"
+    const-string/jumbo v0, "47253"
+    const-string/jumbo v0, "47254"
+    const-string/jumbo v0, "47255"
+    const-string/jumbo v0, "47256"
+    const-string/jumbo v0, "47257"
+    const-string/jumbo v0, "47258"
+    const-string/jumbo v0, "47259"
+    const-string/jumbo v0, "47260"
+    const-string/jumbo v0, "47261"
+    const-string/jumbo v0, "47262"
+    const-string/jumbo v0, "47263"
+    const-string/jumbo v0, "47264"
+    const-string/jumbo v0, "47265"
+    const-string/jumbo v0, "47266"
+    const-string/jumbo v0, "47267"
+    const-string/jumbo v0, "47268"
+    const-string/jumbo v0, "47269"
+    const-string/jumbo v0, "47270"
+    const-string/jumbo v0, "47271"
+    const-string/jumbo v0, "47272"
+    const-string/jumbo v0, "47273"
+    const-string/jumbo v0, "47274"
+    const-string/jumbo v0, "47275"
+    const-string/jumbo v0, "47276"
+    const-string/jumbo v0, "47277"
+    const-string/jumbo v0, "47278"
+    const-string/jumbo v0, "47279"
+    const-string/jumbo v0, "47280"
+    const-string/jumbo v0, "47281"
+    const-string/jumbo v0, "47282"
+    const-string/jumbo v0, "47283"
+    const-string/jumbo v0, "47284"
+    const-string/jumbo v0, "47285"
+    const-string/jumbo v0, "47286"
+    const-string/jumbo v0, "47287"
+    const-string/jumbo v0, "47288"
+    const-string/jumbo v0, "47289"
+    const-string/jumbo v0, "47290"
+    const-string/jumbo v0, "47291"
+    const-string/jumbo v0, "47292"
+    const-string/jumbo v0, "47293"
+    const-string/jumbo v0, "47294"
+    const-string/jumbo v0, "47295"
+    const-string/jumbo v0, "47296"
+    const-string/jumbo v0, "47297"
+    const-string/jumbo v0, "47298"
+    const-string/jumbo v0, "47299"
+    const-string/jumbo v0, "47300"
+    const-string/jumbo v0, "47301"
+    const-string/jumbo v0, "47302"
+    const-string/jumbo v0, "47303"
+    const-string/jumbo v0, "47304"
+    const-string/jumbo v0, "47305"
+    const-string/jumbo v0, "47306"
+    const-string/jumbo v0, "47307"
+    const-string/jumbo v0, "47308"
+    const-string/jumbo v0, "47309"
+    const-string/jumbo v0, "47310"
+    const-string/jumbo v0, "47311"
+    const-string/jumbo v0, "47312"
+    const-string/jumbo v0, "47313"
+    const-string/jumbo v0, "47314"
+    const-string/jumbo v0, "47315"
+    const-string/jumbo v0, "47316"
+    const-string/jumbo v0, "47317"
+    const-string/jumbo v0, "47318"
+    const-string/jumbo v0, "47319"
+    const-string/jumbo v0, "47320"
+    const-string/jumbo v0, "47321"
+    const-string/jumbo v0, "47322"
+    const-string/jumbo v0, "47323"
+    const-string/jumbo v0, "47324"
+    const-string/jumbo v0, "47325"
+    const-string/jumbo v0, "47326"
+    const-string/jumbo v0, "47327"
+    const-string/jumbo v0, "47328"
+    const-string/jumbo v0, "47329"
+    const-string/jumbo v0, "47330"
+    const-string/jumbo v0, "47331"
+    const-string/jumbo v0, "47332"
+    const-string/jumbo v0, "47333"
+    const-string/jumbo v0, "47334"
+    const-string/jumbo v0, "47335"
+    const-string/jumbo v0, "47336"
+    const-string/jumbo v0, "47337"
+    const-string/jumbo v0, "47338"
+    const-string/jumbo v0, "47339"
+    const-string/jumbo v0, "47340"
+    const-string/jumbo v0, "47341"
+    const-string/jumbo v0, "47342"
+    const-string/jumbo v0, "47343"
+    const-string/jumbo v0, "47344"
+    const-string/jumbo v0, "47345"
+    const-string/jumbo v0, "47346"
+    const-string/jumbo v0, "47347"
+    const-string/jumbo v0, "47348"
+    const-string/jumbo v0, "47349"
+    const-string/jumbo v0, "47350"
+    const-string/jumbo v0, "47351"
+    const-string/jumbo v0, "47352"
+    const-string/jumbo v0, "47353"
+    const-string/jumbo v0, "47354"
+    const-string/jumbo v0, "47355"
+    const-string/jumbo v0, "47356"
+    const-string/jumbo v0, "47357"
+    const-string/jumbo v0, "47358"
+    const-string/jumbo v0, "47359"
+    const-string/jumbo v0, "47360"
+    const-string/jumbo v0, "47361"
+    const-string/jumbo v0, "47362"
+    const-string/jumbo v0, "47363"
+    const-string/jumbo v0, "47364"
+    const-string/jumbo v0, "47365"
+    const-string/jumbo v0, "47366"
+    const-string/jumbo v0, "47367"
+    const-string/jumbo v0, "47368"
+    const-string/jumbo v0, "47369"
+    const-string/jumbo v0, "47370"
+    const-string/jumbo v0, "47371"
+    const-string/jumbo v0, "47372"
+    const-string/jumbo v0, "47373"
+    const-string/jumbo v0, "47374"
+    const-string/jumbo v0, "47375"
+    const-string/jumbo v0, "47376"
+    const-string/jumbo v0, "47377"
+    const-string/jumbo v0, "47378"
+    const-string/jumbo v0, "47379"
+    const-string/jumbo v0, "47380"
+    const-string/jumbo v0, "47381"
+    const-string/jumbo v0, "47382"
+    const-string/jumbo v0, "47383"
+    const-string/jumbo v0, "47384"
+    const-string/jumbo v0, "47385"
+    const-string/jumbo v0, "47386"
+    const-string/jumbo v0, "47387"
+    const-string/jumbo v0, "47388"
+    const-string/jumbo v0, "47389"
+    const-string/jumbo v0, "47390"
+    const-string/jumbo v0, "47391"
+    const-string/jumbo v0, "47392"
+    const-string/jumbo v0, "47393"
+    const-string/jumbo v0, "47394"
+    const-string/jumbo v0, "47395"
+    const-string/jumbo v0, "47396"
+    const-string/jumbo v0, "47397"
+    const-string/jumbo v0, "47398"
+    const-string/jumbo v0, "47399"
+    const-string/jumbo v0, "47400"
+    const-string/jumbo v0, "47401"
+    const-string/jumbo v0, "47402"
+    const-string/jumbo v0, "47403"
+    const-string/jumbo v0, "47404"
+    const-string/jumbo v0, "47405"
+    const-string/jumbo v0, "47406"
+    const-string/jumbo v0, "47407"
+    const-string/jumbo v0, "47408"
+    const-string/jumbo v0, "47409"
+    const-string/jumbo v0, "47410"
+    const-string/jumbo v0, "47411"
+    const-string/jumbo v0, "47412"
+    const-string/jumbo v0, "47413"
+    const-string/jumbo v0, "47414"
+    const-string/jumbo v0, "47415"
+    const-string/jumbo v0, "47416"
+    const-string/jumbo v0, "47417"
+    const-string/jumbo v0, "47418"
+    const-string/jumbo v0, "47419"
+    const-string/jumbo v0, "47420"
+    const-string/jumbo v0, "47421"
+    const-string/jumbo v0, "47422"
+    const-string/jumbo v0, "47423"
+    const-string/jumbo v0, "47424"
+    const-string/jumbo v0, "47425"
+    const-string/jumbo v0, "47426"
+    const-string/jumbo v0, "47427"
+    const-string/jumbo v0, "47428"
+    const-string/jumbo v0, "47429"
+    const-string/jumbo v0, "47430"
+    const-string/jumbo v0, "47431"
+    const-string/jumbo v0, "47432"
+    const-string/jumbo v0, "47433"
+    const-string/jumbo v0, "47434"
+    const-string/jumbo v0, "47435"
+    const-string/jumbo v0, "47436"
+    const-string/jumbo v0, "47437"
+    const-string/jumbo v0, "47438"
+    const-string/jumbo v0, "47439"
+    const-string/jumbo v0, "47440"
+    const-string/jumbo v0, "47441"
+    const-string/jumbo v0, "47442"
+    const-string/jumbo v0, "47443"
+    const-string/jumbo v0, "47444"
+    const-string/jumbo v0, "47445"
+    const-string/jumbo v0, "47446"
+    const-string/jumbo v0, "47447"
+    const-string/jumbo v0, "47448"
+    const-string/jumbo v0, "47449"
+    const-string/jumbo v0, "47450"
+    const-string/jumbo v0, "47451"
+    const-string/jumbo v0, "47452"
+    const-string/jumbo v0, "47453"
+    const-string/jumbo v0, "47454"
+    const-string/jumbo v0, "47455"
+    const-string/jumbo v0, "47456"
+    const-string/jumbo v0, "47457"
+    const-string/jumbo v0, "47458"
+    const-string/jumbo v0, "47459"
+    const-string/jumbo v0, "47460"
+    const-string/jumbo v0, "47461"
+    const-string/jumbo v0, "47462"
+    const-string/jumbo v0, "47463"
+    const-string/jumbo v0, "47464"
+    const-string/jumbo v0, "47465"
+    const-string/jumbo v0, "47466"
+    const-string/jumbo v0, "47467"
+    const-string/jumbo v0, "47468"
+    const-string/jumbo v0, "47469"
+    const-string/jumbo v0, "47470"
+    const-string/jumbo v0, "47471"
+    const-string/jumbo v0, "47472"
+    const-string/jumbo v0, "47473"
+    const-string/jumbo v0, "47474"
+    const-string/jumbo v0, "47475"
+    const-string/jumbo v0, "47476"
+    const-string/jumbo v0, "47477"
+    const-string/jumbo v0, "47478"
+    const-string/jumbo v0, "47479"
+    const-string/jumbo v0, "47480"
+    const-string/jumbo v0, "47481"
+    const-string/jumbo v0, "47482"
+    const-string/jumbo v0, "47483"
+    const-string/jumbo v0, "47484"
+    const-string/jumbo v0, "47485"
+    const-string/jumbo v0, "47486"
+    const-string/jumbo v0, "47487"
+    const-string/jumbo v0, "47488"
+    const-string/jumbo v0, "47489"
+    const-string/jumbo v0, "47490"
+    const-string/jumbo v0, "47491"
+    const-string/jumbo v0, "47492"
+    const-string/jumbo v0, "47493"
+    const-string/jumbo v0, "47494"
+    const-string/jumbo v0, "47495"
+    const-string/jumbo v0, "47496"
+    const-string/jumbo v0, "47497"
+    const-string/jumbo v0, "47498"
+    const-string/jumbo v0, "47499"
+    const-string/jumbo v0, "47500"
+    const-string/jumbo v0, "47501"
+    const-string/jumbo v0, "47502"
+    const-string/jumbo v0, "47503"
+    const-string/jumbo v0, "47504"
+    const-string/jumbo v0, "47505"
+    const-string/jumbo v0, "47506"
+    const-string/jumbo v0, "47507"
+    const-string/jumbo v0, "47508"
+    const-string/jumbo v0, "47509"
+    const-string/jumbo v0, "47510"
+    const-string/jumbo v0, "47511"
+    const-string/jumbo v0, "47512"
+    const-string/jumbo v0, "47513"
+    const-string/jumbo v0, "47514"
+    const-string/jumbo v0, "47515"
+    const-string/jumbo v0, "47516"
+    const-string/jumbo v0, "47517"
+    const-string/jumbo v0, "47518"
+    const-string/jumbo v0, "47519"
+    const-string/jumbo v0, "47520"
+    const-string/jumbo v0, "47521"
+    const-string/jumbo v0, "47522"
+    const-string/jumbo v0, "47523"
+    const-string/jumbo v0, "47524"
+    const-string/jumbo v0, "47525"
+    const-string/jumbo v0, "47526"
+    const-string/jumbo v0, "47527"
+    const-string/jumbo v0, "47528"
+    const-string/jumbo v0, "47529"
+    const-string/jumbo v0, "47530"
+    const-string/jumbo v0, "47531"
+    const-string/jumbo v0, "47532"
+    const-string/jumbo v0, "47533"
+    const-string/jumbo v0, "47534"
+    const-string/jumbo v0, "47535"
+    const-string/jumbo v0, "47536"
+    const-string/jumbo v0, "47537"
+    const-string/jumbo v0, "47538"
+    const-string/jumbo v0, "47539"
+    const-string/jumbo v0, "47540"
+    const-string/jumbo v0, "47541"
+    const-string/jumbo v0, "47542"
+    const-string/jumbo v0, "47543"
+    const-string/jumbo v0, "47544"
+    const-string/jumbo v0, "47545"
+    const-string/jumbo v0, "47546"
+    const-string/jumbo v0, "47547"
+    const-string/jumbo v0, "47548"
+    const-string/jumbo v0, "47549"
+    const-string/jumbo v0, "47550"
+    const-string/jumbo v0, "47551"
+    const-string/jumbo v0, "47552"
+    const-string/jumbo v0, "47553"
+    const-string/jumbo v0, "47554"
+    const-string/jumbo v0, "47555"
+    const-string/jumbo v0, "47556"
+    const-string/jumbo v0, "47557"
+    const-string/jumbo v0, "47558"
+    const-string/jumbo v0, "47559"
+    const-string/jumbo v0, "47560"
+    const-string/jumbo v0, "47561"
+    const-string/jumbo v0, "47562"
+    const-string/jumbo v0, "47563"
+    const-string/jumbo v0, "47564"
+    const-string/jumbo v0, "47565"
+    const-string/jumbo v0, "47566"
+    const-string/jumbo v0, "47567"
+    const-string/jumbo v0, "47568"
+    const-string/jumbo v0, "47569"
+    const-string/jumbo v0, "47570"
+    const-string/jumbo v0, "47571"
+    const-string/jumbo v0, "47572"
+    const-string/jumbo v0, "47573"
+    const-string/jumbo v0, "47574"
+    const-string/jumbo v0, "47575"
+    const-string/jumbo v0, "47576"
+    const-string/jumbo v0, "47577"
+    const-string/jumbo v0, "47578"
+    const-string/jumbo v0, "47579"
+    const-string/jumbo v0, "47580"
+    const-string/jumbo v0, "47581"
+    const-string/jumbo v0, "47582"
+    const-string/jumbo v0, "47583"
+    const-string/jumbo v0, "47584"
+    const-string/jumbo v0, "47585"
+    const-string/jumbo v0, "47586"
+    const-string/jumbo v0, "47587"
+    const-string/jumbo v0, "47588"
+    const-string/jumbo v0, "47589"
+    const-string/jumbo v0, "47590"
+    const-string/jumbo v0, "47591"
+    const-string/jumbo v0, "47592"
+    const-string/jumbo v0, "47593"
+    const-string/jumbo v0, "47594"
+    const-string/jumbo v0, "47595"
+    const-string/jumbo v0, "47596"
+    const-string/jumbo v0, "47597"
+    const-string/jumbo v0, "47598"
+    const-string/jumbo v0, "47599"
+    const-string/jumbo v0, "47600"
+    const-string/jumbo v0, "47601"
+    const-string/jumbo v0, "47602"
+    const-string/jumbo v0, "47603"
+    const-string/jumbo v0, "47604"
+    const-string/jumbo v0, "47605"
+    const-string/jumbo v0, "47606"
+    const-string/jumbo v0, "47607"
+    const-string/jumbo v0, "47608"
+    const-string/jumbo v0, "47609"
+    const-string/jumbo v0, "47610"
+    const-string/jumbo v0, "47611"
+    const-string/jumbo v0, "47612"
+    const-string/jumbo v0, "47613"
+    const-string/jumbo v0, "47614"
+    const-string/jumbo v0, "47615"
+    const-string/jumbo v0, "47616"
+    const-string/jumbo v0, "47617"
+    const-string/jumbo v0, "47618"
+    const-string/jumbo v0, "47619"
+    const-string/jumbo v0, "47620"
+    const-string/jumbo v0, "47621"
+    const-string/jumbo v0, "47622"
+    const-string/jumbo v0, "47623"
+    const-string/jumbo v0, "47624"
+    const-string/jumbo v0, "47625"
+    const-string/jumbo v0, "47626"
+    const-string/jumbo v0, "47627"
+    const-string/jumbo v0, "47628"
+    const-string/jumbo v0, "47629"
+    const-string/jumbo v0, "47630"
+    const-string/jumbo v0, "47631"
+    const-string/jumbo v0, "47632"
+    const-string/jumbo v0, "47633"
+    const-string/jumbo v0, "47634"
+    const-string/jumbo v0, "47635"
+    const-string/jumbo v0, "47636"
+    const-string/jumbo v0, "47637"
+    const-string/jumbo v0, "47638"
+    const-string/jumbo v0, "47639"
+    const-string/jumbo v0, "47640"
+    const-string/jumbo v0, "47641"
+    const-string/jumbo v0, "47642"
+    const-string/jumbo v0, "47643"
+    const-string/jumbo v0, "47644"
+    const-string/jumbo v0, "47645"
+    const-string/jumbo v0, "47646"
+    const-string/jumbo v0, "47647"
+    const-string/jumbo v0, "47648"
+    const-string/jumbo v0, "47649"
+    const-string/jumbo v0, "47650"
+    const-string/jumbo v0, "47651"
+    const-string/jumbo v0, "47652"
+    const-string/jumbo v0, "47653"
+    const-string/jumbo v0, "47654"
+    const-string/jumbo v0, "47655"
+    const-string/jumbo v0, "47656"
+    const-string/jumbo v0, "47657"
+    const-string/jumbo v0, "47658"
+    const-string/jumbo v0, "47659"
+    const-string/jumbo v0, "47660"
+    const-string/jumbo v0, "47661"
+    const-string/jumbo v0, "47662"
+    const-string/jumbo v0, "47663"
+    const-string/jumbo v0, "47664"
+    const-string/jumbo v0, "47665"
+    const-string/jumbo v0, "47666"
+    const-string/jumbo v0, "47667"
+    const-string/jumbo v0, "47668"
+    const-string/jumbo v0, "47669"
+    const-string/jumbo v0, "47670"
+    const-string/jumbo v0, "47671"
+    const-string/jumbo v0, "47672"
+    const-string/jumbo v0, "47673"
+    const-string/jumbo v0, "47674"
+    const-string/jumbo v0, "47675"
+    const-string/jumbo v0, "47676"
+    const-string/jumbo v0, "47677"
+    const-string/jumbo v0, "47678"
+    const-string/jumbo v0, "47679"
+    const-string/jumbo v0, "47680"
+    const-string/jumbo v0, "47681"
+    const-string/jumbo v0, "47682"
+    const-string/jumbo v0, "47683"
+    const-string/jumbo v0, "47684"
+    const-string/jumbo v0, "47685"
+    const-string/jumbo v0, "47686"
+    const-string/jumbo v0, "47687"
+    const-string/jumbo v0, "47688"
+    const-string/jumbo v0, "47689"
+    const-string/jumbo v0, "47690"
+    const-string/jumbo v0, "47691"
+    const-string/jumbo v0, "47692"
+    const-string/jumbo v0, "47693"
+    const-string/jumbo v0, "47694"
+    const-string/jumbo v0, "47695"
+    const-string/jumbo v0, "47696"
+    const-string/jumbo v0, "47697"
+    const-string/jumbo v0, "47698"
+    const-string/jumbo v0, "47699"
+    const-string/jumbo v0, "47700"
+    const-string/jumbo v0, "47701"
+    const-string/jumbo v0, "47702"
+    const-string/jumbo v0, "47703"
+    const-string/jumbo v0, "47704"
+    const-string/jumbo v0, "47705"
+    const-string/jumbo v0, "47706"
+    const-string/jumbo v0, "47707"
+    const-string/jumbo v0, "47708"
+    const-string/jumbo v0, "47709"
+    const-string/jumbo v0, "47710"
+    const-string/jumbo v0, "47711"
+    const-string/jumbo v0, "47712"
+    const-string/jumbo v0, "47713"
+    const-string/jumbo v0, "47714"
+    const-string/jumbo v0, "47715"
+    const-string/jumbo v0, "47716"
+    const-string/jumbo v0, "47717"
+    const-string/jumbo v0, "47718"
+    const-string/jumbo v0, "47719"
+    const-string/jumbo v0, "47720"
+    const-string/jumbo v0, "47721"
+    const-string/jumbo v0, "47722"
+    const-string/jumbo v0, "47723"
+    const-string/jumbo v0, "47724"
+    const-string/jumbo v0, "47725"
+    const-string/jumbo v0, "47726"
+    const-string/jumbo v0, "47727"
+    const-string/jumbo v0, "47728"
+    const-string/jumbo v0, "47729"
+    const-string/jumbo v0, "47730"
+    const-string/jumbo v0, "47731"
+    const-string/jumbo v0, "47732"
+    const-string/jumbo v0, "47733"
+    const-string/jumbo v0, "47734"
+    const-string/jumbo v0, "47735"
+    const-string/jumbo v0, "47736"
+    const-string/jumbo v0, "47737"
+    const-string/jumbo v0, "47738"
+    const-string/jumbo v0, "47739"
+    const-string/jumbo v0, "47740"
+    const-string/jumbo v0, "47741"
+    const-string/jumbo v0, "47742"
+    const-string/jumbo v0, "47743"
+    const-string/jumbo v0, "47744"
+    const-string/jumbo v0, "47745"
+    const-string/jumbo v0, "47746"
+    const-string/jumbo v0, "47747"
+    const-string/jumbo v0, "47748"
+    const-string/jumbo v0, "47749"
+    const-string/jumbo v0, "47750"
+    const-string/jumbo v0, "47751"
+    const-string/jumbo v0, "47752"
+    const-string/jumbo v0, "47753"
+    const-string/jumbo v0, "47754"
+    const-string/jumbo v0, "47755"
+    const-string/jumbo v0, "47756"
+    const-string/jumbo v0, "47757"
+    const-string/jumbo v0, "47758"
+    const-string/jumbo v0, "47759"
+    const-string/jumbo v0, "47760"
+    const-string/jumbo v0, "47761"
+    const-string/jumbo v0, "47762"
+    const-string/jumbo v0, "47763"
+    const-string/jumbo v0, "47764"
+    const-string/jumbo v0, "47765"
+    const-string/jumbo v0, "47766"
+    const-string/jumbo v0, "47767"
+    const-string/jumbo v0, "47768"
+    const-string/jumbo v0, "47769"
+    const-string/jumbo v0, "47770"
+    const-string/jumbo v0, "47771"
+    const-string/jumbo v0, "47772"
+    const-string/jumbo v0, "47773"
+    const-string/jumbo v0, "47774"
+    const-string/jumbo v0, "47775"
+    const-string/jumbo v0, "47776"
+    const-string/jumbo v0, "47777"
+    const-string/jumbo v0, "47778"
+    const-string/jumbo v0, "47779"
+    const-string/jumbo v0, "47780"
+    const-string/jumbo v0, "47781"
+    const-string/jumbo v0, "47782"
+    const-string/jumbo v0, "47783"
+    const-string/jumbo v0, "47784"
+    const-string/jumbo v0, "47785"
+    const-string/jumbo v0, "47786"
+    const-string/jumbo v0, "47787"
+    const-string/jumbo v0, "47788"
+    const-string/jumbo v0, "47789"
+    const-string/jumbo v0, "47790"
+    const-string/jumbo v0, "47791"
+    const-string/jumbo v0, "47792"
+    const-string/jumbo v0, "47793"
+    const-string/jumbo v0, "47794"
+    const-string/jumbo v0, "47795"
+    const-string/jumbo v0, "47796"
+    const-string/jumbo v0, "47797"
+    const-string/jumbo v0, "47798"
+    const-string/jumbo v0, "47799"
+    const-string/jumbo v0, "47800"
+    const-string/jumbo v0, "47801"
+    const-string/jumbo v0, "47802"
+    const-string/jumbo v0, "47803"
+    const-string/jumbo v0, "47804"
+    const-string/jumbo v0, "47805"
+    const-string/jumbo v0, "47806"
+    const-string/jumbo v0, "47807"
+    const-string/jumbo v0, "47808"
+    const-string/jumbo v0, "47809"
+    const-string/jumbo v0, "47810"
+    const-string/jumbo v0, "47811"
+    const-string/jumbo v0, "47812"
+    const-string/jumbo v0, "47813"
+    const-string/jumbo v0, "47814"
+    const-string/jumbo v0, "47815"
+    const-string/jumbo v0, "47816"
+    const-string/jumbo v0, "47817"
+    const-string/jumbo v0, "47818"
+    const-string/jumbo v0, "47819"
+    const-string/jumbo v0, "47820"
+    const-string/jumbo v0, "47821"
+    const-string/jumbo v0, "47822"
+    const-string/jumbo v0, "47823"
+    const-string/jumbo v0, "47824"
+    const-string/jumbo v0, "47825"
+    const-string/jumbo v0, "47826"
+    const-string/jumbo v0, "47827"
+    const-string/jumbo v0, "47828"
+    const-string/jumbo v0, "47829"
+    const-string/jumbo v0, "47830"
+    const-string/jumbo v0, "47831"
+    const-string/jumbo v0, "47832"
+    const-string/jumbo v0, "47833"
+    const-string/jumbo v0, "47834"
+    const-string/jumbo v0, "47835"
+    const-string/jumbo v0, "47836"
+    const-string/jumbo v0, "47837"
+    const-string/jumbo v0, "47838"
+    const-string/jumbo v0, "47839"
+    const-string/jumbo v0, "47840"
+    const-string/jumbo v0, "47841"
+    const-string/jumbo v0, "47842"
+    const-string/jumbo v0, "47843"
+    const-string/jumbo v0, "47844"
+    const-string/jumbo v0, "47845"
+    const-string/jumbo v0, "47846"
+    const-string/jumbo v0, "47847"
+    const-string/jumbo v0, "47848"
+    const-string/jumbo v0, "47849"
+    const-string/jumbo v0, "47850"
+    const-string/jumbo v0, "47851"
+    const-string/jumbo v0, "47852"
+    const-string/jumbo v0, "47853"
+    const-string/jumbo v0, "47854"
+    const-string/jumbo v0, "47855"
+    const-string/jumbo v0, "47856"
+    const-string/jumbo v0, "47857"
+    const-string/jumbo v0, "47858"
+    const-string/jumbo v0, "47859"
+    const-string/jumbo v0, "47860"
+    const-string/jumbo v0, "47861"
+    const-string/jumbo v0, "47862"
+    const-string/jumbo v0, "47863"
+    const-string/jumbo v0, "47864"
+    const-string/jumbo v0, "47865"
+    const-string/jumbo v0, "47866"
+    const-string/jumbo v0, "47867"
+    const-string/jumbo v0, "47868"
+    const-string/jumbo v0, "47869"
+    const-string/jumbo v0, "47870"
+    const-string/jumbo v0, "47871"
+    const-string/jumbo v0, "47872"
+    const-string/jumbo v0, "47873"
+    const-string/jumbo v0, "47874"
+    const-string/jumbo v0, "47875"
+    const-string/jumbo v0, "47876"
+    const-string/jumbo v0, "47877"
+    const-string/jumbo v0, "47878"
+    const-string/jumbo v0, "47879"
+    const-string/jumbo v0, "47880"
+    const-string/jumbo v0, "47881"
+    const-string/jumbo v0, "47882"
+    const-string/jumbo v0, "47883"
+    const-string/jumbo v0, "47884"
+    const-string/jumbo v0, "47885"
+    const-string/jumbo v0, "47886"
+    const-string/jumbo v0, "47887"
+    const-string/jumbo v0, "47888"
+    const-string/jumbo v0, "47889"
+    const-string/jumbo v0, "47890"
+    const-string/jumbo v0, "47891"
+    const-string/jumbo v0, "47892"
+    const-string/jumbo v0, "47893"
+    const-string/jumbo v0, "47894"
+    const-string/jumbo v0, "47895"
+    const-string/jumbo v0, "47896"
+    const-string/jumbo v0, "47897"
+    const-string/jumbo v0, "47898"
+    const-string/jumbo v0, "47899"
+    const-string/jumbo v0, "47900"
+    const-string/jumbo v0, "47901"
+    const-string/jumbo v0, "47902"
+    const-string/jumbo v0, "47903"
+    const-string/jumbo v0, "47904"
+    const-string/jumbo v0, "47905"
+    const-string/jumbo v0, "47906"
+    const-string/jumbo v0, "47907"
+    const-string/jumbo v0, "47908"
+    const-string/jumbo v0, "47909"
+    const-string/jumbo v0, "47910"
+    const-string/jumbo v0, "47911"
+    const-string/jumbo v0, "47912"
+    const-string/jumbo v0, "47913"
+    const-string/jumbo v0, "47914"
+    const-string/jumbo v0, "47915"
+    const-string/jumbo v0, "47916"
+    const-string/jumbo v0, "47917"
+    const-string/jumbo v0, "47918"
+    const-string/jumbo v0, "47919"
+    const-string/jumbo v0, "47920"
+    const-string/jumbo v0, "47921"
+    const-string/jumbo v0, "47922"
+    const-string/jumbo v0, "47923"
+    const-string/jumbo v0, "47924"
+    const-string/jumbo v0, "47925"
+    const-string/jumbo v0, "47926"
+    const-string/jumbo v0, "47927"
+    const-string/jumbo v0, "47928"
+    const-string/jumbo v0, "47929"
+    const-string/jumbo v0, "47930"
+    const-string/jumbo v0, "47931"
+    const-string/jumbo v0, "47932"
+    const-string/jumbo v0, "47933"
+    const-string/jumbo v0, "47934"
+    const-string/jumbo v0, "47935"
+    const-string/jumbo v0, "47936"
+    const-string/jumbo v0, "47937"
+    const-string/jumbo v0, "47938"
+    const-string/jumbo v0, "47939"
+    const-string/jumbo v0, "47940"
+    const-string/jumbo v0, "47941"
+    const-string/jumbo v0, "47942"
+    const-string/jumbo v0, "47943"
+    const-string/jumbo v0, "47944"
+    const-string/jumbo v0, "47945"
+    const-string/jumbo v0, "47946"
+    const-string/jumbo v0, "47947"
+    const-string/jumbo v0, "47948"
+    const-string/jumbo v0, "47949"
+    const-string/jumbo v0, "47950"
+    const-string/jumbo v0, "47951"
+    const-string/jumbo v0, "47952"
+    const-string/jumbo v0, "47953"
+    const-string/jumbo v0, "47954"
+    const-string/jumbo v0, "47955"
+    const-string/jumbo v0, "47956"
+    const-string/jumbo v0, "47957"
+    const-string/jumbo v0, "47958"
+    const-string/jumbo v0, "47959"
+    const-string/jumbo v0, "47960"
+    const-string/jumbo v0, "47961"
+    const-string/jumbo v0, "47962"
+    const-string/jumbo v0, "47963"
+    const-string/jumbo v0, "47964"
+    const-string/jumbo v0, "47965"
+    const-string/jumbo v0, "47966"
+    const-string/jumbo v0, "47967"
+    const-string/jumbo v0, "47968"
+    const-string/jumbo v0, "47969"
+    const-string/jumbo v0, "47970"
+    const-string/jumbo v0, "47971"
+    const-string/jumbo v0, "47972"
+    const-string/jumbo v0, "47973"
+    const-string/jumbo v0, "47974"
+    const-string/jumbo v0, "47975"
+    const-string/jumbo v0, "47976"
+    const-string/jumbo v0, "47977"
+    const-string/jumbo v0, "47978"
+    const-string/jumbo v0, "47979"
+    const-string/jumbo v0, "47980"
+    const-string/jumbo v0, "47981"
+    const-string/jumbo v0, "47982"
+    const-string/jumbo v0, "47983"
+    const-string/jumbo v0, "47984"
+    const-string/jumbo v0, "47985"
+    const-string/jumbo v0, "47986"
+    const-string/jumbo v0, "47987"
+    const-string/jumbo v0, "47988"
+    const-string/jumbo v0, "47989"
+    const-string/jumbo v0, "47990"
+    const-string/jumbo v0, "47991"
+    const-string/jumbo v0, "47992"
+    const-string/jumbo v0, "47993"
+    const-string/jumbo v0, "47994"
+    const-string/jumbo v0, "47995"
+    const-string/jumbo v0, "47996"
+    const-string/jumbo v0, "47997"
+    const-string/jumbo v0, "47998"
+    const-string/jumbo v0, "47999"
+    const-string/jumbo v0, "48000"
+    const-string/jumbo v0, "48001"
+    const-string/jumbo v0, "48002"
+    const-string/jumbo v0, "48003"
+    const-string/jumbo v0, "48004"
+    const-string/jumbo v0, "48005"
+    const-string/jumbo v0, "48006"
+    const-string/jumbo v0, "48007"
+    const-string/jumbo v0, "48008"
+    const-string/jumbo v0, "48009"
+    const-string/jumbo v0, "48010"
+    const-string/jumbo v0, "48011"
+    const-string/jumbo v0, "48012"
+    const-string/jumbo v0, "48013"
+    const-string/jumbo v0, "48014"
+    const-string/jumbo v0, "48015"
+    const-string/jumbo v0, "48016"
+    const-string/jumbo v0, "48017"
+    const-string/jumbo v0, "48018"
+    const-string/jumbo v0, "48019"
+    const-string/jumbo v0, "48020"
+    const-string/jumbo v0, "48021"
+    const-string/jumbo v0, "48022"
+    const-string/jumbo v0, "48023"
+    const-string/jumbo v0, "48024"
+    const-string/jumbo v0, "48025"
+    const-string/jumbo v0, "48026"
+    const-string/jumbo v0, "48027"
+    const-string/jumbo v0, "48028"
+    const-string/jumbo v0, "48029"
+    const-string/jumbo v0, "48030"
+    const-string/jumbo v0, "48031"
+    const-string/jumbo v0, "48032"
+    const-string/jumbo v0, "48033"
+    const-string/jumbo v0, "48034"
+    const-string/jumbo v0, "48035"
+    const-string/jumbo v0, "48036"
+    const-string/jumbo v0, "48037"
+    const-string/jumbo v0, "48038"
+    const-string/jumbo v0, "48039"
+    const-string/jumbo v0, "48040"
+    const-string/jumbo v0, "48041"
+    const-string/jumbo v0, "48042"
+    const-string/jumbo v0, "48043"
+    const-string/jumbo v0, "48044"
+    const-string/jumbo v0, "48045"
+    const-string/jumbo v0, "48046"
+    const-string/jumbo v0, "48047"
+    const-string/jumbo v0, "48048"
+    const-string/jumbo v0, "48049"
+    const-string/jumbo v0, "48050"
+    const-string/jumbo v0, "48051"
+    const-string/jumbo v0, "48052"
+    const-string/jumbo v0, "48053"
+    const-string/jumbo v0, "48054"
+    const-string/jumbo v0, "48055"
+    const-string/jumbo v0, "48056"
+    const-string/jumbo v0, "48057"
+    const-string/jumbo v0, "48058"
+    const-string/jumbo v0, "48059"
+    const-string/jumbo v0, "48060"
+    const-string/jumbo v0, "48061"
+    const-string/jumbo v0, "48062"
+    const-string/jumbo v0, "48063"
+    const-string/jumbo v0, "48064"
+    const-string/jumbo v0, "48065"
+    const-string/jumbo v0, "48066"
+    const-string/jumbo v0, "48067"
+    const-string/jumbo v0, "48068"
+    const-string/jumbo v0, "48069"
+    const-string/jumbo v0, "48070"
+    const-string/jumbo v0, "48071"
+    const-string/jumbo v0, "48072"
+    const-string/jumbo v0, "48073"
+    const-string/jumbo v0, "48074"
+    const-string/jumbo v0, "48075"
+    const-string/jumbo v0, "48076"
+    const-string/jumbo v0, "48077"
+    const-string/jumbo v0, "48078"
+    const-string/jumbo v0, "48079"
+    const-string/jumbo v0, "48080"
+    const-string/jumbo v0, "48081"
+    const-string/jumbo v0, "48082"
+    const-string/jumbo v0, "48083"
+    const-string/jumbo v0, "48084"
+    const-string/jumbo v0, "48085"
+    const-string/jumbo v0, "48086"
+    const-string/jumbo v0, "48087"
+    const-string/jumbo v0, "48088"
+    const-string/jumbo v0, "48089"
+    const-string/jumbo v0, "48090"
+    const-string/jumbo v0, "48091"
+    const-string/jumbo v0, "48092"
+    const-string/jumbo v0, "48093"
+    const-string/jumbo v0, "48094"
+    const-string/jumbo v0, "48095"
+    const-string/jumbo v0, "48096"
+    const-string/jumbo v0, "48097"
+    const-string/jumbo v0, "48098"
+    const-string/jumbo v0, "48099"
+    const-string/jumbo v0, "48100"
+    const-string/jumbo v0, "48101"
+    const-string/jumbo v0, "48102"
+    const-string/jumbo v0, "48103"
+    const-string/jumbo v0, "48104"
+    const-string/jumbo v0, "48105"
+    const-string/jumbo v0, "48106"
+    const-string/jumbo v0, "48107"
+    const-string/jumbo v0, "48108"
+    const-string/jumbo v0, "48109"
+    const-string/jumbo v0, "48110"
+    const-string/jumbo v0, "48111"
+    const-string/jumbo v0, "48112"
+    const-string/jumbo v0, "48113"
+    const-string/jumbo v0, "48114"
+    const-string/jumbo v0, "48115"
+    const-string/jumbo v0, "48116"
+    const-string/jumbo v0, "48117"
+    const-string/jumbo v0, "48118"
+    const-string/jumbo v0, "48119"
+    const-string/jumbo v0, "48120"
+    const-string/jumbo v0, "48121"
+    const-string/jumbo v0, "48122"
+    const-string/jumbo v0, "48123"
+    const-string/jumbo v0, "48124"
+    const-string/jumbo v0, "48125"
+    const-string/jumbo v0, "48126"
+    const-string/jumbo v0, "48127"
+    const-string/jumbo v0, "48128"
+    const-string/jumbo v0, "48129"
+    const-string/jumbo v0, "48130"
+    const-string/jumbo v0, "48131"
+    const-string/jumbo v0, "48132"
+    const-string/jumbo v0, "48133"
+    const-string/jumbo v0, "48134"
+    const-string/jumbo v0, "48135"
+    const-string/jumbo v0, "48136"
+    const-string/jumbo v0, "48137"
+    const-string/jumbo v0, "48138"
+    const-string/jumbo v0, "48139"
+    const-string/jumbo v0, "48140"
+    const-string/jumbo v0, "48141"
+    const-string/jumbo v0, "48142"
+    const-string/jumbo v0, "48143"
+    const-string/jumbo v0, "48144"
+    const-string/jumbo v0, "48145"
+    const-string/jumbo v0, "48146"
+    const-string/jumbo v0, "48147"
+    const-string/jumbo v0, "48148"
+    const-string/jumbo v0, "48149"
+    const-string/jumbo v0, "48150"
+    const-string/jumbo v0, "48151"
+    const-string/jumbo v0, "48152"
+    const-string/jumbo v0, "48153"
+    const-string/jumbo v0, "48154"
+    const-string/jumbo v0, "48155"
+    const-string/jumbo v0, "48156"
+    const-string/jumbo v0, "48157"
+    const-string/jumbo v0, "48158"
+    const-string/jumbo v0, "48159"
+    const-string/jumbo v0, "48160"
+    const-string/jumbo v0, "48161"
+    const-string/jumbo v0, "48162"
+    const-string/jumbo v0, "48163"
+    const-string/jumbo v0, "48164"
+    const-string/jumbo v0, "48165"
+    const-string/jumbo v0, "48166"
+    const-string/jumbo v0, "48167"
+    const-string/jumbo v0, "48168"
+    const-string/jumbo v0, "48169"
+    const-string/jumbo v0, "48170"
+    const-string/jumbo v0, "48171"
+    const-string/jumbo v0, "48172"
+    const-string/jumbo v0, "48173"
+    const-string/jumbo v0, "48174"
+    const-string/jumbo v0, "48175"
+    const-string/jumbo v0, "48176"
+    const-string/jumbo v0, "48177"
+    const-string/jumbo v0, "48178"
+    const-string/jumbo v0, "48179"
+    const-string/jumbo v0, "48180"
+    const-string/jumbo v0, "48181"
+    const-string/jumbo v0, "48182"
+    const-string/jumbo v0, "48183"
+    const-string/jumbo v0, "48184"
+    const-string/jumbo v0, "48185"
+    const-string/jumbo v0, "48186"
+    const-string/jumbo v0, "48187"
+    const-string/jumbo v0, "48188"
+    const-string/jumbo v0, "48189"
+    const-string/jumbo v0, "48190"
+    const-string/jumbo v0, "48191"
+    const-string/jumbo v0, "48192"
+    const-string/jumbo v0, "48193"
+    const-string/jumbo v0, "48194"
+    const-string/jumbo v0, "48195"
+    const-string/jumbo v0, "48196"
+    const-string/jumbo v0, "48197"
+    const-string/jumbo v0, "48198"
+    const-string/jumbo v0, "48199"
+    const-string/jumbo v0, "48200"
+    const-string/jumbo v0, "48201"
+    const-string/jumbo v0, "48202"
+    const-string/jumbo v0, "48203"
+    const-string/jumbo v0, "48204"
+    const-string/jumbo v0, "48205"
+    const-string/jumbo v0, "48206"
+    const-string/jumbo v0, "48207"
+    const-string/jumbo v0, "48208"
+    const-string/jumbo v0, "48209"
+    const-string/jumbo v0, "48210"
+    const-string/jumbo v0, "48211"
+    const-string/jumbo v0, "48212"
+    const-string/jumbo v0, "48213"
+    const-string/jumbo v0, "48214"
+    const-string/jumbo v0, "48215"
+    const-string/jumbo v0, "48216"
+    const-string/jumbo v0, "48217"
+    const-string/jumbo v0, "48218"
+    const-string/jumbo v0, "48219"
+    const-string/jumbo v0, "48220"
+    const-string/jumbo v0, "48221"
+    const-string/jumbo v0, "48222"
+    const-string/jumbo v0, "48223"
+    const-string/jumbo v0, "48224"
+    const-string/jumbo v0, "48225"
+    const-string/jumbo v0, "48226"
+    const-string/jumbo v0, "48227"
+    const-string/jumbo v0, "48228"
+    const-string/jumbo v0, "48229"
+    const-string/jumbo v0, "48230"
+    const-string/jumbo v0, "48231"
+    const-string/jumbo v0, "48232"
+    const-string/jumbo v0, "48233"
+    const-string/jumbo v0, "48234"
+    const-string/jumbo v0, "48235"
+    const-string/jumbo v0, "48236"
+    const-string/jumbo v0, "48237"
+    const-string/jumbo v0, "48238"
+    const-string/jumbo v0, "48239"
+    const-string/jumbo v0, "48240"
+    const-string/jumbo v0, "48241"
+    const-string/jumbo v0, "48242"
+    const-string/jumbo v0, "48243"
+    const-string/jumbo v0, "48244"
+    const-string/jumbo v0, "48245"
+    const-string/jumbo v0, "48246"
+    const-string/jumbo v0, "48247"
+    const-string/jumbo v0, "48248"
+    const-string/jumbo v0, "48249"
+    const-string/jumbo v0, "48250"
+    const-string/jumbo v0, "48251"
+    const-string/jumbo v0, "48252"
+    const-string/jumbo v0, "48253"
+    const-string/jumbo v0, "48254"
+    const-string/jumbo v0, "48255"
+    const-string/jumbo v0, "48256"
+    const-string/jumbo v0, "48257"
+    const-string/jumbo v0, "48258"
+    const-string/jumbo v0, "48259"
+    const-string/jumbo v0, "48260"
+    const-string/jumbo v0, "48261"
+    const-string/jumbo v0, "48262"
+    const-string/jumbo v0, "48263"
+    const-string/jumbo v0, "48264"
+    const-string/jumbo v0, "48265"
+    const-string/jumbo v0, "48266"
+    const-string/jumbo v0, "48267"
+    const-string/jumbo v0, "48268"
+    const-string/jumbo v0, "48269"
+    const-string/jumbo v0, "48270"
+    const-string/jumbo v0, "48271"
+    const-string/jumbo v0, "48272"
+    const-string/jumbo v0, "48273"
+    const-string/jumbo v0, "48274"
+    const-string/jumbo v0, "48275"
+    const-string/jumbo v0, "48276"
+    const-string/jumbo v0, "48277"
+    const-string/jumbo v0, "48278"
+    const-string/jumbo v0, "48279"
+    const-string/jumbo v0, "48280"
+    const-string/jumbo v0, "48281"
+    const-string/jumbo v0, "48282"
+    const-string/jumbo v0, "48283"
+    const-string/jumbo v0, "48284"
+    const-string/jumbo v0, "48285"
+    const-string/jumbo v0, "48286"
+    const-string/jumbo v0, "48287"
+    const-string/jumbo v0, "48288"
+    const-string/jumbo v0, "48289"
+    const-string/jumbo v0, "48290"
+    const-string/jumbo v0, "48291"
+    const-string/jumbo v0, "48292"
+    const-string/jumbo v0, "48293"
+    const-string/jumbo v0, "48294"
+    const-string/jumbo v0, "48295"
+    const-string/jumbo v0, "48296"
+    const-string/jumbo v0, "48297"
+    const-string/jumbo v0, "48298"
+    const-string/jumbo v0, "48299"
+    const-string/jumbo v0, "48300"
+    const-string/jumbo v0, "48301"
+    const-string/jumbo v0, "48302"
+    const-string/jumbo v0, "48303"
+    const-string/jumbo v0, "48304"
+    const-string/jumbo v0, "48305"
+    const-string/jumbo v0, "48306"
+    const-string/jumbo v0, "48307"
+    const-string/jumbo v0, "48308"
+    const-string/jumbo v0, "48309"
+    const-string/jumbo v0, "48310"
+    const-string/jumbo v0, "48311"
+    const-string/jumbo v0, "48312"
+    const-string/jumbo v0, "48313"
+    const-string/jumbo v0, "48314"
+    const-string/jumbo v0, "48315"
+    const-string/jumbo v0, "48316"
+    const-string/jumbo v0, "48317"
+    const-string/jumbo v0, "48318"
+    const-string/jumbo v0, "48319"
+    const-string/jumbo v0, "48320"
+    const-string/jumbo v0, "48321"
+    const-string/jumbo v0, "48322"
+    const-string/jumbo v0, "48323"
+    const-string/jumbo v0, "48324"
+    const-string/jumbo v0, "48325"
+    const-string/jumbo v0, "48326"
+    const-string/jumbo v0, "48327"
+    const-string/jumbo v0, "48328"
+    const-string/jumbo v0, "48329"
+    const-string/jumbo v0, "48330"
+    const-string/jumbo v0, "48331"
+    const-string/jumbo v0, "48332"
+    const-string/jumbo v0, "48333"
+    const-string/jumbo v0, "48334"
+    const-string/jumbo v0, "48335"
+    const-string/jumbo v0, "48336"
+    const-string/jumbo v0, "48337"
+    const-string/jumbo v0, "48338"
+    const-string/jumbo v0, "48339"
+    const-string/jumbo v0, "48340"
+    const-string/jumbo v0, "48341"
+    const-string/jumbo v0, "48342"
+    const-string/jumbo v0, "48343"
+    const-string/jumbo v0, "48344"
+    const-string/jumbo v0, "48345"
+    const-string/jumbo v0, "48346"
+    const-string/jumbo v0, "48347"
+    const-string/jumbo v0, "48348"
+    const-string/jumbo v0, "48349"
+    const-string/jumbo v0, "48350"
+    const-string/jumbo v0, "48351"
+    const-string/jumbo v0, "48352"
+    const-string/jumbo v0, "48353"
+    const-string/jumbo v0, "48354"
+    const-string/jumbo v0, "48355"
+    const-string/jumbo v0, "48356"
+    const-string/jumbo v0, "48357"
+    const-string/jumbo v0, "48358"
+    const-string/jumbo v0, "48359"
+    const-string/jumbo v0, "48360"
+    const-string/jumbo v0, "48361"
+    const-string/jumbo v0, "48362"
+    const-string/jumbo v0, "48363"
+    const-string/jumbo v0, "48364"
+    const-string/jumbo v0, "48365"
+    const-string/jumbo v0, "48366"
+    const-string/jumbo v0, "48367"
+    const-string/jumbo v0, "48368"
+    const-string/jumbo v0, "48369"
+    const-string/jumbo v0, "48370"
+    const-string/jumbo v0, "48371"
+    const-string/jumbo v0, "48372"
+    const-string/jumbo v0, "48373"
+    const-string/jumbo v0, "48374"
+    const-string/jumbo v0, "48375"
+    const-string/jumbo v0, "48376"
+    const-string/jumbo v0, "48377"
+    const-string/jumbo v0, "48378"
+    const-string/jumbo v0, "48379"
+    const-string/jumbo v0, "48380"
+    const-string/jumbo v0, "48381"
+    const-string/jumbo v0, "48382"
+    const-string/jumbo v0, "48383"
+    const-string/jumbo v0, "48384"
+    const-string/jumbo v0, "48385"
+    const-string/jumbo v0, "48386"
+    const-string/jumbo v0, "48387"
+    const-string/jumbo v0, "48388"
+    const-string/jumbo v0, "48389"
+    const-string/jumbo v0, "48390"
+    const-string/jumbo v0, "48391"
+    const-string/jumbo v0, "48392"
+    const-string/jumbo v0, "48393"
+    const-string/jumbo v0, "48394"
+    const-string/jumbo v0, "48395"
+    const-string/jumbo v0, "48396"
+    const-string/jumbo v0, "48397"
+    const-string/jumbo v0, "48398"
+    const-string/jumbo v0, "48399"
+    const-string/jumbo v0, "48400"
+    const-string/jumbo v0, "48401"
+    const-string/jumbo v0, "48402"
+    const-string/jumbo v0, "48403"
+    const-string/jumbo v0, "48404"
+    const-string/jumbo v0, "48405"
+    const-string/jumbo v0, "48406"
+    const-string/jumbo v0, "48407"
+    const-string/jumbo v0, "48408"
+    const-string/jumbo v0, "48409"
+    const-string/jumbo v0, "48410"
+    const-string/jumbo v0, "48411"
+    const-string/jumbo v0, "48412"
+    const-string/jumbo v0, "48413"
+    const-string/jumbo v0, "48414"
+    const-string/jumbo v0, "48415"
+    const-string/jumbo v0, "48416"
+    const-string/jumbo v0, "48417"
+    const-string/jumbo v0, "48418"
+    const-string/jumbo v0, "48419"
+    const-string/jumbo v0, "48420"
+    const-string/jumbo v0, "48421"
+    const-string/jumbo v0, "48422"
+    const-string/jumbo v0, "48423"
+    const-string/jumbo v0, "48424"
+    const-string/jumbo v0, "48425"
+    const-string/jumbo v0, "48426"
+    const-string/jumbo v0, "48427"
+    const-string/jumbo v0, "48428"
+    const-string/jumbo v0, "48429"
+    const-string/jumbo v0, "48430"
+    const-string/jumbo v0, "48431"
+    const-string/jumbo v0, "48432"
+    const-string/jumbo v0, "48433"
+    const-string/jumbo v0, "48434"
+    const-string/jumbo v0, "48435"
+    const-string/jumbo v0, "48436"
+    const-string/jumbo v0, "48437"
+    const-string/jumbo v0, "48438"
+    const-string/jumbo v0, "48439"
+    const-string/jumbo v0, "48440"
+    const-string/jumbo v0, "48441"
+    const-string/jumbo v0, "48442"
+    const-string/jumbo v0, "48443"
+    const-string/jumbo v0, "48444"
+    const-string/jumbo v0, "48445"
+    const-string/jumbo v0, "48446"
+    const-string/jumbo v0, "48447"
+    const-string/jumbo v0, "48448"
+    const-string/jumbo v0, "48449"
+    const-string/jumbo v0, "48450"
+    const-string/jumbo v0, "48451"
+    const-string/jumbo v0, "48452"
+    const-string/jumbo v0, "48453"
+    const-string/jumbo v0, "48454"
+    const-string/jumbo v0, "48455"
+    const-string/jumbo v0, "48456"
+    const-string/jumbo v0, "48457"
+    const-string/jumbo v0, "48458"
+    const-string/jumbo v0, "48459"
+    const-string/jumbo v0, "48460"
+    const-string/jumbo v0, "48461"
+    const-string/jumbo v0, "48462"
+    const-string/jumbo v0, "48463"
+    const-string/jumbo v0, "48464"
+    const-string/jumbo v0, "48465"
+    const-string/jumbo v0, "48466"
+    const-string/jumbo v0, "48467"
+    const-string/jumbo v0, "48468"
+    const-string/jumbo v0, "48469"
+    const-string/jumbo v0, "48470"
+    const-string/jumbo v0, "48471"
+    const-string/jumbo v0, "48472"
+    const-string/jumbo v0, "48473"
+    const-string/jumbo v0, "48474"
+    const-string/jumbo v0, "48475"
+    const-string/jumbo v0, "48476"
+    const-string/jumbo v0, "48477"
+    const-string/jumbo v0, "48478"
+    const-string/jumbo v0, "48479"
+    const-string/jumbo v0, "48480"
+    const-string/jumbo v0, "48481"
+    const-string/jumbo v0, "48482"
+    const-string/jumbo v0, "48483"
+    const-string/jumbo v0, "48484"
+    const-string/jumbo v0, "48485"
+    const-string/jumbo v0, "48486"
+    const-string/jumbo v0, "48487"
+    const-string/jumbo v0, "48488"
+    const-string/jumbo v0, "48489"
+    const-string/jumbo v0, "48490"
+    const-string/jumbo v0, "48491"
+    const-string/jumbo v0, "48492"
+    const-string/jumbo v0, "48493"
+    const-string/jumbo v0, "48494"
+    const-string/jumbo v0, "48495"
+    const-string/jumbo v0, "48496"
+    const-string/jumbo v0, "48497"
+    const-string/jumbo v0, "48498"
+    const-string/jumbo v0, "48499"
+    const-string/jumbo v0, "48500"
+    const-string/jumbo v0, "48501"
+    const-string/jumbo v0, "48502"
+    const-string/jumbo v0, "48503"
+    const-string/jumbo v0, "48504"
+    const-string/jumbo v0, "48505"
+    const-string/jumbo v0, "48506"
+    const-string/jumbo v0, "48507"
+    const-string/jumbo v0, "48508"
+    const-string/jumbo v0, "48509"
+    const-string/jumbo v0, "48510"
+    const-string/jumbo v0, "48511"
+    const-string/jumbo v0, "48512"
+    const-string/jumbo v0, "48513"
+    const-string/jumbo v0, "48514"
+    const-string/jumbo v0, "48515"
+    const-string/jumbo v0, "48516"
+    const-string/jumbo v0, "48517"
+    const-string/jumbo v0, "48518"
+    const-string/jumbo v0, "48519"
+    const-string/jumbo v0, "48520"
+    const-string/jumbo v0, "48521"
+    const-string/jumbo v0, "48522"
+    const-string/jumbo v0, "48523"
+    const-string/jumbo v0, "48524"
+    const-string/jumbo v0, "48525"
+    const-string/jumbo v0, "48526"
+    const-string/jumbo v0, "48527"
+    const-string/jumbo v0, "48528"
+    const-string/jumbo v0, "48529"
+    const-string/jumbo v0, "48530"
+    const-string/jumbo v0, "48531"
+    const-string/jumbo v0, "48532"
+    const-string/jumbo v0, "48533"
+    const-string/jumbo v0, "48534"
+    const-string/jumbo v0, "48535"
+    const-string/jumbo v0, "48536"
+    const-string/jumbo v0, "48537"
+    const-string/jumbo v0, "48538"
+    const-string/jumbo v0, "48539"
+    const-string/jumbo v0, "48540"
+    const-string/jumbo v0, "48541"
+    const-string/jumbo v0, "48542"
+    const-string/jumbo v0, "48543"
+    const-string/jumbo v0, "48544"
+    const-string/jumbo v0, "48545"
+    const-string/jumbo v0, "48546"
+    const-string/jumbo v0, "48547"
+    const-string/jumbo v0, "48548"
+    const-string/jumbo v0, "48549"
+    const-string/jumbo v0, "48550"
+    const-string/jumbo v0, "48551"
+    const-string/jumbo v0, "48552"
+    const-string/jumbo v0, "48553"
+    const-string/jumbo v0, "48554"
+    const-string/jumbo v0, "48555"
+    const-string/jumbo v0, "48556"
+    const-string/jumbo v0, "48557"
+    const-string/jumbo v0, "48558"
+    const-string/jumbo v0, "48559"
+    const-string/jumbo v0, "48560"
+    const-string/jumbo v0, "48561"
+    const-string/jumbo v0, "48562"
+    const-string/jumbo v0, "48563"
+    const-string/jumbo v0, "48564"
+    const-string/jumbo v0, "48565"
+    const-string/jumbo v0, "48566"
+    const-string/jumbo v0, "48567"
+    const-string/jumbo v0, "48568"
+    const-string/jumbo v0, "48569"
+    const-string/jumbo v0, "48570"
+    const-string/jumbo v0, "48571"
+    const-string/jumbo v0, "48572"
+    const-string/jumbo v0, "48573"
+    const-string/jumbo v0, "48574"
+    const-string/jumbo v0, "48575"
+    const-string/jumbo v0, "48576"
+    const-string/jumbo v0, "48577"
+    const-string/jumbo v0, "48578"
+    const-string/jumbo v0, "48579"
+    const-string/jumbo v0, "48580"
+    const-string/jumbo v0, "48581"
+    const-string/jumbo v0, "48582"
+    const-string/jumbo v0, "48583"
+    const-string/jumbo v0, "48584"
+    const-string/jumbo v0, "48585"
+    const-string/jumbo v0, "48586"
+    const-string/jumbo v0, "48587"
+    const-string/jumbo v0, "48588"
+    const-string/jumbo v0, "48589"
+    const-string/jumbo v0, "48590"
+    const-string/jumbo v0, "48591"
+    const-string/jumbo v0, "48592"
+    const-string/jumbo v0, "48593"
+    const-string/jumbo v0, "48594"
+    const-string/jumbo v0, "48595"
+    const-string/jumbo v0, "48596"
+    const-string/jumbo v0, "48597"
+    const-string/jumbo v0, "48598"
+    const-string/jumbo v0, "48599"
+    const-string/jumbo v0, "48600"
+    const-string/jumbo v0, "48601"
+    const-string/jumbo v0, "48602"
+    const-string/jumbo v0, "48603"
+    const-string/jumbo v0, "48604"
+    const-string/jumbo v0, "48605"
+    const-string/jumbo v0, "48606"
+    const-string/jumbo v0, "48607"
+    const-string/jumbo v0, "48608"
+    const-string/jumbo v0, "48609"
+    const-string/jumbo v0, "48610"
+    const-string/jumbo v0, "48611"
+    const-string/jumbo v0, "48612"
+    const-string/jumbo v0, "48613"
+    const-string/jumbo v0, "48614"
+    const-string/jumbo v0, "48615"
+    const-string/jumbo v0, "48616"
+    const-string/jumbo v0, "48617"
+    const-string/jumbo v0, "48618"
+    const-string/jumbo v0, "48619"
+    const-string/jumbo v0, "48620"
+    const-string/jumbo v0, "48621"
+    const-string/jumbo v0, "48622"
+    const-string/jumbo v0, "48623"
+    const-string/jumbo v0, "48624"
+    const-string/jumbo v0, "48625"
+    const-string/jumbo v0, "48626"
+    const-string/jumbo v0, "48627"
+    const-string/jumbo v0, "48628"
+    const-string/jumbo v0, "48629"
+    const-string/jumbo v0, "48630"
+    const-string/jumbo v0, "48631"
+    const-string/jumbo v0, "48632"
+    const-string/jumbo v0, "48633"
+    const-string/jumbo v0, "48634"
+    const-string/jumbo v0, "48635"
+    const-string/jumbo v0, "48636"
+    const-string/jumbo v0, "48637"
+    const-string/jumbo v0, "48638"
+    const-string/jumbo v0, "48639"
+    const-string/jumbo v0, "48640"
+    const-string/jumbo v0, "48641"
+    const-string/jumbo v0, "48642"
+    const-string/jumbo v0, "48643"
+    const-string/jumbo v0, "48644"
+    const-string/jumbo v0, "48645"
+    const-string/jumbo v0, "48646"
+    const-string/jumbo v0, "48647"
+    const-string/jumbo v0, "48648"
+    const-string/jumbo v0, "48649"
+    const-string/jumbo v0, "48650"
+    const-string/jumbo v0, "48651"
+    const-string/jumbo v0, "48652"
+    const-string/jumbo v0, "48653"
+    const-string/jumbo v0, "48654"
+    const-string/jumbo v0, "48655"
+    const-string/jumbo v0, "48656"
+    const-string/jumbo v0, "48657"
+    const-string/jumbo v0, "48658"
+    const-string/jumbo v0, "48659"
+    const-string/jumbo v0, "48660"
+    const-string/jumbo v0, "48661"
+    const-string/jumbo v0, "48662"
+    const-string/jumbo v0, "48663"
+    const-string/jumbo v0, "48664"
+    const-string/jumbo v0, "48665"
+    const-string/jumbo v0, "48666"
+    const-string/jumbo v0, "48667"
+    const-string/jumbo v0, "48668"
+    const-string/jumbo v0, "48669"
+    const-string/jumbo v0, "48670"
+    const-string/jumbo v0, "48671"
+    const-string/jumbo v0, "48672"
+    const-string/jumbo v0, "48673"
+    const-string/jumbo v0, "48674"
+    const-string/jumbo v0, "48675"
+    const-string/jumbo v0, "48676"
+    const-string/jumbo v0, "48677"
+    const-string/jumbo v0, "48678"
+    const-string/jumbo v0, "48679"
+    const-string/jumbo v0, "48680"
+    const-string/jumbo v0, "48681"
+    const-string/jumbo v0, "48682"
+    const-string/jumbo v0, "48683"
+    const-string/jumbo v0, "48684"
+    const-string/jumbo v0, "48685"
+    const-string/jumbo v0, "48686"
+    const-string/jumbo v0, "48687"
+    const-string/jumbo v0, "48688"
+    const-string/jumbo v0, "48689"
+    const-string/jumbo v0, "48690"
+    const-string/jumbo v0, "48691"
+    const-string/jumbo v0, "48692"
+    const-string/jumbo v0, "48693"
+    const-string/jumbo v0, "48694"
+    const-string/jumbo v0, "48695"
+    const-string/jumbo v0, "48696"
+    const-string/jumbo v0, "48697"
+    const-string/jumbo v0, "48698"
+    const-string/jumbo v0, "48699"
+    const-string/jumbo v0, "48700"
+    const-string/jumbo v0, "48701"
+    const-string/jumbo v0, "48702"
+    const-string/jumbo v0, "48703"
+    const-string/jumbo v0, "48704"
+    const-string/jumbo v0, "48705"
+    const-string/jumbo v0, "48706"
+    const-string/jumbo v0, "48707"
+    const-string/jumbo v0, "48708"
+    const-string/jumbo v0, "48709"
+    const-string/jumbo v0, "48710"
+    const-string/jumbo v0, "48711"
+    const-string/jumbo v0, "48712"
+    const-string/jumbo v0, "48713"
+    const-string/jumbo v0, "48714"
+    const-string/jumbo v0, "48715"
+    const-string/jumbo v0, "48716"
+    const-string/jumbo v0, "48717"
+    const-string/jumbo v0, "48718"
+    const-string/jumbo v0, "48719"
+    const-string/jumbo v0, "48720"
+    const-string/jumbo v0, "48721"
+    const-string/jumbo v0, "48722"
+    const-string/jumbo v0, "48723"
+    const-string/jumbo v0, "48724"
+    const-string/jumbo v0, "48725"
+    const-string/jumbo v0, "48726"
+    const-string/jumbo v0, "48727"
+    const-string/jumbo v0, "48728"
+    const-string/jumbo v0, "48729"
+    const-string/jumbo v0, "48730"
+    const-string/jumbo v0, "48731"
+    const-string/jumbo v0, "48732"
+    const-string/jumbo v0, "48733"
+    const-string/jumbo v0, "48734"
+    const-string/jumbo v0, "48735"
+    const-string/jumbo v0, "48736"
+    const-string/jumbo v0, "48737"
+    const-string/jumbo v0, "48738"
+    const-string/jumbo v0, "48739"
+    const-string/jumbo v0, "48740"
+    const-string/jumbo v0, "48741"
+    const-string/jumbo v0, "48742"
+    const-string/jumbo v0, "48743"
+    const-string/jumbo v0, "48744"
+    const-string/jumbo v0, "48745"
+    const-string/jumbo v0, "48746"
+    const-string/jumbo v0, "48747"
+    const-string/jumbo v0, "48748"
+    const-string/jumbo v0, "48749"
+    const-string/jumbo v0, "48750"
+    const-string/jumbo v0, "48751"
+    const-string/jumbo v0, "48752"
+    const-string/jumbo v0, "48753"
+    const-string/jumbo v0, "48754"
+    const-string/jumbo v0, "48755"
+    const-string/jumbo v0, "48756"
+    const-string/jumbo v0, "48757"
+    const-string/jumbo v0, "48758"
+    const-string/jumbo v0, "48759"
+    const-string/jumbo v0, "48760"
+    const-string/jumbo v0, "48761"
+    const-string/jumbo v0, "48762"
+    const-string/jumbo v0, "48763"
+    const-string/jumbo v0, "48764"
+    const-string/jumbo v0, "48765"
+    const-string/jumbo v0, "48766"
+    const-string/jumbo v0, "48767"
+    const-string/jumbo v0, "48768"
+    const-string/jumbo v0, "48769"
+    const-string/jumbo v0, "48770"
+    const-string/jumbo v0, "48771"
+    const-string/jumbo v0, "48772"
+    const-string/jumbo v0, "48773"
+    const-string/jumbo v0, "48774"
+    const-string/jumbo v0, "48775"
+    const-string/jumbo v0, "48776"
+    const-string/jumbo v0, "48777"
+    const-string/jumbo v0, "48778"
+    const-string/jumbo v0, "48779"
+    const-string/jumbo v0, "48780"
+    const-string/jumbo v0, "48781"
+    const-string/jumbo v0, "48782"
+    const-string/jumbo v0, "48783"
+    const-string/jumbo v0, "48784"
+    const-string/jumbo v0, "48785"
+    const-string/jumbo v0, "48786"
+    const-string/jumbo v0, "48787"
+    const-string/jumbo v0, "48788"
+    const-string/jumbo v0, "48789"
+    const-string/jumbo v0, "48790"
+    const-string/jumbo v0, "48791"
+    const-string/jumbo v0, "48792"
+    const-string/jumbo v0, "48793"
+    const-string/jumbo v0, "48794"
+    const-string/jumbo v0, "48795"
+    const-string/jumbo v0, "48796"
+    const-string/jumbo v0, "48797"
+    const-string/jumbo v0, "48798"
+    const-string/jumbo v0, "48799"
+    const-string/jumbo v0, "48800"
+    const-string/jumbo v0, "48801"
+    const-string/jumbo v0, "48802"
+    const-string/jumbo v0, "48803"
+    const-string/jumbo v0, "48804"
+    const-string/jumbo v0, "48805"
+    const-string/jumbo v0, "48806"
+    const-string/jumbo v0, "48807"
+    const-string/jumbo v0, "48808"
+    const-string/jumbo v0, "48809"
+    const-string/jumbo v0, "48810"
+    const-string/jumbo v0, "48811"
+    const-string/jumbo v0, "48812"
+    const-string/jumbo v0, "48813"
+    const-string/jumbo v0, "48814"
+    const-string/jumbo v0, "48815"
+    const-string/jumbo v0, "48816"
+    const-string/jumbo v0, "48817"
+    const-string/jumbo v0, "48818"
+    const-string/jumbo v0, "48819"
+    const-string/jumbo v0, "48820"
+    const-string/jumbo v0, "48821"
+    const-string/jumbo v0, "48822"
+    const-string/jumbo v0, "48823"
+    const-string/jumbo v0, "48824"
+    const-string/jumbo v0, "48825"
+    const-string/jumbo v0, "48826"
+    const-string/jumbo v0, "48827"
+    const-string/jumbo v0, "48828"
+    const-string/jumbo v0, "48829"
+    const-string/jumbo v0, "48830"
+    const-string/jumbo v0, "48831"
+    const-string/jumbo v0, "48832"
+    const-string/jumbo v0, "48833"
+    const-string/jumbo v0, "48834"
+    const-string/jumbo v0, "48835"
+    const-string/jumbo v0, "48836"
+    const-string/jumbo v0, "48837"
+    const-string/jumbo v0, "48838"
+    const-string/jumbo v0, "48839"
+    const-string/jumbo v0, "48840"
+    const-string/jumbo v0, "48841"
+    const-string/jumbo v0, "48842"
+    const-string/jumbo v0, "48843"
+    const-string/jumbo v0, "48844"
+    const-string/jumbo v0, "48845"
+    const-string/jumbo v0, "48846"
+    const-string/jumbo v0, "48847"
+    const-string/jumbo v0, "48848"
+    const-string/jumbo v0, "48849"
+    const-string/jumbo v0, "48850"
+    const-string/jumbo v0, "48851"
+    const-string/jumbo v0, "48852"
+    const-string/jumbo v0, "48853"
+    const-string/jumbo v0, "48854"
+    const-string/jumbo v0, "48855"
+    const-string/jumbo v0, "48856"
+    const-string/jumbo v0, "48857"
+    const-string/jumbo v0, "48858"
+    const-string/jumbo v0, "48859"
+    const-string/jumbo v0, "48860"
+    const-string/jumbo v0, "48861"
+    const-string/jumbo v0, "48862"
+    const-string/jumbo v0, "48863"
+    const-string/jumbo v0, "48864"
+    const-string/jumbo v0, "48865"
+    const-string/jumbo v0, "48866"
+    const-string/jumbo v0, "48867"
+    const-string/jumbo v0, "48868"
+    const-string/jumbo v0, "48869"
+    const-string/jumbo v0, "48870"
+    const-string/jumbo v0, "48871"
+    const-string/jumbo v0, "48872"
+    const-string/jumbo v0, "48873"
+    const-string/jumbo v0, "48874"
+    const-string/jumbo v0, "48875"
+    const-string/jumbo v0, "48876"
+    const-string/jumbo v0, "48877"
+    const-string/jumbo v0, "48878"
+    const-string/jumbo v0, "48879"
+    const-string/jumbo v0, "48880"
+    const-string/jumbo v0, "48881"
+    const-string/jumbo v0, "48882"
+    const-string/jumbo v0, "48883"
+    const-string/jumbo v0, "48884"
+    const-string/jumbo v0, "48885"
+    const-string/jumbo v0, "48886"
+    const-string/jumbo v0, "48887"
+    const-string/jumbo v0, "48888"
+    const-string/jumbo v0, "48889"
+    const-string/jumbo v0, "48890"
+    const-string/jumbo v0, "48891"
+    const-string/jumbo v0, "48892"
+    const-string/jumbo v0, "48893"
+    const-string/jumbo v0, "48894"
+    const-string/jumbo v0, "48895"
+    const-string/jumbo v0, "48896"
+    const-string/jumbo v0, "48897"
+    const-string/jumbo v0, "48898"
+    const-string/jumbo v0, "48899"
+    const-string/jumbo v0, "48900"
+    const-string/jumbo v0, "48901"
+    const-string/jumbo v0, "48902"
+    const-string/jumbo v0, "48903"
+    const-string/jumbo v0, "48904"
+    const-string/jumbo v0, "48905"
+    const-string/jumbo v0, "48906"
+    const-string/jumbo v0, "48907"
+    const-string/jumbo v0, "48908"
+    const-string/jumbo v0, "48909"
+    const-string/jumbo v0, "48910"
+    const-string/jumbo v0, "48911"
+    const-string/jumbo v0, "48912"
+    const-string/jumbo v0, "48913"
+    const-string/jumbo v0, "48914"
+    const-string/jumbo v0, "48915"
+    const-string/jumbo v0, "48916"
+    const-string/jumbo v0, "48917"
+    const-string/jumbo v0, "48918"
+    const-string/jumbo v0, "48919"
+    const-string/jumbo v0, "48920"
+    const-string/jumbo v0, "48921"
+    const-string/jumbo v0, "48922"
+    const-string/jumbo v0, "48923"
+    const-string/jumbo v0, "48924"
+    const-string/jumbo v0, "48925"
+    const-string/jumbo v0, "48926"
+    const-string/jumbo v0, "48927"
+    const-string/jumbo v0, "48928"
+    const-string/jumbo v0, "48929"
+    const-string/jumbo v0, "48930"
+    const-string/jumbo v0, "48931"
+    const-string/jumbo v0, "48932"
+    const-string/jumbo v0, "48933"
+    const-string/jumbo v0, "48934"
+    const-string/jumbo v0, "48935"
+    const-string/jumbo v0, "48936"
+    const-string/jumbo v0, "48937"
+    const-string/jumbo v0, "48938"
+    const-string/jumbo v0, "48939"
+    const-string/jumbo v0, "48940"
+    const-string/jumbo v0, "48941"
+    const-string/jumbo v0, "48942"
+    const-string/jumbo v0, "48943"
+    const-string/jumbo v0, "48944"
+    const-string/jumbo v0, "48945"
+    const-string/jumbo v0, "48946"
+    const-string/jumbo v0, "48947"
+    const-string/jumbo v0, "48948"
+    const-string/jumbo v0, "48949"
+    const-string/jumbo v0, "48950"
+    const-string/jumbo v0, "48951"
+    const-string/jumbo v0, "48952"
+    const-string/jumbo v0, "48953"
+    const-string/jumbo v0, "48954"
+    const-string/jumbo v0, "48955"
+    const-string/jumbo v0, "48956"
+    const-string/jumbo v0, "48957"
+    const-string/jumbo v0, "48958"
+    const-string/jumbo v0, "48959"
+    const-string/jumbo v0, "48960"
+    const-string/jumbo v0, "48961"
+    const-string/jumbo v0, "48962"
+    const-string/jumbo v0, "48963"
+    const-string/jumbo v0, "48964"
+    const-string/jumbo v0, "48965"
+    const-string/jumbo v0, "48966"
+    const-string/jumbo v0, "48967"
+    const-string/jumbo v0, "48968"
+    const-string/jumbo v0, "48969"
+    const-string/jumbo v0, "48970"
+    const-string/jumbo v0, "48971"
+    const-string/jumbo v0, "48972"
+    const-string/jumbo v0, "48973"
+    const-string/jumbo v0, "48974"
+    const-string/jumbo v0, "48975"
+    const-string/jumbo v0, "48976"
+    const-string/jumbo v0, "48977"
+    const-string/jumbo v0, "48978"
+    const-string/jumbo v0, "48979"
+    const-string/jumbo v0, "48980"
+    const-string/jumbo v0, "48981"
+    const-string/jumbo v0, "48982"
+    const-string/jumbo v0, "48983"
+    const-string/jumbo v0, "48984"
+    const-string/jumbo v0, "48985"
+    const-string/jumbo v0, "48986"
+    const-string/jumbo v0, "48987"
+    const-string/jumbo v0, "48988"
+    const-string/jumbo v0, "48989"
+    const-string/jumbo v0, "48990"
+    const-string/jumbo v0, "48991"
+    const-string/jumbo v0, "48992"
+    const-string/jumbo v0, "48993"
+    const-string/jumbo v0, "48994"
+    const-string/jumbo v0, "48995"
+    const-string/jumbo v0, "48996"
+    const-string/jumbo v0, "48997"
+    const-string/jumbo v0, "48998"
+    const-string/jumbo v0, "48999"
+    const-string/jumbo v0, "49000"
+    const-string/jumbo v0, "49001"
+    const-string/jumbo v0, "49002"
+    const-string/jumbo v0, "49003"
+    const-string/jumbo v0, "49004"
+    const-string/jumbo v0, "49005"
+    const-string/jumbo v0, "49006"
+    const-string/jumbo v0, "49007"
+    const-string/jumbo v0, "49008"
+    const-string/jumbo v0, "49009"
+    const-string/jumbo v0, "49010"
+    const-string/jumbo v0, "49011"
+    const-string/jumbo v0, "49012"
+    const-string/jumbo v0, "49013"
+    const-string/jumbo v0, "49014"
+    const-string/jumbo v0, "49015"
+    const-string/jumbo v0, "49016"
+    const-string/jumbo v0, "49017"
+    const-string/jumbo v0, "49018"
+    const-string/jumbo v0, "49019"
+    const-string/jumbo v0, "49020"
+    const-string/jumbo v0, "49021"
+    const-string/jumbo v0, "49022"
+    const-string/jumbo v0, "49023"
+    const-string/jumbo v0, "49024"
+    const-string/jumbo v0, "49025"
+    const-string/jumbo v0, "49026"
+    const-string/jumbo v0, "49027"
+    const-string/jumbo v0, "49028"
+    const-string/jumbo v0, "49029"
+    const-string/jumbo v0, "49030"
+    const-string/jumbo v0, "49031"
+    const-string/jumbo v0, "49032"
+    const-string/jumbo v0, "49033"
+    const-string/jumbo v0, "49034"
+    const-string/jumbo v0, "49035"
+    const-string/jumbo v0, "49036"
+    const-string/jumbo v0, "49037"
+    const-string/jumbo v0, "49038"
+    const-string/jumbo v0, "49039"
+    const-string/jumbo v0, "49040"
+    const-string/jumbo v0, "49041"
+    const-string/jumbo v0, "49042"
+    const-string/jumbo v0, "49043"
+    const-string/jumbo v0, "49044"
+    const-string/jumbo v0, "49045"
+    const-string/jumbo v0, "49046"
+    const-string/jumbo v0, "49047"
+    const-string/jumbo v0, "49048"
+    const-string/jumbo v0, "49049"
+    const-string/jumbo v0, "49050"
+    const-string/jumbo v0, "49051"
+    const-string/jumbo v0, "49052"
+    const-string/jumbo v0, "49053"
+    const-string/jumbo v0, "49054"
+    const-string/jumbo v0, "49055"
+    const-string/jumbo v0, "49056"
+    const-string/jumbo v0, "49057"
+    const-string/jumbo v0, "49058"
+    const-string/jumbo v0, "49059"
+    const-string/jumbo v0, "49060"
+    const-string/jumbo v0, "49061"
+    const-string/jumbo v0, "49062"
+    const-string/jumbo v0, "49063"
+    const-string/jumbo v0, "49064"
+    const-string/jumbo v0, "49065"
+    const-string/jumbo v0, "49066"
+    const-string/jumbo v0, "49067"
+    const-string/jumbo v0, "49068"
+    const-string/jumbo v0, "49069"
+    const-string/jumbo v0, "49070"
+    const-string/jumbo v0, "49071"
+    const-string/jumbo v0, "49072"
+    const-string/jumbo v0, "49073"
+    const-string/jumbo v0, "49074"
+    const-string/jumbo v0, "49075"
+    const-string/jumbo v0, "49076"
+    const-string/jumbo v0, "49077"
+    const-string/jumbo v0, "49078"
+    const-string/jumbo v0, "49079"
+    const-string/jumbo v0, "49080"
+    const-string/jumbo v0, "49081"
+    const-string/jumbo v0, "49082"
+    const-string/jumbo v0, "49083"
+    const-string/jumbo v0, "49084"
+    const-string/jumbo v0, "49085"
+    const-string/jumbo v0, "49086"
+    const-string/jumbo v0, "49087"
+    const-string/jumbo v0, "49088"
+    const-string/jumbo v0, "49089"
+    const-string/jumbo v0, "49090"
+    const-string/jumbo v0, "49091"
+    const-string/jumbo v0, "49092"
+    const-string/jumbo v0, "49093"
+    const-string/jumbo v0, "49094"
+    const-string/jumbo v0, "49095"
+    const-string/jumbo v0, "49096"
+    const-string/jumbo v0, "49097"
+    const-string/jumbo v0, "49098"
+    const-string/jumbo v0, "49099"
+    const-string/jumbo v0, "49100"
+    const-string/jumbo v0, "49101"
+    const-string/jumbo v0, "49102"
+    const-string/jumbo v0, "49103"
+    const-string/jumbo v0, "49104"
+    const-string/jumbo v0, "49105"
+    const-string/jumbo v0, "49106"
+    const-string/jumbo v0, "49107"
+    const-string/jumbo v0, "49108"
+    const-string/jumbo v0, "49109"
+    const-string/jumbo v0, "49110"
+    const-string/jumbo v0, "49111"
+    const-string/jumbo v0, "49112"
+    const-string/jumbo v0, "49113"
+    const-string/jumbo v0, "49114"
+    const-string/jumbo v0, "49115"
+    const-string/jumbo v0, "49116"
+    const-string/jumbo v0, "49117"
+    const-string/jumbo v0, "49118"
+    const-string/jumbo v0, "49119"
+    const-string/jumbo v0, "49120"
+    const-string/jumbo v0, "49121"
+    const-string/jumbo v0, "49122"
+    const-string/jumbo v0, "49123"
+    const-string/jumbo v0, "49124"
+    const-string/jumbo v0, "49125"
+    const-string/jumbo v0, "49126"
+    const-string/jumbo v0, "49127"
+    const-string/jumbo v0, "49128"
+    const-string/jumbo v0, "49129"
+    const-string/jumbo v0, "49130"
+    const-string/jumbo v0, "49131"
+    const-string/jumbo v0, "49132"
+    const-string/jumbo v0, "49133"
+    const-string/jumbo v0, "49134"
+    const-string/jumbo v0, "49135"
+    const-string/jumbo v0, "49136"
+    const-string/jumbo v0, "49137"
+    const-string/jumbo v0, "49138"
+    const-string/jumbo v0, "49139"
+    const-string/jumbo v0, "49140"
+    const-string/jumbo v0, "49141"
+    const-string/jumbo v0, "49142"
+    const-string/jumbo v0, "49143"
+    const-string/jumbo v0, "49144"
+    const-string/jumbo v0, "49145"
+    const-string/jumbo v0, "49146"
+    const-string/jumbo v0, "49147"
+    const-string/jumbo v0, "49148"
+    const-string/jumbo v0, "49149"
+    const-string/jumbo v0, "49150"
+    const-string/jumbo v0, "49151"
+    const-string/jumbo v0, "49152"
+    const-string/jumbo v0, "49153"
+    const-string/jumbo v0, "49154"
+    const-string/jumbo v0, "49155"
+    const-string/jumbo v0, "49156"
+    const-string/jumbo v0, "49157"
+    const-string/jumbo v0, "49158"
+    const-string/jumbo v0, "49159"
+    const-string/jumbo v0, "49160"
+    const-string/jumbo v0, "49161"
+    const-string/jumbo v0, "49162"
+    const-string/jumbo v0, "49163"
+    const-string/jumbo v0, "49164"
+    const-string/jumbo v0, "49165"
+    const-string/jumbo v0, "49166"
+    const-string/jumbo v0, "49167"
+    const-string/jumbo v0, "49168"
+    const-string/jumbo v0, "49169"
+    const-string/jumbo v0, "49170"
+    const-string/jumbo v0, "49171"
+    const-string/jumbo v0, "49172"
+    const-string/jumbo v0, "49173"
+    const-string/jumbo v0, "49174"
+    const-string/jumbo v0, "49175"
+    const-string/jumbo v0, "49176"
+    const-string/jumbo v0, "49177"
+    const-string/jumbo v0, "49178"
+    const-string/jumbo v0, "49179"
+    const-string/jumbo v0, "49180"
+    const-string/jumbo v0, "49181"
+    const-string/jumbo v0, "49182"
+    const-string/jumbo v0, "49183"
+    const-string/jumbo v0, "49184"
+    const-string/jumbo v0, "49185"
+    const-string/jumbo v0, "49186"
+    const-string/jumbo v0, "49187"
+    const-string/jumbo v0, "49188"
+    const-string/jumbo v0, "49189"
+    const-string/jumbo v0, "49190"
+    const-string/jumbo v0, "49191"
+    const-string/jumbo v0, "49192"
+    const-string/jumbo v0, "49193"
+    const-string/jumbo v0, "49194"
+    const-string/jumbo v0, "49195"
+    const-string/jumbo v0, "49196"
+    const-string/jumbo v0, "49197"
+    const-string/jumbo v0, "49198"
+    const-string/jumbo v0, "49199"
+    const-string/jumbo v0, "49200"
+    const-string/jumbo v0, "49201"
+    const-string/jumbo v0, "49202"
+    const-string/jumbo v0, "49203"
+    const-string/jumbo v0, "49204"
+    const-string/jumbo v0, "49205"
+    const-string/jumbo v0, "49206"
+    const-string/jumbo v0, "49207"
+    const-string/jumbo v0, "49208"
+    const-string/jumbo v0, "49209"
+    const-string/jumbo v0, "49210"
+    const-string/jumbo v0, "49211"
+    const-string/jumbo v0, "49212"
+    const-string/jumbo v0, "49213"
+    const-string/jumbo v0, "49214"
+    const-string/jumbo v0, "49215"
+    const-string/jumbo v0, "49216"
+    const-string/jumbo v0, "49217"
+    const-string/jumbo v0, "49218"
+    const-string/jumbo v0, "49219"
+    const-string/jumbo v0, "49220"
+    const-string/jumbo v0, "49221"
+    const-string/jumbo v0, "49222"
+    const-string/jumbo v0, "49223"
+    const-string/jumbo v0, "49224"
+    const-string/jumbo v0, "49225"
+    const-string/jumbo v0, "49226"
+    const-string/jumbo v0, "49227"
+    const-string/jumbo v0, "49228"
+    const-string/jumbo v0, "49229"
+    const-string/jumbo v0, "49230"
+    const-string/jumbo v0, "49231"
+    const-string/jumbo v0, "49232"
+    const-string/jumbo v0, "49233"
+    const-string/jumbo v0, "49234"
+    const-string/jumbo v0, "49235"
+    const-string/jumbo v0, "49236"
+    const-string/jumbo v0, "49237"
+    const-string/jumbo v0, "49238"
+    const-string/jumbo v0, "49239"
+    const-string/jumbo v0, "49240"
+    const-string/jumbo v0, "49241"
+    const-string/jumbo v0, "49242"
+    const-string/jumbo v0, "49243"
+    const-string/jumbo v0, "49244"
+    const-string/jumbo v0, "49245"
+    const-string/jumbo v0, "49246"
+    const-string/jumbo v0, "49247"
+    const-string/jumbo v0, "49248"
+    const-string/jumbo v0, "49249"
+    const-string/jumbo v0, "49250"
+    const-string/jumbo v0, "49251"
+    const-string/jumbo v0, "49252"
+    const-string/jumbo v0, "49253"
+    const-string/jumbo v0, "49254"
+    const-string/jumbo v0, "49255"
+    const-string/jumbo v0, "49256"
+    const-string/jumbo v0, "49257"
+    const-string/jumbo v0, "49258"
+    const-string/jumbo v0, "49259"
+    const-string/jumbo v0, "49260"
+    const-string/jumbo v0, "49261"
+    const-string/jumbo v0, "49262"
+    const-string/jumbo v0, "49263"
+    const-string/jumbo v0, "49264"
+    const-string/jumbo v0, "49265"
+    const-string/jumbo v0, "49266"
+    const-string/jumbo v0, "49267"
+    const-string/jumbo v0, "49268"
+    const-string/jumbo v0, "49269"
+    const-string/jumbo v0, "49270"
+    const-string/jumbo v0, "49271"
+    const-string/jumbo v0, "49272"
+    const-string/jumbo v0, "49273"
+    const-string/jumbo v0, "49274"
+    const-string/jumbo v0, "49275"
+    const-string/jumbo v0, "49276"
+    const-string/jumbo v0, "49277"
+    const-string/jumbo v0, "49278"
+    const-string/jumbo v0, "49279"
+    const-string/jumbo v0, "49280"
+    const-string/jumbo v0, "49281"
+    const-string/jumbo v0, "49282"
+    const-string/jumbo v0, "49283"
+    const-string/jumbo v0, "49284"
+    const-string/jumbo v0, "49285"
+    const-string/jumbo v0, "49286"
+    const-string/jumbo v0, "49287"
+    const-string/jumbo v0, "49288"
+    const-string/jumbo v0, "49289"
+    const-string/jumbo v0, "49290"
+    const-string/jumbo v0, "49291"
+    const-string/jumbo v0, "49292"
+    const-string/jumbo v0, "49293"
+    const-string/jumbo v0, "49294"
+    const-string/jumbo v0, "49295"
+    const-string/jumbo v0, "49296"
+    const-string/jumbo v0, "49297"
+    const-string/jumbo v0, "49298"
+    const-string/jumbo v0, "49299"
+    const-string/jumbo v0, "49300"
+    const-string/jumbo v0, "49301"
+    const-string/jumbo v0, "49302"
+    const-string/jumbo v0, "49303"
+    const-string/jumbo v0, "49304"
+    const-string/jumbo v0, "49305"
+    const-string/jumbo v0, "49306"
+    const-string/jumbo v0, "49307"
+    const-string/jumbo v0, "49308"
+    const-string/jumbo v0, "49309"
+    const-string/jumbo v0, "49310"
+    const-string/jumbo v0, "49311"
+    const-string/jumbo v0, "49312"
+    const-string/jumbo v0, "49313"
+    const-string/jumbo v0, "49314"
+    const-string/jumbo v0, "49315"
+    const-string/jumbo v0, "49316"
+    const-string/jumbo v0, "49317"
+    const-string/jumbo v0, "49318"
+    const-string/jumbo v0, "49319"
+    const-string/jumbo v0, "49320"
+    const-string/jumbo v0, "49321"
+    const-string/jumbo v0, "49322"
+    const-string/jumbo v0, "49323"
+    const-string/jumbo v0, "49324"
+    const-string/jumbo v0, "49325"
+    const-string/jumbo v0, "49326"
+    const-string/jumbo v0, "49327"
+    const-string/jumbo v0, "49328"
+    const-string/jumbo v0, "49329"
+    const-string/jumbo v0, "49330"
+    const-string/jumbo v0, "49331"
+    const-string/jumbo v0, "49332"
+    const-string/jumbo v0, "49333"
+    const-string/jumbo v0, "49334"
+    const-string/jumbo v0, "49335"
+    const-string/jumbo v0, "49336"
+    const-string/jumbo v0, "49337"
+    const-string/jumbo v0, "49338"
+    const-string/jumbo v0, "49339"
+    const-string/jumbo v0, "49340"
+    const-string/jumbo v0, "49341"
+    const-string/jumbo v0, "49342"
+    const-string/jumbo v0, "49343"
+    const-string/jumbo v0, "49344"
+    const-string/jumbo v0, "49345"
+    const-string/jumbo v0, "49346"
+    const-string/jumbo v0, "49347"
+    const-string/jumbo v0, "49348"
+    const-string/jumbo v0, "49349"
+    const-string/jumbo v0, "49350"
+    const-string/jumbo v0, "49351"
+    const-string/jumbo v0, "49352"
+    const-string/jumbo v0, "49353"
+    const-string/jumbo v0, "49354"
+    const-string/jumbo v0, "49355"
+    const-string/jumbo v0, "49356"
+    const-string/jumbo v0, "49357"
+    const-string/jumbo v0, "49358"
+    const-string/jumbo v0, "49359"
+    const-string/jumbo v0, "49360"
+    const-string/jumbo v0, "49361"
+    const-string/jumbo v0, "49362"
+    const-string/jumbo v0, "49363"
+    const-string/jumbo v0, "49364"
+    const-string/jumbo v0, "49365"
+    const-string/jumbo v0, "49366"
+    const-string/jumbo v0, "49367"
+    const-string/jumbo v0, "49368"
+    const-string/jumbo v0, "49369"
+    const-string/jumbo v0, "49370"
+    const-string/jumbo v0, "49371"
+    const-string/jumbo v0, "49372"
+    const-string/jumbo v0, "49373"
+    const-string/jumbo v0, "49374"
+    const-string/jumbo v0, "49375"
+    const-string/jumbo v0, "49376"
+    const-string/jumbo v0, "49377"
+    const-string/jumbo v0, "49378"
+    const-string/jumbo v0, "49379"
+    const-string/jumbo v0, "49380"
+    const-string/jumbo v0, "49381"
+    const-string/jumbo v0, "49382"
+    const-string/jumbo v0, "49383"
+    const-string/jumbo v0, "49384"
+    const-string/jumbo v0, "49385"
+    const-string/jumbo v0, "49386"
+    const-string/jumbo v0, "49387"
+    const-string/jumbo v0, "49388"
+    const-string/jumbo v0, "49389"
+    const-string/jumbo v0, "49390"
+    const-string/jumbo v0, "49391"
+    const-string/jumbo v0, "49392"
+    const-string/jumbo v0, "49393"
+    const-string/jumbo v0, "49394"
+    const-string/jumbo v0, "49395"
+    const-string/jumbo v0, "49396"
+    const-string/jumbo v0, "49397"
+    const-string/jumbo v0, "49398"
+    const-string/jumbo v0, "49399"
+    const-string/jumbo v0, "49400"
+    const-string/jumbo v0, "49401"
+    const-string/jumbo v0, "49402"
+    const-string/jumbo v0, "49403"
+    const-string/jumbo v0, "49404"
+    const-string/jumbo v0, "49405"
+    const-string/jumbo v0, "49406"
+    const-string/jumbo v0, "49407"
+    const-string/jumbo v0, "49408"
+    const-string/jumbo v0, "49409"
+    const-string/jumbo v0, "49410"
+    const-string/jumbo v0, "49411"
+    const-string/jumbo v0, "49412"
+    const-string/jumbo v0, "49413"
+    const-string/jumbo v0, "49414"
+    const-string/jumbo v0, "49415"
+    const-string/jumbo v0, "49416"
+    const-string/jumbo v0, "49417"
+    const-string/jumbo v0, "49418"
+    const-string/jumbo v0, "49419"
+    const-string/jumbo v0, "49420"
+    const-string/jumbo v0, "49421"
+    const-string/jumbo v0, "49422"
+    const-string/jumbo v0, "49423"
+    const-string/jumbo v0, "49424"
+    const-string/jumbo v0, "49425"
+    const-string/jumbo v0, "49426"
+    const-string/jumbo v0, "49427"
+    const-string/jumbo v0, "49428"
+    const-string/jumbo v0, "49429"
+    const-string/jumbo v0, "49430"
+    const-string/jumbo v0, "49431"
+    const-string/jumbo v0, "49432"
+    const-string/jumbo v0, "49433"
+    const-string/jumbo v0, "49434"
+    const-string/jumbo v0, "49435"
+    const-string/jumbo v0, "49436"
+    const-string/jumbo v0, "49437"
+    const-string/jumbo v0, "49438"
+    const-string/jumbo v0, "49439"
+    const-string/jumbo v0, "49440"
+    const-string/jumbo v0, "49441"
+    const-string/jumbo v0, "49442"
+    const-string/jumbo v0, "49443"
+    const-string/jumbo v0, "49444"
+    const-string/jumbo v0, "49445"
+    const-string/jumbo v0, "49446"
+    const-string/jumbo v0, "49447"
+    const-string/jumbo v0, "49448"
+    const-string/jumbo v0, "49449"
+    const-string/jumbo v0, "49450"
+    const-string/jumbo v0, "49451"
+    const-string/jumbo v0, "49452"
+    const-string/jumbo v0, "49453"
+    const-string/jumbo v0, "49454"
+    const-string/jumbo v0, "49455"
+    const-string/jumbo v0, "49456"
+    const-string/jumbo v0, "49457"
+    const-string/jumbo v0, "49458"
+    const-string/jumbo v0, "49459"
+    const-string/jumbo v0, "49460"
+    const-string/jumbo v0, "49461"
+    const-string/jumbo v0, "49462"
+    const-string/jumbo v0, "49463"
+    const-string/jumbo v0, "49464"
+    const-string/jumbo v0, "49465"
+    const-string/jumbo v0, "49466"
+    const-string/jumbo v0, "49467"
+    const-string/jumbo v0, "49468"
+    const-string/jumbo v0, "49469"
+    const-string/jumbo v0, "49470"
+    const-string/jumbo v0, "49471"
+    const-string/jumbo v0, "49472"
+    const-string/jumbo v0, "49473"
+    const-string/jumbo v0, "49474"
+    const-string/jumbo v0, "49475"
+    const-string/jumbo v0, "49476"
+    const-string/jumbo v0, "49477"
+    const-string/jumbo v0, "49478"
+    const-string/jumbo v0, "49479"
+    const-string/jumbo v0, "49480"
+    const-string/jumbo v0, "49481"
+    const-string/jumbo v0, "49482"
+    const-string/jumbo v0, "49483"
+    const-string/jumbo v0, "49484"
+    const-string/jumbo v0, "49485"
+    const-string/jumbo v0, "49486"
+    const-string/jumbo v0, "49487"
+    const-string/jumbo v0, "49488"
+    const-string/jumbo v0, "49489"
+    const-string/jumbo v0, "49490"
+    const-string/jumbo v0, "49491"
+    const-string/jumbo v0, "49492"
+    const-string/jumbo v0, "49493"
+    const-string/jumbo v0, "49494"
+    const-string/jumbo v0, "49495"
+    const-string/jumbo v0, "49496"
+    const-string/jumbo v0, "49497"
+    const-string/jumbo v0, "49498"
+    const-string/jumbo v0, "49499"
+    const-string/jumbo v0, "49500"
+    const-string/jumbo v0, "49501"
+    const-string/jumbo v0, "49502"
+    const-string/jumbo v0, "49503"
+    const-string/jumbo v0, "49504"
+    const-string/jumbo v0, "49505"
+    const-string/jumbo v0, "49506"
+    const-string/jumbo v0, "49507"
+    const-string/jumbo v0, "49508"
+    const-string/jumbo v0, "49509"
+    const-string/jumbo v0, "49510"
+    const-string/jumbo v0, "49511"
+    const-string/jumbo v0, "49512"
+    const-string/jumbo v0, "49513"
+    const-string/jumbo v0, "49514"
+    const-string/jumbo v0, "49515"
+    const-string/jumbo v0, "49516"
+    const-string/jumbo v0, "49517"
+    const-string/jumbo v0, "49518"
+    const-string/jumbo v0, "49519"
+    const-string/jumbo v0, "49520"
+    const-string/jumbo v0, "49521"
+    const-string/jumbo v0, "49522"
+    const-string/jumbo v0, "49523"
+    const-string/jumbo v0, "49524"
+    const-string/jumbo v0, "49525"
+    const-string/jumbo v0, "49526"
+    const-string/jumbo v0, "49527"
+    const-string/jumbo v0, "49528"
+    const-string/jumbo v0, "49529"
+    const-string/jumbo v0, "49530"
+    const-string/jumbo v0, "49531"
+    const-string/jumbo v0, "49532"
+    const-string/jumbo v0, "49533"
+    const-string/jumbo v0, "49534"
+    const-string/jumbo v0, "49535"
+    const-string/jumbo v0, "49536"
+    const-string/jumbo v0, "49537"
+    const-string/jumbo v0, "49538"
+    const-string/jumbo v0, "49539"
+    const-string/jumbo v0, "49540"
+    const-string/jumbo v0, "49541"
+    const-string/jumbo v0, "49542"
+    const-string/jumbo v0, "49543"
+    const-string/jumbo v0, "49544"
+    const-string/jumbo v0, "49545"
+    const-string/jumbo v0, "49546"
+    const-string/jumbo v0, "49547"
+    const-string/jumbo v0, "49548"
+    const-string/jumbo v0, "49549"
+    const-string/jumbo v0, "49550"
+    const-string/jumbo v0, "49551"
+    const-string/jumbo v0, "49552"
+    const-string/jumbo v0, "49553"
+    const-string/jumbo v0, "49554"
+    const-string/jumbo v0, "49555"
+    const-string/jumbo v0, "49556"
+    const-string/jumbo v0, "49557"
+    const-string/jumbo v0, "49558"
+    const-string/jumbo v0, "49559"
+    const-string/jumbo v0, "49560"
+    const-string/jumbo v0, "49561"
+    const-string/jumbo v0, "49562"
+    const-string/jumbo v0, "49563"
+    const-string/jumbo v0, "49564"
+    const-string/jumbo v0, "49565"
+    const-string/jumbo v0, "49566"
+    const-string/jumbo v0, "49567"
+    const-string/jumbo v0, "49568"
+    const-string/jumbo v0, "49569"
+    const-string/jumbo v0, "49570"
+    const-string/jumbo v0, "49571"
+    const-string/jumbo v0, "49572"
+    const-string/jumbo v0, "49573"
+    const-string/jumbo v0, "49574"
+    const-string/jumbo v0, "49575"
+    const-string/jumbo v0, "49576"
+    const-string/jumbo v0, "49577"
+    const-string/jumbo v0, "49578"
+    const-string/jumbo v0, "49579"
+    const-string/jumbo v0, "49580"
+    const-string/jumbo v0, "49581"
+    const-string/jumbo v0, "49582"
+    const-string/jumbo v0, "49583"
+    const-string/jumbo v0, "49584"
+    const-string/jumbo v0, "49585"
+    const-string/jumbo v0, "49586"
+    const-string/jumbo v0, "49587"
+    const-string/jumbo v0, "49588"
+    const-string/jumbo v0, "49589"
+    const-string/jumbo v0, "49590"
+    const-string/jumbo v0, "49591"
+    const-string/jumbo v0, "49592"
+    const-string/jumbo v0, "49593"
+    const-string/jumbo v0, "49594"
+    const-string/jumbo v0, "49595"
+    const-string/jumbo v0, "49596"
+    const-string/jumbo v0, "49597"
+    const-string/jumbo v0, "49598"
+    const-string/jumbo v0, "49599"
+    const-string/jumbo v0, "49600"
+    const-string/jumbo v0, "49601"
+    const-string/jumbo v0, "49602"
+    const-string/jumbo v0, "49603"
+    const-string/jumbo v0, "49604"
+    const-string/jumbo v0, "49605"
+    const-string/jumbo v0, "49606"
+    const-string/jumbo v0, "49607"
+    const-string/jumbo v0, "49608"
+    const-string/jumbo v0, "49609"
+    const-string/jumbo v0, "49610"
+    const-string/jumbo v0, "49611"
+    const-string/jumbo v0, "49612"
+    const-string/jumbo v0, "49613"
+    const-string/jumbo v0, "49614"
+    const-string/jumbo v0, "49615"
+    const-string/jumbo v0, "49616"
+    const-string/jumbo v0, "49617"
+    const-string/jumbo v0, "49618"
+    const-string/jumbo v0, "49619"
+    const-string/jumbo v0, "49620"
+    const-string/jumbo v0, "49621"
+    const-string/jumbo v0, "49622"
+    const-string/jumbo v0, "49623"
+    const-string/jumbo v0, "49624"
+    const-string/jumbo v0, "49625"
+    const-string/jumbo v0, "49626"
+    const-string/jumbo v0, "49627"
+    const-string/jumbo v0, "49628"
+    const-string/jumbo v0, "49629"
+    const-string/jumbo v0, "49630"
+    const-string/jumbo v0, "49631"
+    const-string/jumbo v0, "49632"
+    const-string/jumbo v0, "49633"
+    const-string/jumbo v0, "49634"
+    const-string/jumbo v0, "49635"
+    const-string/jumbo v0, "49636"
+    const-string/jumbo v0, "49637"
+    const-string/jumbo v0, "49638"
+    const-string/jumbo v0, "49639"
+    const-string/jumbo v0, "49640"
+    const-string/jumbo v0, "49641"
+    const-string/jumbo v0, "49642"
+    const-string/jumbo v0, "49643"
+    const-string/jumbo v0, "49644"
+    const-string/jumbo v0, "49645"
+    const-string/jumbo v0, "49646"
+    const-string/jumbo v0, "49647"
+    const-string/jumbo v0, "49648"
+    const-string/jumbo v0, "49649"
+    const-string/jumbo v0, "49650"
+    const-string/jumbo v0, "49651"
+    const-string/jumbo v0, "49652"
+    const-string/jumbo v0, "49653"
+    const-string/jumbo v0, "49654"
+    const-string/jumbo v0, "49655"
+    const-string/jumbo v0, "49656"
+    const-string/jumbo v0, "49657"
+    const-string/jumbo v0, "49658"
+    const-string/jumbo v0, "49659"
+    const-string/jumbo v0, "49660"
+    const-string/jumbo v0, "49661"
+    const-string/jumbo v0, "49662"
+    const-string/jumbo v0, "49663"
+    const-string/jumbo v0, "49664"
+    const-string/jumbo v0, "49665"
+    const-string/jumbo v0, "49666"
+    const-string/jumbo v0, "49667"
+    const-string/jumbo v0, "49668"
+    const-string/jumbo v0, "49669"
+    const-string/jumbo v0, "49670"
+    const-string/jumbo v0, "49671"
+    const-string/jumbo v0, "49672"
+    const-string/jumbo v0, "49673"
+    const-string/jumbo v0, "49674"
+    const-string/jumbo v0, "49675"
+    const-string/jumbo v0, "49676"
+    const-string/jumbo v0, "49677"
+    const-string/jumbo v0, "49678"
+    const-string/jumbo v0, "49679"
+    const-string/jumbo v0, "49680"
+    const-string/jumbo v0, "49681"
+    const-string/jumbo v0, "49682"
+    const-string/jumbo v0, "49683"
+    const-string/jumbo v0, "49684"
+    const-string/jumbo v0, "49685"
+    const-string/jumbo v0, "49686"
+    const-string/jumbo v0, "49687"
+    const-string/jumbo v0, "49688"
+    const-string/jumbo v0, "49689"
+    const-string/jumbo v0, "49690"
+    const-string/jumbo v0, "49691"
+    const-string/jumbo v0, "49692"
+    const-string/jumbo v0, "49693"
+    const-string/jumbo v0, "49694"
+    const-string/jumbo v0, "49695"
+    const-string/jumbo v0, "49696"
+    const-string/jumbo v0, "49697"
+    const-string/jumbo v0, "49698"
+    const-string/jumbo v0, "49699"
+    const-string/jumbo v0, "49700"
+    const-string/jumbo v0, "49701"
+    const-string/jumbo v0, "49702"
+    const-string/jumbo v0, "49703"
+    const-string/jumbo v0, "49704"
+    const-string/jumbo v0, "49705"
+    const-string/jumbo v0, "49706"
+    const-string/jumbo v0, "49707"
+    const-string/jumbo v0, "49708"
+    const-string/jumbo v0, "49709"
+    const-string/jumbo v0, "49710"
+    const-string/jumbo v0, "49711"
+    const-string/jumbo v0, "49712"
+    const-string/jumbo v0, "49713"
+    const-string/jumbo v0, "49714"
+    const-string/jumbo v0, "49715"
+    const-string/jumbo v0, "49716"
+    const-string/jumbo v0, "49717"
+    const-string/jumbo v0, "49718"
+    const-string/jumbo v0, "49719"
+    const-string/jumbo v0, "49720"
+    const-string/jumbo v0, "49721"
+    const-string/jumbo v0, "49722"
+    const-string/jumbo v0, "49723"
+    const-string/jumbo v0, "49724"
+    const-string/jumbo v0, "49725"
+    const-string/jumbo v0, "49726"
+    const-string/jumbo v0, "49727"
+    const-string/jumbo v0, "49728"
+    const-string/jumbo v0, "49729"
+    const-string/jumbo v0, "49730"
+    const-string/jumbo v0, "49731"
+    const-string/jumbo v0, "49732"
+    const-string/jumbo v0, "49733"
+    const-string/jumbo v0, "49734"
+    const-string/jumbo v0, "49735"
+    const-string/jumbo v0, "49736"
+    const-string/jumbo v0, "49737"
+    const-string/jumbo v0, "49738"
+    const-string/jumbo v0, "49739"
+    const-string/jumbo v0, "49740"
+    const-string/jumbo v0, "49741"
+    const-string/jumbo v0, "49742"
+    const-string/jumbo v0, "49743"
+    const-string/jumbo v0, "49744"
+    const-string/jumbo v0, "49745"
+    const-string/jumbo v0, "49746"
+    const-string/jumbo v0, "49747"
+    const-string/jumbo v0, "49748"
+    const-string/jumbo v0, "49749"
+    const-string/jumbo v0, "49750"
+    const-string/jumbo v0, "49751"
+    const-string/jumbo v0, "49752"
+    const-string/jumbo v0, "49753"
+    const-string/jumbo v0, "49754"
+    const-string/jumbo v0, "49755"
+    const-string/jumbo v0, "49756"
+    const-string/jumbo v0, "49757"
+    const-string/jumbo v0, "49758"
+    const-string/jumbo v0, "49759"
+    const-string/jumbo v0, "49760"
+    const-string/jumbo v0, "49761"
+    const-string/jumbo v0, "49762"
+    const-string/jumbo v0, "49763"
+    const-string/jumbo v0, "49764"
+    const-string/jumbo v0, "49765"
+    const-string/jumbo v0, "49766"
+    const-string/jumbo v0, "49767"
+    const-string/jumbo v0, "49768"
+    const-string/jumbo v0, "49769"
+    const-string/jumbo v0, "49770"
+    const-string/jumbo v0, "49771"
+    const-string/jumbo v0, "49772"
+    const-string/jumbo v0, "49773"
+    const-string/jumbo v0, "49774"
+    const-string/jumbo v0, "49775"
+    const-string/jumbo v0, "49776"
+    const-string/jumbo v0, "49777"
+    const-string/jumbo v0, "49778"
+    const-string/jumbo v0, "49779"
+    const-string/jumbo v0, "49780"
+    const-string/jumbo v0, "49781"
+    const-string/jumbo v0, "49782"
+    const-string/jumbo v0, "49783"
+    const-string/jumbo v0, "49784"
+    const-string/jumbo v0, "49785"
+    const-string/jumbo v0, "49786"
+    const-string/jumbo v0, "49787"
+    const-string/jumbo v0, "49788"
+    const-string/jumbo v0, "49789"
+    const-string/jumbo v0, "49790"
+    const-string/jumbo v0, "49791"
+    const-string/jumbo v0, "49792"
+    const-string/jumbo v0, "49793"
+    const-string/jumbo v0, "49794"
+    const-string/jumbo v0, "49795"
+    const-string/jumbo v0, "49796"
+    const-string/jumbo v0, "49797"
+    const-string/jumbo v0, "49798"
+    const-string/jumbo v0, "49799"
+    const-string/jumbo v0, "49800"
+    const-string/jumbo v0, "49801"
+    const-string/jumbo v0, "49802"
+    const-string/jumbo v0, "49803"
+    const-string/jumbo v0, "49804"
+    const-string/jumbo v0, "49805"
+    const-string/jumbo v0, "49806"
+    const-string/jumbo v0, "49807"
+    const-string/jumbo v0, "49808"
+    const-string/jumbo v0, "49809"
+    const-string/jumbo v0, "49810"
+    const-string/jumbo v0, "49811"
+    const-string/jumbo v0, "49812"
+    const-string/jumbo v0, "49813"
+    const-string/jumbo v0, "49814"
+    const-string/jumbo v0, "49815"
+    const-string/jumbo v0, "49816"
+    const-string/jumbo v0, "49817"
+    const-string/jumbo v0, "49818"
+    const-string/jumbo v0, "49819"
+    const-string/jumbo v0, "49820"
+    const-string/jumbo v0, "49821"
+    const-string/jumbo v0, "49822"
+    const-string/jumbo v0, "49823"
+    const-string/jumbo v0, "49824"
+    const-string/jumbo v0, "49825"
+    const-string/jumbo v0, "49826"
+    const-string/jumbo v0, "49827"
+    const-string/jumbo v0, "49828"
+    const-string/jumbo v0, "49829"
+    const-string/jumbo v0, "49830"
+    const-string/jumbo v0, "49831"
+    const-string/jumbo v0, "49832"
+    const-string/jumbo v0, "49833"
+    const-string/jumbo v0, "49834"
+    const-string/jumbo v0, "49835"
+    const-string/jumbo v0, "49836"
+    const-string/jumbo v0, "49837"
+    const-string/jumbo v0, "49838"
+    const-string/jumbo v0, "49839"
+    const-string/jumbo v0, "49840"
+    const-string/jumbo v0, "49841"
+    const-string/jumbo v0, "49842"
+    const-string/jumbo v0, "49843"
+    const-string/jumbo v0, "49844"
+    const-string/jumbo v0, "49845"
+    const-string/jumbo v0, "49846"
+    const-string/jumbo v0, "49847"
+    const-string/jumbo v0, "49848"
+    const-string/jumbo v0, "49849"
+    const-string/jumbo v0, "49850"
+    const-string/jumbo v0, "49851"
+    const-string/jumbo v0, "49852"
+    const-string/jumbo v0, "49853"
+    const-string/jumbo v0, "49854"
+    const-string/jumbo v0, "49855"
+    const-string/jumbo v0, "49856"
+    const-string/jumbo v0, "49857"
+    const-string/jumbo v0, "49858"
+    const-string/jumbo v0, "49859"
+    const-string/jumbo v0, "49860"
+    const-string/jumbo v0, "49861"
+    const-string/jumbo v0, "49862"
+    const-string/jumbo v0, "49863"
+    const-string/jumbo v0, "49864"
+    const-string/jumbo v0, "49865"
+    const-string/jumbo v0, "49866"
+    const-string/jumbo v0, "49867"
+    const-string/jumbo v0, "49868"
+    const-string/jumbo v0, "49869"
+    const-string/jumbo v0, "49870"
+    const-string/jumbo v0, "49871"
+    const-string/jumbo v0, "49872"
+    const-string/jumbo v0, "49873"
+    const-string/jumbo v0, "49874"
+    const-string/jumbo v0, "49875"
+    const-string/jumbo v0, "49876"
+    const-string/jumbo v0, "49877"
+    const-string/jumbo v0, "49878"
+    const-string/jumbo v0, "49879"
+    const-string/jumbo v0, "49880"
+    const-string/jumbo v0, "49881"
+    const-string/jumbo v0, "49882"
+    const-string/jumbo v0, "49883"
+    const-string/jumbo v0, "49884"
+    const-string/jumbo v0, "49885"
+    const-string/jumbo v0, "49886"
+    const-string/jumbo v0, "49887"
+    const-string/jumbo v0, "49888"
+    const-string/jumbo v0, "49889"
+    const-string/jumbo v0, "49890"
+    const-string/jumbo v0, "49891"
+    const-string/jumbo v0, "49892"
+    const-string/jumbo v0, "49893"
+    const-string/jumbo v0, "49894"
+    const-string/jumbo v0, "49895"
+    const-string/jumbo v0, "49896"
+    const-string/jumbo v0, "49897"
+    const-string/jumbo v0, "49898"
+    const-string/jumbo v0, "49899"
+    const-string/jumbo v0, "49900"
+    const-string/jumbo v0, "49901"
+    const-string/jumbo v0, "49902"
+    const-string/jumbo v0, "49903"
+    const-string/jumbo v0, "49904"
+    const-string/jumbo v0, "49905"
+    const-string/jumbo v0, "49906"
+    const-string/jumbo v0, "49907"
+    const-string/jumbo v0, "49908"
+    const-string/jumbo v0, "49909"
+    const-string/jumbo v0, "49910"
+    const-string/jumbo v0, "49911"
+    const-string/jumbo v0, "49912"
+    const-string/jumbo v0, "49913"
+    const-string/jumbo v0, "49914"
+    const-string/jumbo v0, "49915"
+    const-string/jumbo v0, "49916"
+    const-string/jumbo v0, "49917"
+    const-string/jumbo v0, "49918"
+    const-string/jumbo v0, "49919"
+    const-string/jumbo v0, "49920"
+    const-string/jumbo v0, "49921"
+    const-string/jumbo v0, "49922"
+    const-string/jumbo v0, "49923"
+    const-string/jumbo v0, "49924"
+    const-string/jumbo v0, "49925"
+    const-string/jumbo v0, "49926"
+    const-string/jumbo v0, "49927"
+    const-string/jumbo v0, "49928"
+    const-string/jumbo v0, "49929"
+    const-string/jumbo v0, "49930"
+    const-string/jumbo v0, "49931"
+    const-string/jumbo v0, "49932"
+    const-string/jumbo v0, "49933"
+    const-string/jumbo v0, "49934"
+    const-string/jumbo v0, "49935"
+    const-string/jumbo v0, "49936"
+    const-string/jumbo v0, "49937"
+    const-string/jumbo v0, "49938"
+    const-string/jumbo v0, "49939"
+    const-string/jumbo v0, "49940"
+    const-string/jumbo v0, "49941"
+    const-string/jumbo v0, "49942"
+    const-string/jumbo v0, "49943"
+    const-string/jumbo v0, "49944"
+    const-string/jumbo v0, "49945"
+    const-string/jumbo v0, "49946"
+    const-string/jumbo v0, "49947"
+    const-string/jumbo v0, "49948"
+    const-string/jumbo v0, "49949"
+    const-string/jumbo v0, "49950"
+    const-string/jumbo v0, "49951"
+    const-string/jumbo v0, "49952"
+    const-string/jumbo v0, "49953"
+    const-string/jumbo v0, "49954"
+    const-string/jumbo v0, "49955"
+    const-string/jumbo v0, "49956"
+    const-string/jumbo v0, "49957"
+    const-string/jumbo v0, "49958"
+    const-string/jumbo v0, "49959"
+    const-string/jumbo v0, "49960"
+    const-string/jumbo v0, "49961"
+    const-string/jumbo v0, "49962"
+    const-string/jumbo v0, "49963"
+    const-string/jumbo v0, "49964"
+    const-string/jumbo v0, "49965"
+    const-string/jumbo v0, "49966"
+    const-string/jumbo v0, "49967"
+    const-string/jumbo v0, "49968"
+    const-string/jumbo v0, "49969"
+    const-string/jumbo v0, "49970"
+    const-string/jumbo v0, "49971"
+    const-string/jumbo v0, "49972"
+    const-string/jumbo v0, "49973"
+    const-string/jumbo v0, "49974"
+    const-string/jumbo v0, "49975"
+    const-string/jumbo v0, "49976"
+    const-string/jumbo v0, "49977"
+    const-string/jumbo v0, "49978"
+    const-string/jumbo v0, "49979"
+    const-string/jumbo v0, "49980"
+    const-string/jumbo v0, "49981"
+    const-string/jumbo v0, "49982"
+    const-string/jumbo v0, "49983"
+    const-string/jumbo v0, "49984"
+    const-string/jumbo v0, "49985"
+    const-string/jumbo v0, "49986"
+    const-string/jumbo v0, "49987"
+    const-string/jumbo v0, "49988"
+    const-string/jumbo v0, "49989"
+    const-string/jumbo v0, "49990"
+    const-string/jumbo v0, "49991"
+    const-string/jumbo v0, "49992"
+    const-string/jumbo v0, "49993"
+    const-string/jumbo v0, "49994"
+    const-string/jumbo v0, "49995"
+    const-string/jumbo v0, "49996"
+    const-string/jumbo v0, "49997"
+    const-string/jumbo v0, "49998"
+    const-string/jumbo v0, "49999"
+    const-string/jumbo v0, "50000"
+    const-string/jumbo v0, "50001"
+    const-string/jumbo v0, "50002"
+    const-string/jumbo v0, "50003"
+    const-string/jumbo v0, "50004"
+    const-string/jumbo v0, "50005"
+    const-string/jumbo v0, "50006"
+    const-string/jumbo v0, "50007"
+    const-string/jumbo v0, "50008"
+    const-string/jumbo v0, "50009"
+    const-string/jumbo v0, "50010"
+    const-string/jumbo v0, "50011"
+    const-string/jumbo v0, "50012"
+    const-string/jumbo v0, "50013"
+    const-string/jumbo v0, "50014"
+    const-string/jumbo v0, "50015"
+    const-string/jumbo v0, "50016"
+    const-string/jumbo v0, "50017"
+    const-string/jumbo v0, "50018"
+    const-string/jumbo v0, "50019"
+    const-string/jumbo v0, "50020"
+    const-string/jumbo v0, "50021"
+    const-string/jumbo v0, "50022"
+    const-string/jumbo v0, "50023"
+    const-string/jumbo v0, "50024"
+    const-string/jumbo v0, "50025"
+    const-string/jumbo v0, "50026"
+    const-string/jumbo v0, "50027"
+    const-string/jumbo v0, "50028"
+    const-string/jumbo v0, "50029"
+    const-string/jumbo v0, "50030"
+    const-string/jumbo v0, "50031"
+    const-string/jumbo v0, "50032"
+    const-string/jumbo v0, "50033"
+    const-string/jumbo v0, "50034"
+    const-string/jumbo v0, "50035"
+    const-string/jumbo v0, "50036"
+    const-string/jumbo v0, "50037"
+    const-string/jumbo v0, "50038"
+    const-string/jumbo v0, "50039"
+    const-string/jumbo v0, "50040"
+    const-string/jumbo v0, "50041"
+    const-string/jumbo v0, "50042"
+    const-string/jumbo v0, "50043"
+    const-string/jumbo v0, "50044"
+    const-string/jumbo v0, "50045"
+    const-string/jumbo v0, "50046"
+    const-string/jumbo v0, "50047"
+    const-string/jumbo v0, "50048"
+    const-string/jumbo v0, "50049"
+    const-string/jumbo v0, "50050"
+    const-string/jumbo v0, "50051"
+    const-string/jumbo v0, "50052"
+    const-string/jumbo v0, "50053"
+    const-string/jumbo v0, "50054"
+    const-string/jumbo v0, "50055"
+    const-string/jumbo v0, "50056"
+    const-string/jumbo v0, "50057"
+    const-string/jumbo v0, "50058"
+    const-string/jumbo v0, "50059"
+    const-string/jumbo v0, "50060"
+    const-string/jumbo v0, "50061"
+    const-string/jumbo v0, "50062"
+    const-string/jumbo v0, "50063"
+    const-string/jumbo v0, "50064"
+    const-string/jumbo v0, "50065"
+    const-string/jumbo v0, "50066"
+    const-string/jumbo v0, "50067"
+    const-string/jumbo v0, "50068"
+    const-string/jumbo v0, "50069"
+    const-string/jumbo v0, "50070"
+    const-string/jumbo v0, "50071"
+    const-string/jumbo v0, "50072"
+    const-string/jumbo v0, "50073"
+    const-string/jumbo v0, "50074"
+    const-string/jumbo v0, "50075"
+    const-string/jumbo v0, "50076"
+    const-string/jumbo v0, "50077"
+    const-string/jumbo v0, "50078"
+    const-string/jumbo v0, "50079"
+    const-string/jumbo v0, "50080"
+    const-string/jumbo v0, "50081"
+    const-string/jumbo v0, "50082"
+    const-string/jumbo v0, "50083"
+    const-string/jumbo v0, "50084"
+    const-string/jumbo v0, "50085"
+    const-string/jumbo v0, "50086"
+    const-string/jumbo v0, "50087"
+    const-string/jumbo v0, "50088"
+    const-string/jumbo v0, "50089"
+    const-string/jumbo v0, "50090"
+    const-string/jumbo v0, "50091"
+    const-string/jumbo v0, "50092"
+    const-string/jumbo v0, "50093"
+    const-string/jumbo v0, "50094"
+    const-string/jumbo v0, "50095"
+    const-string/jumbo v0, "50096"
+    const-string/jumbo v0, "50097"
+    const-string/jumbo v0, "50098"
+    const-string/jumbo v0, "50099"
+    const-string/jumbo v0, "50100"
+    const-string/jumbo v0, "50101"
+    const-string/jumbo v0, "50102"
+    const-string/jumbo v0, "50103"
+    const-string/jumbo v0, "50104"
+    const-string/jumbo v0, "50105"
+    const-string/jumbo v0, "50106"
+    const-string/jumbo v0, "50107"
+    const-string/jumbo v0, "50108"
+    const-string/jumbo v0, "50109"
+    const-string/jumbo v0, "50110"
+    const-string/jumbo v0, "50111"
+    const-string/jumbo v0, "50112"
+    const-string/jumbo v0, "50113"
+    const-string/jumbo v0, "50114"
+    const-string/jumbo v0, "50115"
+    const-string/jumbo v0, "50116"
+    const-string/jumbo v0, "50117"
+    const-string/jumbo v0, "50118"
+    const-string/jumbo v0, "50119"
+    const-string/jumbo v0, "50120"
+    const-string/jumbo v0, "50121"
+    const-string/jumbo v0, "50122"
+    const-string/jumbo v0, "50123"
+    const-string/jumbo v0, "50124"
+    const-string/jumbo v0, "50125"
+    const-string/jumbo v0, "50126"
+    const-string/jumbo v0, "50127"
+    const-string/jumbo v0, "50128"
+    const-string/jumbo v0, "50129"
+    const-string/jumbo v0, "50130"
+    const-string/jumbo v0, "50131"
+    const-string/jumbo v0, "50132"
+    const-string/jumbo v0, "50133"
+    const-string/jumbo v0, "50134"
+    const-string/jumbo v0, "50135"
+    const-string/jumbo v0, "50136"
+    const-string/jumbo v0, "50137"
+    const-string/jumbo v0, "50138"
+    const-string/jumbo v0, "50139"
+    const-string/jumbo v0, "50140"
+    const-string/jumbo v0, "50141"
+    const-string/jumbo v0, "50142"
+    const-string/jumbo v0, "50143"
+    const-string/jumbo v0, "50144"
+    const-string/jumbo v0, "50145"
+    const-string/jumbo v0, "50146"
+    const-string/jumbo v0, "50147"
+    const-string/jumbo v0, "50148"
+    const-string/jumbo v0, "50149"
+    const-string/jumbo v0, "50150"
+    const-string/jumbo v0, "50151"
+    const-string/jumbo v0, "50152"
+    const-string/jumbo v0, "50153"
+    const-string/jumbo v0, "50154"
+    const-string/jumbo v0, "50155"
+    const-string/jumbo v0, "50156"
+    const-string/jumbo v0, "50157"
+    const-string/jumbo v0, "50158"
+    const-string/jumbo v0, "50159"
+    const-string/jumbo v0, "50160"
+    const-string/jumbo v0, "50161"
+    const-string/jumbo v0, "50162"
+    const-string/jumbo v0, "50163"
+    const-string/jumbo v0, "50164"
+    const-string/jumbo v0, "50165"
+    const-string/jumbo v0, "50166"
+    const-string/jumbo v0, "50167"
+    const-string/jumbo v0, "50168"
+    const-string/jumbo v0, "50169"
+    const-string/jumbo v0, "50170"
+    const-string/jumbo v0, "50171"
+    const-string/jumbo v0, "50172"
+    const-string/jumbo v0, "50173"
+    const-string/jumbo v0, "50174"
+    const-string/jumbo v0, "50175"
+    const-string/jumbo v0, "50176"
+    const-string/jumbo v0, "50177"
+    const-string/jumbo v0, "50178"
+    const-string/jumbo v0, "50179"
+    const-string/jumbo v0, "50180"
+    const-string/jumbo v0, "50181"
+    const-string/jumbo v0, "50182"
+    const-string/jumbo v0, "50183"
+    const-string/jumbo v0, "50184"
+    const-string/jumbo v0, "50185"
+    const-string/jumbo v0, "50186"
+    const-string/jumbo v0, "50187"
+    const-string/jumbo v0, "50188"
+    const-string/jumbo v0, "50189"
+    const-string/jumbo v0, "50190"
+    const-string/jumbo v0, "50191"
+    const-string/jumbo v0, "50192"
+    const-string/jumbo v0, "50193"
+    const-string/jumbo v0, "50194"
+    const-string/jumbo v0, "50195"
+    const-string/jumbo v0, "50196"
+    const-string/jumbo v0, "50197"
+    const-string/jumbo v0, "50198"
+    const-string/jumbo v0, "50199"
+    const-string/jumbo v0, "50200"
+    const-string/jumbo v0, "50201"
+    const-string/jumbo v0, "50202"
+    const-string/jumbo v0, "50203"
+    const-string/jumbo v0, "50204"
+    const-string/jumbo v0, "50205"
+    const-string/jumbo v0, "50206"
+    const-string/jumbo v0, "50207"
+    const-string/jumbo v0, "50208"
+    const-string/jumbo v0, "50209"
+    const-string/jumbo v0, "50210"
+    const-string/jumbo v0, "50211"
+    const-string/jumbo v0, "50212"
+    const-string/jumbo v0, "50213"
+    const-string/jumbo v0, "50214"
+    const-string/jumbo v0, "50215"
+    const-string/jumbo v0, "50216"
+    const-string/jumbo v0, "50217"
+    const-string/jumbo v0, "50218"
+    const-string/jumbo v0, "50219"
+    const-string/jumbo v0, "50220"
+    const-string/jumbo v0, "50221"
+    const-string/jumbo v0, "50222"
+    const-string/jumbo v0, "50223"
+    const-string/jumbo v0, "50224"
+    const-string/jumbo v0, "50225"
+    const-string/jumbo v0, "50226"
+    const-string/jumbo v0, "50227"
+    const-string/jumbo v0, "50228"
+    const-string/jumbo v0, "50229"
+    const-string/jumbo v0, "50230"
+    const-string/jumbo v0, "50231"
+    const-string/jumbo v0, "50232"
+    const-string/jumbo v0, "50233"
+    const-string/jumbo v0, "50234"
+    const-string/jumbo v0, "50235"
+    const-string/jumbo v0, "50236"
+    const-string/jumbo v0, "50237"
+    const-string/jumbo v0, "50238"
+    const-string/jumbo v0, "50239"
+    const-string/jumbo v0, "50240"
+    const-string/jumbo v0, "50241"
+    const-string/jumbo v0, "50242"
+    const-string/jumbo v0, "50243"
+    const-string/jumbo v0, "50244"
+    const-string/jumbo v0, "50245"
+    const-string/jumbo v0, "50246"
+    const-string/jumbo v0, "50247"
+    const-string/jumbo v0, "50248"
+    const-string/jumbo v0, "50249"
+    const-string/jumbo v0, "50250"
+    const-string/jumbo v0, "50251"
+    const-string/jumbo v0, "50252"
+    const-string/jumbo v0, "50253"
+    const-string/jumbo v0, "50254"
+    const-string/jumbo v0, "50255"
+    const-string/jumbo v0, "50256"
+    const-string/jumbo v0, "50257"
+    const-string/jumbo v0, "50258"
+    const-string/jumbo v0, "50259"
+    const-string/jumbo v0, "50260"
+    const-string/jumbo v0, "50261"
+    const-string/jumbo v0, "50262"
+    const-string/jumbo v0, "50263"
+    const-string/jumbo v0, "50264"
+    const-string/jumbo v0, "50265"
+    const-string/jumbo v0, "50266"
+    const-string/jumbo v0, "50267"
+    const-string/jumbo v0, "50268"
+    const-string/jumbo v0, "50269"
+    const-string/jumbo v0, "50270"
+    const-string/jumbo v0, "50271"
+    const-string/jumbo v0, "50272"
+    const-string/jumbo v0, "50273"
+    const-string/jumbo v0, "50274"
+    const-string/jumbo v0, "50275"
+    const-string/jumbo v0, "50276"
+    const-string/jumbo v0, "50277"
+    const-string/jumbo v0, "50278"
+    const-string/jumbo v0, "50279"
+    const-string/jumbo v0, "50280"
+    const-string/jumbo v0, "50281"
+    const-string/jumbo v0, "50282"
+    const-string/jumbo v0, "50283"
+    const-string/jumbo v0, "50284"
+    const-string/jumbo v0, "50285"
+    const-string/jumbo v0, "50286"
+    const-string/jumbo v0, "50287"
+    const-string/jumbo v0, "50288"
+    const-string/jumbo v0, "50289"
+    const-string/jumbo v0, "50290"
+    const-string/jumbo v0, "50291"
+    const-string/jumbo v0, "50292"
+    const-string/jumbo v0, "50293"
+    const-string/jumbo v0, "50294"
+    const-string/jumbo v0, "50295"
+    const-string/jumbo v0, "50296"
+    const-string/jumbo v0, "50297"
+    const-string/jumbo v0, "50298"
+    const-string/jumbo v0, "50299"
+    const-string/jumbo v0, "50300"
+    const-string/jumbo v0, "50301"
+    const-string/jumbo v0, "50302"
+    const-string/jumbo v0, "50303"
+    const-string/jumbo v0, "50304"
+    const-string/jumbo v0, "50305"
+    const-string/jumbo v0, "50306"
+    const-string/jumbo v0, "50307"
+    const-string/jumbo v0, "50308"
+    const-string/jumbo v0, "50309"
+    const-string/jumbo v0, "50310"
+    const-string/jumbo v0, "50311"
+    const-string/jumbo v0, "50312"
+    const-string/jumbo v0, "50313"
+    const-string/jumbo v0, "50314"
+    const-string/jumbo v0, "50315"
+    const-string/jumbo v0, "50316"
+    const-string/jumbo v0, "50317"
+    const-string/jumbo v0, "50318"
+    const-string/jumbo v0, "50319"
+    const-string/jumbo v0, "50320"
+    const-string/jumbo v0, "50321"
+    const-string/jumbo v0, "50322"
+    const-string/jumbo v0, "50323"
+    const-string/jumbo v0, "50324"
+    const-string/jumbo v0, "50325"
+    const-string/jumbo v0, "50326"
+    const-string/jumbo v0, "50327"
+    const-string/jumbo v0, "50328"
+    const-string/jumbo v0, "50329"
+    const-string/jumbo v0, "50330"
+    const-string/jumbo v0, "50331"
+    const-string/jumbo v0, "50332"
+    const-string/jumbo v0, "50333"
+    const-string/jumbo v0, "50334"
+    const-string/jumbo v0, "50335"
+    const-string/jumbo v0, "50336"
+    const-string/jumbo v0, "50337"
+    const-string/jumbo v0, "50338"
+    const-string/jumbo v0, "50339"
+    const-string/jumbo v0, "50340"
+    const-string/jumbo v0, "50341"
+    const-string/jumbo v0, "50342"
+    const-string/jumbo v0, "50343"
+    const-string/jumbo v0, "50344"
+    const-string/jumbo v0, "50345"
+    const-string/jumbo v0, "50346"
+    const-string/jumbo v0, "50347"
+    const-string/jumbo v0, "50348"
+    const-string/jumbo v0, "50349"
+    const-string/jumbo v0, "50350"
+    const-string/jumbo v0, "50351"
+    const-string/jumbo v0, "50352"
+    const-string/jumbo v0, "50353"
+    const-string/jumbo v0, "50354"
+    const-string/jumbo v0, "50355"
+    const-string/jumbo v0, "50356"
+    const-string/jumbo v0, "50357"
+    const-string/jumbo v0, "50358"
+    const-string/jumbo v0, "50359"
+    const-string/jumbo v0, "50360"
+    const-string/jumbo v0, "50361"
+    const-string/jumbo v0, "50362"
+    const-string/jumbo v0, "50363"
+    const-string/jumbo v0, "50364"
+    const-string/jumbo v0, "50365"
+    const-string/jumbo v0, "50366"
+    const-string/jumbo v0, "50367"
+    const-string/jumbo v0, "50368"
+    const-string/jumbo v0, "50369"
+    const-string/jumbo v0, "50370"
+    const-string/jumbo v0, "50371"
+    const-string/jumbo v0, "50372"
+    const-string/jumbo v0, "50373"
+    const-string/jumbo v0, "50374"
+    const-string/jumbo v0, "50375"
+    const-string/jumbo v0, "50376"
+    const-string/jumbo v0, "50377"
+    const-string/jumbo v0, "50378"
+    const-string/jumbo v0, "50379"
+    const-string/jumbo v0, "50380"
+    const-string/jumbo v0, "50381"
+    const-string/jumbo v0, "50382"
+    const-string/jumbo v0, "50383"
+    const-string/jumbo v0, "50384"
+    const-string/jumbo v0, "50385"
+    const-string/jumbo v0, "50386"
+    const-string/jumbo v0, "50387"
+    const-string/jumbo v0, "50388"
+    const-string/jumbo v0, "50389"
+    const-string/jumbo v0, "50390"
+    const-string/jumbo v0, "50391"
+    const-string/jumbo v0, "50392"
+    const-string/jumbo v0, "50393"
+    const-string/jumbo v0, "50394"
+    const-string/jumbo v0, "50395"
+    const-string/jumbo v0, "50396"
+    const-string/jumbo v0, "50397"
+    const-string/jumbo v0, "50398"
+    const-string/jumbo v0, "50399"
+    const-string/jumbo v0, "50400"
+    const-string/jumbo v0, "50401"
+    const-string/jumbo v0, "50402"
+    const-string/jumbo v0, "50403"
+    const-string/jumbo v0, "50404"
+    const-string/jumbo v0, "50405"
+    const-string/jumbo v0, "50406"
+    const-string/jumbo v0, "50407"
+    const-string/jumbo v0, "50408"
+    const-string/jumbo v0, "50409"
+    const-string/jumbo v0, "50410"
+    const-string/jumbo v0, "50411"
+    const-string/jumbo v0, "50412"
+    const-string/jumbo v0, "50413"
+    const-string/jumbo v0, "50414"
+    const-string/jumbo v0, "50415"
+    const-string/jumbo v0, "50416"
+    const-string/jumbo v0, "50417"
+    const-string/jumbo v0, "50418"
+    const-string/jumbo v0, "50419"
+    const-string/jumbo v0, "50420"
+    const-string/jumbo v0, "50421"
+    const-string/jumbo v0, "50422"
+    const-string/jumbo v0, "50423"
+    const-string/jumbo v0, "50424"
+    const-string/jumbo v0, "50425"
+    const-string/jumbo v0, "50426"
+    const-string/jumbo v0, "50427"
+    const-string/jumbo v0, "50428"
+    const-string/jumbo v0, "50429"
+    const-string/jumbo v0, "50430"
+    const-string/jumbo v0, "50431"
+    const-string/jumbo v0, "50432"
+    const-string/jumbo v0, "50433"
+    const-string/jumbo v0, "50434"
+    const-string/jumbo v0, "50435"
+    const-string/jumbo v0, "50436"
+    const-string/jumbo v0, "50437"
+    const-string/jumbo v0, "50438"
+    const-string/jumbo v0, "50439"
+    const-string/jumbo v0, "50440"
+    const-string/jumbo v0, "50441"
+    const-string/jumbo v0, "50442"
+    const-string/jumbo v0, "50443"
+    const-string/jumbo v0, "50444"
+    const-string/jumbo v0, "50445"
+    const-string/jumbo v0, "50446"
+    const-string/jumbo v0, "50447"
+    const-string/jumbo v0, "50448"
+    const-string/jumbo v0, "50449"
+    const-string/jumbo v0, "50450"
+    const-string/jumbo v0, "50451"
+    const-string/jumbo v0, "50452"
+    const-string/jumbo v0, "50453"
+    const-string/jumbo v0, "50454"
+    const-string/jumbo v0, "50455"
+    const-string/jumbo v0, "50456"
+    const-string/jumbo v0, "50457"
+    const-string/jumbo v0, "50458"
+    const-string/jumbo v0, "50459"
+    const-string/jumbo v0, "50460"
+    const-string/jumbo v0, "50461"
+    const-string/jumbo v0, "50462"
+    const-string/jumbo v0, "50463"
+    const-string/jumbo v0, "50464"
+    const-string/jumbo v0, "50465"
+    const-string/jumbo v0, "50466"
+    const-string/jumbo v0, "50467"
+    const-string/jumbo v0, "50468"
+    const-string/jumbo v0, "50469"
+    const-string/jumbo v0, "50470"
+    const-string/jumbo v0, "50471"
+    const-string/jumbo v0, "50472"
+    const-string/jumbo v0, "50473"
+    const-string/jumbo v0, "50474"
+    const-string/jumbo v0, "50475"
+    const-string/jumbo v0, "50476"
+    const-string/jumbo v0, "50477"
+    const-string/jumbo v0, "50478"
+    const-string/jumbo v0, "50479"
+    const-string/jumbo v0, "50480"
+    const-string/jumbo v0, "50481"
+    const-string/jumbo v0, "50482"
+    const-string/jumbo v0, "50483"
+    const-string/jumbo v0, "50484"
+    const-string/jumbo v0, "50485"
+    const-string/jumbo v0, "50486"
+    const-string/jumbo v0, "50487"
+    const-string/jumbo v0, "50488"
+    const-string/jumbo v0, "50489"
+    const-string/jumbo v0, "50490"
+    const-string/jumbo v0, "50491"
+    const-string/jumbo v0, "50492"
+    const-string/jumbo v0, "50493"
+    const-string/jumbo v0, "50494"
+    const-string/jumbo v0, "50495"
+    const-string/jumbo v0, "50496"
+    const-string/jumbo v0, "50497"
+    const-string/jumbo v0, "50498"
+    const-string/jumbo v0, "50499"
+    const-string/jumbo v0, "50500"
+    const-string/jumbo v0, "50501"
+    const-string/jumbo v0, "50502"
+    const-string/jumbo v0, "50503"
+    const-string/jumbo v0, "50504"
+    const-string/jumbo v0, "50505"
+    const-string/jumbo v0, "50506"
+    const-string/jumbo v0, "50507"
+    const-string/jumbo v0, "50508"
+    const-string/jumbo v0, "50509"
+    const-string/jumbo v0, "50510"
+    const-string/jumbo v0, "50511"
+    const-string/jumbo v0, "50512"
+    const-string/jumbo v0, "50513"
+    const-string/jumbo v0, "50514"
+    const-string/jumbo v0, "50515"
+    const-string/jumbo v0, "50516"
+    const-string/jumbo v0, "50517"
+    const-string/jumbo v0, "50518"
+    const-string/jumbo v0, "50519"
+    const-string/jumbo v0, "50520"
+    const-string/jumbo v0, "50521"
+    const-string/jumbo v0, "50522"
+    const-string/jumbo v0, "50523"
+    const-string/jumbo v0, "50524"
+    const-string/jumbo v0, "50525"
+    const-string/jumbo v0, "50526"
+    const-string/jumbo v0, "50527"
+    const-string/jumbo v0, "50528"
+    const-string/jumbo v0, "50529"
+    const-string/jumbo v0, "50530"
+    const-string/jumbo v0, "50531"
+    const-string/jumbo v0, "50532"
+    const-string/jumbo v0, "50533"
+    const-string/jumbo v0, "50534"
+    const-string/jumbo v0, "50535"
+    const-string/jumbo v0, "50536"
+    const-string/jumbo v0, "50537"
+    const-string/jumbo v0, "50538"
+    const-string/jumbo v0, "50539"
+    const-string/jumbo v0, "50540"
+    const-string/jumbo v0, "50541"
+    const-string/jumbo v0, "50542"
+    const-string/jumbo v0, "50543"
+    const-string/jumbo v0, "50544"
+    const-string/jumbo v0, "50545"
+    const-string/jumbo v0, "50546"
+    const-string/jumbo v0, "50547"
+    const-string/jumbo v0, "50548"
+    const-string/jumbo v0, "50549"
+    const-string/jumbo v0, "50550"
+    const-string/jumbo v0, "50551"
+    const-string/jumbo v0, "50552"
+    const-string/jumbo v0, "50553"
+    const-string/jumbo v0, "50554"
+    const-string/jumbo v0, "50555"
+    const-string/jumbo v0, "50556"
+    const-string/jumbo v0, "50557"
+    const-string/jumbo v0, "50558"
+    const-string/jumbo v0, "50559"
+    const-string/jumbo v0, "50560"
+    const-string/jumbo v0, "50561"
+    const-string/jumbo v0, "50562"
+    const-string/jumbo v0, "50563"
+    const-string/jumbo v0, "50564"
+    const-string/jumbo v0, "50565"
+    const-string/jumbo v0, "50566"
+    const-string/jumbo v0, "50567"
+    const-string/jumbo v0, "50568"
+    const-string/jumbo v0, "50569"
+    const-string/jumbo v0, "50570"
+    const-string/jumbo v0, "50571"
+    const-string/jumbo v0, "50572"
+    const-string/jumbo v0, "50573"
+    const-string/jumbo v0, "50574"
+    const-string/jumbo v0, "50575"
+    const-string/jumbo v0, "50576"
+    const-string/jumbo v0, "50577"
+    const-string/jumbo v0, "50578"
+    const-string/jumbo v0, "50579"
+    const-string/jumbo v0, "50580"
+    const-string/jumbo v0, "50581"
+    const-string/jumbo v0, "50582"
+    const-string/jumbo v0, "50583"
+    const-string/jumbo v0, "50584"
+    const-string/jumbo v0, "50585"
+    const-string/jumbo v0, "50586"
+    const-string/jumbo v0, "50587"
+    const-string/jumbo v0, "50588"
+    const-string/jumbo v0, "50589"
+    const-string/jumbo v0, "50590"
+    const-string/jumbo v0, "50591"
+    const-string/jumbo v0, "50592"
+    const-string/jumbo v0, "50593"
+    const-string/jumbo v0, "50594"
+    const-string/jumbo v0, "50595"
+    const-string/jumbo v0, "50596"
+    const-string/jumbo v0, "50597"
+    const-string/jumbo v0, "50598"
+    const-string/jumbo v0, "50599"
+    const-string/jumbo v0, "50600"
+    const-string/jumbo v0, "50601"
+    const-string/jumbo v0, "50602"
+    const-string/jumbo v0, "50603"
+    const-string/jumbo v0, "50604"
+    const-string/jumbo v0, "50605"
+    const-string/jumbo v0, "50606"
+    const-string/jumbo v0, "50607"
+    const-string/jumbo v0, "50608"
+    const-string/jumbo v0, "50609"
+    const-string/jumbo v0, "50610"
+    const-string/jumbo v0, "50611"
+    const-string/jumbo v0, "50612"
+    const-string/jumbo v0, "50613"
+    const-string/jumbo v0, "50614"
+    const-string/jumbo v0, "50615"
+    const-string/jumbo v0, "50616"
+    const-string/jumbo v0, "50617"
+    const-string/jumbo v0, "50618"
+    const-string/jumbo v0, "50619"
+    const-string/jumbo v0, "50620"
+    const-string/jumbo v0, "50621"
+    const-string/jumbo v0, "50622"
+    const-string/jumbo v0, "50623"
+    const-string/jumbo v0, "50624"
+    const-string/jumbo v0, "50625"
+    const-string/jumbo v0, "50626"
+    const-string/jumbo v0, "50627"
+    const-string/jumbo v0, "50628"
+    const-string/jumbo v0, "50629"
+    const-string/jumbo v0, "50630"
+    const-string/jumbo v0, "50631"
+    const-string/jumbo v0, "50632"
+    const-string/jumbo v0, "50633"
+    const-string/jumbo v0, "50634"
+    const-string/jumbo v0, "50635"
+    const-string/jumbo v0, "50636"
+    const-string/jumbo v0, "50637"
+    const-string/jumbo v0, "50638"
+    const-string/jumbo v0, "50639"
+    const-string/jumbo v0, "50640"
+    const-string/jumbo v0, "50641"
+    const-string/jumbo v0, "50642"
+    const-string/jumbo v0, "50643"
+    const-string/jumbo v0, "50644"
+    const-string/jumbo v0, "50645"
+    const-string/jumbo v0, "50646"
+    const-string/jumbo v0, "50647"
+    const-string/jumbo v0, "50648"
+    const-string/jumbo v0, "50649"
+    const-string/jumbo v0, "50650"
+    const-string/jumbo v0, "50651"
+    const-string/jumbo v0, "50652"
+    const-string/jumbo v0, "50653"
+    const-string/jumbo v0, "50654"
+    const-string/jumbo v0, "50655"
+    const-string/jumbo v0, "50656"
+    const-string/jumbo v0, "50657"
+    const-string/jumbo v0, "50658"
+    const-string/jumbo v0, "50659"
+    const-string/jumbo v0, "50660"
+    const-string/jumbo v0, "50661"
+    const-string/jumbo v0, "50662"
+    const-string/jumbo v0, "50663"
+    const-string/jumbo v0, "50664"
+    const-string/jumbo v0, "50665"
+    const-string/jumbo v0, "50666"
+    const-string/jumbo v0, "50667"
+    const-string/jumbo v0, "50668"
+    const-string/jumbo v0, "50669"
+    const-string/jumbo v0, "50670"
+    const-string/jumbo v0, "50671"
+    const-string/jumbo v0, "50672"
+    const-string/jumbo v0, "50673"
+    const-string/jumbo v0, "50674"
+    const-string/jumbo v0, "50675"
+    const-string/jumbo v0, "50676"
+    const-string/jumbo v0, "50677"
+    const-string/jumbo v0, "50678"
+    const-string/jumbo v0, "50679"
+    const-string/jumbo v0, "50680"
+    const-string/jumbo v0, "50681"
+    const-string/jumbo v0, "50682"
+    const-string/jumbo v0, "50683"
+    const-string/jumbo v0, "50684"
+    const-string/jumbo v0, "50685"
+    const-string/jumbo v0, "50686"
+    const-string/jumbo v0, "50687"
+    const-string/jumbo v0, "50688"
+    const-string/jumbo v0, "50689"
+    const-string/jumbo v0, "50690"
+    const-string/jumbo v0, "50691"
+    const-string/jumbo v0, "50692"
+    const-string/jumbo v0, "50693"
+    const-string/jumbo v0, "50694"
+    const-string/jumbo v0, "50695"
+    const-string/jumbo v0, "50696"
+    const-string/jumbo v0, "50697"
+    const-string/jumbo v0, "50698"
+    const-string/jumbo v0, "50699"
+    const-string/jumbo v0, "50700"
+    const-string/jumbo v0, "50701"
+    const-string/jumbo v0, "50702"
+    const-string/jumbo v0, "50703"
+    const-string/jumbo v0, "50704"
+    const-string/jumbo v0, "50705"
+    const-string/jumbo v0, "50706"
+    const-string/jumbo v0, "50707"
+    const-string/jumbo v0, "50708"
+    const-string/jumbo v0, "50709"
+    const-string/jumbo v0, "50710"
+    const-string/jumbo v0, "50711"
+    const-string/jumbo v0, "50712"
+    const-string/jumbo v0, "50713"
+    const-string/jumbo v0, "50714"
+    const-string/jumbo v0, "50715"
+    const-string/jumbo v0, "50716"
+    const-string/jumbo v0, "50717"
+    const-string/jumbo v0, "50718"
+    const-string/jumbo v0, "50719"
+    const-string/jumbo v0, "50720"
+    const-string/jumbo v0, "50721"
+    const-string/jumbo v0, "50722"
+    const-string/jumbo v0, "50723"
+    const-string/jumbo v0, "50724"
+    const-string/jumbo v0, "50725"
+    const-string/jumbo v0, "50726"
+    const-string/jumbo v0, "50727"
+    const-string/jumbo v0, "50728"
+    const-string/jumbo v0, "50729"
+    const-string/jumbo v0, "50730"
+    const-string/jumbo v0, "50731"
+    const-string/jumbo v0, "50732"
+    const-string/jumbo v0, "50733"
+    const-string/jumbo v0, "50734"
+    const-string/jumbo v0, "50735"
+    const-string/jumbo v0, "50736"
+    const-string/jumbo v0, "50737"
+    const-string/jumbo v0, "50738"
+    const-string/jumbo v0, "50739"
+    const-string/jumbo v0, "50740"
+    const-string/jumbo v0, "50741"
+    const-string/jumbo v0, "50742"
+    const-string/jumbo v0, "50743"
+    const-string/jumbo v0, "50744"
+    const-string/jumbo v0, "50745"
+    const-string/jumbo v0, "50746"
+    const-string/jumbo v0, "50747"
+    const-string/jumbo v0, "50748"
+    const-string/jumbo v0, "50749"
+    const-string/jumbo v0, "50750"
+    const-string/jumbo v0, "50751"
+    const-string/jumbo v0, "50752"
+    const-string/jumbo v0, "50753"
+    const-string/jumbo v0, "50754"
+    const-string/jumbo v0, "50755"
+    const-string/jumbo v0, "50756"
+    const-string/jumbo v0, "50757"
+    const-string/jumbo v0, "50758"
+    const-string/jumbo v0, "50759"
+    const-string/jumbo v0, "50760"
+    const-string/jumbo v0, "50761"
+    const-string/jumbo v0, "50762"
+    const-string/jumbo v0, "50763"
+    const-string/jumbo v0, "50764"
+    const-string/jumbo v0, "50765"
+    const-string/jumbo v0, "50766"
+    const-string/jumbo v0, "50767"
+    const-string/jumbo v0, "50768"
+    const-string/jumbo v0, "50769"
+    const-string/jumbo v0, "50770"
+    const-string/jumbo v0, "50771"
+    const-string/jumbo v0, "50772"
+    const-string/jumbo v0, "50773"
+    const-string/jumbo v0, "50774"
+    const-string/jumbo v0, "50775"
+    const-string/jumbo v0, "50776"
+    const-string/jumbo v0, "50777"
+    const-string/jumbo v0, "50778"
+    const-string/jumbo v0, "50779"
+    const-string/jumbo v0, "50780"
+    const-string/jumbo v0, "50781"
+    const-string/jumbo v0, "50782"
+    const-string/jumbo v0, "50783"
+    const-string/jumbo v0, "50784"
+    const-string/jumbo v0, "50785"
+    const-string/jumbo v0, "50786"
+    const-string/jumbo v0, "50787"
+    const-string/jumbo v0, "50788"
+    const-string/jumbo v0, "50789"
+    const-string/jumbo v0, "50790"
+    const-string/jumbo v0, "50791"
+    const-string/jumbo v0, "50792"
+    const-string/jumbo v0, "50793"
+    const-string/jumbo v0, "50794"
+    const-string/jumbo v0, "50795"
+    const-string/jumbo v0, "50796"
+    const-string/jumbo v0, "50797"
+    const-string/jumbo v0, "50798"
+    const-string/jumbo v0, "50799"
+    const-string/jumbo v0, "50800"
+    const-string/jumbo v0, "50801"
+    const-string/jumbo v0, "50802"
+    const-string/jumbo v0, "50803"
+    const-string/jumbo v0, "50804"
+    const-string/jumbo v0, "50805"
+    const-string/jumbo v0, "50806"
+    const-string/jumbo v0, "50807"
+    const-string/jumbo v0, "50808"
+    const-string/jumbo v0, "50809"
+    const-string/jumbo v0, "50810"
+    const-string/jumbo v0, "50811"
+    const-string/jumbo v0, "50812"
+    const-string/jumbo v0, "50813"
+    const-string/jumbo v0, "50814"
+    const-string/jumbo v0, "50815"
+    const-string/jumbo v0, "50816"
+    const-string/jumbo v0, "50817"
+    const-string/jumbo v0, "50818"
+    const-string/jumbo v0, "50819"
+    const-string/jumbo v0, "50820"
+    const-string/jumbo v0, "50821"
+    const-string/jumbo v0, "50822"
+    const-string/jumbo v0, "50823"
+    const-string/jumbo v0, "50824"
+    const-string/jumbo v0, "50825"
+    const-string/jumbo v0, "50826"
+    const-string/jumbo v0, "50827"
+    const-string/jumbo v0, "50828"
+    const-string/jumbo v0, "50829"
+    const-string/jumbo v0, "50830"
+    const-string/jumbo v0, "50831"
+    const-string/jumbo v0, "50832"
+    const-string/jumbo v0, "50833"
+    const-string/jumbo v0, "50834"
+    const-string/jumbo v0, "50835"
+    const-string/jumbo v0, "50836"
+    const-string/jumbo v0, "50837"
+    const-string/jumbo v0, "50838"
+    const-string/jumbo v0, "50839"
+    const-string/jumbo v0, "50840"
+    const-string/jumbo v0, "50841"
+    const-string/jumbo v0, "50842"
+    const-string/jumbo v0, "50843"
+    const-string/jumbo v0, "50844"
+    const-string/jumbo v0, "50845"
+    const-string/jumbo v0, "50846"
+    const-string/jumbo v0, "50847"
+    const-string/jumbo v0, "50848"
+    const-string/jumbo v0, "50849"
+    const-string/jumbo v0, "50850"
+    const-string/jumbo v0, "50851"
+    const-string/jumbo v0, "50852"
+    const-string/jumbo v0, "50853"
+    const-string/jumbo v0, "50854"
+    const-string/jumbo v0, "50855"
+    const-string/jumbo v0, "50856"
+    const-string/jumbo v0, "50857"
+    const-string/jumbo v0, "50858"
+    const-string/jumbo v0, "50859"
+    const-string/jumbo v0, "50860"
+    const-string/jumbo v0, "50861"
+    const-string/jumbo v0, "50862"
+    const-string/jumbo v0, "50863"
+    const-string/jumbo v0, "50864"
+    const-string/jumbo v0, "50865"
+    const-string/jumbo v0, "50866"
+    const-string/jumbo v0, "50867"
+    const-string/jumbo v0, "50868"
+    const-string/jumbo v0, "50869"
+    const-string/jumbo v0, "50870"
+    const-string/jumbo v0, "50871"
+    const-string/jumbo v0, "50872"
+    const-string/jumbo v0, "50873"
+    const-string/jumbo v0, "50874"
+    const-string/jumbo v0, "50875"
+    const-string/jumbo v0, "50876"
+    const-string/jumbo v0, "50877"
+    const-string/jumbo v0, "50878"
+    const-string/jumbo v0, "50879"
+    const-string/jumbo v0, "50880"
+    const-string/jumbo v0, "50881"
+    const-string/jumbo v0, "50882"
+    const-string/jumbo v0, "50883"
+    const-string/jumbo v0, "50884"
+    const-string/jumbo v0, "50885"
+    const-string/jumbo v0, "50886"
+    const-string/jumbo v0, "50887"
+    const-string/jumbo v0, "50888"
+    const-string/jumbo v0, "50889"
+    const-string/jumbo v0, "50890"
+    const-string/jumbo v0, "50891"
+    const-string/jumbo v0, "50892"
+    const-string/jumbo v0, "50893"
+    const-string/jumbo v0, "50894"
+    const-string/jumbo v0, "50895"
+    const-string/jumbo v0, "50896"
+    const-string/jumbo v0, "50897"
+    const-string/jumbo v0, "50898"
+    const-string/jumbo v0, "50899"
+    const-string/jumbo v0, "50900"
+    const-string/jumbo v0, "50901"
+    const-string/jumbo v0, "50902"
+    const-string/jumbo v0, "50903"
+    const-string/jumbo v0, "50904"
+    const-string/jumbo v0, "50905"
+    const-string/jumbo v0, "50906"
+    const-string/jumbo v0, "50907"
+    const-string/jumbo v0, "50908"
+    const-string/jumbo v0, "50909"
+    const-string/jumbo v0, "50910"
+    const-string/jumbo v0, "50911"
+    const-string/jumbo v0, "50912"
+    const-string/jumbo v0, "50913"
+    const-string/jumbo v0, "50914"
+    const-string/jumbo v0, "50915"
+    const-string/jumbo v0, "50916"
+    const-string/jumbo v0, "50917"
+    const-string/jumbo v0, "50918"
+    const-string/jumbo v0, "50919"
+    const-string/jumbo v0, "50920"
+    const-string/jumbo v0, "50921"
+    const-string/jumbo v0, "50922"
+    const-string/jumbo v0, "50923"
+    const-string/jumbo v0, "50924"
+    const-string/jumbo v0, "50925"
+    const-string/jumbo v0, "50926"
+    const-string/jumbo v0, "50927"
+    const-string/jumbo v0, "50928"
+    const-string/jumbo v0, "50929"
+    const-string/jumbo v0, "50930"
+    const-string/jumbo v0, "50931"
+    const-string/jumbo v0, "50932"
+    const-string/jumbo v0, "50933"
+    const-string/jumbo v0, "50934"
+    const-string/jumbo v0, "50935"
+    const-string/jumbo v0, "50936"
+    const-string/jumbo v0, "50937"
+    const-string/jumbo v0, "50938"
+    const-string/jumbo v0, "50939"
+    const-string/jumbo v0, "50940"
+    const-string/jumbo v0, "50941"
+    const-string/jumbo v0, "50942"
+    const-string/jumbo v0, "50943"
+    const-string/jumbo v0, "50944"
+    const-string/jumbo v0, "50945"
+    const-string/jumbo v0, "50946"
+    const-string/jumbo v0, "50947"
+    const-string/jumbo v0, "50948"
+    const-string/jumbo v0, "50949"
+    const-string/jumbo v0, "50950"
+    const-string/jumbo v0, "50951"
+    const-string/jumbo v0, "50952"
+    const-string/jumbo v0, "50953"
+    const-string/jumbo v0, "50954"
+    const-string/jumbo v0, "50955"
+    const-string/jumbo v0, "50956"
+    const-string/jumbo v0, "50957"
+    const-string/jumbo v0, "50958"
+    const-string/jumbo v0, "50959"
+    const-string/jumbo v0, "50960"
+    const-string/jumbo v0, "50961"
+    const-string/jumbo v0, "50962"
+    const-string/jumbo v0, "50963"
+    const-string/jumbo v0, "50964"
+    const-string/jumbo v0, "50965"
+    const-string/jumbo v0, "50966"
+    const-string/jumbo v0, "50967"
+    const-string/jumbo v0, "50968"
+    const-string/jumbo v0, "50969"
+    const-string/jumbo v0, "50970"
+    const-string/jumbo v0, "50971"
+    const-string/jumbo v0, "50972"
+    const-string/jumbo v0, "50973"
+    const-string/jumbo v0, "50974"
+    const-string/jumbo v0, "50975"
+    const-string/jumbo v0, "50976"
+    const-string/jumbo v0, "50977"
+    const-string/jumbo v0, "50978"
+    const-string/jumbo v0, "50979"
+    const-string/jumbo v0, "50980"
+    const-string/jumbo v0, "50981"
+    const-string/jumbo v0, "50982"
+    const-string/jumbo v0, "50983"
+    const-string/jumbo v0, "50984"
+    const-string/jumbo v0, "50985"
+    const-string/jumbo v0, "50986"
+    const-string/jumbo v0, "50987"
+    const-string/jumbo v0, "50988"
+    const-string/jumbo v0, "50989"
+    const-string/jumbo v0, "50990"
+    const-string/jumbo v0, "50991"
+    const-string/jumbo v0, "50992"
+    const-string/jumbo v0, "50993"
+    const-string/jumbo v0, "50994"
+    const-string/jumbo v0, "50995"
+    const-string/jumbo v0, "50996"
+    const-string/jumbo v0, "50997"
+    const-string/jumbo v0, "50998"
+    const-string/jumbo v0, "50999"
+    const-string/jumbo v0, "51000"
+    const-string/jumbo v0, "51001"
+    const-string/jumbo v0, "51002"
+    const-string/jumbo v0, "51003"
+    const-string/jumbo v0, "51004"
+    const-string/jumbo v0, "51005"
+    const-string/jumbo v0, "51006"
+    const-string/jumbo v0, "51007"
+    const-string/jumbo v0, "51008"
+    const-string/jumbo v0, "51009"
+    const-string/jumbo v0, "51010"
+    const-string/jumbo v0, "51011"
+    const-string/jumbo v0, "51012"
+    const-string/jumbo v0, "51013"
+    const-string/jumbo v0, "51014"
+    const-string/jumbo v0, "51015"
+    const-string/jumbo v0, "51016"
+    const-string/jumbo v0, "51017"
+    const-string/jumbo v0, "51018"
+    const-string/jumbo v0, "51019"
+    const-string/jumbo v0, "51020"
+    const-string/jumbo v0, "51021"
+    const-string/jumbo v0, "51022"
+    const-string/jumbo v0, "51023"
+    const-string/jumbo v0, "51024"
+    const-string/jumbo v0, "51025"
+    const-string/jumbo v0, "51026"
+    const-string/jumbo v0, "51027"
+    const-string/jumbo v0, "51028"
+    const-string/jumbo v0, "51029"
+    const-string/jumbo v0, "51030"
+    const-string/jumbo v0, "51031"
+    const-string/jumbo v0, "51032"
+    const-string/jumbo v0, "51033"
+    const-string/jumbo v0, "51034"
+    const-string/jumbo v0, "51035"
+    const-string/jumbo v0, "51036"
+    const-string/jumbo v0, "51037"
+    const-string/jumbo v0, "51038"
+    const-string/jumbo v0, "51039"
+    const-string/jumbo v0, "51040"
+    const-string/jumbo v0, "51041"
+    const-string/jumbo v0, "51042"
+    const-string/jumbo v0, "51043"
+    const-string/jumbo v0, "51044"
+    const-string/jumbo v0, "51045"
+    const-string/jumbo v0, "51046"
+    const-string/jumbo v0, "51047"
+    const-string/jumbo v0, "51048"
+    const-string/jumbo v0, "51049"
+    const-string/jumbo v0, "51050"
+    const-string/jumbo v0, "51051"
+    const-string/jumbo v0, "51052"
+    const-string/jumbo v0, "51053"
+    const-string/jumbo v0, "51054"
+    const-string/jumbo v0, "51055"
+    const-string/jumbo v0, "51056"
+    const-string/jumbo v0, "51057"
+    const-string/jumbo v0, "51058"
+    const-string/jumbo v0, "51059"
+    const-string/jumbo v0, "51060"
+    const-string/jumbo v0, "51061"
+    const-string/jumbo v0, "51062"
+    const-string/jumbo v0, "51063"
+    const-string/jumbo v0, "51064"
+    const-string/jumbo v0, "51065"
+    const-string/jumbo v0, "51066"
+    const-string/jumbo v0, "51067"
+    const-string/jumbo v0, "51068"
+    const-string/jumbo v0, "51069"
+    const-string/jumbo v0, "51070"
+    const-string/jumbo v0, "51071"
+    const-string/jumbo v0, "51072"
+    const-string/jumbo v0, "51073"
+    const-string/jumbo v0, "51074"
+    const-string/jumbo v0, "51075"
+    const-string/jumbo v0, "51076"
+    const-string/jumbo v0, "51077"
+    const-string/jumbo v0, "51078"
+    const-string/jumbo v0, "51079"
+    const-string/jumbo v0, "51080"
+    const-string/jumbo v0, "51081"
+    const-string/jumbo v0, "51082"
+    const-string/jumbo v0, "51083"
+    const-string/jumbo v0, "51084"
+    const-string/jumbo v0, "51085"
+    const-string/jumbo v0, "51086"
+    const-string/jumbo v0, "51087"
+    const-string/jumbo v0, "51088"
+    const-string/jumbo v0, "51089"
+    const-string/jumbo v0, "51090"
+    const-string/jumbo v0, "51091"
+    const-string/jumbo v0, "51092"
+    const-string/jumbo v0, "51093"
+    const-string/jumbo v0, "51094"
+    const-string/jumbo v0, "51095"
+    const-string/jumbo v0, "51096"
+    const-string/jumbo v0, "51097"
+    const-string/jumbo v0, "51098"
+    const-string/jumbo v0, "51099"
+    const-string/jumbo v0, "51100"
+    const-string/jumbo v0, "51101"
+    const-string/jumbo v0, "51102"
+    const-string/jumbo v0, "51103"
+    const-string/jumbo v0, "51104"
+    const-string/jumbo v0, "51105"
+    const-string/jumbo v0, "51106"
+    const-string/jumbo v0, "51107"
+    const-string/jumbo v0, "51108"
+    const-string/jumbo v0, "51109"
+    const-string/jumbo v0, "51110"
+    const-string/jumbo v0, "51111"
+    const-string/jumbo v0, "51112"
+    const-string/jumbo v0, "51113"
+    const-string/jumbo v0, "51114"
+    const-string/jumbo v0, "51115"
+    const-string/jumbo v0, "51116"
+    const-string/jumbo v0, "51117"
+    const-string/jumbo v0, "51118"
+    const-string/jumbo v0, "51119"
+    const-string/jumbo v0, "51120"
+    const-string/jumbo v0, "51121"
+    const-string/jumbo v0, "51122"
+    const-string/jumbo v0, "51123"
+    const-string/jumbo v0, "51124"
+    const-string/jumbo v0, "51125"
+    const-string/jumbo v0, "51126"
+    const-string/jumbo v0, "51127"
+    const-string/jumbo v0, "51128"
+    const-string/jumbo v0, "51129"
+    const-string/jumbo v0, "51130"
+    const-string/jumbo v0, "51131"
+    const-string/jumbo v0, "51132"
+    const-string/jumbo v0, "51133"
+    const-string/jumbo v0, "51134"
+    const-string/jumbo v0, "51135"
+    const-string/jumbo v0, "51136"
+    const-string/jumbo v0, "51137"
+    const-string/jumbo v0, "51138"
+    const-string/jumbo v0, "51139"
+    const-string/jumbo v0, "51140"
+    const-string/jumbo v0, "51141"
+    const-string/jumbo v0, "51142"
+    const-string/jumbo v0, "51143"
+    const-string/jumbo v0, "51144"
+    const-string/jumbo v0, "51145"
+    const-string/jumbo v0, "51146"
+    const-string/jumbo v0, "51147"
+    const-string/jumbo v0, "51148"
+    const-string/jumbo v0, "51149"
+    const-string/jumbo v0, "51150"
+    const-string/jumbo v0, "51151"
+    const-string/jumbo v0, "51152"
+    const-string/jumbo v0, "51153"
+    const-string/jumbo v0, "51154"
+    const-string/jumbo v0, "51155"
+    const-string/jumbo v0, "51156"
+    const-string/jumbo v0, "51157"
+    const-string/jumbo v0, "51158"
+    const-string/jumbo v0, "51159"
+    const-string/jumbo v0, "51160"
+    const-string/jumbo v0, "51161"
+    const-string/jumbo v0, "51162"
+    const-string/jumbo v0, "51163"
+    const-string/jumbo v0, "51164"
+    const-string/jumbo v0, "51165"
+    const-string/jumbo v0, "51166"
+    const-string/jumbo v0, "51167"
+    const-string/jumbo v0, "51168"
+    const-string/jumbo v0, "51169"
+    const-string/jumbo v0, "51170"
+    const-string/jumbo v0, "51171"
+    const-string/jumbo v0, "51172"
+    const-string/jumbo v0, "51173"
+    const-string/jumbo v0, "51174"
+    const-string/jumbo v0, "51175"
+    const-string/jumbo v0, "51176"
+    const-string/jumbo v0, "51177"
+    const-string/jumbo v0, "51178"
+    const-string/jumbo v0, "51179"
+    const-string/jumbo v0, "51180"
+    const-string/jumbo v0, "51181"
+    const-string/jumbo v0, "51182"
+    const-string/jumbo v0, "51183"
+    const-string/jumbo v0, "51184"
+    const-string/jumbo v0, "51185"
+    const-string/jumbo v0, "51186"
+    const-string/jumbo v0, "51187"
+    const-string/jumbo v0, "51188"
+    const-string/jumbo v0, "51189"
+    const-string/jumbo v0, "51190"
+    const-string/jumbo v0, "51191"
+    const-string/jumbo v0, "51192"
+    const-string/jumbo v0, "51193"
+    const-string/jumbo v0, "51194"
+    const-string/jumbo v0, "51195"
+    const-string/jumbo v0, "51196"
+    const-string/jumbo v0, "51197"
+    const-string/jumbo v0, "51198"
+    const-string/jumbo v0, "51199"
+    const-string/jumbo v0, "51200"
+    const-string/jumbo v0, "51201"
+    const-string/jumbo v0, "51202"
+    const-string/jumbo v0, "51203"
+    const-string/jumbo v0, "51204"
+    const-string/jumbo v0, "51205"
+    const-string/jumbo v0, "51206"
+    const-string/jumbo v0, "51207"
+    const-string/jumbo v0, "51208"
+    const-string/jumbo v0, "51209"
+    const-string/jumbo v0, "51210"
+    const-string/jumbo v0, "51211"
+    const-string/jumbo v0, "51212"
+    const-string/jumbo v0, "51213"
+    const-string/jumbo v0, "51214"
+    const-string/jumbo v0, "51215"
+    const-string/jumbo v0, "51216"
+    const-string/jumbo v0, "51217"
+    const-string/jumbo v0, "51218"
+    const-string/jumbo v0, "51219"
+    const-string/jumbo v0, "51220"
+    const-string/jumbo v0, "51221"
+    const-string/jumbo v0, "51222"
+    const-string/jumbo v0, "51223"
+    const-string/jumbo v0, "51224"
+    const-string/jumbo v0, "51225"
+    const-string/jumbo v0, "51226"
+    const-string/jumbo v0, "51227"
+    const-string/jumbo v0, "51228"
+    const-string/jumbo v0, "51229"
+    const-string/jumbo v0, "51230"
+    const-string/jumbo v0, "51231"
+    const-string/jumbo v0, "51232"
+    const-string/jumbo v0, "51233"
+    const-string/jumbo v0, "51234"
+    const-string/jumbo v0, "51235"
+    const-string/jumbo v0, "51236"
+    const-string/jumbo v0, "51237"
+    const-string/jumbo v0, "51238"
+    const-string/jumbo v0, "51239"
+    const-string/jumbo v0, "51240"
+    const-string/jumbo v0, "51241"
+    const-string/jumbo v0, "51242"
+    const-string/jumbo v0, "51243"
+    const-string/jumbo v0, "51244"
+    const-string/jumbo v0, "51245"
+    const-string/jumbo v0, "51246"
+    const-string/jumbo v0, "51247"
+    const-string/jumbo v0, "51248"
+    const-string/jumbo v0, "51249"
+    const-string/jumbo v0, "51250"
+    const-string/jumbo v0, "51251"
+    const-string/jumbo v0, "51252"
+    const-string/jumbo v0, "51253"
+    const-string/jumbo v0, "51254"
+    const-string/jumbo v0, "51255"
+    const-string/jumbo v0, "51256"
+    const-string/jumbo v0, "51257"
+    const-string/jumbo v0, "51258"
+    const-string/jumbo v0, "51259"
+    const-string/jumbo v0, "51260"
+    const-string/jumbo v0, "51261"
+    const-string/jumbo v0, "51262"
+    const-string/jumbo v0, "51263"
+    const-string/jumbo v0, "51264"
+    const-string/jumbo v0, "51265"
+    const-string/jumbo v0, "51266"
+    const-string/jumbo v0, "51267"
+    const-string/jumbo v0, "51268"
+    const-string/jumbo v0, "51269"
+    const-string/jumbo v0, "51270"
+    const-string/jumbo v0, "51271"
+    const-string/jumbo v0, "51272"
+    const-string/jumbo v0, "51273"
+    const-string/jumbo v0, "51274"
+    const-string/jumbo v0, "51275"
+    const-string/jumbo v0, "51276"
+    const-string/jumbo v0, "51277"
+    const-string/jumbo v0, "51278"
+    const-string/jumbo v0, "51279"
+    const-string/jumbo v0, "51280"
+    const-string/jumbo v0, "51281"
+    const-string/jumbo v0, "51282"
+    const-string/jumbo v0, "51283"
+    const-string/jumbo v0, "51284"
+    const-string/jumbo v0, "51285"
+    const-string/jumbo v0, "51286"
+    const-string/jumbo v0, "51287"
+    const-string/jumbo v0, "51288"
+    const-string/jumbo v0, "51289"
+    const-string/jumbo v0, "51290"
+    const-string/jumbo v0, "51291"
+    const-string/jumbo v0, "51292"
+    const-string/jumbo v0, "51293"
+    const-string/jumbo v0, "51294"
+    const-string/jumbo v0, "51295"
+    const-string/jumbo v0, "51296"
+    const-string/jumbo v0, "51297"
+    const-string/jumbo v0, "51298"
+    const-string/jumbo v0, "51299"
+    const-string/jumbo v0, "51300"
+    const-string/jumbo v0, "51301"
+    const-string/jumbo v0, "51302"
+    const-string/jumbo v0, "51303"
+    const-string/jumbo v0, "51304"
+    const-string/jumbo v0, "51305"
+    const-string/jumbo v0, "51306"
+    const-string/jumbo v0, "51307"
+    const-string/jumbo v0, "51308"
+    const-string/jumbo v0, "51309"
+    const-string/jumbo v0, "51310"
+    const-string/jumbo v0, "51311"
+    const-string/jumbo v0, "51312"
+    const-string/jumbo v0, "51313"
+    const-string/jumbo v0, "51314"
+    const-string/jumbo v0, "51315"
+    const-string/jumbo v0, "51316"
+    const-string/jumbo v0, "51317"
+    const-string/jumbo v0, "51318"
+    const-string/jumbo v0, "51319"
+    const-string/jumbo v0, "51320"
+    const-string/jumbo v0, "51321"
+    const-string/jumbo v0, "51322"
+    const-string/jumbo v0, "51323"
+    const-string/jumbo v0, "51324"
+    const-string/jumbo v0, "51325"
+    const-string/jumbo v0, "51326"
+    const-string/jumbo v0, "51327"
+    const-string/jumbo v0, "51328"
+    const-string/jumbo v0, "51329"
+    const-string/jumbo v0, "51330"
+    const-string/jumbo v0, "51331"
+    const-string/jumbo v0, "51332"
+    const-string/jumbo v0, "51333"
+    const-string/jumbo v0, "51334"
+    const-string/jumbo v0, "51335"
+    const-string/jumbo v0, "51336"
+    const-string/jumbo v0, "51337"
+    const-string/jumbo v0, "51338"
+    const-string/jumbo v0, "51339"
+    const-string/jumbo v0, "51340"
+    const-string/jumbo v0, "51341"
+    const-string/jumbo v0, "51342"
+    const-string/jumbo v0, "51343"
+    const-string/jumbo v0, "51344"
+    const-string/jumbo v0, "51345"
+    const-string/jumbo v0, "51346"
+    const-string/jumbo v0, "51347"
+    const-string/jumbo v0, "51348"
+    const-string/jumbo v0, "51349"
+    const-string/jumbo v0, "51350"
+    const-string/jumbo v0, "51351"
+    const-string/jumbo v0, "51352"
+    const-string/jumbo v0, "51353"
+    const-string/jumbo v0, "51354"
+    const-string/jumbo v0, "51355"
+    const-string/jumbo v0, "51356"
+    const-string/jumbo v0, "51357"
+    const-string/jumbo v0, "51358"
+    const-string/jumbo v0, "51359"
+    const-string/jumbo v0, "51360"
+    const-string/jumbo v0, "51361"
+    const-string/jumbo v0, "51362"
+    const-string/jumbo v0, "51363"
+    const-string/jumbo v0, "51364"
+    const-string/jumbo v0, "51365"
+    const-string/jumbo v0, "51366"
+    const-string/jumbo v0, "51367"
+    const-string/jumbo v0, "51368"
+    const-string/jumbo v0, "51369"
+    const-string/jumbo v0, "51370"
+    const-string/jumbo v0, "51371"
+    const-string/jumbo v0, "51372"
+    const-string/jumbo v0, "51373"
+    const-string/jumbo v0, "51374"
+    const-string/jumbo v0, "51375"
+    const-string/jumbo v0, "51376"
+    const-string/jumbo v0, "51377"
+    const-string/jumbo v0, "51378"
+    const-string/jumbo v0, "51379"
+    const-string/jumbo v0, "51380"
+    const-string/jumbo v0, "51381"
+    const-string/jumbo v0, "51382"
+    const-string/jumbo v0, "51383"
+    const-string/jumbo v0, "51384"
+    const-string/jumbo v0, "51385"
+    const-string/jumbo v0, "51386"
+    const-string/jumbo v0, "51387"
+    const-string/jumbo v0, "51388"
+    const-string/jumbo v0, "51389"
+    const-string/jumbo v0, "51390"
+    const-string/jumbo v0, "51391"
+    const-string/jumbo v0, "51392"
+    const-string/jumbo v0, "51393"
+    const-string/jumbo v0, "51394"
+    const-string/jumbo v0, "51395"
+    const-string/jumbo v0, "51396"
+    const-string/jumbo v0, "51397"
+    const-string/jumbo v0, "51398"
+    const-string/jumbo v0, "51399"
+    const-string/jumbo v0, "51400"
+    const-string/jumbo v0, "51401"
+    const-string/jumbo v0, "51402"
+    const-string/jumbo v0, "51403"
+    const-string/jumbo v0, "51404"
+    const-string/jumbo v0, "51405"
+    const-string/jumbo v0, "51406"
+    const-string/jumbo v0, "51407"
+    const-string/jumbo v0, "51408"
+    const-string/jumbo v0, "51409"
+    const-string/jumbo v0, "51410"
+    const-string/jumbo v0, "51411"
+    const-string/jumbo v0, "51412"
+    const-string/jumbo v0, "51413"
+    const-string/jumbo v0, "51414"
+    const-string/jumbo v0, "51415"
+    const-string/jumbo v0, "51416"
+    const-string/jumbo v0, "51417"
+    const-string/jumbo v0, "51418"
+    const-string/jumbo v0, "51419"
+    const-string/jumbo v0, "51420"
+    const-string/jumbo v0, "51421"
+    const-string/jumbo v0, "51422"
+    const-string/jumbo v0, "51423"
+    const-string/jumbo v0, "51424"
+    const-string/jumbo v0, "51425"
+    const-string/jumbo v0, "51426"
+    const-string/jumbo v0, "51427"
+    const-string/jumbo v0, "51428"
+    const-string/jumbo v0, "51429"
+    const-string/jumbo v0, "51430"
+    const-string/jumbo v0, "51431"
+    const-string/jumbo v0, "51432"
+    const-string/jumbo v0, "51433"
+    const-string/jumbo v0, "51434"
+    const-string/jumbo v0, "51435"
+    const-string/jumbo v0, "51436"
+    const-string/jumbo v0, "51437"
+    const-string/jumbo v0, "51438"
+    const-string/jumbo v0, "51439"
+    const-string/jumbo v0, "51440"
+    const-string/jumbo v0, "51441"
+    const-string/jumbo v0, "51442"
+    const-string/jumbo v0, "51443"
+    const-string/jumbo v0, "51444"
+    const-string/jumbo v0, "51445"
+    const-string/jumbo v0, "51446"
+    const-string/jumbo v0, "51447"
+    const-string/jumbo v0, "51448"
+    const-string/jumbo v0, "51449"
+    const-string/jumbo v0, "51450"
+    const-string/jumbo v0, "51451"
+    const-string/jumbo v0, "51452"
+    const-string/jumbo v0, "51453"
+    const-string/jumbo v0, "51454"
+    const-string/jumbo v0, "51455"
+    const-string/jumbo v0, "51456"
+    const-string/jumbo v0, "51457"
+    const-string/jumbo v0, "51458"
+    const-string/jumbo v0, "51459"
+    const-string/jumbo v0, "51460"
+    const-string/jumbo v0, "51461"
+    const-string/jumbo v0, "51462"
+    const-string/jumbo v0, "51463"
+    const-string/jumbo v0, "51464"
+    const-string/jumbo v0, "51465"
+    const-string/jumbo v0, "51466"
+    const-string/jumbo v0, "51467"
+    const-string/jumbo v0, "51468"
+    const-string/jumbo v0, "51469"
+    const-string/jumbo v0, "51470"
+    const-string/jumbo v0, "51471"
+    const-string/jumbo v0, "51472"
+    const-string/jumbo v0, "51473"
+    const-string/jumbo v0, "51474"
+    const-string/jumbo v0, "51475"
+    const-string/jumbo v0, "51476"
+    const-string/jumbo v0, "51477"
+    const-string/jumbo v0, "51478"
+    const-string/jumbo v0, "51479"
+    const-string/jumbo v0, "51480"
+    const-string/jumbo v0, "51481"
+    const-string/jumbo v0, "51482"
+    const-string/jumbo v0, "51483"
+    const-string/jumbo v0, "51484"
+    const-string/jumbo v0, "51485"
+    const-string/jumbo v0, "51486"
+    const-string/jumbo v0, "51487"
+    const-string/jumbo v0, "51488"
+    const-string/jumbo v0, "51489"
+    const-string/jumbo v0, "51490"
+    const-string/jumbo v0, "51491"
+    const-string/jumbo v0, "51492"
+    const-string/jumbo v0, "51493"
+    const-string/jumbo v0, "51494"
+    const-string/jumbo v0, "51495"
+    const-string/jumbo v0, "51496"
+    const-string/jumbo v0, "51497"
+    const-string/jumbo v0, "51498"
+    const-string/jumbo v0, "51499"
+    const-string/jumbo v0, "51500"
+    const-string/jumbo v0, "51501"
+    const-string/jumbo v0, "51502"
+    const-string/jumbo v0, "51503"
+    const-string/jumbo v0, "51504"
+    const-string/jumbo v0, "51505"
+    const-string/jumbo v0, "51506"
+    const-string/jumbo v0, "51507"
+    const-string/jumbo v0, "51508"
+    const-string/jumbo v0, "51509"
+    const-string/jumbo v0, "51510"
+    const-string/jumbo v0, "51511"
+    const-string/jumbo v0, "51512"
+    const-string/jumbo v0, "51513"
+    const-string/jumbo v0, "51514"
+    const-string/jumbo v0, "51515"
+    const-string/jumbo v0, "51516"
+    const-string/jumbo v0, "51517"
+    const-string/jumbo v0, "51518"
+    const-string/jumbo v0, "51519"
+    const-string/jumbo v0, "51520"
+    const-string/jumbo v0, "51521"
+    const-string/jumbo v0, "51522"
+    const-string/jumbo v0, "51523"
+    const-string/jumbo v0, "51524"
+    const-string/jumbo v0, "51525"
+    const-string/jumbo v0, "51526"
+    const-string/jumbo v0, "51527"
+    const-string/jumbo v0, "51528"
+    const-string/jumbo v0, "51529"
+    const-string/jumbo v0, "51530"
+    const-string/jumbo v0, "51531"
+    const-string/jumbo v0, "51532"
+    const-string/jumbo v0, "51533"
+    const-string/jumbo v0, "51534"
+    const-string/jumbo v0, "51535"
+    const-string/jumbo v0, "51536"
+    const-string/jumbo v0, "51537"
+    const-string/jumbo v0, "51538"
+    const-string/jumbo v0, "51539"
+    const-string/jumbo v0, "51540"
+    const-string/jumbo v0, "51541"
+    const-string/jumbo v0, "51542"
+    const-string/jumbo v0, "51543"
+    const-string/jumbo v0, "51544"
+    const-string/jumbo v0, "51545"
+    const-string/jumbo v0, "51546"
+    const-string/jumbo v0, "51547"
+    const-string/jumbo v0, "51548"
+    const-string/jumbo v0, "51549"
+    const-string/jumbo v0, "51550"
+    const-string/jumbo v0, "51551"
+    const-string/jumbo v0, "51552"
+    const-string/jumbo v0, "51553"
+    const-string/jumbo v0, "51554"
+    const-string/jumbo v0, "51555"
+    const-string/jumbo v0, "51556"
+    const-string/jumbo v0, "51557"
+    const-string/jumbo v0, "51558"
+    const-string/jumbo v0, "51559"
+    const-string/jumbo v0, "51560"
+    const-string/jumbo v0, "51561"
+    const-string/jumbo v0, "51562"
+    const-string/jumbo v0, "51563"
+    const-string/jumbo v0, "51564"
+    const-string/jumbo v0, "51565"
+    const-string/jumbo v0, "51566"
+    const-string/jumbo v0, "51567"
+    const-string/jumbo v0, "51568"
+    const-string/jumbo v0, "51569"
+    const-string/jumbo v0, "51570"
+    const-string/jumbo v0, "51571"
+    const-string/jumbo v0, "51572"
+    const-string/jumbo v0, "51573"
+    const-string/jumbo v0, "51574"
+    const-string/jumbo v0, "51575"
+    const-string/jumbo v0, "51576"
+    const-string/jumbo v0, "51577"
+    const-string/jumbo v0, "51578"
+    const-string/jumbo v0, "51579"
+    const-string/jumbo v0, "51580"
+    const-string/jumbo v0, "51581"
+    const-string/jumbo v0, "51582"
+    const-string/jumbo v0, "51583"
+    const-string/jumbo v0, "51584"
+    const-string/jumbo v0, "51585"
+    const-string/jumbo v0, "51586"
+    const-string/jumbo v0, "51587"
+    const-string/jumbo v0, "51588"
+    const-string/jumbo v0, "51589"
+    const-string/jumbo v0, "51590"
+    const-string/jumbo v0, "51591"
+    const-string/jumbo v0, "51592"
+    const-string/jumbo v0, "51593"
+    const-string/jumbo v0, "51594"
+    const-string/jumbo v0, "51595"
+    const-string/jumbo v0, "51596"
+    const-string/jumbo v0, "51597"
+    const-string/jumbo v0, "51598"
+    const-string/jumbo v0, "51599"
+    const-string/jumbo v0, "51600"
+    const-string/jumbo v0, "51601"
+    const-string/jumbo v0, "51602"
+    const-string/jumbo v0, "51603"
+    const-string/jumbo v0, "51604"
+    const-string/jumbo v0, "51605"
+    const-string/jumbo v0, "51606"
+    const-string/jumbo v0, "51607"
+    const-string/jumbo v0, "51608"
+    const-string/jumbo v0, "51609"
+    const-string/jumbo v0, "51610"
+    const-string/jumbo v0, "51611"
+    const-string/jumbo v0, "51612"
+    const-string/jumbo v0, "51613"
+    const-string/jumbo v0, "51614"
+    const-string/jumbo v0, "51615"
+    const-string/jumbo v0, "51616"
+    const-string/jumbo v0, "51617"
+    const-string/jumbo v0, "51618"
+    const-string/jumbo v0, "51619"
+    const-string/jumbo v0, "51620"
+    const-string/jumbo v0, "51621"
+    const-string/jumbo v0, "51622"
+    const-string/jumbo v0, "51623"
+    const-string/jumbo v0, "51624"
+    const-string/jumbo v0, "51625"
+    const-string/jumbo v0, "51626"
+    const-string/jumbo v0, "51627"
+    const-string/jumbo v0, "51628"
+    const-string/jumbo v0, "51629"
+    const-string/jumbo v0, "51630"
+    const-string/jumbo v0, "51631"
+    const-string/jumbo v0, "51632"
+    const-string/jumbo v0, "51633"
+    const-string/jumbo v0, "51634"
+    const-string/jumbo v0, "51635"
+    const-string/jumbo v0, "51636"
+    const-string/jumbo v0, "51637"
+    const-string/jumbo v0, "51638"
+    const-string/jumbo v0, "51639"
+    const-string/jumbo v0, "51640"
+    const-string/jumbo v0, "51641"
+    const-string/jumbo v0, "51642"
+    const-string/jumbo v0, "51643"
+    const-string/jumbo v0, "51644"
+    const-string/jumbo v0, "51645"
+    const-string/jumbo v0, "51646"
+    const-string/jumbo v0, "51647"
+    const-string/jumbo v0, "51648"
+    const-string/jumbo v0, "51649"
+    const-string/jumbo v0, "51650"
+    const-string/jumbo v0, "51651"
+    const-string/jumbo v0, "51652"
+    const-string/jumbo v0, "51653"
+    const-string/jumbo v0, "51654"
+    const-string/jumbo v0, "51655"
+    const-string/jumbo v0, "51656"
+    const-string/jumbo v0, "51657"
+    const-string/jumbo v0, "51658"
+    const-string/jumbo v0, "51659"
+    const-string/jumbo v0, "51660"
+    const-string/jumbo v0, "51661"
+    const-string/jumbo v0, "51662"
+    const-string/jumbo v0, "51663"
+    const-string/jumbo v0, "51664"
+    const-string/jumbo v0, "51665"
+    const-string/jumbo v0, "51666"
+    const-string/jumbo v0, "51667"
+    const-string/jumbo v0, "51668"
+    const-string/jumbo v0, "51669"
+    const-string/jumbo v0, "51670"
+    const-string/jumbo v0, "51671"
+    const-string/jumbo v0, "51672"
+    const-string/jumbo v0, "51673"
+    const-string/jumbo v0, "51674"
+    const-string/jumbo v0, "51675"
+    const-string/jumbo v0, "51676"
+    const-string/jumbo v0, "51677"
+    const-string/jumbo v0, "51678"
+    const-string/jumbo v0, "51679"
+    const-string/jumbo v0, "51680"
+    const-string/jumbo v0, "51681"
+    const-string/jumbo v0, "51682"
+    const-string/jumbo v0, "51683"
+    const-string/jumbo v0, "51684"
+    const-string/jumbo v0, "51685"
+    const-string/jumbo v0, "51686"
+    const-string/jumbo v0, "51687"
+    const-string/jumbo v0, "51688"
+    const-string/jumbo v0, "51689"
+    const-string/jumbo v0, "51690"
+    const-string/jumbo v0, "51691"
+    const-string/jumbo v0, "51692"
+    const-string/jumbo v0, "51693"
+    const-string/jumbo v0, "51694"
+    const-string/jumbo v0, "51695"
+    const-string/jumbo v0, "51696"
+    const-string/jumbo v0, "51697"
+    const-string/jumbo v0, "51698"
+    const-string/jumbo v0, "51699"
+    const-string/jumbo v0, "51700"
+    const-string/jumbo v0, "51701"
+    const-string/jumbo v0, "51702"
+    const-string/jumbo v0, "51703"
+    const-string/jumbo v0, "51704"
+    const-string/jumbo v0, "51705"
+    const-string/jumbo v0, "51706"
+    const-string/jumbo v0, "51707"
+    const-string/jumbo v0, "51708"
+    const-string/jumbo v0, "51709"
+    const-string/jumbo v0, "51710"
+    const-string/jumbo v0, "51711"
+    const-string/jumbo v0, "51712"
+    const-string/jumbo v0, "51713"
+    const-string/jumbo v0, "51714"
+    const-string/jumbo v0, "51715"
+    const-string/jumbo v0, "51716"
+    const-string/jumbo v0, "51717"
+    const-string/jumbo v0, "51718"
+    const-string/jumbo v0, "51719"
+    const-string/jumbo v0, "51720"
+    const-string/jumbo v0, "51721"
+    const-string/jumbo v0, "51722"
+    const-string/jumbo v0, "51723"
+    const-string/jumbo v0, "51724"
+    const-string/jumbo v0, "51725"
+    const-string/jumbo v0, "51726"
+    const-string/jumbo v0, "51727"
+    const-string/jumbo v0, "51728"
+    const-string/jumbo v0, "51729"
+    const-string/jumbo v0, "51730"
+    const-string/jumbo v0, "51731"
+    const-string/jumbo v0, "51732"
+    const-string/jumbo v0, "51733"
+    const-string/jumbo v0, "51734"
+    const-string/jumbo v0, "51735"
+    const-string/jumbo v0, "51736"
+    const-string/jumbo v0, "51737"
+    const-string/jumbo v0, "51738"
+    const-string/jumbo v0, "51739"
+    const-string/jumbo v0, "51740"
+    const-string/jumbo v0, "51741"
+    const-string/jumbo v0, "51742"
+    const-string/jumbo v0, "51743"
+    const-string/jumbo v0, "51744"
+    const-string/jumbo v0, "51745"
+    const-string/jumbo v0, "51746"
+    const-string/jumbo v0, "51747"
+    const-string/jumbo v0, "51748"
+    const-string/jumbo v0, "51749"
+    const-string/jumbo v0, "51750"
+    const-string/jumbo v0, "51751"
+    const-string/jumbo v0, "51752"
+    const-string/jumbo v0, "51753"
+    const-string/jumbo v0, "51754"
+    const-string/jumbo v0, "51755"
+    const-string/jumbo v0, "51756"
+    const-string/jumbo v0, "51757"
+    const-string/jumbo v0, "51758"
+    const-string/jumbo v0, "51759"
+    const-string/jumbo v0, "51760"
+    const-string/jumbo v0, "51761"
+    const-string/jumbo v0, "51762"
+    const-string/jumbo v0, "51763"
+    const-string/jumbo v0, "51764"
+    const-string/jumbo v0, "51765"
+    const-string/jumbo v0, "51766"
+    const-string/jumbo v0, "51767"
+    const-string/jumbo v0, "51768"
+    const-string/jumbo v0, "51769"
+    const-string/jumbo v0, "51770"
+    const-string/jumbo v0, "51771"
+    const-string/jumbo v0, "51772"
+    const-string/jumbo v0, "51773"
+    const-string/jumbo v0, "51774"
+    const-string/jumbo v0, "51775"
+    const-string/jumbo v0, "51776"
+    const-string/jumbo v0, "51777"
+    const-string/jumbo v0, "51778"
+    const-string/jumbo v0, "51779"
+    const-string/jumbo v0, "51780"
+    const-string/jumbo v0, "51781"
+    const-string/jumbo v0, "51782"
+    const-string/jumbo v0, "51783"
+    const-string/jumbo v0, "51784"
+    const-string/jumbo v0, "51785"
+    const-string/jumbo v0, "51786"
+    const-string/jumbo v0, "51787"
+    const-string/jumbo v0, "51788"
+    const-string/jumbo v0, "51789"
+    const-string/jumbo v0, "51790"
+    const-string/jumbo v0, "51791"
+    const-string/jumbo v0, "51792"
+    const-string/jumbo v0, "51793"
+    const-string/jumbo v0, "51794"
+    const-string/jumbo v0, "51795"
+    const-string/jumbo v0, "51796"
+    const-string/jumbo v0, "51797"
+    const-string/jumbo v0, "51798"
+    const-string/jumbo v0, "51799"
+    const-string/jumbo v0, "51800"
+    const-string/jumbo v0, "51801"
+    const-string/jumbo v0, "51802"
+    const-string/jumbo v0, "51803"
+    const-string/jumbo v0, "51804"
+    const-string/jumbo v0, "51805"
+    const-string/jumbo v0, "51806"
+    const-string/jumbo v0, "51807"
+    const-string/jumbo v0, "51808"
+    const-string/jumbo v0, "51809"
+    const-string/jumbo v0, "51810"
+    const-string/jumbo v0, "51811"
+    const-string/jumbo v0, "51812"
+    const-string/jumbo v0, "51813"
+    const-string/jumbo v0, "51814"
+    const-string/jumbo v0, "51815"
+    const-string/jumbo v0, "51816"
+    const-string/jumbo v0, "51817"
+    const-string/jumbo v0, "51818"
+    const-string/jumbo v0, "51819"
+    const-string/jumbo v0, "51820"
+    const-string/jumbo v0, "51821"
+    const-string/jumbo v0, "51822"
+    const-string/jumbo v0, "51823"
+    const-string/jumbo v0, "51824"
+    const-string/jumbo v0, "51825"
+    const-string/jumbo v0, "51826"
+    const-string/jumbo v0, "51827"
+    const-string/jumbo v0, "51828"
+    const-string/jumbo v0, "51829"
+    const-string/jumbo v0, "51830"
+    const-string/jumbo v0, "51831"
+    const-string/jumbo v0, "51832"
+    const-string/jumbo v0, "51833"
+    const-string/jumbo v0, "51834"
+    const-string/jumbo v0, "51835"
+    const-string/jumbo v0, "51836"
+    const-string/jumbo v0, "51837"
+    const-string/jumbo v0, "51838"
+    const-string/jumbo v0, "51839"
+    const-string/jumbo v0, "51840"
+    const-string/jumbo v0, "51841"
+    const-string/jumbo v0, "51842"
+    const-string/jumbo v0, "51843"
+    const-string/jumbo v0, "51844"
+    const-string/jumbo v0, "51845"
+    const-string/jumbo v0, "51846"
+    const-string/jumbo v0, "51847"
+    const-string/jumbo v0, "51848"
+    const-string/jumbo v0, "51849"
+    const-string/jumbo v0, "51850"
+    const-string/jumbo v0, "51851"
+    const-string/jumbo v0, "51852"
+    const-string/jumbo v0, "51853"
+    const-string/jumbo v0, "51854"
+    const-string/jumbo v0, "51855"
+    const-string/jumbo v0, "51856"
+    const-string/jumbo v0, "51857"
+    const-string/jumbo v0, "51858"
+    const-string/jumbo v0, "51859"
+    const-string/jumbo v0, "51860"
+    const-string/jumbo v0, "51861"
+    const-string/jumbo v0, "51862"
+    const-string/jumbo v0, "51863"
+    const-string/jumbo v0, "51864"
+    const-string/jumbo v0, "51865"
+    const-string/jumbo v0, "51866"
+    const-string/jumbo v0, "51867"
+    const-string/jumbo v0, "51868"
+    const-string/jumbo v0, "51869"
+    const-string/jumbo v0, "51870"
+    const-string/jumbo v0, "51871"
+    const-string/jumbo v0, "51872"
+    const-string/jumbo v0, "51873"
+    const-string/jumbo v0, "51874"
+    const-string/jumbo v0, "51875"
+    const-string/jumbo v0, "51876"
+    const-string/jumbo v0, "51877"
+    const-string/jumbo v0, "51878"
+    const-string/jumbo v0, "51879"
+    const-string/jumbo v0, "51880"
+    const-string/jumbo v0, "51881"
+    const-string/jumbo v0, "51882"
+    const-string/jumbo v0, "51883"
+    const-string/jumbo v0, "51884"
+    const-string/jumbo v0, "51885"
+    const-string/jumbo v0, "51886"
+    const-string/jumbo v0, "51887"
+    const-string/jumbo v0, "51888"
+    const-string/jumbo v0, "51889"
+    const-string/jumbo v0, "51890"
+    const-string/jumbo v0, "51891"
+    const-string/jumbo v0, "51892"
+    const-string/jumbo v0, "51893"
+    const-string/jumbo v0, "51894"
+    const-string/jumbo v0, "51895"
+    const-string/jumbo v0, "51896"
+    const-string/jumbo v0, "51897"
+    const-string/jumbo v0, "51898"
+    const-string/jumbo v0, "51899"
+    const-string/jumbo v0, "51900"
+    const-string/jumbo v0, "51901"
+    const-string/jumbo v0, "51902"
+    const-string/jumbo v0, "51903"
+    const-string/jumbo v0, "51904"
+    const-string/jumbo v0, "51905"
+    const-string/jumbo v0, "51906"
+    const-string/jumbo v0, "51907"
+    const-string/jumbo v0, "51908"
+    const-string/jumbo v0, "51909"
+    const-string/jumbo v0, "51910"
+    const-string/jumbo v0, "51911"
+    const-string/jumbo v0, "51912"
+    const-string/jumbo v0, "51913"
+    const-string/jumbo v0, "51914"
+    const-string/jumbo v0, "51915"
+    const-string/jumbo v0, "51916"
+    const-string/jumbo v0, "51917"
+    const-string/jumbo v0, "51918"
+    const-string/jumbo v0, "51919"
+    const-string/jumbo v0, "51920"
+    const-string/jumbo v0, "51921"
+    const-string/jumbo v0, "51922"
+    const-string/jumbo v0, "51923"
+    const-string/jumbo v0, "51924"
+    const-string/jumbo v0, "51925"
+    const-string/jumbo v0, "51926"
+    const-string/jumbo v0, "51927"
+    const-string/jumbo v0, "51928"
+    const-string/jumbo v0, "51929"
+    const-string/jumbo v0, "51930"
+    const-string/jumbo v0, "51931"
+    const-string/jumbo v0, "51932"
+    const-string/jumbo v0, "51933"
+    const-string/jumbo v0, "51934"
+    const-string/jumbo v0, "51935"
+    const-string/jumbo v0, "51936"
+    const-string/jumbo v0, "51937"
+    const-string/jumbo v0, "51938"
+    const-string/jumbo v0, "51939"
+    const-string/jumbo v0, "51940"
+    const-string/jumbo v0, "51941"
+    const-string/jumbo v0, "51942"
+    const-string/jumbo v0, "51943"
+    const-string/jumbo v0, "51944"
+    const-string/jumbo v0, "51945"
+    const-string/jumbo v0, "51946"
+    const-string/jumbo v0, "51947"
+    const-string/jumbo v0, "51948"
+    const-string/jumbo v0, "51949"
+    const-string/jumbo v0, "51950"
+    const-string/jumbo v0, "51951"
+    const-string/jumbo v0, "51952"
+    const-string/jumbo v0, "51953"
+    const-string/jumbo v0, "51954"
+    const-string/jumbo v0, "51955"
+    const-string/jumbo v0, "51956"
+    const-string/jumbo v0, "51957"
+    const-string/jumbo v0, "51958"
+    const-string/jumbo v0, "51959"
+    const-string/jumbo v0, "51960"
+    const-string/jumbo v0, "51961"
+    const-string/jumbo v0, "51962"
+    const-string/jumbo v0, "51963"
+    const-string/jumbo v0, "51964"
+    const-string/jumbo v0, "51965"
+    const-string/jumbo v0, "51966"
+    const-string/jumbo v0, "51967"
+    const-string/jumbo v0, "51968"
+    const-string/jumbo v0, "51969"
+    const-string/jumbo v0, "51970"
+    const-string/jumbo v0, "51971"
+    const-string/jumbo v0, "51972"
+    const-string/jumbo v0, "51973"
+    const-string/jumbo v0, "51974"
+    const-string/jumbo v0, "51975"
+    const-string/jumbo v0, "51976"
+    const-string/jumbo v0, "51977"
+    const-string/jumbo v0, "51978"
+    const-string/jumbo v0, "51979"
+    const-string/jumbo v0, "51980"
+    const-string/jumbo v0, "51981"
+    const-string/jumbo v0, "51982"
+    const-string/jumbo v0, "51983"
+    const-string/jumbo v0, "51984"
+    const-string/jumbo v0, "51985"
+    const-string/jumbo v0, "51986"
+    const-string/jumbo v0, "51987"
+    const-string/jumbo v0, "51988"
+    const-string/jumbo v0, "51989"
+    const-string/jumbo v0, "51990"
+    const-string/jumbo v0, "51991"
+    const-string/jumbo v0, "51992"
+    const-string/jumbo v0, "51993"
+    const-string/jumbo v0, "51994"
+    const-string/jumbo v0, "51995"
+    const-string/jumbo v0, "51996"
+    const-string/jumbo v0, "51997"
+    const-string/jumbo v0, "51998"
+    const-string/jumbo v0, "51999"
+    const-string/jumbo v0, "52000"
+    const-string/jumbo v0, "52001"
+    const-string/jumbo v0, "52002"
+    const-string/jumbo v0, "52003"
+    const-string/jumbo v0, "52004"
+    const-string/jumbo v0, "52005"
+    const-string/jumbo v0, "52006"
+    const-string/jumbo v0, "52007"
+    const-string/jumbo v0, "52008"
+    const-string/jumbo v0, "52009"
+    const-string/jumbo v0, "52010"
+    const-string/jumbo v0, "52011"
+    const-string/jumbo v0, "52012"
+    const-string/jumbo v0, "52013"
+    const-string/jumbo v0, "52014"
+    const-string/jumbo v0, "52015"
+    const-string/jumbo v0, "52016"
+    const-string/jumbo v0, "52017"
+    const-string/jumbo v0, "52018"
+    const-string/jumbo v0, "52019"
+    const-string/jumbo v0, "52020"
+    const-string/jumbo v0, "52021"
+    const-string/jumbo v0, "52022"
+    const-string/jumbo v0, "52023"
+    const-string/jumbo v0, "52024"
+    const-string/jumbo v0, "52025"
+    const-string/jumbo v0, "52026"
+    const-string/jumbo v0, "52027"
+    const-string/jumbo v0, "52028"
+    const-string/jumbo v0, "52029"
+    const-string/jumbo v0, "52030"
+    const-string/jumbo v0, "52031"
+    const-string/jumbo v0, "52032"
+    const-string/jumbo v0, "52033"
+    const-string/jumbo v0, "52034"
+    const-string/jumbo v0, "52035"
+    const-string/jumbo v0, "52036"
+    const-string/jumbo v0, "52037"
+    const-string/jumbo v0, "52038"
+    const-string/jumbo v0, "52039"
+    const-string/jumbo v0, "52040"
+    const-string/jumbo v0, "52041"
+    const-string/jumbo v0, "52042"
+    const-string/jumbo v0, "52043"
+    const-string/jumbo v0, "52044"
+    const-string/jumbo v0, "52045"
+    const-string/jumbo v0, "52046"
+    const-string/jumbo v0, "52047"
+    const-string/jumbo v0, "52048"
+    const-string/jumbo v0, "52049"
+    const-string/jumbo v0, "52050"
+    const-string/jumbo v0, "52051"
+    const-string/jumbo v0, "52052"
+    const-string/jumbo v0, "52053"
+    const-string/jumbo v0, "52054"
+    const-string/jumbo v0, "52055"
+    const-string/jumbo v0, "52056"
+    const-string/jumbo v0, "52057"
+    const-string/jumbo v0, "52058"
+    const-string/jumbo v0, "52059"
+    const-string/jumbo v0, "52060"
+    const-string/jumbo v0, "52061"
+    const-string/jumbo v0, "52062"
+    const-string/jumbo v0, "52063"
+    const-string/jumbo v0, "52064"
+    const-string/jumbo v0, "52065"
+    const-string/jumbo v0, "52066"
+    const-string/jumbo v0, "52067"
+    const-string/jumbo v0, "52068"
+    const-string/jumbo v0, "52069"
+    const-string/jumbo v0, "52070"
+    const-string/jumbo v0, "52071"
+    const-string/jumbo v0, "52072"
+    const-string/jumbo v0, "52073"
+    const-string/jumbo v0, "52074"
+    const-string/jumbo v0, "52075"
+    const-string/jumbo v0, "52076"
+    const-string/jumbo v0, "52077"
+    const-string/jumbo v0, "52078"
+    const-string/jumbo v0, "52079"
+    const-string/jumbo v0, "52080"
+    const-string/jumbo v0, "52081"
+    const-string/jumbo v0, "52082"
+    const-string/jumbo v0, "52083"
+    const-string/jumbo v0, "52084"
+    const-string/jumbo v0, "52085"
+    const-string/jumbo v0, "52086"
+    const-string/jumbo v0, "52087"
+    const-string/jumbo v0, "52088"
+    const-string/jumbo v0, "52089"
+    const-string/jumbo v0, "52090"
+    const-string/jumbo v0, "52091"
+    const-string/jumbo v0, "52092"
+    const-string/jumbo v0, "52093"
+    const-string/jumbo v0, "52094"
+    const-string/jumbo v0, "52095"
+    const-string/jumbo v0, "52096"
+    const-string/jumbo v0, "52097"
+    const-string/jumbo v0, "52098"
+    const-string/jumbo v0, "52099"
+    const-string/jumbo v0, "52100"
+    const-string/jumbo v0, "52101"
+    const-string/jumbo v0, "52102"
+    const-string/jumbo v0, "52103"
+    const-string/jumbo v0, "52104"
+    const-string/jumbo v0, "52105"
+    const-string/jumbo v0, "52106"
+    const-string/jumbo v0, "52107"
+    const-string/jumbo v0, "52108"
+    const-string/jumbo v0, "52109"
+    const-string/jumbo v0, "52110"
+    const-string/jumbo v0, "52111"
+    const-string/jumbo v0, "52112"
+    const-string/jumbo v0, "52113"
+    const-string/jumbo v0, "52114"
+    const-string/jumbo v0, "52115"
+    const-string/jumbo v0, "52116"
+    const-string/jumbo v0, "52117"
+    const-string/jumbo v0, "52118"
+    const-string/jumbo v0, "52119"
+    const-string/jumbo v0, "52120"
+    const-string/jumbo v0, "52121"
+    const-string/jumbo v0, "52122"
+    const-string/jumbo v0, "52123"
+    const-string/jumbo v0, "52124"
+    const-string/jumbo v0, "52125"
+    const-string/jumbo v0, "52126"
+    const-string/jumbo v0, "52127"
+    const-string/jumbo v0, "52128"
+    const-string/jumbo v0, "52129"
+    const-string/jumbo v0, "52130"
+    const-string/jumbo v0, "52131"
+    const-string/jumbo v0, "52132"
+    const-string/jumbo v0, "52133"
+    const-string/jumbo v0, "52134"
+    const-string/jumbo v0, "52135"
+    const-string/jumbo v0, "52136"
+    const-string/jumbo v0, "52137"
+    const-string/jumbo v0, "52138"
+    const-string/jumbo v0, "52139"
+    const-string/jumbo v0, "52140"
+    const-string/jumbo v0, "52141"
+    const-string/jumbo v0, "52142"
+    const-string/jumbo v0, "52143"
+    const-string/jumbo v0, "52144"
+    const-string/jumbo v0, "52145"
+    const-string/jumbo v0, "52146"
+    const-string/jumbo v0, "52147"
+    const-string/jumbo v0, "52148"
+    const-string/jumbo v0, "52149"
+    const-string/jumbo v0, "52150"
+    const-string/jumbo v0, "52151"
+    const-string/jumbo v0, "52152"
+    const-string/jumbo v0, "52153"
+    const-string/jumbo v0, "52154"
+    const-string/jumbo v0, "52155"
+    const-string/jumbo v0, "52156"
+    const-string/jumbo v0, "52157"
+    const-string/jumbo v0, "52158"
+    const-string/jumbo v0, "52159"
+    const-string/jumbo v0, "52160"
+    const-string/jumbo v0, "52161"
+    const-string/jumbo v0, "52162"
+    const-string/jumbo v0, "52163"
+    const-string/jumbo v0, "52164"
+    const-string/jumbo v0, "52165"
+    const-string/jumbo v0, "52166"
+    const-string/jumbo v0, "52167"
+    const-string/jumbo v0, "52168"
+    const-string/jumbo v0, "52169"
+    const-string/jumbo v0, "52170"
+    const-string/jumbo v0, "52171"
+    const-string/jumbo v0, "52172"
+    const-string/jumbo v0, "52173"
+    const-string/jumbo v0, "52174"
+    const-string/jumbo v0, "52175"
+    const-string/jumbo v0, "52176"
+    const-string/jumbo v0, "52177"
+    const-string/jumbo v0, "52178"
+    const-string/jumbo v0, "52179"
+    const-string/jumbo v0, "52180"
+    const-string/jumbo v0, "52181"
+    const-string/jumbo v0, "52182"
+    const-string/jumbo v0, "52183"
+    const-string/jumbo v0, "52184"
+    const-string/jumbo v0, "52185"
+    const-string/jumbo v0, "52186"
+    const-string/jumbo v0, "52187"
+    const-string/jumbo v0, "52188"
+    const-string/jumbo v0, "52189"
+    const-string/jumbo v0, "52190"
+    const-string/jumbo v0, "52191"
+    const-string/jumbo v0, "52192"
+    const-string/jumbo v0, "52193"
+    const-string/jumbo v0, "52194"
+    const-string/jumbo v0, "52195"
+    const-string/jumbo v0, "52196"
+    const-string/jumbo v0, "52197"
+    const-string/jumbo v0, "52198"
+    const-string/jumbo v0, "52199"
+    const-string/jumbo v0, "52200"
+    const-string/jumbo v0, "52201"
+    const-string/jumbo v0, "52202"
+    const-string/jumbo v0, "52203"
+    const-string/jumbo v0, "52204"
+    const-string/jumbo v0, "52205"
+    const-string/jumbo v0, "52206"
+    const-string/jumbo v0, "52207"
+    const-string/jumbo v0, "52208"
+    const-string/jumbo v0, "52209"
+    const-string/jumbo v0, "52210"
+    const-string/jumbo v0, "52211"
+    const-string/jumbo v0, "52212"
+    const-string/jumbo v0, "52213"
+    const-string/jumbo v0, "52214"
+    const-string/jumbo v0, "52215"
+    const-string/jumbo v0, "52216"
+    const-string/jumbo v0, "52217"
+    const-string/jumbo v0, "52218"
+    const-string/jumbo v0, "52219"
+    const-string/jumbo v0, "52220"
+    const-string/jumbo v0, "52221"
+    const-string/jumbo v0, "52222"
+    const-string/jumbo v0, "52223"
+    const-string/jumbo v0, "52224"
+    const-string/jumbo v0, "52225"
+    const-string/jumbo v0, "52226"
+    const-string/jumbo v0, "52227"
+    const-string/jumbo v0, "52228"
+    const-string/jumbo v0, "52229"
+    const-string/jumbo v0, "52230"
+    const-string/jumbo v0, "52231"
+    const-string/jumbo v0, "52232"
+    const-string/jumbo v0, "52233"
+    const-string/jumbo v0, "52234"
+    const-string/jumbo v0, "52235"
+    const-string/jumbo v0, "52236"
+    const-string/jumbo v0, "52237"
+    const-string/jumbo v0, "52238"
+    const-string/jumbo v0, "52239"
+    const-string/jumbo v0, "52240"
+    const-string/jumbo v0, "52241"
+    const-string/jumbo v0, "52242"
+    const-string/jumbo v0, "52243"
+    const-string/jumbo v0, "52244"
+    const-string/jumbo v0, "52245"
+    const-string/jumbo v0, "52246"
+    const-string/jumbo v0, "52247"
+    const-string/jumbo v0, "52248"
+    const-string/jumbo v0, "52249"
+    const-string/jumbo v0, "52250"
+    const-string/jumbo v0, "52251"
+    const-string/jumbo v0, "52252"
+    const-string/jumbo v0, "52253"
+    const-string/jumbo v0, "52254"
+    const-string/jumbo v0, "52255"
+    const-string/jumbo v0, "52256"
+    const-string/jumbo v0, "52257"
+    const-string/jumbo v0, "52258"
+    const-string/jumbo v0, "52259"
+    const-string/jumbo v0, "52260"
+    const-string/jumbo v0, "52261"
+    const-string/jumbo v0, "52262"
+    const-string/jumbo v0, "52263"
+    const-string/jumbo v0, "52264"
+    const-string/jumbo v0, "52265"
+    const-string/jumbo v0, "52266"
+    const-string/jumbo v0, "52267"
+    const-string/jumbo v0, "52268"
+    const-string/jumbo v0, "52269"
+    const-string/jumbo v0, "52270"
+    const-string/jumbo v0, "52271"
+    const-string/jumbo v0, "52272"
+    const-string/jumbo v0, "52273"
+    const-string/jumbo v0, "52274"
+    const-string/jumbo v0, "52275"
+    const-string/jumbo v0, "52276"
+    const-string/jumbo v0, "52277"
+    const-string/jumbo v0, "52278"
+    const-string/jumbo v0, "52279"
+    const-string/jumbo v0, "52280"
+    const-string/jumbo v0, "52281"
+    const-string/jumbo v0, "52282"
+    const-string/jumbo v0, "52283"
+    const-string/jumbo v0, "52284"
+    const-string/jumbo v0, "52285"
+    const-string/jumbo v0, "52286"
+    const-string/jumbo v0, "52287"
+    const-string/jumbo v0, "52288"
+    const-string/jumbo v0, "52289"
+    const-string/jumbo v0, "52290"
+    const-string/jumbo v0, "52291"
+    const-string/jumbo v0, "52292"
+    const-string/jumbo v0, "52293"
+    const-string/jumbo v0, "52294"
+    const-string/jumbo v0, "52295"
+    const-string/jumbo v0, "52296"
+    const-string/jumbo v0, "52297"
+    const-string/jumbo v0, "52298"
+    const-string/jumbo v0, "52299"
+    const-string/jumbo v0, "52300"
+    const-string/jumbo v0, "52301"
+    const-string/jumbo v0, "52302"
+    const-string/jumbo v0, "52303"
+    const-string/jumbo v0, "52304"
+    const-string/jumbo v0, "52305"
+    const-string/jumbo v0, "52306"
+    const-string/jumbo v0, "52307"
+    const-string/jumbo v0, "52308"
+    const-string/jumbo v0, "52309"
+    const-string/jumbo v0, "52310"
+    const-string/jumbo v0, "52311"
+    const-string/jumbo v0, "52312"
+    const-string/jumbo v0, "52313"
+    const-string/jumbo v0, "52314"
+    const-string/jumbo v0, "52315"
+    const-string/jumbo v0, "52316"
+    const-string/jumbo v0, "52317"
+    const-string/jumbo v0, "52318"
+    const-string/jumbo v0, "52319"
+    const-string/jumbo v0, "52320"
+    const-string/jumbo v0, "52321"
+    const-string/jumbo v0, "52322"
+    const-string/jumbo v0, "52323"
+    const-string/jumbo v0, "52324"
+    const-string/jumbo v0, "52325"
+    const-string/jumbo v0, "52326"
+    const-string/jumbo v0, "52327"
+    const-string/jumbo v0, "52328"
+    const-string/jumbo v0, "52329"
+    const-string/jumbo v0, "52330"
+    const-string/jumbo v0, "52331"
+    const-string/jumbo v0, "52332"
+    const-string/jumbo v0, "52333"
+    const-string/jumbo v0, "52334"
+    const-string/jumbo v0, "52335"
+    const-string/jumbo v0, "52336"
+    const-string/jumbo v0, "52337"
+    const-string/jumbo v0, "52338"
+    const-string/jumbo v0, "52339"
+    const-string/jumbo v0, "52340"
+    const-string/jumbo v0, "52341"
+    const-string/jumbo v0, "52342"
+    const-string/jumbo v0, "52343"
+    const-string/jumbo v0, "52344"
+    const-string/jumbo v0, "52345"
+    const-string/jumbo v0, "52346"
+    const-string/jumbo v0, "52347"
+    const-string/jumbo v0, "52348"
+    const-string/jumbo v0, "52349"
+    const-string/jumbo v0, "52350"
+    const-string/jumbo v0, "52351"
+    const-string/jumbo v0, "52352"
+    const-string/jumbo v0, "52353"
+    const-string/jumbo v0, "52354"
+    const-string/jumbo v0, "52355"
+    const-string/jumbo v0, "52356"
+    const-string/jumbo v0, "52357"
+    const-string/jumbo v0, "52358"
+    const-string/jumbo v0, "52359"
+    const-string/jumbo v0, "52360"
+    const-string/jumbo v0, "52361"
+    const-string/jumbo v0, "52362"
+    const-string/jumbo v0, "52363"
+    const-string/jumbo v0, "52364"
+    const-string/jumbo v0, "52365"
+    const-string/jumbo v0, "52366"
+    const-string/jumbo v0, "52367"
+    const-string/jumbo v0, "52368"
+    const-string/jumbo v0, "52369"
+    const-string/jumbo v0, "52370"
+    const-string/jumbo v0, "52371"
+    const-string/jumbo v0, "52372"
+    const-string/jumbo v0, "52373"
+    const-string/jumbo v0, "52374"
+    const-string/jumbo v0, "52375"
+    const-string/jumbo v0, "52376"
+    const-string/jumbo v0, "52377"
+    const-string/jumbo v0, "52378"
+    const-string/jumbo v0, "52379"
+    const-string/jumbo v0, "52380"
+    const-string/jumbo v0, "52381"
+    const-string/jumbo v0, "52382"
+    const-string/jumbo v0, "52383"
+    const-string/jumbo v0, "52384"
+    const-string/jumbo v0, "52385"
+    const-string/jumbo v0, "52386"
+    const-string/jumbo v0, "52387"
+    const-string/jumbo v0, "52388"
+    const-string/jumbo v0, "52389"
+    const-string/jumbo v0, "52390"
+    const-string/jumbo v0, "52391"
+    const-string/jumbo v0, "52392"
+    const-string/jumbo v0, "52393"
+    const-string/jumbo v0, "52394"
+    const-string/jumbo v0, "52395"
+    const-string/jumbo v0, "52396"
+    const-string/jumbo v0, "52397"
+    const-string/jumbo v0, "52398"
+    const-string/jumbo v0, "52399"
+    const-string/jumbo v0, "52400"
+    const-string/jumbo v0, "52401"
+    const-string/jumbo v0, "52402"
+    const-string/jumbo v0, "52403"
+    const-string/jumbo v0, "52404"
+    const-string/jumbo v0, "52405"
+    const-string/jumbo v0, "52406"
+    const-string/jumbo v0, "52407"
+    const-string/jumbo v0, "52408"
+    const-string/jumbo v0, "52409"
+    const-string/jumbo v0, "52410"
+    const-string/jumbo v0, "52411"
+    const-string/jumbo v0, "52412"
+    const-string/jumbo v0, "52413"
+    const-string/jumbo v0, "52414"
+    const-string/jumbo v0, "52415"
+    const-string/jumbo v0, "52416"
+    const-string/jumbo v0, "52417"
+    const-string/jumbo v0, "52418"
+    const-string/jumbo v0, "52419"
+    const-string/jumbo v0, "52420"
+    const-string/jumbo v0, "52421"
+    const-string/jumbo v0, "52422"
+    const-string/jumbo v0, "52423"
+    const-string/jumbo v0, "52424"
+    const-string/jumbo v0, "52425"
+    const-string/jumbo v0, "52426"
+    const-string/jumbo v0, "52427"
+    const-string/jumbo v0, "52428"
+    const-string/jumbo v0, "52429"
+    const-string/jumbo v0, "52430"
+    const-string/jumbo v0, "52431"
+    const-string/jumbo v0, "52432"
+    const-string/jumbo v0, "52433"
+    const-string/jumbo v0, "52434"
+    const-string/jumbo v0, "52435"
+    const-string/jumbo v0, "52436"
+    const-string/jumbo v0, "52437"
+    const-string/jumbo v0, "52438"
+    const-string/jumbo v0, "52439"
+    const-string/jumbo v0, "52440"
+    const-string/jumbo v0, "52441"
+    const-string/jumbo v0, "52442"
+    const-string/jumbo v0, "52443"
+    const-string/jumbo v0, "52444"
+    const-string/jumbo v0, "52445"
+    const-string/jumbo v0, "52446"
+    const-string/jumbo v0, "52447"
+    const-string/jumbo v0, "52448"
+    const-string/jumbo v0, "52449"
+    const-string/jumbo v0, "52450"
+    const-string/jumbo v0, "52451"
+    const-string/jumbo v0, "52452"
+    const-string/jumbo v0, "52453"
+    const-string/jumbo v0, "52454"
+    const-string/jumbo v0, "52455"
+    const-string/jumbo v0, "52456"
+    const-string/jumbo v0, "52457"
+    const-string/jumbo v0, "52458"
+    const-string/jumbo v0, "52459"
+    const-string/jumbo v0, "52460"
+    const-string/jumbo v0, "52461"
+    const-string/jumbo v0, "52462"
+    const-string/jumbo v0, "52463"
+    const-string/jumbo v0, "52464"
+    const-string/jumbo v0, "52465"
+    const-string/jumbo v0, "52466"
+    const-string/jumbo v0, "52467"
+    const-string/jumbo v0, "52468"
+    const-string/jumbo v0, "52469"
+    const-string/jumbo v0, "52470"
+    const-string/jumbo v0, "52471"
+    const-string/jumbo v0, "52472"
+    const-string/jumbo v0, "52473"
+    const-string/jumbo v0, "52474"
+    const-string/jumbo v0, "52475"
+    const-string/jumbo v0, "52476"
+    const-string/jumbo v0, "52477"
+    const-string/jumbo v0, "52478"
+    const-string/jumbo v0, "52479"
+    const-string/jumbo v0, "52480"
+    const-string/jumbo v0, "52481"
+    const-string/jumbo v0, "52482"
+    const-string/jumbo v0, "52483"
+    const-string/jumbo v0, "52484"
+    const-string/jumbo v0, "52485"
+    const-string/jumbo v0, "52486"
+    const-string/jumbo v0, "52487"
+    const-string/jumbo v0, "52488"
+    const-string/jumbo v0, "52489"
+    const-string/jumbo v0, "52490"
+    const-string/jumbo v0, "52491"
+    const-string/jumbo v0, "52492"
+    const-string/jumbo v0, "52493"
+    const-string/jumbo v0, "52494"
+    const-string/jumbo v0, "52495"
+    const-string/jumbo v0, "52496"
+    const-string/jumbo v0, "52497"
+    const-string/jumbo v0, "52498"
+    const-string/jumbo v0, "52499"
+    const-string/jumbo v0, "52500"
+    const-string/jumbo v0, "52501"
+    const-string/jumbo v0, "52502"
+    const-string/jumbo v0, "52503"
+    const-string/jumbo v0, "52504"
+    const-string/jumbo v0, "52505"
+    const-string/jumbo v0, "52506"
+    const-string/jumbo v0, "52507"
+    const-string/jumbo v0, "52508"
+    const-string/jumbo v0, "52509"
+    const-string/jumbo v0, "52510"
+    const-string/jumbo v0, "52511"
+    const-string/jumbo v0, "52512"
+    const-string/jumbo v0, "52513"
+    const-string/jumbo v0, "52514"
+    const-string/jumbo v0, "52515"
+    const-string/jumbo v0, "52516"
+    const-string/jumbo v0, "52517"
+    const-string/jumbo v0, "52518"
+    const-string/jumbo v0, "52519"
+    const-string/jumbo v0, "52520"
+    const-string/jumbo v0, "52521"
+    const-string/jumbo v0, "52522"
+    const-string/jumbo v0, "52523"
+    const-string/jumbo v0, "52524"
+    const-string/jumbo v0, "52525"
+    const-string/jumbo v0, "52526"
+    const-string/jumbo v0, "52527"
+    const-string/jumbo v0, "52528"
+    const-string/jumbo v0, "52529"
+    const-string/jumbo v0, "52530"
+    const-string/jumbo v0, "52531"
+    const-string/jumbo v0, "52532"
+    const-string/jumbo v0, "52533"
+    const-string/jumbo v0, "52534"
+    const-string/jumbo v0, "52535"
+    const-string/jumbo v0, "52536"
+    const-string/jumbo v0, "52537"
+    const-string/jumbo v0, "52538"
+    const-string/jumbo v0, "52539"
+    const-string/jumbo v0, "52540"
+    const-string/jumbo v0, "52541"
+    const-string/jumbo v0, "52542"
+    const-string/jumbo v0, "52543"
+    const-string/jumbo v0, "52544"
+    const-string/jumbo v0, "52545"
+    const-string/jumbo v0, "52546"
+    const-string/jumbo v0, "52547"
+    const-string/jumbo v0, "52548"
+    const-string/jumbo v0, "52549"
+    const-string/jumbo v0, "52550"
+    const-string/jumbo v0, "52551"
+    const-string/jumbo v0, "52552"
+    const-string/jumbo v0, "52553"
+    const-string/jumbo v0, "52554"
+    const-string/jumbo v0, "52555"
+    const-string/jumbo v0, "52556"
+    const-string/jumbo v0, "52557"
+    const-string/jumbo v0, "52558"
+    const-string/jumbo v0, "52559"
+    const-string/jumbo v0, "52560"
+    const-string/jumbo v0, "52561"
+    const-string/jumbo v0, "52562"
+    const-string/jumbo v0, "52563"
+    const-string/jumbo v0, "52564"
+    const-string/jumbo v0, "52565"
+    const-string/jumbo v0, "52566"
+    const-string/jumbo v0, "52567"
+    const-string/jumbo v0, "52568"
+    const-string/jumbo v0, "52569"
+    const-string/jumbo v0, "52570"
+    const-string/jumbo v0, "52571"
+    const-string/jumbo v0, "52572"
+    const-string/jumbo v0, "52573"
+    const-string/jumbo v0, "52574"
+    const-string/jumbo v0, "52575"
+    const-string/jumbo v0, "52576"
+    const-string/jumbo v0, "52577"
+    const-string/jumbo v0, "52578"
+    const-string/jumbo v0, "52579"
+    const-string/jumbo v0, "52580"
+    const-string/jumbo v0, "52581"
+    const-string/jumbo v0, "52582"
+    const-string/jumbo v0, "52583"
+    const-string/jumbo v0, "52584"
+    const-string/jumbo v0, "52585"
+    const-string/jumbo v0, "52586"
+    const-string/jumbo v0, "52587"
+    const-string/jumbo v0, "52588"
+    const-string/jumbo v0, "52589"
+    const-string/jumbo v0, "52590"
+    const-string/jumbo v0, "52591"
+    const-string/jumbo v0, "52592"
+    const-string/jumbo v0, "52593"
+    const-string/jumbo v0, "52594"
+    const-string/jumbo v0, "52595"
+    const-string/jumbo v0, "52596"
+    const-string/jumbo v0, "52597"
+    const-string/jumbo v0, "52598"
+    const-string/jumbo v0, "52599"
+    const-string/jumbo v0, "52600"
+    const-string/jumbo v0, "52601"
+    const-string/jumbo v0, "52602"
+    const-string/jumbo v0, "52603"
+    const-string/jumbo v0, "52604"
+    const-string/jumbo v0, "52605"
+    const-string/jumbo v0, "52606"
+    const-string/jumbo v0, "52607"
+    const-string/jumbo v0, "52608"
+    const-string/jumbo v0, "52609"
+    const-string/jumbo v0, "52610"
+    const-string/jumbo v0, "52611"
+    const-string/jumbo v0, "52612"
+    const-string/jumbo v0, "52613"
+    const-string/jumbo v0, "52614"
+    const-string/jumbo v0, "52615"
+    const-string/jumbo v0, "52616"
+    const-string/jumbo v0, "52617"
+    const-string/jumbo v0, "52618"
+    const-string/jumbo v0, "52619"
+    const-string/jumbo v0, "52620"
+    const-string/jumbo v0, "52621"
+    const-string/jumbo v0, "52622"
+    const-string/jumbo v0, "52623"
+    const-string/jumbo v0, "52624"
+    const-string/jumbo v0, "52625"
+    const-string/jumbo v0, "52626"
+    const-string/jumbo v0, "52627"
+    const-string/jumbo v0, "52628"
+    const-string/jumbo v0, "52629"
+    const-string/jumbo v0, "52630"
+    const-string/jumbo v0, "52631"
+    const-string/jumbo v0, "52632"
+    const-string/jumbo v0, "52633"
+    const-string/jumbo v0, "52634"
+    const-string/jumbo v0, "52635"
+    const-string/jumbo v0, "52636"
+    const-string/jumbo v0, "52637"
+    const-string/jumbo v0, "52638"
+    const-string/jumbo v0, "52639"
+    const-string/jumbo v0, "52640"
+    const-string/jumbo v0, "52641"
+    const-string/jumbo v0, "52642"
+    const-string/jumbo v0, "52643"
+    const-string/jumbo v0, "52644"
+    const-string/jumbo v0, "52645"
+    const-string/jumbo v0, "52646"
+    const-string/jumbo v0, "52647"
+    const-string/jumbo v0, "52648"
+    const-string/jumbo v0, "52649"
+    const-string/jumbo v0, "52650"
+    const-string/jumbo v0, "52651"
+    const-string/jumbo v0, "52652"
+    const-string/jumbo v0, "52653"
+    const-string/jumbo v0, "52654"
+    const-string/jumbo v0, "52655"
+    const-string/jumbo v0, "52656"
+    const-string/jumbo v0, "52657"
+    const-string/jumbo v0, "52658"
+    const-string/jumbo v0, "52659"
+    const-string/jumbo v0, "52660"
+    const-string/jumbo v0, "52661"
+    const-string/jumbo v0, "52662"
+    const-string/jumbo v0, "52663"
+    const-string/jumbo v0, "52664"
+    const-string/jumbo v0, "52665"
+    const-string/jumbo v0, "52666"
+    const-string/jumbo v0, "52667"
+    const-string/jumbo v0, "52668"
+    const-string/jumbo v0, "52669"
+    const-string/jumbo v0, "52670"
+    const-string/jumbo v0, "52671"
+    const-string/jumbo v0, "52672"
+    const-string/jumbo v0, "52673"
+    const-string/jumbo v0, "52674"
+    const-string/jumbo v0, "52675"
+    const-string/jumbo v0, "52676"
+    const-string/jumbo v0, "52677"
+    const-string/jumbo v0, "52678"
+    const-string/jumbo v0, "52679"
+    const-string/jumbo v0, "52680"
+    const-string/jumbo v0, "52681"
+    const-string/jumbo v0, "52682"
+    const-string/jumbo v0, "52683"
+    const-string/jumbo v0, "52684"
+    const-string/jumbo v0, "52685"
+    const-string/jumbo v0, "52686"
+    const-string/jumbo v0, "52687"
+    const-string/jumbo v0, "52688"
+    const-string/jumbo v0, "52689"
+    const-string/jumbo v0, "52690"
+    const-string/jumbo v0, "52691"
+    const-string/jumbo v0, "52692"
+    const-string/jumbo v0, "52693"
+    const-string/jumbo v0, "52694"
+    const-string/jumbo v0, "52695"
+    const-string/jumbo v0, "52696"
+    const-string/jumbo v0, "52697"
+    const-string/jumbo v0, "52698"
+    const-string/jumbo v0, "52699"
+    const-string/jumbo v0, "52700"
+    const-string/jumbo v0, "52701"
+    const-string/jumbo v0, "52702"
+    const-string/jumbo v0, "52703"
+    const-string/jumbo v0, "52704"
+    const-string/jumbo v0, "52705"
+    const-string/jumbo v0, "52706"
+    const-string/jumbo v0, "52707"
+    const-string/jumbo v0, "52708"
+    const-string/jumbo v0, "52709"
+    const-string/jumbo v0, "52710"
+    const-string/jumbo v0, "52711"
+    const-string/jumbo v0, "52712"
+    const-string/jumbo v0, "52713"
+    const-string/jumbo v0, "52714"
+    const-string/jumbo v0, "52715"
+    const-string/jumbo v0, "52716"
+    const-string/jumbo v0, "52717"
+    const-string/jumbo v0, "52718"
+    const-string/jumbo v0, "52719"
+    const-string/jumbo v0, "52720"
+    const-string/jumbo v0, "52721"
+    const-string/jumbo v0, "52722"
+    const-string/jumbo v0, "52723"
+    const-string/jumbo v0, "52724"
+    const-string/jumbo v0, "52725"
+    const-string/jumbo v0, "52726"
+    const-string/jumbo v0, "52727"
+    const-string/jumbo v0, "52728"
+    const-string/jumbo v0, "52729"
+    const-string/jumbo v0, "52730"
+    const-string/jumbo v0, "52731"
+    const-string/jumbo v0, "52732"
+    const-string/jumbo v0, "52733"
+    const-string/jumbo v0, "52734"
+    const-string/jumbo v0, "52735"
+    const-string/jumbo v0, "52736"
+    const-string/jumbo v0, "52737"
+    const-string/jumbo v0, "52738"
+    const-string/jumbo v0, "52739"
+    const-string/jumbo v0, "52740"
+    const-string/jumbo v0, "52741"
+    const-string/jumbo v0, "52742"
+    const-string/jumbo v0, "52743"
+    const-string/jumbo v0, "52744"
+    const-string/jumbo v0, "52745"
+    const-string/jumbo v0, "52746"
+    const-string/jumbo v0, "52747"
+    const-string/jumbo v0, "52748"
+    const-string/jumbo v0, "52749"
+    const-string/jumbo v0, "52750"
+    const-string/jumbo v0, "52751"
+    const-string/jumbo v0, "52752"
+    const-string/jumbo v0, "52753"
+    const-string/jumbo v0, "52754"
+    const-string/jumbo v0, "52755"
+    const-string/jumbo v0, "52756"
+    const-string/jumbo v0, "52757"
+    const-string/jumbo v0, "52758"
+    const-string/jumbo v0, "52759"
+    const-string/jumbo v0, "52760"
+    const-string/jumbo v0, "52761"
+    const-string/jumbo v0, "52762"
+    const-string/jumbo v0, "52763"
+    const-string/jumbo v0, "52764"
+    const-string/jumbo v0, "52765"
+    const-string/jumbo v0, "52766"
+    const-string/jumbo v0, "52767"
+    const-string/jumbo v0, "52768"
+    const-string/jumbo v0, "52769"
+    const-string/jumbo v0, "52770"
+    const-string/jumbo v0, "52771"
+    const-string/jumbo v0, "52772"
+    const-string/jumbo v0, "52773"
+    const-string/jumbo v0, "52774"
+    const-string/jumbo v0, "52775"
+    const-string/jumbo v0, "52776"
+    const-string/jumbo v0, "52777"
+    const-string/jumbo v0, "52778"
+    const-string/jumbo v0, "52779"
+    const-string/jumbo v0, "52780"
+    const-string/jumbo v0, "52781"
+    const-string/jumbo v0, "52782"
+    const-string/jumbo v0, "52783"
+    const-string/jumbo v0, "52784"
+    const-string/jumbo v0, "52785"
+    const-string/jumbo v0, "52786"
+    const-string/jumbo v0, "52787"
+    const-string/jumbo v0, "52788"
+    const-string/jumbo v0, "52789"
+    const-string/jumbo v0, "52790"
+    const-string/jumbo v0, "52791"
+    const-string/jumbo v0, "52792"
+    const-string/jumbo v0, "52793"
+    const-string/jumbo v0, "52794"
+    const-string/jumbo v0, "52795"
+    const-string/jumbo v0, "52796"
+    const-string/jumbo v0, "52797"
+    const-string/jumbo v0, "52798"
+    const-string/jumbo v0, "52799"
+    const-string/jumbo v0, "52800"
+    const-string/jumbo v0, "52801"
+    const-string/jumbo v0, "52802"
+    const-string/jumbo v0, "52803"
+    const-string/jumbo v0, "52804"
+    const-string/jumbo v0, "52805"
+    const-string/jumbo v0, "52806"
+    const-string/jumbo v0, "52807"
+    const-string/jumbo v0, "52808"
+    const-string/jumbo v0, "52809"
+    const-string/jumbo v0, "52810"
+    const-string/jumbo v0, "52811"
+    const-string/jumbo v0, "52812"
+    const-string/jumbo v0, "52813"
+    const-string/jumbo v0, "52814"
+    const-string/jumbo v0, "52815"
+    const-string/jumbo v0, "52816"
+    const-string/jumbo v0, "52817"
+    const-string/jumbo v0, "52818"
+    const-string/jumbo v0, "52819"
+    const-string/jumbo v0, "52820"
+    const-string/jumbo v0, "52821"
+    const-string/jumbo v0, "52822"
+    const-string/jumbo v0, "52823"
+    const-string/jumbo v0, "52824"
+    const-string/jumbo v0, "52825"
+    const-string/jumbo v0, "52826"
+    const-string/jumbo v0, "52827"
+    const-string/jumbo v0, "52828"
+    const-string/jumbo v0, "52829"
+    const-string/jumbo v0, "52830"
+    const-string/jumbo v0, "52831"
+    const-string/jumbo v0, "52832"
+    const-string/jumbo v0, "52833"
+    const-string/jumbo v0, "52834"
+    const-string/jumbo v0, "52835"
+    const-string/jumbo v0, "52836"
+    const-string/jumbo v0, "52837"
+    const-string/jumbo v0, "52838"
+    const-string/jumbo v0, "52839"
+    const-string/jumbo v0, "52840"
+    const-string/jumbo v0, "52841"
+    const-string/jumbo v0, "52842"
+    const-string/jumbo v0, "52843"
+    const-string/jumbo v0, "52844"
+    const-string/jumbo v0, "52845"
+    const-string/jumbo v0, "52846"
+    const-string/jumbo v0, "52847"
+    const-string/jumbo v0, "52848"
+    const-string/jumbo v0, "52849"
+    const-string/jumbo v0, "52850"
+    const-string/jumbo v0, "52851"
+    const-string/jumbo v0, "52852"
+    const-string/jumbo v0, "52853"
+    const-string/jumbo v0, "52854"
+    const-string/jumbo v0, "52855"
+    const-string/jumbo v0, "52856"
+    const-string/jumbo v0, "52857"
+    const-string/jumbo v0, "52858"
+    const-string/jumbo v0, "52859"
+    const-string/jumbo v0, "52860"
+    const-string/jumbo v0, "52861"
+    const-string/jumbo v0, "52862"
+    const-string/jumbo v0, "52863"
+    const-string/jumbo v0, "52864"
+    const-string/jumbo v0, "52865"
+    const-string/jumbo v0, "52866"
+    const-string/jumbo v0, "52867"
+    const-string/jumbo v0, "52868"
+    const-string/jumbo v0, "52869"
+    const-string/jumbo v0, "52870"
+    const-string/jumbo v0, "52871"
+    const-string/jumbo v0, "52872"
+    const-string/jumbo v0, "52873"
+    const-string/jumbo v0, "52874"
+    const-string/jumbo v0, "52875"
+    const-string/jumbo v0, "52876"
+    const-string/jumbo v0, "52877"
+    const-string/jumbo v0, "52878"
+    const-string/jumbo v0, "52879"
+    const-string/jumbo v0, "52880"
+    const-string/jumbo v0, "52881"
+    const-string/jumbo v0, "52882"
+    const-string/jumbo v0, "52883"
+    const-string/jumbo v0, "52884"
+    const-string/jumbo v0, "52885"
+    const-string/jumbo v0, "52886"
+    const-string/jumbo v0, "52887"
+    const-string/jumbo v0, "52888"
+    const-string/jumbo v0, "52889"
+    const-string/jumbo v0, "52890"
+    const-string/jumbo v0, "52891"
+    const-string/jumbo v0, "52892"
+    const-string/jumbo v0, "52893"
+    const-string/jumbo v0, "52894"
+    const-string/jumbo v0, "52895"
+    const-string/jumbo v0, "52896"
+    const-string/jumbo v0, "52897"
+    const-string/jumbo v0, "52898"
+    const-string/jumbo v0, "52899"
+    const-string/jumbo v0, "52900"
+    const-string/jumbo v0, "52901"
+    const-string/jumbo v0, "52902"
+    const-string/jumbo v0, "52903"
+    const-string/jumbo v0, "52904"
+    const-string/jumbo v0, "52905"
+    const-string/jumbo v0, "52906"
+    const-string/jumbo v0, "52907"
+    const-string/jumbo v0, "52908"
+    const-string/jumbo v0, "52909"
+    const-string/jumbo v0, "52910"
+    const-string/jumbo v0, "52911"
+    const-string/jumbo v0, "52912"
+    const-string/jumbo v0, "52913"
+    const-string/jumbo v0, "52914"
+    const-string/jumbo v0, "52915"
+    const-string/jumbo v0, "52916"
+    const-string/jumbo v0, "52917"
+    const-string/jumbo v0, "52918"
+    const-string/jumbo v0, "52919"
+    const-string/jumbo v0, "52920"
+    const-string/jumbo v0, "52921"
+    const-string/jumbo v0, "52922"
+    const-string/jumbo v0, "52923"
+    const-string/jumbo v0, "52924"
+    const-string/jumbo v0, "52925"
+    const-string/jumbo v0, "52926"
+    const-string/jumbo v0, "52927"
+    const-string/jumbo v0, "52928"
+    const-string/jumbo v0, "52929"
+    const-string/jumbo v0, "52930"
+    const-string/jumbo v0, "52931"
+    const-string/jumbo v0, "52932"
+    const-string/jumbo v0, "52933"
+    const-string/jumbo v0, "52934"
+    const-string/jumbo v0, "52935"
+    const-string/jumbo v0, "52936"
+    const-string/jumbo v0, "52937"
+    const-string/jumbo v0, "52938"
+    const-string/jumbo v0, "52939"
+    const-string/jumbo v0, "52940"
+    const-string/jumbo v0, "52941"
+    const-string/jumbo v0, "52942"
+    const-string/jumbo v0, "52943"
+    const-string/jumbo v0, "52944"
+    const-string/jumbo v0, "52945"
+    const-string/jumbo v0, "52946"
+    const-string/jumbo v0, "52947"
+    const-string/jumbo v0, "52948"
+    const-string/jumbo v0, "52949"
+    const-string/jumbo v0, "52950"
+    const-string/jumbo v0, "52951"
+    const-string/jumbo v0, "52952"
+    const-string/jumbo v0, "52953"
+    const-string/jumbo v0, "52954"
+    const-string/jumbo v0, "52955"
+    const-string/jumbo v0, "52956"
+    const-string/jumbo v0, "52957"
+    const-string/jumbo v0, "52958"
+    const-string/jumbo v0, "52959"
+    const-string/jumbo v0, "52960"
+    const-string/jumbo v0, "52961"
+    const-string/jumbo v0, "52962"
+    const-string/jumbo v0, "52963"
+    const-string/jumbo v0, "52964"
+    const-string/jumbo v0, "52965"
+    const-string/jumbo v0, "52966"
+    const-string/jumbo v0, "52967"
+    const-string/jumbo v0, "52968"
+    const-string/jumbo v0, "52969"
+    const-string/jumbo v0, "52970"
+    const-string/jumbo v0, "52971"
+    const-string/jumbo v0, "52972"
+    const-string/jumbo v0, "52973"
+    const-string/jumbo v0, "52974"
+    const-string/jumbo v0, "52975"
+    const-string/jumbo v0, "52976"
+    const-string/jumbo v0, "52977"
+    const-string/jumbo v0, "52978"
+    const-string/jumbo v0, "52979"
+    const-string/jumbo v0, "52980"
+    const-string/jumbo v0, "52981"
+    const-string/jumbo v0, "52982"
+    const-string/jumbo v0, "52983"
+    const-string/jumbo v0, "52984"
+    const-string/jumbo v0, "52985"
+    const-string/jumbo v0, "52986"
+    const-string/jumbo v0, "52987"
+    const-string/jumbo v0, "52988"
+    const-string/jumbo v0, "52989"
+    const-string/jumbo v0, "52990"
+    const-string/jumbo v0, "52991"
+    const-string/jumbo v0, "52992"
+    const-string/jumbo v0, "52993"
+    const-string/jumbo v0, "52994"
+    const-string/jumbo v0, "52995"
+    const-string/jumbo v0, "52996"
+    const-string/jumbo v0, "52997"
+    const-string/jumbo v0, "52998"
+    const-string/jumbo v0, "52999"
+    const-string/jumbo v0, "53000"
+    const-string/jumbo v0, "53001"
+    const-string/jumbo v0, "53002"
+    const-string/jumbo v0, "53003"
+    const-string/jumbo v0, "53004"
+    const-string/jumbo v0, "53005"
+    const-string/jumbo v0, "53006"
+    const-string/jumbo v0, "53007"
+    const-string/jumbo v0, "53008"
+    const-string/jumbo v0, "53009"
+    const-string/jumbo v0, "53010"
+    const-string/jumbo v0, "53011"
+    const-string/jumbo v0, "53012"
+    const-string/jumbo v0, "53013"
+    const-string/jumbo v0, "53014"
+    const-string/jumbo v0, "53015"
+    const-string/jumbo v0, "53016"
+    const-string/jumbo v0, "53017"
+    const-string/jumbo v0, "53018"
+    const-string/jumbo v0, "53019"
+    const-string/jumbo v0, "53020"
+    const-string/jumbo v0, "53021"
+    const-string/jumbo v0, "53022"
+    const-string/jumbo v0, "53023"
+    const-string/jumbo v0, "53024"
+    const-string/jumbo v0, "53025"
+    const-string/jumbo v0, "53026"
+    const-string/jumbo v0, "53027"
+    const-string/jumbo v0, "53028"
+    const-string/jumbo v0, "53029"
+    const-string/jumbo v0, "53030"
+    const-string/jumbo v0, "53031"
+    const-string/jumbo v0, "53032"
+    const-string/jumbo v0, "53033"
+    const-string/jumbo v0, "53034"
+    const-string/jumbo v0, "53035"
+    const-string/jumbo v0, "53036"
+    const-string/jumbo v0, "53037"
+    const-string/jumbo v0, "53038"
+    const-string/jumbo v0, "53039"
+    const-string/jumbo v0, "53040"
+    const-string/jumbo v0, "53041"
+    const-string/jumbo v0, "53042"
+    const-string/jumbo v0, "53043"
+    const-string/jumbo v0, "53044"
+    const-string/jumbo v0, "53045"
+    const-string/jumbo v0, "53046"
+    const-string/jumbo v0, "53047"
+    const-string/jumbo v0, "53048"
+    const-string/jumbo v0, "53049"
+    const-string/jumbo v0, "53050"
+    const-string/jumbo v0, "53051"
+    const-string/jumbo v0, "53052"
+    const-string/jumbo v0, "53053"
+    const-string/jumbo v0, "53054"
+    const-string/jumbo v0, "53055"
+    const-string/jumbo v0, "53056"
+    const-string/jumbo v0, "53057"
+    const-string/jumbo v0, "53058"
+    const-string/jumbo v0, "53059"
+    const-string/jumbo v0, "53060"
+    const-string/jumbo v0, "53061"
+    const-string/jumbo v0, "53062"
+    const-string/jumbo v0, "53063"
+    const-string/jumbo v0, "53064"
+    const-string/jumbo v0, "53065"
+    const-string/jumbo v0, "53066"
+    const-string/jumbo v0, "53067"
+    const-string/jumbo v0, "53068"
+    const-string/jumbo v0, "53069"
+    const-string/jumbo v0, "53070"
+    const-string/jumbo v0, "53071"
+    const-string/jumbo v0, "53072"
+    const-string/jumbo v0, "53073"
+    const-string/jumbo v0, "53074"
+    const-string/jumbo v0, "53075"
+    const-string/jumbo v0, "53076"
+    const-string/jumbo v0, "53077"
+    const-string/jumbo v0, "53078"
+    const-string/jumbo v0, "53079"
+    const-string/jumbo v0, "53080"
+    const-string/jumbo v0, "53081"
+    const-string/jumbo v0, "53082"
+    const-string/jumbo v0, "53083"
+    const-string/jumbo v0, "53084"
+    const-string/jumbo v0, "53085"
+    const-string/jumbo v0, "53086"
+    const-string/jumbo v0, "53087"
+    const-string/jumbo v0, "53088"
+    const-string/jumbo v0, "53089"
+    const-string/jumbo v0, "53090"
+    const-string/jumbo v0, "53091"
+    const-string/jumbo v0, "53092"
+    const-string/jumbo v0, "53093"
+    const-string/jumbo v0, "53094"
+    const-string/jumbo v0, "53095"
+    const-string/jumbo v0, "53096"
+    const-string/jumbo v0, "53097"
+    const-string/jumbo v0, "53098"
+    const-string/jumbo v0, "53099"
+    const-string/jumbo v0, "53100"
+    const-string/jumbo v0, "53101"
+    const-string/jumbo v0, "53102"
+    const-string/jumbo v0, "53103"
+    const-string/jumbo v0, "53104"
+    const-string/jumbo v0, "53105"
+    const-string/jumbo v0, "53106"
+    const-string/jumbo v0, "53107"
+    const-string/jumbo v0, "53108"
+    const-string/jumbo v0, "53109"
+    const-string/jumbo v0, "53110"
+    const-string/jumbo v0, "53111"
+    const-string/jumbo v0, "53112"
+    const-string/jumbo v0, "53113"
+    const-string/jumbo v0, "53114"
+    const-string/jumbo v0, "53115"
+    const-string/jumbo v0, "53116"
+    const-string/jumbo v0, "53117"
+    const-string/jumbo v0, "53118"
+    const-string/jumbo v0, "53119"
+    const-string/jumbo v0, "53120"
+    const-string/jumbo v0, "53121"
+    const-string/jumbo v0, "53122"
+    const-string/jumbo v0, "53123"
+    const-string/jumbo v0, "53124"
+    const-string/jumbo v0, "53125"
+    const-string/jumbo v0, "53126"
+    const-string/jumbo v0, "53127"
+    const-string/jumbo v0, "53128"
+    const-string/jumbo v0, "53129"
+    const-string/jumbo v0, "53130"
+    const-string/jumbo v0, "53131"
+    const-string/jumbo v0, "53132"
+    const-string/jumbo v0, "53133"
+    const-string/jumbo v0, "53134"
+    const-string/jumbo v0, "53135"
+    const-string/jumbo v0, "53136"
+    const-string/jumbo v0, "53137"
+    const-string/jumbo v0, "53138"
+    const-string/jumbo v0, "53139"
+    const-string/jumbo v0, "53140"
+    const-string/jumbo v0, "53141"
+    const-string/jumbo v0, "53142"
+    const-string/jumbo v0, "53143"
+    const-string/jumbo v0, "53144"
+    const-string/jumbo v0, "53145"
+    const-string/jumbo v0, "53146"
+    const-string/jumbo v0, "53147"
+    const-string/jumbo v0, "53148"
+    const-string/jumbo v0, "53149"
+    const-string/jumbo v0, "53150"
+    const-string/jumbo v0, "53151"
+    const-string/jumbo v0, "53152"
+    const-string/jumbo v0, "53153"
+    const-string/jumbo v0, "53154"
+    const-string/jumbo v0, "53155"
+    const-string/jumbo v0, "53156"
+    const-string/jumbo v0, "53157"
+    const-string/jumbo v0, "53158"
+    const-string/jumbo v0, "53159"
+    const-string/jumbo v0, "53160"
+    const-string/jumbo v0, "53161"
+    const-string/jumbo v0, "53162"
+    const-string/jumbo v0, "53163"
+    const-string/jumbo v0, "53164"
+    const-string/jumbo v0, "53165"
+    const-string/jumbo v0, "53166"
+    const-string/jumbo v0, "53167"
+    const-string/jumbo v0, "53168"
+    const-string/jumbo v0, "53169"
+    const-string/jumbo v0, "53170"
+    const-string/jumbo v0, "53171"
+    const-string/jumbo v0, "53172"
+    const-string/jumbo v0, "53173"
+    const-string/jumbo v0, "53174"
+    const-string/jumbo v0, "53175"
+    const-string/jumbo v0, "53176"
+    const-string/jumbo v0, "53177"
+    const-string/jumbo v0, "53178"
+    const-string/jumbo v0, "53179"
+    const-string/jumbo v0, "53180"
+    const-string/jumbo v0, "53181"
+    const-string/jumbo v0, "53182"
+    const-string/jumbo v0, "53183"
+    const-string/jumbo v0, "53184"
+    const-string/jumbo v0, "53185"
+    const-string/jumbo v0, "53186"
+    const-string/jumbo v0, "53187"
+    const-string/jumbo v0, "53188"
+    const-string/jumbo v0, "53189"
+    const-string/jumbo v0, "53190"
+    const-string/jumbo v0, "53191"
+    const-string/jumbo v0, "53192"
+    const-string/jumbo v0, "53193"
+    const-string/jumbo v0, "53194"
+    const-string/jumbo v0, "53195"
+    const-string/jumbo v0, "53196"
+    const-string/jumbo v0, "53197"
+    const-string/jumbo v0, "53198"
+    const-string/jumbo v0, "53199"
+    const-string/jumbo v0, "53200"
+    const-string/jumbo v0, "53201"
+    const-string/jumbo v0, "53202"
+    const-string/jumbo v0, "53203"
+    const-string/jumbo v0, "53204"
+    const-string/jumbo v0, "53205"
+    const-string/jumbo v0, "53206"
+    const-string/jumbo v0, "53207"
+    const-string/jumbo v0, "53208"
+    const-string/jumbo v0, "53209"
+    const-string/jumbo v0, "53210"
+    const-string/jumbo v0, "53211"
+    const-string/jumbo v0, "53212"
+    const-string/jumbo v0, "53213"
+    const-string/jumbo v0, "53214"
+    const-string/jumbo v0, "53215"
+    const-string/jumbo v0, "53216"
+    const-string/jumbo v0, "53217"
+    const-string/jumbo v0, "53218"
+    const-string/jumbo v0, "53219"
+    const-string/jumbo v0, "53220"
+    const-string/jumbo v0, "53221"
+    const-string/jumbo v0, "53222"
+    const-string/jumbo v0, "53223"
+    const-string/jumbo v0, "53224"
+    const-string/jumbo v0, "53225"
+    const-string/jumbo v0, "53226"
+    const-string/jumbo v0, "53227"
+    const-string/jumbo v0, "53228"
+    const-string/jumbo v0, "53229"
+    const-string/jumbo v0, "53230"
+    const-string/jumbo v0, "53231"
+    const-string/jumbo v0, "53232"
+    const-string/jumbo v0, "53233"
+    const-string/jumbo v0, "53234"
+    const-string/jumbo v0, "53235"
+    const-string/jumbo v0, "53236"
+    const-string/jumbo v0, "53237"
+    const-string/jumbo v0, "53238"
+    const-string/jumbo v0, "53239"
+    const-string/jumbo v0, "53240"
+    const-string/jumbo v0, "53241"
+    const-string/jumbo v0, "53242"
+    const-string/jumbo v0, "53243"
+    const-string/jumbo v0, "53244"
+    const-string/jumbo v0, "53245"
+    const-string/jumbo v0, "53246"
+    const-string/jumbo v0, "53247"
+    const-string/jumbo v0, "53248"
+    const-string/jumbo v0, "53249"
+    const-string/jumbo v0, "53250"
+    const-string/jumbo v0, "53251"
+    const-string/jumbo v0, "53252"
+    const-string/jumbo v0, "53253"
+    const-string/jumbo v0, "53254"
+    const-string/jumbo v0, "53255"
+    const-string/jumbo v0, "53256"
+    const-string/jumbo v0, "53257"
+    const-string/jumbo v0, "53258"
+    const-string/jumbo v0, "53259"
+    const-string/jumbo v0, "53260"
+    const-string/jumbo v0, "53261"
+    const-string/jumbo v0, "53262"
+    const-string/jumbo v0, "53263"
+    const-string/jumbo v0, "53264"
+    const-string/jumbo v0, "53265"
+    const-string/jumbo v0, "53266"
+    const-string/jumbo v0, "53267"
+    const-string/jumbo v0, "53268"
+    const-string/jumbo v0, "53269"
+    const-string/jumbo v0, "53270"
+    const-string/jumbo v0, "53271"
+    const-string/jumbo v0, "53272"
+    const-string/jumbo v0, "53273"
+    const-string/jumbo v0, "53274"
+    const-string/jumbo v0, "53275"
+    const-string/jumbo v0, "53276"
+    const-string/jumbo v0, "53277"
+    const-string/jumbo v0, "53278"
+    const-string/jumbo v0, "53279"
+    const-string/jumbo v0, "53280"
+    const-string/jumbo v0, "53281"
+    const-string/jumbo v0, "53282"
+    const-string/jumbo v0, "53283"
+    const-string/jumbo v0, "53284"
+    const-string/jumbo v0, "53285"
+    const-string/jumbo v0, "53286"
+    const-string/jumbo v0, "53287"
+    const-string/jumbo v0, "53288"
+    const-string/jumbo v0, "53289"
+    const-string/jumbo v0, "53290"
+    const-string/jumbo v0, "53291"
+    const-string/jumbo v0, "53292"
+    const-string/jumbo v0, "53293"
+    const-string/jumbo v0, "53294"
+    const-string/jumbo v0, "53295"
+    const-string/jumbo v0, "53296"
+    const-string/jumbo v0, "53297"
+    const-string/jumbo v0, "53298"
+    const-string/jumbo v0, "53299"
+    const-string/jumbo v0, "53300"
+    const-string/jumbo v0, "53301"
+    const-string/jumbo v0, "53302"
+    const-string/jumbo v0, "53303"
+    const-string/jumbo v0, "53304"
+    const-string/jumbo v0, "53305"
+    const-string/jumbo v0, "53306"
+    const-string/jumbo v0, "53307"
+    const-string/jumbo v0, "53308"
+    const-string/jumbo v0, "53309"
+    const-string/jumbo v0, "53310"
+    const-string/jumbo v0, "53311"
+    const-string/jumbo v0, "53312"
+    const-string/jumbo v0, "53313"
+    const-string/jumbo v0, "53314"
+    const-string/jumbo v0, "53315"
+    const-string/jumbo v0, "53316"
+    const-string/jumbo v0, "53317"
+    const-string/jumbo v0, "53318"
+    const-string/jumbo v0, "53319"
+    const-string/jumbo v0, "53320"
+    const-string/jumbo v0, "53321"
+    const-string/jumbo v0, "53322"
+    const-string/jumbo v0, "53323"
+    const-string/jumbo v0, "53324"
+    const-string/jumbo v0, "53325"
+    const-string/jumbo v0, "53326"
+    const-string/jumbo v0, "53327"
+    const-string/jumbo v0, "53328"
+    const-string/jumbo v0, "53329"
+    const-string/jumbo v0, "53330"
+    const-string/jumbo v0, "53331"
+    const-string/jumbo v0, "53332"
+    const-string/jumbo v0, "53333"
+    const-string/jumbo v0, "53334"
+    const-string/jumbo v0, "53335"
+    const-string/jumbo v0, "53336"
+    const-string/jumbo v0, "53337"
+    const-string/jumbo v0, "53338"
+    const-string/jumbo v0, "53339"
+    const-string/jumbo v0, "53340"
+    const-string/jumbo v0, "53341"
+    const-string/jumbo v0, "53342"
+    const-string/jumbo v0, "53343"
+    const-string/jumbo v0, "53344"
+    const-string/jumbo v0, "53345"
+    const-string/jumbo v0, "53346"
+    const-string/jumbo v0, "53347"
+    const-string/jumbo v0, "53348"
+    const-string/jumbo v0, "53349"
+    const-string/jumbo v0, "53350"
+    const-string/jumbo v0, "53351"
+    const-string/jumbo v0, "53352"
+    const-string/jumbo v0, "53353"
+    const-string/jumbo v0, "53354"
+    const-string/jumbo v0, "53355"
+    const-string/jumbo v0, "53356"
+    const-string/jumbo v0, "53357"
+    const-string/jumbo v0, "53358"
+    const-string/jumbo v0, "53359"
+    const-string/jumbo v0, "53360"
+    const-string/jumbo v0, "53361"
+    const-string/jumbo v0, "53362"
+    const-string/jumbo v0, "53363"
+    const-string/jumbo v0, "53364"
+    const-string/jumbo v0, "53365"
+    const-string/jumbo v0, "53366"
+    const-string/jumbo v0, "53367"
+    const-string/jumbo v0, "53368"
+    const-string/jumbo v0, "53369"
+    const-string/jumbo v0, "53370"
+    const-string/jumbo v0, "53371"
+    const-string/jumbo v0, "53372"
+    const-string/jumbo v0, "53373"
+    const-string/jumbo v0, "53374"
+    const-string/jumbo v0, "53375"
+    const-string/jumbo v0, "53376"
+    const-string/jumbo v0, "53377"
+    const-string/jumbo v0, "53378"
+    const-string/jumbo v0, "53379"
+    const-string/jumbo v0, "53380"
+    const-string/jumbo v0, "53381"
+    const-string/jumbo v0, "53382"
+    const-string/jumbo v0, "53383"
+    const-string/jumbo v0, "53384"
+    const-string/jumbo v0, "53385"
+    const-string/jumbo v0, "53386"
+    const-string/jumbo v0, "53387"
+    const-string/jumbo v0, "53388"
+    const-string/jumbo v0, "53389"
+    const-string/jumbo v0, "53390"
+    const-string/jumbo v0, "53391"
+    const-string/jumbo v0, "53392"
+    const-string/jumbo v0, "53393"
+    const-string/jumbo v0, "53394"
+    const-string/jumbo v0, "53395"
+    const-string/jumbo v0, "53396"
+    const-string/jumbo v0, "53397"
+    const-string/jumbo v0, "53398"
+    const-string/jumbo v0, "53399"
+    const-string/jumbo v0, "53400"
+    const-string/jumbo v0, "53401"
+    const-string/jumbo v0, "53402"
+    const-string/jumbo v0, "53403"
+    const-string/jumbo v0, "53404"
+    const-string/jumbo v0, "53405"
+    const-string/jumbo v0, "53406"
+    const-string/jumbo v0, "53407"
+    const-string/jumbo v0, "53408"
+    const-string/jumbo v0, "53409"
+    const-string/jumbo v0, "53410"
+    const-string/jumbo v0, "53411"
+    const-string/jumbo v0, "53412"
+    const-string/jumbo v0, "53413"
+    const-string/jumbo v0, "53414"
+    const-string/jumbo v0, "53415"
+    const-string/jumbo v0, "53416"
+    const-string/jumbo v0, "53417"
+    const-string/jumbo v0, "53418"
+    const-string/jumbo v0, "53419"
+    const-string/jumbo v0, "53420"
+    const-string/jumbo v0, "53421"
+    const-string/jumbo v0, "53422"
+    const-string/jumbo v0, "53423"
+    const-string/jumbo v0, "53424"
+    const-string/jumbo v0, "53425"
+    const-string/jumbo v0, "53426"
+    const-string/jumbo v0, "53427"
+    const-string/jumbo v0, "53428"
+    const-string/jumbo v0, "53429"
+    const-string/jumbo v0, "53430"
+    const-string/jumbo v0, "53431"
+    const-string/jumbo v0, "53432"
+    const-string/jumbo v0, "53433"
+    const-string/jumbo v0, "53434"
+    const-string/jumbo v0, "53435"
+    const-string/jumbo v0, "53436"
+    const-string/jumbo v0, "53437"
+    const-string/jumbo v0, "53438"
+    const-string/jumbo v0, "53439"
+    const-string/jumbo v0, "53440"
+    const-string/jumbo v0, "53441"
+    const-string/jumbo v0, "53442"
+    const-string/jumbo v0, "53443"
+    const-string/jumbo v0, "53444"
+    const-string/jumbo v0, "53445"
+    const-string/jumbo v0, "53446"
+    const-string/jumbo v0, "53447"
+    const-string/jumbo v0, "53448"
+    const-string/jumbo v0, "53449"
+    const-string/jumbo v0, "53450"
+    const-string/jumbo v0, "53451"
+    const-string/jumbo v0, "53452"
+    const-string/jumbo v0, "53453"
+    const-string/jumbo v0, "53454"
+    const-string/jumbo v0, "53455"
+    const-string/jumbo v0, "53456"
+    const-string/jumbo v0, "53457"
+    const-string/jumbo v0, "53458"
+    const-string/jumbo v0, "53459"
+    const-string/jumbo v0, "53460"
+    const-string/jumbo v0, "53461"
+    const-string/jumbo v0, "53462"
+    const-string/jumbo v0, "53463"
+    const-string/jumbo v0, "53464"
+    const-string/jumbo v0, "53465"
+    const-string/jumbo v0, "53466"
+    const-string/jumbo v0, "53467"
+    const-string/jumbo v0, "53468"
+    const-string/jumbo v0, "53469"
+    const-string/jumbo v0, "53470"
+    const-string/jumbo v0, "53471"
+    const-string/jumbo v0, "53472"
+    const-string/jumbo v0, "53473"
+    const-string/jumbo v0, "53474"
+    const-string/jumbo v0, "53475"
+    const-string/jumbo v0, "53476"
+    const-string/jumbo v0, "53477"
+    const-string/jumbo v0, "53478"
+    const-string/jumbo v0, "53479"
+    const-string/jumbo v0, "53480"
+    const-string/jumbo v0, "53481"
+    const-string/jumbo v0, "53482"
+    const-string/jumbo v0, "53483"
+    const-string/jumbo v0, "53484"
+    const-string/jumbo v0, "53485"
+    const-string/jumbo v0, "53486"
+    const-string/jumbo v0, "53487"
+    const-string/jumbo v0, "53488"
+    const-string/jumbo v0, "53489"
+    const-string/jumbo v0, "53490"
+    const-string/jumbo v0, "53491"
+    const-string/jumbo v0, "53492"
+    const-string/jumbo v0, "53493"
+    const-string/jumbo v0, "53494"
+    const-string/jumbo v0, "53495"
+    const-string/jumbo v0, "53496"
+    const-string/jumbo v0, "53497"
+    const-string/jumbo v0, "53498"
+    const-string/jumbo v0, "53499"
+    const-string/jumbo v0, "53500"
+    const-string/jumbo v0, "53501"
+    const-string/jumbo v0, "53502"
+    const-string/jumbo v0, "53503"
+    const-string/jumbo v0, "53504"
+    const-string/jumbo v0, "53505"
+    const-string/jumbo v0, "53506"
+    const-string/jumbo v0, "53507"
+    const-string/jumbo v0, "53508"
+    const-string/jumbo v0, "53509"
+    const-string/jumbo v0, "53510"
+    const-string/jumbo v0, "53511"
+    const-string/jumbo v0, "53512"
+    const-string/jumbo v0, "53513"
+    const-string/jumbo v0, "53514"
+    const-string/jumbo v0, "53515"
+    const-string/jumbo v0, "53516"
+    const-string/jumbo v0, "53517"
+    const-string/jumbo v0, "53518"
+    const-string/jumbo v0, "53519"
+    const-string/jumbo v0, "53520"
+    const-string/jumbo v0, "53521"
+    const-string/jumbo v0, "53522"
+    const-string/jumbo v0, "53523"
+    const-string/jumbo v0, "53524"
+    const-string/jumbo v0, "53525"
+    const-string/jumbo v0, "53526"
+    const-string/jumbo v0, "53527"
+    const-string/jumbo v0, "53528"
+    const-string/jumbo v0, "53529"
+    const-string/jumbo v0, "53530"
+    const-string/jumbo v0, "53531"
+    const-string/jumbo v0, "53532"
+    const-string/jumbo v0, "53533"
+    const-string/jumbo v0, "53534"
+    const-string/jumbo v0, "53535"
+    const-string/jumbo v0, "53536"
+    const-string/jumbo v0, "53537"
+    const-string/jumbo v0, "53538"
+    const-string/jumbo v0, "53539"
+    const-string/jumbo v0, "53540"
+    const-string/jumbo v0, "53541"
+    const-string/jumbo v0, "53542"
+    const-string/jumbo v0, "53543"
+    const-string/jumbo v0, "53544"
+    const-string/jumbo v0, "53545"
+    const-string/jumbo v0, "53546"
+    const-string/jumbo v0, "53547"
+    const-string/jumbo v0, "53548"
+    const-string/jumbo v0, "53549"
+    const-string/jumbo v0, "53550"
+    const-string/jumbo v0, "53551"
+    const-string/jumbo v0, "53552"
+    const-string/jumbo v0, "53553"
+    const-string/jumbo v0, "53554"
+    const-string/jumbo v0, "53555"
+    const-string/jumbo v0, "53556"
+    const-string/jumbo v0, "53557"
+    const-string/jumbo v0, "53558"
+    const-string/jumbo v0, "53559"
+    const-string/jumbo v0, "53560"
+    const-string/jumbo v0, "53561"
+    const-string/jumbo v0, "53562"
+    const-string/jumbo v0, "53563"
+    const-string/jumbo v0, "53564"
+    const-string/jumbo v0, "53565"
+    const-string/jumbo v0, "53566"
+    const-string/jumbo v0, "53567"
+    const-string/jumbo v0, "53568"
+    const-string/jumbo v0, "53569"
+    const-string/jumbo v0, "53570"
+    const-string/jumbo v0, "53571"
+    const-string/jumbo v0, "53572"
+    const-string/jumbo v0, "53573"
+    const-string/jumbo v0, "53574"
+    const-string/jumbo v0, "53575"
+    const-string/jumbo v0, "53576"
+    const-string/jumbo v0, "53577"
+    const-string/jumbo v0, "53578"
+    const-string/jumbo v0, "53579"
+    const-string/jumbo v0, "53580"
+    const-string/jumbo v0, "53581"
+    const-string/jumbo v0, "53582"
+    const-string/jumbo v0, "53583"
+    const-string/jumbo v0, "53584"
+    const-string/jumbo v0, "53585"
+    const-string/jumbo v0, "53586"
+    const-string/jumbo v0, "53587"
+    const-string/jumbo v0, "53588"
+    const-string/jumbo v0, "53589"
+    const-string/jumbo v0, "53590"
+    const-string/jumbo v0, "53591"
+    const-string/jumbo v0, "53592"
+    const-string/jumbo v0, "53593"
+    const-string/jumbo v0, "53594"
+    const-string/jumbo v0, "53595"
+    const-string/jumbo v0, "53596"
+    const-string/jumbo v0, "53597"
+    const-string/jumbo v0, "53598"
+    const-string/jumbo v0, "53599"
+    const-string/jumbo v0, "53600"
+    const-string/jumbo v0, "53601"
+    const-string/jumbo v0, "53602"
+    const-string/jumbo v0, "53603"
+    const-string/jumbo v0, "53604"
+    const-string/jumbo v0, "53605"
+    const-string/jumbo v0, "53606"
+    const-string/jumbo v0, "53607"
+    const-string/jumbo v0, "53608"
+    const-string/jumbo v0, "53609"
+    const-string/jumbo v0, "53610"
+    const-string/jumbo v0, "53611"
+    const-string/jumbo v0, "53612"
+    const-string/jumbo v0, "53613"
+    const-string/jumbo v0, "53614"
+    const-string/jumbo v0, "53615"
+    const-string/jumbo v0, "53616"
+    const-string/jumbo v0, "53617"
+    const-string/jumbo v0, "53618"
+    const-string/jumbo v0, "53619"
+    const-string/jumbo v0, "53620"
+    const-string/jumbo v0, "53621"
+    const-string/jumbo v0, "53622"
+    const-string/jumbo v0, "53623"
+    const-string/jumbo v0, "53624"
+    const-string/jumbo v0, "53625"
+    const-string/jumbo v0, "53626"
+    const-string/jumbo v0, "53627"
+    const-string/jumbo v0, "53628"
+    const-string/jumbo v0, "53629"
+    const-string/jumbo v0, "53630"
+    const-string/jumbo v0, "53631"
+    const-string/jumbo v0, "53632"
+    const-string/jumbo v0, "53633"
+    const-string/jumbo v0, "53634"
+    const-string/jumbo v0, "53635"
+    const-string/jumbo v0, "53636"
+    const-string/jumbo v0, "53637"
+    const-string/jumbo v0, "53638"
+    const-string/jumbo v0, "53639"
+    const-string/jumbo v0, "53640"
+    const-string/jumbo v0, "53641"
+    const-string/jumbo v0, "53642"
+    const-string/jumbo v0, "53643"
+    const-string/jumbo v0, "53644"
+    const-string/jumbo v0, "53645"
+    const-string/jumbo v0, "53646"
+    const-string/jumbo v0, "53647"
+    const-string/jumbo v0, "53648"
+    const-string/jumbo v0, "53649"
+    const-string/jumbo v0, "53650"
+    const-string/jumbo v0, "53651"
+    const-string/jumbo v0, "53652"
+    const-string/jumbo v0, "53653"
+    const-string/jumbo v0, "53654"
+    const-string/jumbo v0, "53655"
+    const-string/jumbo v0, "53656"
+    const-string/jumbo v0, "53657"
+    const-string/jumbo v0, "53658"
+    const-string/jumbo v0, "53659"
+    const-string/jumbo v0, "53660"
+    const-string/jumbo v0, "53661"
+    const-string/jumbo v0, "53662"
+    const-string/jumbo v0, "53663"
+    const-string/jumbo v0, "53664"
+    const-string/jumbo v0, "53665"
+    const-string/jumbo v0, "53666"
+    const-string/jumbo v0, "53667"
+    const-string/jumbo v0, "53668"
+    const-string/jumbo v0, "53669"
+    const-string/jumbo v0, "53670"
+    const-string/jumbo v0, "53671"
+    const-string/jumbo v0, "53672"
+    const-string/jumbo v0, "53673"
+    const-string/jumbo v0, "53674"
+    const-string/jumbo v0, "53675"
+    const-string/jumbo v0, "53676"
+    const-string/jumbo v0, "53677"
+    const-string/jumbo v0, "53678"
+    const-string/jumbo v0, "53679"
+    const-string/jumbo v0, "53680"
+    const-string/jumbo v0, "53681"
+    const-string/jumbo v0, "53682"
+    const-string/jumbo v0, "53683"
+    const-string/jumbo v0, "53684"
+    const-string/jumbo v0, "53685"
+    const-string/jumbo v0, "53686"
+    const-string/jumbo v0, "53687"
+    const-string/jumbo v0, "53688"
+    const-string/jumbo v0, "53689"
+    const-string/jumbo v0, "53690"
+    const-string/jumbo v0, "53691"
+    const-string/jumbo v0, "53692"
+    const-string/jumbo v0, "53693"
+    const-string/jumbo v0, "53694"
+    const-string/jumbo v0, "53695"
+    const-string/jumbo v0, "53696"
+    const-string/jumbo v0, "53697"
+    const-string/jumbo v0, "53698"
+    const-string/jumbo v0, "53699"
+    const-string/jumbo v0, "53700"
+    const-string/jumbo v0, "53701"
+    const-string/jumbo v0, "53702"
+    const-string/jumbo v0, "53703"
+    const-string/jumbo v0, "53704"
+    const-string/jumbo v0, "53705"
+    const-string/jumbo v0, "53706"
+    const-string/jumbo v0, "53707"
+    const-string/jumbo v0, "53708"
+    const-string/jumbo v0, "53709"
+    const-string/jumbo v0, "53710"
+    const-string/jumbo v0, "53711"
+    const-string/jumbo v0, "53712"
+    const-string/jumbo v0, "53713"
+    const-string/jumbo v0, "53714"
+    const-string/jumbo v0, "53715"
+    const-string/jumbo v0, "53716"
+    const-string/jumbo v0, "53717"
+    const-string/jumbo v0, "53718"
+    const-string/jumbo v0, "53719"
+    const-string/jumbo v0, "53720"
+    const-string/jumbo v0, "53721"
+    const-string/jumbo v0, "53722"
+    const-string/jumbo v0, "53723"
+    const-string/jumbo v0, "53724"
+    const-string/jumbo v0, "53725"
+    const-string/jumbo v0, "53726"
+    const-string/jumbo v0, "53727"
+    const-string/jumbo v0, "53728"
+    const-string/jumbo v0, "53729"
+    const-string/jumbo v0, "53730"
+    const-string/jumbo v0, "53731"
+    const-string/jumbo v0, "53732"
+    const-string/jumbo v0, "53733"
+    const-string/jumbo v0, "53734"
+    const-string/jumbo v0, "53735"
+    const-string/jumbo v0, "53736"
+    const-string/jumbo v0, "53737"
+    const-string/jumbo v0, "53738"
+    const-string/jumbo v0, "53739"
+    const-string/jumbo v0, "53740"
+    const-string/jumbo v0, "53741"
+    const-string/jumbo v0, "53742"
+    const-string/jumbo v0, "53743"
+    const-string/jumbo v0, "53744"
+    const-string/jumbo v0, "53745"
+    const-string/jumbo v0, "53746"
+    const-string/jumbo v0, "53747"
+    const-string/jumbo v0, "53748"
+    const-string/jumbo v0, "53749"
+    const-string/jumbo v0, "53750"
+    const-string/jumbo v0, "53751"
+    const-string/jumbo v0, "53752"
+    const-string/jumbo v0, "53753"
+    const-string/jumbo v0, "53754"
+    const-string/jumbo v0, "53755"
+    const-string/jumbo v0, "53756"
+    const-string/jumbo v0, "53757"
+    const-string/jumbo v0, "53758"
+    const-string/jumbo v0, "53759"
+    const-string/jumbo v0, "53760"
+    const-string/jumbo v0, "53761"
+    const-string/jumbo v0, "53762"
+    const-string/jumbo v0, "53763"
+    const-string/jumbo v0, "53764"
+    const-string/jumbo v0, "53765"
+    const-string/jumbo v0, "53766"
+    const-string/jumbo v0, "53767"
+    const-string/jumbo v0, "53768"
+    const-string/jumbo v0, "53769"
+    const-string/jumbo v0, "53770"
+    const-string/jumbo v0, "53771"
+    const-string/jumbo v0, "53772"
+    const-string/jumbo v0, "53773"
+    const-string/jumbo v0, "53774"
+    const-string/jumbo v0, "53775"
+    const-string/jumbo v0, "53776"
+    const-string/jumbo v0, "53777"
+    const-string/jumbo v0, "53778"
+    const-string/jumbo v0, "53779"
+    const-string/jumbo v0, "53780"
+    const-string/jumbo v0, "53781"
+    const-string/jumbo v0, "53782"
+    const-string/jumbo v0, "53783"
+    const-string/jumbo v0, "53784"
+    const-string/jumbo v0, "53785"
+    const-string/jumbo v0, "53786"
+    const-string/jumbo v0, "53787"
+    const-string/jumbo v0, "53788"
+    const-string/jumbo v0, "53789"
+    const-string/jumbo v0, "53790"
+    const-string/jumbo v0, "53791"
+    const-string/jumbo v0, "53792"
+    const-string/jumbo v0, "53793"
+    const-string/jumbo v0, "53794"
+    const-string/jumbo v0, "53795"
+    const-string/jumbo v0, "53796"
+    const-string/jumbo v0, "53797"
+    const-string/jumbo v0, "53798"
+    const-string/jumbo v0, "53799"
+    const-string/jumbo v0, "53800"
+    const-string/jumbo v0, "53801"
+    const-string/jumbo v0, "53802"
+    const-string/jumbo v0, "53803"
+    const-string/jumbo v0, "53804"
+    const-string/jumbo v0, "53805"
+    const-string/jumbo v0, "53806"
+    const-string/jumbo v0, "53807"
+    const-string/jumbo v0, "53808"
+    const-string/jumbo v0, "53809"
+    const-string/jumbo v0, "53810"
+    const-string/jumbo v0, "53811"
+    const-string/jumbo v0, "53812"
+    const-string/jumbo v0, "53813"
+    const-string/jumbo v0, "53814"
+    const-string/jumbo v0, "53815"
+    const-string/jumbo v0, "53816"
+    const-string/jumbo v0, "53817"
+    const-string/jumbo v0, "53818"
+    const-string/jumbo v0, "53819"
+    const-string/jumbo v0, "53820"
+    const-string/jumbo v0, "53821"
+    const-string/jumbo v0, "53822"
+    const-string/jumbo v0, "53823"
+    const-string/jumbo v0, "53824"
+    const-string/jumbo v0, "53825"
+    const-string/jumbo v0, "53826"
+    const-string/jumbo v0, "53827"
+    const-string/jumbo v0, "53828"
+    const-string/jumbo v0, "53829"
+    const-string/jumbo v0, "53830"
+    const-string/jumbo v0, "53831"
+    const-string/jumbo v0, "53832"
+    const-string/jumbo v0, "53833"
+    const-string/jumbo v0, "53834"
+    const-string/jumbo v0, "53835"
+    const-string/jumbo v0, "53836"
+    const-string/jumbo v0, "53837"
+    const-string/jumbo v0, "53838"
+    const-string/jumbo v0, "53839"
+    const-string/jumbo v0, "53840"
+    const-string/jumbo v0, "53841"
+    const-string/jumbo v0, "53842"
+    const-string/jumbo v0, "53843"
+    const-string/jumbo v0, "53844"
+    const-string/jumbo v0, "53845"
+    const-string/jumbo v0, "53846"
+    const-string/jumbo v0, "53847"
+    const-string/jumbo v0, "53848"
+    const-string/jumbo v0, "53849"
+    const-string/jumbo v0, "53850"
+    const-string/jumbo v0, "53851"
+    const-string/jumbo v0, "53852"
+    const-string/jumbo v0, "53853"
+    const-string/jumbo v0, "53854"
+    const-string/jumbo v0, "53855"
+    const-string/jumbo v0, "53856"
+    const-string/jumbo v0, "53857"
+    const-string/jumbo v0, "53858"
+    const-string/jumbo v0, "53859"
+    const-string/jumbo v0, "53860"
+    const-string/jumbo v0, "53861"
+    const-string/jumbo v0, "53862"
+    const-string/jumbo v0, "53863"
+    const-string/jumbo v0, "53864"
+    const-string/jumbo v0, "53865"
+    const-string/jumbo v0, "53866"
+    const-string/jumbo v0, "53867"
+    const-string/jumbo v0, "53868"
+    const-string/jumbo v0, "53869"
+    const-string/jumbo v0, "53870"
+    const-string/jumbo v0, "53871"
+    const-string/jumbo v0, "53872"
+    const-string/jumbo v0, "53873"
+    const-string/jumbo v0, "53874"
+    const-string/jumbo v0, "53875"
+    const-string/jumbo v0, "53876"
+    const-string/jumbo v0, "53877"
+    const-string/jumbo v0, "53878"
+    const-string/jumbo v0, "53879"
+    const-string/jumbo v0, "53880"
+    const-string/jumbo v0, "53881"
+    const-string/jumbo v0, "53882"
+    const-string/jumbo v0, "53883"
+    const-string/jumbo v0, "53884"
+    const-string/jumbo v0, "53885"
+    const-string/jumbo v0, "53886"
+    const-string/jumbo v0, "53887"
+    const-string/jumbo v0, "53888"
+    const-string/jumbo v0, "53889"
+    const-string/jumbo v0, "53890"
+    const-string/jumbo v0, "53891"
+    const-string/jumbo v0, "53892"
+    const-string/jumbo v0, "53893"
+    const-string/jumbo v0, "53894"
+    const-string/jumbo v0, "53895"
+    const-string/jumbo v0, "53896"
+    const-string/jumbo v0, "53897"
+    const-string/jumbo v0, "53898"
+    const-string/jumbo v0, "53899"
+    const-string/jumbo v0, "53900"
+    const-string/jumbo v0, "53901"
+    const-string/jumbo v0, "53902"
+    const-string/jumbo v0, "53903"
+    const-string/jumbo v0, "53904"
+    const-string/jumbo v0, "53905"
+    const-string/jumbo v0, "53906"
+    const-string/jumbo v0, "53907"
+    const-string/jumbo v0, "53908"
+    const-string/jumbo v0, "53909"
+    const-string/jumbo v0, "53910"
+    const-string/jumbo v0, "53911"
+    const-string/jumbo v0, "53912"
+    const-string/jumbo v0, "53913"
+    const-string/jumbo v0, "53914"
+    const-string/jumbo v0, "53915"
+    const-string/jumbo v0, "53916"
+    const-string/jumbo v0, "53917"
+    const-string/jumbo v0, "53918"
+    const-string/jumbo v0, "53919"
+    const-string/jumbo v0, "53920"
+    const-string/jumbo v0, "53921"
+    const-string/jumbo v0, "53922"
+    const-string/jumbo v0, "53923"
+    const-string/jumbo v0, "53924"
+    const-string/jumbo v0, "53925"
+    const-string/jumbo v0, "53926"
+    const-string/jumbo v0, "53927"
+    const-string/jumbo v0, "53928"
+    const-string/jumbo v0, "53929"
+    const-string/jumbo v0, "53930"
+    const-string/jumbo v0, "53931"
+    const-string/jumbo v0, "53932"
+    const-string/jumbo v0, "53933"
+    const-string/jumbo v0, "53934"
+    const-string/jumbo v0, "53935"
+    const-string/jumbo v0, "53936"
+    const-string/jumbo v0, "53937"
+    const-string/jumbo v0, "53938"
+    const-string/jumbo v0, "53939"
+    const-string/jumbo v0, "53940"
+    const-string/jumbo v0, "53941"
+    const-string/jumbo v0, "53942"
+    const-string/jumbo v0, "53943"
+    const-string/jumbo v0, "53944"
+    const-string/jumbo v0, "53945"
+    const-string/jumbo v0, "53946"
+    const-string/jumbo v0, "53947"
+    const-string/jumbo v0, "53948"
+    const-string/jumbo v0, "53949"
+    const-string/jumbo v0, "53950"
+    const-string/jumbo v0, "53951"
+    const-string/jumbo v0, "53952"
+    const-string/jumbo v0, "53953"
+    const-string/jumbo v0, "53954"
+    const-string/jumbo v0, "53955"
+    const-string/jumbo v0, "53956"
+    const-string/jumbo v0, "53957"
+    const-string/jumbo v0, "53958"
+    const-string/jumbo v0, "53959"
+    const-string/jumbo v0, "53960"
+    const-string/jumbo v0, "53961"
+    const-string/jumbo v0, "53962"
+    const-string/jumbo v0, "53963"
+    const-string/jumbo v0, "53964"
+    const-string/jumbo v0, "53965"
+    const-string/jumbo v0, "53966"
+    const-string/jumbo v0, "53967"
+    const-string/jumbo v0, "53968"
+    const-string/jumbo v0, "53969"
+    const-string/jumbo v0, "53970"
+    const-string/jumbo v0, "53971"
+    const-string/jumbo v0, "53972"
+    const-string/jumbo v0, "53973"
+    const-string/jumbo v0, "53974"
+    const-string/jumbo v0, "53975"
+    const-string/jumbo v0, "53976"
+    const-string/jumbo v0, "53977"
+    const-string/jumbo v0, "53978"
+    const-string/jumbo v0, "53979"
+    const-string/jumbo v0, "53980"
+    const-string/jumbo v0, "53981"
+    const-string/jumbo v0, "53982"
+    const-string/jumbo v0, "53983"
+    const-string/jumbo v0, "53984"
+    const-string/jumbo v0, "53985"
+    const-string/jumbo v0, "53986"
+    const-string/jumbo v0, "53987"
+    const-string/jumbo v0, "53988"
+    const-string/jumbo v0, "53989"
+    const-string/jumbo v0, "53990"
+    const-string/jumbo v0, "53991"
+    const-string/jumbo v0, "53992"
+    const-string/jumbo v0, "53993"
+    const-string/jumbo v0, "53994"
+    const-string/jumbo v0, "53995"
+    const-string/jumbo v0, "53996"
+    const-string/jumbo v0, "53997"
+    const-string/jumbo v0, "53998"
+    const-string/jumbo v0, "53999"
+    const-string/jumbo v0, "54000"
+    const-string/jumbo v0, "54001"
+    const-string/jumbo v0, "54002"
+    const-string/jumbo v0, "54003"
+    const-string/jumbo v0, "54004"
+    const-string/jumbo v0, "54005"
+    const-string/jumbo v0, "54006"
+    const-string/jumbo v0, "54007"
+    const-string/jumbo v0, "54008"
+    const-string/jumbo v0, "54009"
+    const-string/jumbo v0, "54010"
+    const-string/jumbo v0, "54011"
+    const-string/jumbo v0, "54012"
+    const-string/jumbo v0, "54013"
+    const-string/jumbo v0, "54014"
+    const-string/jumbo v0, "54015"
+    const-string/jumbo v0, "54016"
+    const-string/jumbo v0, "54017"
+    const-string/jumbo v0, "54018"
+    const-string/jumbo v0, "54019"
+    const-string/jumbo v0, "54020"
+    const-string/jumbo v0, "54021"
+    const-string/jumbo v0, "54022"
+    const-string/jumbo v0, "54023"
+    const-string/jumbo v0, "54024"
+    const-string/jumbo v0, "54025"
+    const-string/jumbo v0, "54026"
+    const-string/jumbo v0, "54027"
+    const-string/jumbo v0, "54028"
+    const-string/jumbo v0, "54029"
+    const-string/jumbo v0, "54030"
+    const-string/jumbo v0, "54031"
+    const-string/jumbo v0, "54032"
+    const-string/jumbo v0, "54033"
+    const-string/jumbo v0, "54034"
+    const-string/jumbo v0, "54035"
+    const-string/jumbo v0, "54036"
+    const-string/jumbo v0, "54037"
+    const-string/jumbo v0, "54038"
+    const-string/jumbo v0, "54039"
+    const-string/jumbo v0, "54040"
+    const-string/jumbo v0, "54041"
+    const-string/jumbo v0, "54042"
+    const-string/jumbo v0, "54043"
+    const-string/jumbo v0, "54044"
+    const-string/jumbo v0, "54045"
+    const-string/jumbo v0, "54046"
+    const-string/jumbo v0, "54047"
+    const-string/jumbo v0, "54048"
+    const-string/jumbo v0, "54049"
+    const-string/jumbo v0, "54050"
+    const-string/jumbo v0, "54051"
+    const-string/jumbo v0, "54052"
+    const-string/jumbo v0, "54053"
+    const-string/jumbo v0, "54054"
+    const-string/jumbo v0, "54055"
+    const-string/jumbo v0, "54056"
+    const-string/jumbo v0, "54057"
+    const-string/jumbo v0, "54058"
+    const-string/jumbo v0, "54059"
+    const-string/jumbo v0, "54060"
+    const-string/jumbo v0, "54061"
+    const-string/jumbo v0, "54062"
+    const-string/jumbo v0, "54063"
+    const-string/jumbo v0, "54064"
+    const-string/jumbo v0, "54065"
+    const-string/jumbo v0, "54066"
+    const-string/jumbo v0, "54067"
+    const-string/jumbo v0, "54068"
+    const-string/jumbo v0, "54069"
+    const-string/jumbo v0, "54070"
+    const-string/jumbo v0, "54071"
+    const-string/jumbo v0, "54072"
+    const-string/jumbo v0, "54073"
+    const-string/jumbo v0, "54074"
+    const-string/jumbo v0, "54075"
+    const-string/jumbo v0, "54076"
+    const-string/jumbo v0, "54077"
+    const-string/jumbo v0, "54078"
+    const-string/jumbo v0, "54079"
+    const-string/jumbo v0, "54080"
+    const-string/jumbo v0, "54081"
+    const-string/jumbo v0, "54082"
+    const-string/jumbo v0, "54083"
+    const-string/jumbo v0, "54084"
+    const-string/jumbo v0, "54085"
+    const-string/jumbo v0, "54086"
+    const-string/jumbo v0, "54087"
+    const-string/jumbo v0, "54088"
+    const-string/jumbo v0, "54089"
+    const-string/jumbo v0, "54090"
+    const-string/jumbo v0, "54091"
+    const-string/jumbo v0, "54092"
+    const-string/jumbo v0, "54093"
+    const-string/jumbo v0, "54094"
+    const-string/jumbo v0, "54095"
+    const-string/jumbo v0, "54096"
+    const-string/jumbo v0, "54097"
+    const-string/jumbo v0, "54098"
+    const-string/jumbo v0, "54099"
+    const-string/jumbo v0, "54100"
+    const-string/jumbo v0, "54101"
+    const-string/jumbo v0, "54102"
+    const-string/jumbo v0, "54103"
+    const-string/jumbo v0, "54104"
+    const-string/jumbo v0, "54105"
+    const-string/jumbo v0, "54106"
+    const-string/jumbo v0, "54107"
+    const-string/jumbo v0, "54108"
+    const-string/jumbo v0, "54109"
+    const-string/jumbo v0, "54110"
+    const-string/jumbo v0, "54111"
+    const-string/jumbo v0, "54112"
+    const-string/jumbo v0, "54113"
+    const-string/jumbo v0, "54114"
+    const-string/jumbo v0, "54115"
+    const-string/jumbo v0, "54116"
+    const-string/jumbo v0, "54117"
+    const-string/jumbo v0, "54118"
+    const-string/jumbo v0, "54119"
+    const-string/jumbo v0, "54120"
+    const-string/jumbo v0, "54121"
+    const-string/jumbo v0, "54122"
+    const-string/jumbo v0, "54123"
+    const-string/jumbo v0, "54124"
+    const-string/jumbo v0, "54125"
+    const-string/jumbo v0, "54126"
+    const-string/jumbo v0, "54127"
+    const-string/jumbo v0, "54128"
+    const-string/jumbo v0, "54129"
+    const-string/jumbo v0, "54130"
+    const-string/jumbo v0, "54131"
+    const-string/jumbo v0, "54132"
+    const-string/jumbo v0, "54133"
+    const-string/jumbo v0, "54134"
+    const-string/jumbo v0, "54135"
+    const-string/jumbo v0, "54136"
+    const-string/jumbo v0, "54137"
+    const-string/jumbo v0, "54138"
+    const-string/jumbo v0, "54139"
+    const-string/jumbo v0, "54140"
+    const-string/jumbo v0, "54141"
+    const-string/jumbo v0, "54142"
+    const-string/jumbo v0, "54143"
+    const-string/jumbo v0, "54144"
+    const-string/jumbo v0, "54145"
+    const-string/jumbo v0, "54146"
+    const-string/jumbo v0, "54147"
+    const-string/jumbo v0, "54148"
+    const-string/jumbo v0, "54149"
+    const-string/jumbo v0, "54150"
+    const-string/jumbo v0, "54151"
+    const-string/jumbo v0, "54152"
+    const-string/jumbo v0, "54153"
+    const-string/jumbo v0, "54154"
+    const-string/jumbo v0, "54155"
+    const-string/jumbo v0, "54156"
+    const-string/jumbo v0, "54157"
+    const-string/jumbo v0, "54158"
+    const-string/jumbo v0, "54159"
+    const-string/jumbo v0, "54160"
+    const-string/jumbo v0, "54161"
+    const-string/jumbo v0, "54162"
+    const-string/jumbo v0, "54163"
+    const-string/jumbo v0, "54164"
+    const-string/jumbo v0, "54165"
+    const-string/jumbo v0, "54166"
+    const-string/jumbo v0, "54167"
+    const-string/jumbo v0, "54168"
+    const-string/jumbo v0, "54169"
+    const-string/jumbo v0, "54170"
+    const-string/jumbo v0, "54171"
+    const-string/jumbo v0, "54172"
+    const-string/jumbo v0, "54173"
+    const-string/jumbo v0, "54174"
+    const-string/jumbo v0, "54175"
+    const-string/jumbo v0, "54176"
+    const-string/jumbo v0, "54177"
+    const-string/jumbo v0, "54178"
+    const-string/jumbo v0, "54179"
+    const-string/jumbo v0, "54180"
+    const-string/jumbo v0, "54181"
+    const-string/jumbo v0, "54182"
+    const-string/jumbo v0, "54183"
+    const-string/jumbo v0, "54184"
+    const-string/jumbo v0, "54185"
+    const-string/jumbo v0, "54186"
+    const-string/jumbo v0, "54187"
+    const-string/jumbo v0, "54188"
+    const-string/jumbo v0, "54189"
+    const-string/jumbo v0, "54190"
+    const-string/jumbo v0, "54191"
+    const-string/jumbo v0, "54192"
+    const-string/jumbo v0, "54193"
+    const-string/jumbo v0, "54194"
+    const-string/jumbo v0, "54195"
+    const-string/jumbo v0, "54196"
+    const-string/jumbo v0, "54197"
+    const-string/jumbo v0, "54198"
+    const-string/jumbo v0, "54199"
+    const-string/jumbo v0, "54200"
+    const-string/jumbo v0, "54201"
+    const-string/jumbo v0, "54202"
+    const-string/jumbo v0, "54203"
+    const-string/jumbo v0, "54204"
+    const-string/jumbo v0, "54205"
+    const-string/jumbo v0, "54206"
+    const-string/jumbo v0, "54207"
+    const-string/jumbo v0, "54208"
+    const-string/jumbo v0, "54209"
+    const-string/jumbo v0, "54210"
+    const-string/jumbo v0, "54211"
+    const-string/jumbo v0, "54212"
+    const-string/jumbo v0, "54213"
+    const-string/jumbo v0, "54214"
+    const-string/jumbo v0, "54215"
+    const-string/jumbo v0, "54216"
+    const-string/jumbo v0, "54217"
+    const-string/jumbo v0, "54218"
+    const-string/jumbo v0, "54219"
+    const-string/jumbo v0, "54220"
+    const-string/jumbo v0, "54221"
+    const-string/jumbo v0, "54222"
+    const-string/jumbo v0, "54223"
+    const-string/jumbo v0, "54224"
+    const-string/jumbo v0, "54225"
+    const-string/jumbo v0, "54226"
+    const-string/jumbo v0, "54227"
+    const-string/jumbo v0, "54228"
+    const-string/jumbo v0, "54229"
+    const-string/jumbo v0, "54230"
+    const-string/jumbo v0, "54231"
+    const-string/jumbo v0, "54232"
+    const-string/jumbo v0, "54233"
+    const-string/jumbo v0, "54234"
+    const-string/jumbo v0, "54235"
+    const-string/jumbo v0, "54236"
+    const-string/jumbo v0, "54237"
+    const-string/jumbo v0, "54238"
+    const-string/jumbo v0, "54239"
+    const-string/jumbo v0, "54240"
+    const-string/jumbo v0, "54241"
+    const-string/jumbo v0, "54242"
+    const-string/jumbo v0, "54243"
+    const-string/jumbo v0, "54244"
+    const-string/jumbo v0, "54245"
+    const-string/jumbo v0, "54246"
+    const-string/jumbo v0, "54247"
+    const-string/jumbo v0, "54248"
+    const-string/jumbo v0, "54249"
+    const-string/jumbo v0, "54250"
+    const-string/jumbo v0, "54251"
+    const-string/jumbo v0, "54252"
+    const-string/jumbo v0, "54253"
+    const-string/jumbo v0, "54254"
+    const-string/jumbo v0, "54255"
+    const-string/jumbo v0, "54256"
+    const-string/jumbo v0, "54257"
+    const-string/jumbo v0, "54258"
+    const-string/jumbo v0, "54259"
+    const-string/jumbo v0, "54260"
+    const-string/jumbo v0, "54261"
+    const-string/jumbo v0, "54262"
+    const-string/jumbo v0, "54263"
+    const-string/jumbo v0, "54264"
+    const-string/jumbo v0, "54265"
+    const-string/jumbo v0, "54266"
+    const-string/jumbo v0, "54267"
+    const-string/jumbo v0, "54268"
+    const-string/jumbo v0, "54269"
+    const-string/jumbo v0, "54270"
+    const-string/jumbo v0, "54271"
+    const-string/jumbo v0, "54272"
+    const-string/jumbo v0, "54273"
+    const-string/jumbo v0, "54274"
+    const-string/jumbo v0, "54275"
+    const-string/jumbo v0, "54276"
+    const-string/jumbo v0, "54277"
+    const-string/jumbo v0, "54278"
+    const-string/jumbo v0, "54279"
+    const-string/jumbo v0, "54280"
+    const-string/jumbo v0, "54281"
+    const-string/jumbo v0, "54282"
+    const-string/jumbo v0, "54283"
+    const-string/jumbo v0, "54284"
+    const-string/jumbo v0, "54285"
+    const-string/jumbo v0, "54286"
+    const-string/jumbo v0, "54287"
+    const-string/jumbo v0, "54288"
+    const-string/jumbo v0, "54289"
+    const-string/jumbo v0, "54290"
+    const-string/jumbo v0, "54291"
+    const-string/jumbo v0, "54292"
+    const-string/jumbo v0, "54293"
+    const-string/jumbo v0, "54294"
+    const-string/jumbo v0, "54295"
+    const-string/jumbo v0, "54296"
+    const-string/jumbo v0, "54297"
+    const-string/jumbo v0, "54298"
+    const-string/jumbo v0, "54299"
+    const-string/jumbo v0, "54300"
+    const-string/jumbo v0, "54301"
+    const-string/jumbo v0, "54302"
+    const-string/jumbo v0, "54303"
+    const-string/jumbo v0, "54304"
+    const-string/jumbo v0, "54305"
+    const-string/jumbo v0, "54306"
+    const-string/jumbo v0, "54307"
+    const-string/jumbo v0, "54308"
+    const-string/jumbo v0, "54309"
+    const-string/jumbo v0, "54310"
+    const-string/jumbo v0, "54311"
+    const-string/jumbo v0, "54312"
+    const-string/jumbo v0, "54313"
+    const-string/jumbo v0, "54314"
+    const-string/jumbo v0, "54315"
+    const-string/jumbo v0, "54316"
+    const-string/jumbo v0, "54317"
+    const-string/jumbo v0, "54318"
+    const-string/jumbo v0, "54319"
+    const-string/jumbo v0, "54320"
+    const-string/jumbo v0, "54321"
+    const-string/jumbo v0, "54322"
+    const-string/jumbo v0, "54323"
+    const-string/jumbo v0, "54324"
+    const-string/jumbo v0, "54325"
+    const-string/jumbo v0, "54326"
+    const-string/jumbo v0, "54327"
+    const-string/jumbo v0, "54328"
+    const-string/jumbo v0, "54329"
+    const-string/jumbo v0, "54330"
+    const-string/jumbo v0, "54331"
+    const-string/jumbo v0, "54332"
+    const-string/jumbo v0, "54333"
+    const-string/jumbo v0, "54334"
+    const-string/jumbo v0, "54335"
+    const-string/jumbo v0, "54336"
+    const-string/jumbo v0, "54337"
+    const-string/jumbo v0, "54338"
+    const-string/jumbo v0, "54339"
+    const-string/jumbo v0, "54340"
+    const-string/jumbo v0, "54341"
+    const-string/jumbo v0, "54342"
+    const-string/jumbo v0, "54343"
+    const-string/jumbo v0, "54344"
+    const-string/jumbo v0, "54345"
+    const-string/jumbo v0, "54346"
+    const-string/jumbo v0, "54347"
+    const-string/jumbo v0, "54348"
+    const-string/jumbo v0, "54349"
+    const-string/jumbo v0, "54350"
+    const-string/jumbo v0, "54351"
+    const-string/jumbo v0, "54352"
+    const-string/jumbo v0, "54353"
+    const-string/jumbo v0, "54354"
+    const-string/jumbo v0, "54355"
+    const-string/jumbo v0, "54356"
+    const-string/jumbo v0, "54357"
+    const-string/jumbo v0, "54358"
+    const-string/jumbo v0, "54359"
+    const-string/jumbo v0, "54360"
+    const-string/jumbo v0, "54361"
+    const-string/jumbo v0, "54362"
+    const-string/jumbo v0, "54363"
+    const-string/jumbo v0, "54364"
+    const-string/jumbo v0, "54365"
+    const-string/jumbo v0, "54366"
+    const-string/jumbo v0, "54367"
+    const-string/jumbo v0, "54368"
+    const-string/jumbo v0, "54369"
+    const-string/jumbo v0, "54370"
+    const-string/jumbo v0, "54371"
+    const-string/jumbo v0, "54372"
+    const-string/jumbo v0, "54373"
+    const-string/jumbo v0, "54374"
+    const-string/jumbo v0, "54375"
+    const-string/jumbo v0, "54376"
+    const-string/jumbo v0, "54377"
+    const-string/jumbo v0, "54378"
+    const-string/jumbo v0, "54379"
+    const-string/jumbo v0, "54380"
+    const-string/jumbo v0, "54381"
+    const-string/jumbo v0, "54382"
+    const-string/jumbo v0, "54383"
+    const-string/jumbo v0, "54384"
+    const-string/jumbo v0, "54385"
+    const-string/jumbo v0, "54386"
+    const-string/jumbo v0, "54387"
+    const-string/jumbo v0, "54388"
+    const-string/jumbo v0, "54389"
+    const-string/jumbo v0, "54390"
+    const-string/jumbo v0, "54391"
+    const-string/jumbo v0, "54392"
+    const-string/jumbo v0, "54393"
+    const-string/jumbo v0, "54394"
+    const-string/jumbo v0, "54395"
+    const-string/jumbo v0, "54396"
+    const-string/jumbo v0, "54397"
+    const-string/jumbo v0, "54398"
+    const-string/jumbo v0, "54399"
+    const-string/jumbo v0, "54400"
+    const-string/jumbo v0, "54401"
+    const-string/jumbo v0, "54402"
+    const-string/jumbo v0, "54403"
+    const-string/jumbo v0, "54404"
+    const-string/jumbo v0, "54405"
+    const-string/jumbo v0, "54406"
+    const-string/jumbo v0, "54407"
+    const-string/jumbo v0, "54408"
+    const-string/jumbo v0, "54409"
+    const-string/jumbo v0, "54410"
+    const-string/jumbo v0, "54411"
+    const-string/jumbo v0, "54412"
+    const-string/jumbo v0, "54413"
+    const-string/jumbo v0, "54414"
+    const-string/jumbo v0, "54415"
+    const-string/jumbo v0, "54416"
+    const-string/jumbo v0, "54417"
+    const-string/jumbo v0, "54418"
+    const-string/jumbo v0, "54419"
+    const-string/jumbo v0, "54420"
+    const-string/jumbo v0, "54421"
+    const-string/jumbo v0, "54422"
+    const-string/jumbo v0, "54423"
+    const-string/jumbo v0, "54424"
+    const-string/jumbo v0, "54425"
+    const-string/jumbo v0, "54426"
+    const-string/jumbo v0, "54427"
+    const-string/jumbo v0, "54428"
+    const-string/jumbo v0, "54429"
+    const-string/jumbo v0, "54430"
+    const-string/jumbo v0, "54431"
+    const-string/jumbo v0, "54432"
+    const-string/jumbo v0, "54433"
+    const-string/jumbo v0, "54434"
+    const-string/jumbo v0, "54435"
+    const-string/jumbo v0, "54436"
+    const-string/jumbo v0, "54437"
+    const-string/jumbo v0, "54438"
+    const-string/jumbo v0, "54439"
+    const-string/jumbo v0, "54440"
+    const-string/jumbo v0, "54441"
+    const-string/jumbo v0, "54442"
+    const-string/jumbo v0, "54443"
+    const-string/jumbo v0, "54444"
+    const-string/jumbo v0, "54445"
+    const-string/jumbo v0, "54446"
+    const-string/jumbo v0, "54447"
+    const-string/jumbo v0, "54448"
+    const-string/jumbo v0, "54449"
+    const-string/jumbo v0, "54450"
+    const-string/jumbo v0, "54451"
+    const-string/jumbo v0, "54452"
+    const-string/jumbo v0, "54453"
+    const-string/jumbo v0, "54454"
+    const-string/jumbo v0, "54455"
+    const-string/jumbo v0, "54456"
+    const-string/jumbo v0, "54457"
+    const-string/jumbo v0, "54458"
+    const-string/jumbo v0, "54459"
+    const-string/jumbo v0, "54460"
+    const-string/jumbo v0, "54461"
+    const-string/jumbo v0, "54462"
+    const-string/jumbo v0, "54463"
+    const-string/jumbo v0, "54464"
+    const-string/jumbo v0, "54465"
+    const-string/jumbo v0, "54466"
+    const-string/jumbo v0, "54467"
+    const-string/jumbo v0, "54468"
+    const-string/jumbo v0, "54469"
+    const-string/jumbo v0, "54470"
+    const-string/jumbo v0, "54471"
+    const-string/jumbo v0, "54472"
+    const-string/jumbo v0, "54473"
+    const-string/jumbo v0, "54474"
+    const-string/jumbo v0, "54475"
+    const-string/jumbo v0, "54476"
+    const-string/jumbo v0, "54477"
+    const-string/jumbo v0, "54478"
+    const-string/jumbo v0, "54479"
+    const-string/jumbo v0, "54480"
+    const-string/jumbo v0, "54481"
+    const-string/jumbo v0, "54482"
+    const-string/jumbo v0, "54483"
+    const-string/jumbo v0, "54484"
+    const-string/jumbo v0, "54485"
+    const-string/jumbo v0, "54486"
+    const-string/jumbo v0, "54487"
+    const-string/jumbo v0, "54488"
+    const-string/jumbo v0, "54489"
+    const-string/jumbo v0, "54490"
+    const-string/jumbo v0, "54491"
+    const-string/jumbo v0, "54492"
+    const-string/jumbo v0, "54493"
+    const-string/jumbo v0, "54494"
+    const-string/jumbo v0, "54495"
+    const-string/jumbo v0, "54496"
+    const-string/jumbo v0, "54497"
+    const-string/jumbo v0, "54498"
+    const-string/jumbo v0, "54499"
+    const-string/jumbo v0, "54500"
+    const-string/jumbo v0, "54501"
+    const-string/jumbo v0, "54502"
+    const-string/jumbo v0, "54503"
+    const-string/jumbo v0, "54504"
+    const-string/jumbo v0, "54505"
+    const-string/jumbo v0, "54506"
+    const-string/jumbo v0, "54507"
+    const-string/jumbo v0, "54508"
+    const-string/jumbo v0, "54509"
+    const-string/jumbo v0, "54510"
+    const-string/jumbo v0, "54511"
+    const-string/jumbo v0, "54512"
+    const-string/jumbo v0, "54513"
+    const-string/jumbo v0, "54514"
+    const-string/jumbo v0, "54515"
+    const-string/jumbo v0, "54516"
+    const-string/jumbo v0, "54517"
+    const-string/jumbo v0, "54518"
+    const-string/jumbo v0, "54519"
+    const-string/jumbo v0, "54520"
+    const-string/jumbo v0, "54521"
+    const-string/jumbo v0, "54522"
+    const-string/jumbo v0, "54523"
+    const-string/jumbo v0, "54524"
+    const-string/jumbo v0, "54525"
+    const-string/jumbo v0, "54526"
+    const-string/jumbo v0, "54527"
+    const-string/jumbo v0, "54528"
+    const-string/jumbo v0, "54529"
+    const-string/jumbo v0, "54530"
+    const-string/jumbo v0, "54531"
+    const-string/jumbo v0, "54532"
+    const-string/jumbo v0, "54533"
+    const-string/jumbo v0, "54534"
+    const-string/jumbo v0, "54535"
+    const-string/jumbo v0, "54536"
+    const-string/jumbo v0, "54537"
+    const-string/jumbo v0, "54538"
+    const-string/jumbo v0, "54539"
+    const-string/jumbo v0, "54540"
+    const-string/jumbo v0, "54541"
+    const-string/jumbo v0, "54542"
+    const-string/jumbo v0, "54543"
+    const-string/jumbo v0, "54544"
+    const-string/jumbo v0, "54545"
+    const-string/jumbo v0, "54546"
+    const-string/jumbo v0, "54547"
+    const-string/jumbo v0, "54548"
+    const-string/jumbo v0, "54549"
+    const-string/jumbo v0, "54550"
+    const-string/jumbo v0, "54551"
+    const-string/jumbo v0, "54552"
+    const-string/jumbo v0, "54553"
+    const-string/jumbo v0, "54554"
+    const-string/jumbo v0, "54555"
+    const-string/jumbo v0, "54556"
+    const-string/jumbo v0, "54557"
+    const-string/jumbo v0, "54558"
+    const-string/jumbo v0, "54559"
+    const-string/jumbo v0, "54560"
+    const-string/jumbo v0, "54561"
+    const-string/jumbo v0, "54562"
+    const-string/jumbo v0, "54563"
+    const-string/jumbo v0, "54564"
+    const-string/jumbo v0, "54565"
+    const-string/jumbo v0, "54566"
+    const-string/jumbo v0, "54567"
+    const-string/jumbo v0, "54568"
+    const-string/jumbo v0, "54569"
+    const-string/jumbo v0, "54570"
+    const-string/jumbo v0, "54571"
+    const-string/jumbo v0, "54572"
+    const-string/jumbo v0, "54573"
+    const-string/jumbo v0, "54574"
+    const-string/jumbo v0, "54575"
+    const-string/jumbo v0, "54576"
+    const-string/jumbo v0, "54577"
+    const-string/jumbo v0, "54578"
+    const-string/jumbo v0, "54579"
+    const-string/jumbo v0, "54580"
+    const-string/jumbo v0, "54581"
+    const-string/jumbo v0, "54582"
+    const-string/jumbo v0, "54583"
+    const-string/jumbo v0, "54584"
+    const-string/jumbo v0, "54585"
+    const-string/jumbo v0, "54586"
+    const-string/jumbo v0, "54587"
+    const-string/jumbo v0, "54588"
+    const-string/jumbo v0, "54589"
+    const-string/jumbo v0, "54590"
+    const-string/jumbo v0, "54591"
+    const-string/jumbo v0, "54592"
+    const-string/jumbo v0, "54593"
+    const-string/jumbo v0, "54594"
+    const-string/jumbo v0, "54595"
+    const-string/jumbo v0, "54596"
+    const-string/jumbo v0, "54597"
+    const-string/jumbo v0, "54598"
+    const-string/jumbo v0, "54599"
+    const-string/jumbo v0, "54600"
+    const-string/jumbo v0, "54601"
+    const-string/jumbo v0, "54602"
+    const-string/jumbo v0, "54603"
+    const-string/jumbo v0, "54604"
+    const-string/jumbo v0, "54605"
+    const-string/jumbo v0, "54606"
+    const-string/jumbo v0, "54607"
+    const-string/jumbo v0, "54608"
+    const-string/jumbo v0, "54609"
+    const-string/jumbo v0, "54610"
+    const-string/jumbo v0, "54611"
+    const-string/jumbo v0, "54612"
+    const-string/jumbo v0, "54613"
+    const-string/jumbo v0, "54614"
+    const-string/jumbo v0, "54615"
+    const-string/jumbo v0, "54616"
+    const-string/jumbo v0, "54617"
+    const-string/jumbo v0, "54618"
+    const-string/jumbo v0, "54619"
+    const-string/jumbo v0, "54620"
+    const-string/jumbo v0, "54621"
+    const-string/jumbo v0, "54622"
+    const-string/jumbo v0, "54623"
+    const-string/jumbo v0, "54624"
+    const-string/jumbo v0, "54625"
+    const-string/jumbo v0, "54626"
+    const-string/jumbo v0, "54627"
+    const-string/jumbo v0, "54628"
+    const-string/jumbo v0, "54629"
+    const-string/jumbo v0, "54630"
+    const-string/jumbo v0, "54631"
+    const-string/jumbo v0, "54632"
+    const-string/jumbo v0, "54633"
+    const-string/jumbo v0, "54634"
+    const-string/jumbo v0, "54635"
+    const-string/jumbo v0, "54636"
+    const-string/jumbo v0, "54637"
+    const-string/jumbo v0, "54638"
+    const-string/jumbo v0, "54639"
+    const-string/jumbo v0, "54640"
+    const-string/jumbo v0, "54641"
+    const-string/jumbo v0, "54642"
+    const-string/jumbo v0, "54643"
+    const-string/jumbo v0, "54644"
+    const-string/jumbo v0, "54645"
+    const-string/jumbo v0, "54646"
+    const-string/jumbo v0, "54647"
+    const-string/jumbo v0, "54648"
+    const-string/jumbo v0, "54649"
+    const-string/jumbo v0, "54650"
+    const-string/jumbo v0, "54651"
+    const-string/jumbo v0, "54652"
+    const-string/jumbo v0, "54653"
+    const-string/jumbo v0, "54654"
+    const-string/jumbo v0, "54655"
+    const-string/jumbo v0, "54656"
+    const-string/jumbo v0, "54657"
+    const-string/jumbo v0, "54658"
+    const-string/jumbo v0, "54659"
+    const-string/jumbo v0, "54660"
+    const-string/jumbo v0, "54661"
+    const-string/jumbo v0, "54662"
+    const-string/jumbo v0, "54663"
+    const-string/jumbo v0, "54664"
+    const-string/jumbo v0, "54665"
+    const-string/jumbo v0, "54666"
+    const-string/jumbo v0, "54667"
+    const-string/jumbo v0, "54668"
+    const-string/jumbo v0, "54669"
+    const-string/jumbo v0, "54670"
+    const-string/jumbo v0, "54671"
+    const-string/jumbo v0, "54672"
+    const-string/jumbo v0, "54673"
+    const-string/jumbo v0, "54674"
+    const-string/jumbo v0, "54675"
+    const-string/jumbo v0, "54676"
+    const-string/jumbo v0, "54677"
+    const-string/jumbo v0, "54678"
+    const-string/jumbo v0, "54679"
+    const-string/jumbo v0, "54680"
+    const-string/jumbo v0, "54681"
+    const-string/jumbo v0, "54682"
+    const-string/jumbo v0, "54683"
+    const-string/jumbo v0, "54684"
+    const-string/jumbo v0, "54685"
+    const-string/jumbo v0, "54686"
+    const-string/jumbo v0, "54687"
+    const-string/jumbo v0, "54688"
+    const-string/jumbo v0, "54689"
+    const-string/jumbo v0, "54690"
+    const-string/jumbo v0, "54691"
+    const-string/jumbo v0, "54692"
+    const-string/jumbo v0, "54693"
+    const-string/jumbo v0, "54694"
+    const-string/jumbo v0, "54695"
+    const-string/jumbo v0, "54696"
+    const-string/jumbo v0, "54697"
+    const-string/jumbo v0, "54698"
+    const-string/jumbo v0, "54699"
+    const-string/jumbo v0, "54700"
+    const-string/jumbo v0, "54701"
+    const-string/jumbo v0, "54702"
+    const-string/jumbo v0, "54703"
+    const-string/jumbo v0, "54704"
+    const-string/jumbo v0, "54705"
+    const-string/jumbo v0, "54706"
+    const-string/jumbo v0, "54707"
+    const-string/jumbo v0, "54708"
+    const-string/jumbo v0, "54709"
+    const-string/jumbo v0, "54710"
+    const-string/jumbo v0, "54711"
+    const-string/jumbo v0, "54712"
+    const-string/jumbo v0, "54713"
+    const-string/jumbo v0, "54714"
+    const-string/jumbo v0, "54715"
+    const-string/jumbo v0, "54716"
+    const-string/jumbo v0, "54717"
+    const-string/jumbo v0, "54718"
+    const-string/jumbo v0, "54719"
+    const-string/jumbo v0, "54720"
+    const-string/jumbo v0, "54721"
+    const-string/jumbo v0, "54722"
+    const-string/jumbo v0, "54723"
+    const-string/jumbo v0, "54724"
+    const-string/jumbo v0, "54725"
+    const-string/jumbo v0, "54726"
+    const-string/jumbo v0, "54727"
+    const-string/jumbo v0, "54728"
+    const-string/jumbo v0, "54729"
+    const-string/jumbo v0, "54730"
+    const-string/jumbo v0, "54731"
+    const-string/jumbo v0, "54732"
+    const-string/jumbo v0, "54733"
+    const-string/jumbo v0, "54734"
+    const-string/jumbo v0, "54735"
+    const-string/jumbo v0, "54736"
+    const-string/jumbo v0, "54737"
+    const-string/jumbo v0, "54738"
+    const-string/jumbo v0, "54739"
+    const-string/jumbo v0, "54740"
+    const-string/jumbo v0, "54741"
+    const-string/jumbo v0, "54742"
+    const-string/jumbo v0, "54743"
+    const-string/jumbo v0, "54744"
+    const-string/jumbo v0, "54745"
+    const-string/jumbo v0, "54746"
+    const-string/jumbo v0, "54747"
+    const-string/jumbo v0, "54748"
+    const-string/jumbo v0, "54749"
+    const-string/jumbo v0, "54750"
+    const-string/jumbo v0, "54751"
+    const-string/jumbo v0, "54752"
+    const-string/jumbo v0, "54753"
+    const-string/jumbo v0, "54754"
+    const-string/jumbo v0, "54755"
+    const-string/jumbo v0, "54756"
+    const-string/jumbo v0, "54757"
+    const-string/jumbo v0, "54758"
+    const-string/jumbo v0, "54759"
+    const-string/jumbo v0, "54760"
+    const-string/jumbo v0, "54761"
+    const-string/jumbo v0, "54762"
+    const-string/jumbo v0, "54763"
+    const-string/jumbo v0, "54764"
+    const-string/jumbo v0, "54765"
+    const-string/jumbo v0, "54766"
+    const-string/jumbo v0, "54767"
+    const-string/jumbo v0, "54768"
+    const-string/jumbo v0, "54769"
+    const-string/jumbo v0, "54770"
+    const-string/jumbo v0, "54771"
+    const-string/jumbo v0, "54772"
+    const-string/jumbo v0, "54773"
+    const-string/jumbo v0, "54774"
+    const-string/jumbo v0, "54775"
+    const-string/jumbo v0, "54776"
+    const-string/jumbo v0, "54777"
+    const-string/jumbo v0, "54778"
+    const-string/jumbo v0, "54779"
+    const-string/jumbo v0, "54780"
+    const-string/jumbo v0, "54781"
+    const-string/jumbo v0, "54782"
+    const-string/jumbo v0, "54783"
+    const-string/jumbo v0, "54784"
+    const-string/jumbo v0, "54785"
+    const-string/jumbo v0, "54786"
+    const-string/jumbo v0, "54787"
+    const-string/jumbo v0, "54788"
+    const-string/jumbo v0, "54789"
+    const-string/jumbo v0, "54790"
+    const-string/jumbo v0, "54791"
+    const-string/jumbo v0, "54792"
+    const-string/jumbo v0, "54793"
+    const-string/jumbo v0, "54794"
+    const-string/jumbo v0, "54795"
+    const-string/jumbo v0, "54796"
+    const-string/jumbo v0, "54797"
+    const-string/jumbo v0, "54798"
+    const-string/jumbo v0, "54799"
+    const-string/jumbo v0, "54800"
+    const-string/jumbo v0, "54801"
+    const-string/jumbo v0, "54802"
+    const-string/jumbo v0, "54803"
+    const-string/jumbo v0, "54804"
+    const-string/jumbo v0, "54805"
+    const-string/jumbo v0, "54806"
+    const-string/jumbo v0, "54807"
+    const-string/jumbo v0, "54808"
+    const-string/jumbo v0, "54809"
+    const-string/jumbo v0, "54810"
+    const-string/jumbo v0, "54811"
+    const-string/jumbo v0, "54812"
+    const-string/jumbo v0, "54813"
+    const-string/jumbo v0, "54814"
+    const-string/jumbo v0, "54815"
+    const-string/jumbo v0, "54816"
+    const-string/jumbo v0, "54817"
+    const-string/jumbo v0, "54818"
+    const-string/jumbo v0, "54819"
+    const-string/jumbo v0, "54820"
+    const-string/jumbo v0, "54821"
+    const-string/jumbo v0, "54822"
+    const-string/jumbo v0, "54823"
+    const-string/jumbo v0, "54824"
+    const-string/jumbo v0, "54825"
+    const-string/jumbo v0, "54826"
+    const-string/jumbo v0, "54827"
+    const-string/jumbo v0, "54828"
+    const-string/jumbo v0, "54829"
+    const-string/jumbo v0, "54830"
+    const-string/jumbo v0, "54831"
+    const-string/jumbo v0, "54832"
+    const-string/jumbo v0, "54833"
+    const-string/jumbo v0, "54834"
+    const-string/jumbo v0, "54835"
+    const-string/jumbo v0, "54836"
+    const-string/jumbo v0, "54837"
+    const-string/jumbo v0, "54838"
+    const-string/jumbo v0, "54839"
+    const-string/jumbo v0, "54840"
+    const-string/jumbo v0, "54841"
+    const-string/jumbo v0, "54842"
+    const-string/jumbo v0, "54843"
+    const-string/jumbo v0, "54844"
+    const-string/jumbo v0, "54845"
+    const-string/jumbo v0, "54846"
+    const-string/jumbo v0, "54847"
+    const-string/jumbo v0, "54848"
+    const-string/jumbo v0, "54849"
+    const-string/jumbo v0, "54850"
+    const-string/jumbo v0, "54851"
+    const-string/jumbo v0, "54852"
+    const-string/jumbo v0, "54853"
+    const-string/jumbo v0, "54854"
+    const-string/jumbo v0, "54855"
+    const-string/jumbo v0, "54856"
+    const-string/jumbo v0, "54857"
+    const-string/jumbo v0, "54858"
+    const-string/jumbo v0, "54859"
+    const-string/jumbo v0, "54860"
+    const-string/jumbo v0, "54861"
+    const-string/jumbo v0, "54862"
+    const-string/jumbo v0, "54863"
+    const-string/jumbo v0, "54864"
+    const-string/jumbo v0, "54865"
+    const-string/jumbo v0, "54866"
+    const-string/jumbo v0, "54867"
+    const-string/jumbo v0, "54868"
+    const-string/jumbo v0, "54869"
+    const-string/jumbo v0, "54870"
+    const-string/jumbo v0, "54871"
+    const-string/jumbo v0, "54872"
+    const-string/jumbo v0, "54873"
+    const-string/jumbo v0, "54874"
+    const-string/jumbo v0, "54875"
+    const-string/jumbo v0, "54876"
+    const-string/jumbo v0, "54877"
+    const-string/jumbo v0, "54878"
+    const-string/jumbo v0, "54879"
+    const-string/jumbo v0, "54880"
+    const-string/jumbo v0, "54881"
+    const-string/jumbo v0, "54882"
+    const-string/jumbo v0, "54883"
+    const-string/jumbo v0, "54884"
+    const-string/jumbo v0, "54885"
+    const-string/jumbo v0, "54886"
+    const-string/jumbo v0, "54887"
+    const-string/jumbo v0, "54888"
+    const-string/jumbo v0, "54889"
+    const-string/jumbo v0, "54890"
+    const-string/jumbo v0, "54891"
+    const-string/jumbo v0, "54892"
+    const-string/jumbo v0, "54893"
+    const-string/jumbo v0, "54894"
+    const-string/jumbo v0, "54895"
+    const-string/jumbo v0, "54896"
+    const-string/jumbo v0, "54897"
+    const-string/jumbo v0, "54898"
+    const-string/jumbo v0, "54899"
+    const-string/jumbo v0, "54900"
+    const-string/jumbo v0, "54901"
+    const-string/jumbo v0, "54902"
+    const-string/jumbo v0, "54903"
+    const-string/jumbo v0, "54904"
+    const-string/jumbo v0, "54905"
+    const-string/jumbo v0, "54906"
+    const-string/jumbo v0, "54907"
+    const-string/jumbo v0, "54908"
+    const-string/jumbo v0, "54909"
+    const-string/jumbo v0, "54910"
+    const-string/jumbo v0, "54911"
+    const-string/jumbo v0, "54912"
+    const-string/jumbo v0, "54913"
+    const-string/jumbo v0, "54914"
+    const-string/jumbo v0, "54915"
+    const-string/jumbo v0, "54916"
+    const-string/jumbo v0, "54917"
+    const-string/jumbo v0, "54918"
+    const-string/jumbo v0, "54919"
+    const-string/jumbo v0, "54920"
+    const-string/jumbo v0, "54921"
+    const-string/jumbo v0, "54922"
+    const-string/jumbo v0, "54923"
+    const-string/jumbo v0, "54924"
+    const-string/jumbo v0, "54925"
+    const-string/jumbo v0, "54926"
+    const-string/jumbo v0, "54927"
+    const-string/jumbo v0, "54928"
+    const-string/jumbo v0, "54929"
+    const-string/jumbo v0, "54930"
+    const-string/jumbo v0, "54931"
+    const-string/jumbo v0, "54932"
+    const-string/jumbo v0, "54933"
+    const-string/jumbo v0, "54934"
+    const-string/jumbo v0, "54935"
+    const-string/jumbo v0, "54936"
+    const-string/jumbo v0, "54937"
+    const-string/jumbo v0, "54938"
+    const-string/jumbo v0, "54939"
+    const-string/jumbo v0, "54940"
+    const-string/jumbo v0, "54941"
+    const-string/jumbo v0, "54942"
+    const-string/jumbo v0, "54943"
+    const-string/jumbo v0, "54944"
+    const-string/jumbo v0, "54945"
+    const-string/jumbo v0, "54946"
+    const-string/jumbo v0, "54947"
+    const-string/jumbo v0, "54948"
+    const-string/jumbo v0, "54949"
+    const-string/jumbo v0, "54950"
+    const-string/jumbo v0, "54951"
+    const-string/jumbo v0, "54952"
+    const-string/jumbo v0, "54953"
+    const-string/jumbo v0, "54954"
+    const-string/jumbo v0, "54955"
+    const-string/jumbo v0, "54956"
+    const-string/jumbo v0, "54957"
+    const-string/jumbo v0, "54958"
+    const-string/jumbo v0, "54959"
+    const-string/jumbo v0, "54960"
+    const-string/jumbo v0, "54961"
+    const-string/jumbo v0, "54962"
+    const-string/jumbo v0, "54963"
+    const-string/jumbo v0, "54964"
+    const-string/jumbo v0, "54965"
+    const-string/jumbo v0, "54966"
+    const-string/jumbo v0, "54967"
+    const-string/jumbo v0, "54968"
+    const-string/jumbo v0, "54969"
+    const-string/jumbo v0, "54970"
+    const-string/jumbo v0, "54971"
+    const-string/jumbo v0, "54972"
+    const-string/jumbo v0, "54973"
+    const-string/jumbo v0, "54974"
+    const-string/jumbo v0, "54975"
+    const-string/jumbo v0, "54976"
+    const-string/jumbo v0, "54977"
+    const-string/jumbo v0, "54978"
+    const-string/jumbo v0, "54979"
+    const-string/jumbo v0, "54980"
+    const-string/jumbo v0, "54981"
+    const-string/jumbo v0, "54982"
+    const-string/jumbo v0, "54983"
+    const-string/jumbo v0, "54984"
+    const-string/jumbo v0, "54985"
+    const-string/jumbo v0, "54986"
+    const-string/jumbo v0, "54987"
+    const-string/jumbo v0, "54988"
+    const-string/jumbo v0, "54989"
+    const-string/jumbo v0, "54990"
+    const-string/jumbo v0, "54991"
+    const-string/jumbo v0, "54992"
+    const-string/jumbo v0, "54993"
+    const-string/jumbo v0, "54994"
+    const-string/jumbo v0, "54995"
+    const-string/jumbo v0, "54996"
+    const-string/jumbo v0, "54997"
+    const-string/jumbo v0, "54998"
+    const-string/jumbo v0, "54999"
+    const-string/jumbo v0, "55000"
+    const-string/jumbo v0, "55001"
+    const-string/jumbo v0, "55002"
+    const-string/jumbo v0, "55003"
+    const-string/jumbo v0, "55004"
+    const-string/jumbo v0, "55005"
+    const-string/jumbo v0, "55006"
+    const-string/jumbo v0, "55007"
+    const-string/jumbo v0, "55008"
+    const-string/jumbo v0, "55009"
+    const-string/jumbo v0, "55010"
+    const-string/jumbo v0, "55011"
+    const-string/jumbo v0, "55012"
+    const-string/jumbo v0, "55013"
+    const-string/jumbo v0, "55014"
+    const-string/jumbo v0, "55015"
+    const-string/jumbo v0, "55016"
+    const-string/jumbo v0, "55017"
+    const-string/jumbo v0, "55018"
+    const-string/jumbo v0, "55019"
+    const-string/jumbo v0, "55020"
+    const-string/jumbo v0, "55021"
+    const-string/jumbo v0, "55022"
+    const-string/jumbo v0, "55023"
+    const-string/jumbo v0, "55024"
+    const-string/jumbo v0, "55025"
+    const-string/jumbo v0, "55026"
+    const-string/jumbo v0, "55027"
+    const-string/jumbo v0, "55028"
+    const-string/jumbo v0, "55029"
+    const-string/jumbo v0, "55030"
+    const-string/jumbo v0, "55031"
+    const-string/jumbo v0, "55032"
+    const-string/jumbo v0, "55033"
+    const-string/jumbo v0, "55034"
+    const-string/jumbo v0, "55035"
+    const-string/jumbo v0, "55036"
+    const-string/jumbo v0, "55037"
+    const-string/jumbo v0, "55038"
+    const-string/jumbo v0, "55039"
+    const-string/jumbo v0, "55040"
+    const-string/jumbo v0, "55041"
+    const-string/jumbo v0, "55042"
+    const-string/jumbo v0, "55043"
+    const-string/jumbo v0, "55044"
+    const-string/jumbo v0, "55045"
+    const-string/jumbo v0, "55046"
+    const-string/jumbo v0, "55047"
+    const-string/jumbo v0, "55048"
+    const-string/jumbo v0, "55049"
+    const-string/jumbo v0, "55050"
+    const-string/jumbo v0, "55051"
+    const-string/jumbo v0, "55052"
+    const-string/jumbo v0, "55053"
+    const-string/jumbo v0, "55054"
+    const-string/jumbo v0, "55055"
+    const-string/jumbo v0, "55056"
+    const-string/jumbo v0, "55057"
+    const-string/jumbo v0, "55058"
+    const-string/jumbo v0, "55059"
+    const-string/jumbo v0, "55060"
+    const-string/jumbo v0, "55061"
+    const-string/jumbo v0, "55062"
+    const-string/jumbo v0, "55063"
+    const-string/jumbo v0, "55064"
+    const-string/jumbo v0, "55065"
+    const-string/jumbo v0, "55066"
+    const-string/jumbo v0, "55067"
+    const-string/jumbo v0, "55068"
+    const-string/jumbo v0, "55069"
+    const-string/jumbo v0, "55070"
+    const-string/jumbo v0, "55071"
+    const-string/jumbo v0, "55072"
+    const-string/jumbo v0, "55073"
+    const-string/jumbo v0, "55074"
+    const-string/jumbo v0, "55075"
+    const-string/jumbo v0, "55076"
+    const-string/jumbo v0, "55077"
+    const-string/jumbo v0, "55078"
+    const-string/jumbo v0, "55079"
+    const-string/jumbo v0, "55080"
+    const-string/jumbo v0, "55081"
+    const-string/jumbo v0, "55082"
+    const-string/jumbo v0, "55083"
+    const-string/jumbo v0, "55084"
+    const-string/jumbo v0, "55085"
+    const-string/jumbo v0, "55086"
+    const-string/jumbo v0, "55087"
+    const-string/jumbo v0, "55088"
+    const-string/jumbo v0, "55089"
+    const-string/jumbo v0, "55090"
+    const-string/jumbo v0, "55091"
+    const-string/jumbo v0, "55092"
+    const-string/jumbo v0, "55093"
+    const-string/jumbo v0, "55094"
+    const-string/jumbo v0, "55095"
+    const-string/jumbo v0, "55096"
+    const-string/jumbo v0, "55097"
+    const-string/jumbo v0, "55098"
+    const-string/jumbo v0, "55099"
+    const-string/jumbo v0, "55100"
+    const-string/jumbo v0, "55101"
+    const-string/jumbo v0, "55102"
+    const-string/jumbo v0, "55103"
+    const-string/jumbo v0, "55104"
+    const-string/jumbo v0, "55105"
+    const-string/jumbo v0, "55106"
+    const-string/jumbo v0, "55107"
+    const-string/jumbo v0, "55108"
+    const-string/jumbo v0, "55109"
+    const-string/jumbo v0, "55110"
+    const-string/jumbo v0, "55111"
+    const-string/jumbo v0, "55112"
+    const-string/jumbo v0, "55113"
+    const-string/jumbo v0, "55114"
+    const-string/jumbo v0, "55115"
+    const-string/jumbo v0, "55116"
+    const-string/jumbo v0, "55117"
+    const-string/jumbo v0, "55118"
+    const-string/jumbo v0, "55119"
+    const-string/jumbo v0, "55120"
+    const-string/jumbo v0, "55121"
+    const-string/jumbo v0, "55122"
+    const-string/jumbo v0, "55123"
+    const-string/jumbo v0, "55124"
+    const-string/jumbo v0, "55125"
+    const-string/jumbo v0, "55126"
+    const-string/jumbo v0, "55127"
+    const-string/jumbo v0, "55128"
+    const-string/jumbo v0, "55129"
+    const-string/jumbo v0, "55130"
+    const-string/jumbo v0, "55131"
+    const-string/jumbo v0, "55132"
+    const-string/jumbo v0, "55133"
+    const-string/jumbo v0, "55134"
+    const-string/jumbo v0, "55135"
+    const-string/jumbo v0, "55136"
+    const-string/jumbo v0, "55137"
+    const-string/jumbo v0, "55138"
+    const-string/jumbo v0, "55139"
+    const-string/jumbo v0, "55140"
+    const-string/jumbo v0, "55141"
+    const-string/jumbo v0, "55142"
+    const-string/jumbo v0, "55143"
+    const-string/jumbo v0, "55144"
+    const-string/jumbo v0, "55145"
+    const-string/jumbo v0, "55146"
+    const-string/jumbo v0, "55147"
+    const-string/jumbo v0, "55148"
+    const-string/jumbo v0, "55149"
+    const-string/jumbo v0, "55150"
+    const-string/jumbo v0, "55151"
+    const-string/jumbo v0, "55152"
+    const-string/jumbo v0, "55153"
+    const-string/jumbo v0, "55154"
+    const-string/jumbo v0, "55155"
+    const-string/jumbo v0, "55156"
+    const-string/jumbo v0, "55157"
+    const-string/jumbo v0, "55158"
+    const-string/jumbo v0, "55159"
+    const-string/jumbo v0, "55160"
+    const-string/jumbo v0, "55161"
+    const-string/jumbo v0, "55162"
+    const-string/jumbo v0, "55163"
+    const-string/jumbo v0, "55164"
+    const-string/jumbo v0, "55165"
+    const-string/jumbo v0, "55166"
+    const-string/jumbo v0, "55167"
+    const-string/jumbo v0, "55168"
+    const-string/jumbo v0, "55169"
+    const-string/jumbo v0, "55170"
+    const-string/jumbo v0, "55171"
+    const-string/jumbo v0, "55172"
+    const-string/jumbo v0, "55173"
+    const-string/jumbo v0, "55174"
+    const-string/jumbo v0, "55175"
+    const-string/jumbo v0, "55176"
+    const-string/jumbo v0, "55177"
+    const-string/jumbo v0, "55178"
+    const-string/jumbo v0, "55179"
+    const-string/jumbo v0, "55180"
+    const-string/jumbo v0, "55181"
+    const-string/jumbo v0, "55182"
+    const-string/jumbo v0, "55183"
+    const-string/jumbo v0, "55184"
+    const-string/jumbo v0, "55185"
+    const-string/jumbo v0, "55186"
+    const-string/jumbo v0, "55187"
+    const-string/jumbo v0, "55188"
+    const-string/jumbo v0, "55189"
+    const-string/jumbo v0, "55190"
+    const-string/jumbo v0, "55191"
+    const-string/jumbo v0, "55192"
+    const-string/jumbo v0, "55193"
+    const-string/jumbo v0, "55194"
+    const-string/jumbo v0, "55195"
+    const-string/jumbo v0, "55196"
+    const-string/jumbo v0, "55197"
+    const-string/jumbo v0, "55198"
+    const-string/jumbo v0, "55199"
+    const-string/jumbo v0, "55200"
+    const-string/jumbo v0, "55201"
+    const-string/jumbo v0, "55202"
+    const-string/jumbo v0, "55203"
+    const-string/jumbo v0, "55204"
+    const-string/jumbo v0, "55205"
+    const-string/jumbo v0, "55206"
+    const-string/jumbo v0, "55207"
+    const-string/jumbo v0, "55208"
+    const-string/jumbo v0, "55209"
+    const-string/jumbo v0, "55210"
+    const-string/jumbo v0, "55211"
+    const-string/jumbo v0, "55212"
+    const-string/jumbo v0, "55213"
+    const-string/jumbo v0, "55214"
+    const-string/jumbo v0, "55215"
+    const-string/jumbo v0, "55216"
+    const-string/jumbo v0, "55217"
+    const-string/jumbo v0, "55218"
+    const-string/jumbo v0, "55219"
+    const-string/jumbo v0, "55220"
+    const-string/jumbo v0, "55221"
+    const-string/jumbo v0, "55222"
+    const-string/jumbo v0, "55223"
+    const-string/jumbo v0, "55224"
+    const-string/jumbo v0, "55225"
+    const-string/jumbo v0, "55226"
+    const-string/jumbo v0, "55227"
+    const-string/jumbo v0, "55228"
+    const-string/jumbo v0, "55229"
+    const-string/jumbo v0, "55230"
+    const-string/jumbo v0, "55231"
+    const-string/jumbo v0, "55232"
+    const-string/jumbo v0, "55233"
+    const-string/jumbo v0, "55234"
+    const-string/jumbo v0, "55235"
+    const-string/jumbo v0, "55236"
+    const-string/jumbo v0, "55237"
+    const-string/jumbo v0, "55238"
+    const-string/jumbo v0, "55239"
+    const-string/jumbo v0, "55240"
+    const-string/jumbo v0, "55241"
+    const-string/jumbo v0, "55242"
+    const-string/jumbo v0, "55243"
+    const-string/jumbo v0, "55244"
+    const-string/jumbo v0, "55245"
+    const-string/jumbo v0, "55246"
+    const-string/jumbo v0, "55247"
+    const-string/jumbo v0, "55248"
+    const-string/jumbo v0, "55249"
+    const-string/jumbo v0, "55250"
+    const-string/jumbo v0, "55251"
+    const-string/jumbo v0, "55252"
+    const-string/jumbo v0, "55253"
+    const-string/jumbo v0, "55254"
+    const-string/jumbo v0, "55255"
+    const-string/jumbo v0, "55256"
+    const-string/jumbo v0, "55257"
+    const-string/jumbo v0, "55258"
+    const-string/jumbo v0, "55259"
+    const-string/jumbo v0, "55260"
+    const-string/jumbo v0, "55261"
+    const-string/jumbo v0, "55262"
+    const-string/jumbo v0, "55263"
+    const-string/jumbo v0, "55264"
+    const-string/jumbo v0, "55265"
+    const-string/jumbo v0, "55266"
+    const-string/jumbo v0, "55267"
+    const-string/jumbo v0, "55268"
+    const-string/jumbo v0, "55269"
+    const-string/jumbo v0, "55270"
+    const-string/jumbo v0, "55271"
+    const-string/jumbo v0, "55272"
+    const-string/jumbo v0, "55273"
+    const-string/jumbo v0, "55274"
+    const-string/jumbo v0, "55275"
+    const-string/jumbo v0, "55276"
+    const-string/jumbo v0, "55277"
+    const-string/jumbo v0, "55278"
+    const-string/jumbo v0, "55279"
+    const-string/jumbo v0, "55280"
+    const-string/jumbo v0, "55281"
+    const-string/jumbo v0, "55282"
+    const-string/jumbo v0, "55283"
+    const-string/jumbo v0, "55284"
+    const-string/jumbo v0, "55285"
+    const-string/jumbo v0, "55286"
+    const-string/jumbo v0, "55287"
+    const-string/jumbo v0, "55288"
+    const-string/jumbo v0, "55289"
+    const-string/jumbo v0, "55290"
+    const-string/jumbo v0, "55291"
+    const-string/jumbo v0, "55292"
+    const-string/jumbo v0, "55293"
+    const-string/jumbo v0, "55294"
+    const-string/jumbo v0, "55295"
+    const-string/jumbo v0, "55296"
+    const-string/jumbo v0, "55297"
+    const-string/jumbo v0, "55298"
+    const-string/jumbo v0, "55299"
+    const-string/jumbo v0, "55300"
+    const-string/jumbo v0, "55301"
+    const-string/jumbo v0, "55302"
+    const-string/jumbo v0, "55303"
+    const-string/jumbo v0, "55304"
+    const-string/jumbo v0, "55305"
+    const-string/jumbo v0, "55306"
+    const-string/jumbo v0, "55307"
+    const-string/jumbo v0, "55308"
+    const-string/jumbo v0, "55309"
+    const-string/jumbo v0, "55310"
+    const-string/jumbo v0, "55311"
+    const-string/jumbo v0, "55312"
+    const-string/jumbo v0, "55313"
+    const-string/jumbo v0, "55314"
+    const-string/jumbo v0, "55315"
+    const-string/jumbo v0, "55316"
+    const-string/jumbo v0, "55317"
+    const-string/jumbo v0, "55318"
+    const-string/jumbo v0, "55319"
+    const-string/jumbo v0, "55320"
+    const-string/jumbo v0, "55321"
+    const-string/jumbo v0, "55322"
+    const-string/jumbo v0, "55323"
+    const-string/jumbo v0, "55324"
+    const-string/jumbo v0, "55325"
+    const-string/jumbo v0, "55326"
+    const-string/jumbo v0, "55327"
+    const-string/jumbo v0, "55328"
+    const-string/jumbo v0, "55329"
+    const-string/jumbo v0, "55330"
+    const-string/jumbo v0, "55331"
+    const-string/jumbo v0, "55332"
+    const-string/jumbo v0, "55333"
+    const-string/jumbo v0, "55334"
+    const-string/jumbo v0, "55335"
+    const-string/jumbo v0, "55336"
+    const-string/jumbo v0, "55337"
+    const-string/jumbo v0, "55338"
+    const-string/jumbo v0, "55339"
+    const-string/jumbo v0, "55340"
+    const-string/jumbo v0, "55341"
+    const-string/jumbo v0, "55342"
+    const-string/jumbo v0, "55343"
+    const-string/jumbo v0, "55344"
+    const-string/jumbo v0, "55345"
+    const-string/jumbo v0, "55346"
+    const-string/jumbo v0, "55347"
+    const-string/jumbo v0, "55348"
+    const-string/jumbo v0, "55349"
+    const-string/jumbo v0, "55350"
+    const-string/jumbo v0, "55351"
+    const-string/jumbo v0, "55352"
+    const-string/jumbo v0, "55353"
+    const-string/jumbo v0, "55354"
+    const-string/jumbo v0, "55355"
+    const-string/jumbo v0, "55356"
+    const-string/jumbo v0, "55357"
+    const-string/jumbo v0, "55358"
+    const-string/jumbo v0, "55359"
+    const-string/jumbo v0, "55360"
+    const-string/jumbo v0, "55361"
+    const-string/jumbo v0, "55362"
+    const-string/jumbo v0, "55363"
+    const-string/jumbo v0, "55364"
+    const-string/jumbo v0, "55365"
+    const-string/jumbo v0, "55366"
+    const-string/jumbo v0, "55367"
+    const-string/jumbo v0, "55368"
+    const-string/jumbo v0, "55369"
+    const-string/jumbo v0, "55370"
+    const-string/jumbo v0, "55371"
+    const-string/jumbo v0, "55372"
+    const-string/jumbo v0, "55373"
+    const-string/jumbo v0, "55374"
+    const-string/jumbo v0, "55375"
+    const-string/jumbo v0, "55376"
+    const-string/jumbo v0, "55377"
+    const-string/jumbo v0, "55378"
+    const-string/jumbo v0, "55379"
+    const-string/jumbo v0, "55380"
+    const-string/jumbo v0, "55381"
+    const-string/jumbo v0, "55382"
+    const-string/jumbo v0, "55383"
+    const-string/jumbo v0, "55384"
+    const-string/jumbo v0, "55385"
+    const-string/jumbo v0, "55386"
+    const-string/jumbo v0, "55387"
+    const-string/jumbo v0, "55388"
+    const-string/jumbo v0, "55389"
+    const-string/jumbo v0, "55390"
+    const-string/jumbo v0, "55391"
+    const-string/jumbo v0, "55392"
+    const-string/jumbo v0, "55393"
+    const-string/jumbo v0, "55394"
+    const-string/jumbo v0, "55395"
+    const-string/jumbo v0, "55396"
+    const-string/jumbo v0, "55397"
+    const-string/jumbo v0, "55398"
+    const-string/jumbo v0, "55399"
+    const-string/jumbo v0, "55400"
+    const-string/jumbo v0, "55401"
+    const-string/jumbo v0, "55402"
+    const-string/jumbo v0, "55403"
+    const-string/jumbo v0, "55404"
+    const-string/jumbo v0, "55405"
+    const-string/jumbo v0, "55406"
+    const-string/jumbo v0, "55407"
+    const-string/jumbo v0, "55408"
+    const-string/jumbo v0, "55409"
+    const-string/jumbo v0, "55410"
+    const-string/jumbo v0, "55411"
+    const-string/jumbo v0, "55412"
+    const-string/jumbo v0, "55413"
+    const-string/jumbo v0, "55414"
+    const-string/jumbo v0, "55415"
+    const-string/jumbo v0, "55416"
+    const-string/jumbo v0, "55417"
+    const-string/jumbo v0, "55418"
+    const-string/jumbo v0, "55419"
+    const-string/jumbo v0, "55420"
+    const-string/jumbo v0, "55421"
+    const-string/jumbo v0, "55422"
+    const-string/jumbo v0, "55423"
+    const-string/jumbo v0, "55424"
+    const-string/jumbo v0, "55425"
+    const-string/jumbo v0, "55426"
+    const-string/jumbo v0, "55427"
+    const-string/jumbo v0, "55428"
+    const-string/jumbo v0, "55429"
+    const-string/jumbo v0, "55430"
+    const-string/jumbo v0, "55431"
+    const-string/jumbo v0, "55432"
+    const-string/jumbo v0, "55433"
+    const-string/jumbo v0, "55434"
+    const-string/jumbo v0, "55435"
+    const-string/jumbo v0, "55436"
+    const-string/jumbo v0, "55437"
+    const-string/jumbo v0, "55438"
+    const-string/jumbo v0, "55439"
+    const-string/jumbo v0, "55440"
+    const-string/jumbo v0, "55441"
+    const-string/jumbo v0, "55442"
+    const-string/jumbo v0, "55443"
+    const-string/jumbo v0, "55444"
+    const-string/jumbo v0, "55445"
+    const-string/jumbo v0, "55446"
+    const-string/jumbo v0, "55447"
+    const-string/jumbo v0, "55448"
+    const-string/jumbo v0, "55449"
+    const-string/jumbo v0, "55450"
+    const-string/jumbo v0, "55451"
+    const-string/jumbo v0, "55452"
+    const-string/jumbo v0, "55453"
+    const-string/jumbo v0, "55454"
+    const-string/jumbo v0, "55455"
+    const-string/jumbo v0, "55456"
+    const-string/jumbo v0, "55457"
+    const-string/jumbo v0, "55458"
+    const-string/jumbo v0, "55459"
+    const-string/jumbo v0, "55460"
+    const-string/jumbo v0, "55461"
+    const-string/jumbo v0, "55462"
+    const-string/jumbo v0, "55463"
+    const-string/jumbo v0, "55464"
+    const-string/jumbo v0, "55465"
+    const-string/jumbo v0, "55466"
+    const-string/jumbo v0, "55467"
+    const-string/jumbo v0, "55468"
+    const-string/jumbo v0, "55469"
+    const-string/jumbo v0, "55470"
+    const-string/jumbo v0, "55471"
+    const-string/jumbo v0, "55472"
+    const-string/jumbo v0, "55473"
+    const-string/jumbo v0, "55474"
+    const-string/jumbo v0, "55475"
+    const-string/jumbo v0, "55476"
+    const-string/jumbo v0, "55477"
+    const-string/jumbo v0, "55478"
+    const-string/jumbo v0, "55479"
+    const-string/jumbo v0, "55480"
+    const-string/jumbo v0, "55481"
+    const-string/jumbo v0, "55482"
+    const-string/jumbo v0, "55483"
+    const-string/jumbo v0, "55484"
+    const-string/jumbo v0, "55485"
+    const-string/jumbo v0, "55486"
+    const-string/jumbo v0, "55487"
+    const-string/jumbo v0, "55488"
+    const-string/jumbo v0, "55489"
+    const-string/jumbo v0, "55490"
+    const-string/jumbo v0, "55491"
+    const-string/jumbo v0, "55492"
+    const-string/jumbo v0, "55493"
+    const-string/jumbo v0, "55494"
+    const-string/jumbo v0, "55495"
+    const-string/jumbo v0, "55496"
+    const-string/jumbo v0, "55497"
+    const-string/jumbo v0, "55498"
+    const-string/jumbo v0, "55499"
+    const-string/jumbo v0, "55500"
+    const-string/jumbo v0, "55501"
+    const-string/jumbo v0, "55502"
+    const-string/jumbo v0, "55503"
+    const-string/jumbo v0, "55504"
+    const-string/jumbo v0, "55505"
+    const-string/jumbo v0, "55506"
+    const-string/jumbo v0, "55507"
+    const-string/jumbo v0, "55508"
+    const-string/jumbo v0, "55509"
+    const-string/jumbo v0, "55510"
+    const-string/jumbo v0, "55511"
+    const-string/jumbo v0, "55512"
+    const-string/jumbo v0, "55513"
+    const-string/jumbo v0, "55514"
+    const-string/jumbo v0, "55515"
+    const-string/jumbo v0, "55516"
+    const-string/jumbo v0, "55517"
+    const-string/jumbo v0, "55518"
+    const-string/jumbo v0, "55519"
+    const-string/jumbo v0, "55520"
+    const-string/jumbo v0, "55521"
+    const-string/jumbo v0, "55522"
+    const-string/jumbo v0, "55523"
+    const-string/jumbo v0, "55524"
+    const-string/jumbo v0, "55525"
+    const-string/jumbo v0, "55526"
+    const-string/jumbo v0, "55527"
+    const-string/jumbo v0, "55528"
+    const-string/jumbo v0, "55529"
+    const-string/jumbo v0, "55530"
+    const-string/jumbo v0, "55531"
+    const-string/jumbo v0, "55532"
+    const-string/jumbo v0, "55533"
+    const-string/jumbo v0, "55534"
+    const-string/jumbo v0, "55535"
+    const-string/jumbo v0, "55536"
+    const-string/jumbo v0, "55537"
+    const-string/jumbo v0, "55538"
+    const-string/jumbo v0, "55539"
+    const-string/jumbo v0, "55540"
+    const-string/jumbo v0, "55541"
+    const-string/jumbo v0, "55542"
+    const-string/jumbo v0, "55543"
+    const-string/jumbo v0, "55544"
+    const-string/jumbo v0, "55545"
+    const-string/jumbo v0, "55546"
+    const-string/jumbo v0, "55547"
+    const-string/jumbo v0, "55548"
+    const-string/jumbo v0, "55549"
+    const-string/jumbo v0, "55550"
+    const-string/jumbo v0, "55551"
+    const-string/jumbo v0, "55552"
+    const-string/jumbo v0, "55553"
+    const-string/jumbo v0, "55554"
+    const-string/jumbo v0, "55555"
+    const-string/jumbo v0, "55556"
+    const-string/jumbo v0, "55557"
+    const-string/jumbo v0, "55558"
+    const-string/jumbo v0, "55559"
+    const-string/jumbo v0, "55560"
+    const-string/jumbo v0, "55561"
+    const-string/jumbo v0, "55562"
+    const-string/jumbo v0, "55563"
+    const-string/jumbo v0, "55564"
+    const-string/jumbo v0, "55565"
+    const-string/jumbo v0, "55566"
+    const-string/jumbo v0, "55567"
+    const-string/jumbo v0, "55568"
+    const-string/jumbo v0, "55569"
+    const-string/jumbo v0, "55570"
+    const-string/jumbo v0, "55571"
+    const-string/jumbo v0, "55572"
+    const-string/jumbo v0, "55573"
+    const-string/jumbo v0, "55574"
+    const-string/jumbo v0, "55575"
+    const-string/jumbo v0, "55576"
+    const-string/jumbo v0, "55577"
+    const-string/jumbo v0, "55578"
+    const-string/jumbo v0, "55579"
+    const-string/jumbo v0, "55580"
+    const-string/jumbo v0, "55581"
+    const-string/jumbo v0, "55582"
+    const-string/jumbo v0, "55583"
+    const-string/jumbo v0, "55584"
+    const-string/jumbo v0, "55585"
+    const-string/jumbo v0, "55586"
+    const-string/jumbo v0, "55587"
+    const-string/jumbo v0, "55588"
+    const-string/jumbo v0, "55589"
+    const-string/jumbo v0, "55590"
+    const-string/jumbo v0, "55591"
+    const-string/jumbo v0, "55592"
+    const-string/jumbo v0, "55593"
+    const-string/jumbo v0, "55594"
+    const-string/jumbo v0, "55595"
+    const-string/jumbo v0, "55596"
+    const-string/jumbo v0, "55597"
+    const-string/jumbo v0, "55598"
+    const-string/jumbo v0, "55599"
+    const-string/jumbo v0, "55600"
+    const-string/jumbo v0, "55601"
+    const-string/jumbo v0, "55602"
+    const-string/jumbo v0, "55603"
+    const-string/jumbo v0, "55604"
+    const-string/jumbo v0, "55605"
+    const-string/jumbo v0, "55606"
+    const-string/jumbo v0, "55607"
+    const-string/jumbo v0, "55608"
+    const-string/jumbo v0, "55609"
+    const-string/jumbo v0, "55610"
+    const-string/jumbo v0, "55611"
+    const-string/jumbo v0, "55612"
+    const-string/jumbo v0, "55613"
+    const-string/jumbo v0, "55614"
+    const-string/jumbo v0, "55615"
+    const-string/jumbo v0, "55616"
+    const-string/jumbo v0, "55617"
+    const-string/jumbo v0, "55618"
+    const-string/jumbo v0, "55619"
+    const-string/jumbo v0, "55620"
+    const-string/jumbo v0, "55621"
+    const-string/jumbo v0, "55622"
+    const-string/jumbo v0, "55623"
+    const-string/jumbo v0, "55624"
+    const-string/jumbo v0, "55625"
+    const-string/jumbo v0, "55626"
+    const-string/jumbo v0, "55627"
+    const-string/jumbo v0, "55628"
+    const-string/jumbo v0, "55629"
+    const-string/jumbo v0, "55630"
+    const-string/jumbo v0, "55631"
+    const-string/jumbo v0, "55632"
+    const-string/jumbo v0, "55633"
+    const-string/jumbo v0, "55634"
+    const-string/jumbo v0, "55635"
+    const-string/jumbo v0, "55636"
+    const-string/jumbo v0, "55637"
+    const-string/jumbo v0, "55638"
+    const-string/jumbo v0, "55639"
+    const-string/jumbo v0, "55640"
+    const-string/jumbo v0, "55641"
+    const-string/jumbo v0, "55642"
+    const-string/jumbo v0, "55643"
+    const-string/jumbo v0, "55644"
+    const-string/jumbo v0, "55645"
+    const-string/jumbo v0, "55646"
+    const-string/jumbo v0, "55647"
+    const-string/jumbo v0, "55648"
+    const-string/jumbo v0, "55649"
+    const-string/jumbo v0, "55650"
+    const-string/jumbo v0, "55651"
+    const-string/jumbo v0, "55652"
+    const-string/jumbo v0, "55653"
+    const-string/jumbo v0, "55654"
+    const-string/jumbo v0, "55655"
+    const-string/jumbo v0, "55656"
+    const-string/jumbo v0, "55657"
+    const-string/jumbo v0, "55658"
+    const-string/jumbo v0, "55659"
+    const-string/jumbo v0, "55660"
+    const-string/jumbo v0, "55661"
+    const-string/jumbo v0, "55662"
+    const-string/jumbo v0, "55663"
+    const-string/jumbo v0, "55664"
+    const-string/jumbo v0, "55665"
+    const-string/jumbo v0, "55666"
+    const-string/jumbo v0, "55667"
+    const-string/jumbo v0, "55668"
+    const-string/jumbo v0, "55669"
+    const-string/jumbo v0, "55670"
+    const-string/jumbo v0, "55671"
+    const-string/jumbo v0, "55672"
+    const-string/jumbo v0, "55673"
+    const-string/jumbo v0, "55674"
+    const-string/jumbo v0, "55675"
+    const-string/jumbo v0, "55676"
+    const-string/jumbo v0, "55677"
+    const-string/jumbo v0, "55678"
+    const-string/jumbo v0, "55679"
+    const-string/jumbo v0, "55680"
+    const-string/jumbo v0, "55681"
+    const-string/jumbo v0, "55682"
+    const-string/jumbo v0, "55683"
+    const-string/jumbo v0, "55684"
+    const-string/jumbo v0, "55685"
+    const-string/jumbo v0, "55686"
+    const-string/jumbo v0, "55687"
+    const-string/jumbo v0, "55688"
+    const-string/jumbo v0, "55689"
+    const-string/jumbo v0, "55690"
+    const-string/jumbo v0, "55691"
+    const-string/jumbo v0, "55692"
+    const-string/jumbo v0, "55693"
+    const-string/jumbo v0, "55694"
+    const-string/jumbo v0, "55695"
+    const-string/jumbo v0, "55696"
+    const-string/jumbo v0, "55697"
+    const-string/jumbo v0, "55698"
+    const-string/jumbo v0, "55699"
+    const-string/jumbo v0, "55700"
+    const-string/jumbo v0, "55701"
+    const-string/jumbo v0, "55702"
+    const-string/jumbo v0, "55703"
+    const-string/jumbo v0, "55704"
+    const-string/jumbo v0, "55705"
+    const-string/jumbo v0, "55706"
+    const-string/jumbo v0, "55707"
+    const-string/jumbo v0, "55708"
+    const-string/jumbo v0, "55709"
+    const-string/jumbo v0, "55710"
+    const-string/jumbo v0, "55711"
+    const-string/jumbo v0, "55712"
+    const-string/jumbo v0, "55713"
+    const-string/jumbo v0, "55714"
+    const-string/jumbo v0, "55715"
+    const-string/jumbo v0, "55716"
+    const-string/jumbo v0, "55717"
+    const-string/jumbo v0, "55718"
+    const-string/jumbo v0, "55719"
+    const-string/jumbo v0, "55720"
+    const-string/jumbo v0, "55721"
+    const-string/jumbo v0, "55722"
+    const-string/jumbo v0, "55723"
+    const-string/jumbo v0, "55724"
+    const-string/jumbo v0, "55725"
+    const-string/jumbo v0, "55726"
+    const-string/jumbo v0, "55727"
+    const-string/jumbo v0, "55728"
+    const-string/jumbo v0, "55729"
+    const-string/jumbo v0, "55730"
+    const-string/jumbo v0, "55731"
+    const-string/jumbo v0, "55732"
+    const-string/jumbo v0, "55733"
+    const-string/jumbo v0, "55734"
+    const-string/jumbo v0, "55735"
+    const-string/jumbo v0, "55736"
+    const-string/jumbo v0, "55737"
+    const-string/jumbo v0, "55738"
+    const-string/jumbo v0, "55739"
+    const-string/jumbo v0, "55740"
+    const-string/jumbo v0, "55741"
+    const-string/jumbo v0, "55742"
+    const-string/jumbo v0, "55743"
+    const-string/jumbo v0, "55744"
+    const-string/jumbo v0, "55745"
+    const-string/jumbo v0, "55746"
+    const-string/jumbo v0, "55747"
+    const-string/jumbo v0, "55748"
+    const-string/jumbo v0, "55749"
+    const-string/jumbo v0, "55750"
+    const-string/jumbo v0, "55751"
+    const-string/jumbo v0, "55752"
+    const-string/jumbo v0, "55753"
+    const-string/jumbo v0, "55754"
+    const-string/jumbo v0, "55755"
+    const-string/jumbo v0, "55756"
+    const-string/jumbo v0, "55757"
+    const-string/jumbo v0, "55758"
+    const-string/jumbo v0, "55759"
+    const-string/jumbo v0, "55760"
+    const-string/jumbo v0, "55761"
+    const-string/jumbo v0, "55762"
+    const-string/jumbo v0, "55763"
+    const-string/jumbo v0, "55764"
+    const-string/jumbo v0, "55765"
+    const-string/jumbo v0, "55766"
+    const-string/jumbo v0, "55767"
+    const-string/jumbo v0, "55768"
+    const-string/jumbo v0, "55769"
+    const-string/jumbo v0, "55770"
+    const-string/jumbo v0, "55771"
+    const-string/jumbo v0, "55772"
+    const-string/jumbo v0, "55773"
+    const-string/jumbo v0, "55774"
+    const-string/jumbo v0, "55775"
+    const-string/jumbo v0, "55776"
+    const-string/jumbo v0, "55777"
+    const-string/jumbo v0, "55778"
+    const-string/jumbo v0, "55779"
+    const-string/jumbo v0, "55780"
+    const-string/jumbo v0, "55781"
+    const-string/jumbo v0, "55782"
+    const-string/jumbo v0, "55783"
+    const-string/jumbo v0, "55784"
+    const-string/jumbo v0, "55785"
+    const-string/jumbo v0, "55786"
+    const-string/jumbo v0, "55787"
+    const-string/jumbo v0, "55788"
+    const-string/jumbo v0, "55789"
+    const-string/jumbo v0, "55790"
+    const-string/jumbo v0, "55791"
+    const-string/jumbo v0, "55792"
+    const-string/jumbo v0, "55793"
+    const-string/jumbo v0, "55794"
+    const-string/jumbo v0, "55795"
+    const-string/jumbo v0, "55796"
+    const-string/jumbo v0, "55797"
+    const-string/jumbo v0, "55798"
+    const-string/jumbo v0, "55799"
+    const-string/jumbo v0, "55800"
+    const-string/jumbo v0, "55801"
+    const-string/jumbo v0, "55802"
+    const-string/jumbo v0, "55803"
+    const-string/jumbo v0, "55804"
+    const-string/jumbo v0, "55805"
+    const-string/jumbo v0, "55806"
+    const-string/jumbo v0, "55807"
+    const-string/jumbo v0, "55808"
+    const-string/jumbo v0, "55809"
+    const-string/jumbo v0, "55810"
+    const-string/jumbo v0, "55811"
+    const-string/jumbo v0, "55812"
+    const-string/jumbo v0, "55813"
+    const-string/jumbo v0, "55814"
+    const-string/jumbo v0, "55815"
+    const-string/jumbo v0, "55816"
+    const-string/jumbo v0, "55817"
+    const-string/jumbo v0, "55818"
+    const-string/jumbo v0, "55819"
+    const-string/jumbo v0, "55820"
+    const-string/jumbo v0, "55821"
+    const-string/jumbo v0, "55822"
+    const-string/jumbo v0, "55823"
+    const-string/jumbo v0, "55824"
+    const-string/jumbo v0, "55825"
+    const-string/jumbo v0, "55826"
+    const-string/jumbo v0, "55827"
+    const-string/jumbo v0, "55828"
+    const-string/jumbo v0, "55829"
+    const-string/jumbo v0, "55830"
+    const-string/jumbo v0, "55831"
+    const-string/jumbo v0, "55832"
+    const-string/jumbo v0, "55833"
+    const-string/jumbo v0, "55834"
+    const-string/jumbo v0, "55835"
+    const-string/jumbo v0, "55836"
+    const-string/jumbo v0, "55837"
+    const-string/jumbo v0, "55838"
+    const-string/jumbo v0, "55839"
+    const-string/jumbo v0, "55840"
+    const-string/jumbo v0, "55841"
+    const-string/jumbo v0, "55842"
+    const-string/jumbo v0, "55843"
+    const-string/jumbo v0, "55844"
+    const-string/jumbo v0, "55845"
+    const-string/jumbo v0, "55846"
+    const-string/jumbo v0, "55847"
+    const-string/jumbo v0, "55848"
+    const-string/jumbo v0, "55849"
+    const-string/jumbo v0, "55850"
+    const-string/jumbo v0, "55851"
+    const-string/jumbo v0, "55852"
+    const-string/jumbo v0, "55853"
+    const-string/jumbo v0, "55854"
+    const-string/jumbo v0, "55855"
+    const-string/jumbo v0, "55856"
+    const-string/jumbo v0, "55857"
+    const-string/jumbo v0, "55858"
+    const-string/jumbo v0, "55859"
+    const-string/jumbo v0, "55860"
+    const-string/jumbo v0, "55861"
+    const-string/jumbo v0, "55862"
+    const-string/jumbo v0, "55863"
+    const-string/jumbo v0, "55864"
+    const-string/jumbo v0, "55865"
+    const-string/jumbo v0, "55866"
+    const-string/jumbo v0, "55867"
+    const-string/jumbo v0, "55868"
+    const-string/jumbo v0, "55869"
+    const-string/jumbo v0, "55870"
+    const-string/jumbo v0, "55871"
+    const-string/jumbo v0, "55872"
+    const-string/jumbo v0, "55873"
+    const-string/jumbo v0, "55874"
+    const-string/jumbo v0, "55875"
+    const-string/jumbo v0, "55876"
+    const-string/jumbo v0, "55877"
+    const-string/jumbo v0, "55878"
+    const-string/jumbo v0, "55879"
+    const-string/jumbo v0, "55880"
+    const-string/jumbo v0, "55881"
+    const-string/jumbo v0, "55882"
+    const-string/jumbo v0, "55883"
+    const-string/jumbo v0, "55884"
+    const-string/jumbo v0, "55885"
+    const-string/jumbo v0, "55886"
+    const-string/jumbo v0, "55887"
+    const-string/jumbo v0, "55888"
+    const-string/jumbo v0, "55889"
+    const-string/jumbo v0, "55890"
+    const-string/jumbo v0, "55891"
+    const-string/jumbo v0, "55892"
+    const-string/jumbo v0, "55893"
+    const-string/jumbo v0, "55894"
+    const-string/jumbo v0, "55895"
+    const-string/jumbo v0, "55896"
+    const-string/jumbo v0, "55897"
+    const-string/jumbo v0, "55898"
+    const-string/jumbo v0, "55899"
+    const-string/jumbo v0, "55900"
+    const-string/jumbo v0, "55901"
+    const-string/jumbo v0, "55902"
+    const-string/jumbo v0, "55903"
+    const-string/jumbo v0, "55904"
+    const-string/jumbo v0, "55905"
+    const-string/jumbo v0, "55906"
+    const-string/jumbo v0, "55907"
+    const-string/jumbo v0, "55908"
+    const-string/jumbo v0, "55909"
+    const-string/jumbo v0, "55910"
+    const-string/jumbo v0, "55911"
+    const-string/jumbo v0, "55912"
+    const-string/jumbo v0, "55913"
+    const-string/jumbo v0, "55914"
+    const-string/jumbo v0, "55915"
+    const-string/jumbo v0, "55916"
+    const-string/jumbo v0, "55917"
+    const-string/jumbo v0, "55918"
+    const-string/jumbo v0, "55919"
+    const-string/jumbo v0, "55920"
+    const-string/jumbo v0, "55921"
+    const-string/jumbo v0, "55922"
+    const-string/jumbo v0, "55923"
+    const-string/jumbo v0, "55924"
+    const-string/jumbo v0, "55925"
+    const-string/jumbo v0, "55926"
+    const-string/jumbo v0, "55927"
+    const-string/jumbo v0, "55928"
+    const-string/jumbo v0, "55929"
+    const-string/jumbo v0, "55930"
+    const-string/jumbo v0, "55931"
+    const-string/jumbo v0, "55932"
+    const-string/jumbo v0, "55933"
+    const-string/jumbo v0, "55934"
+    const-string/jumbo v0, "55935"
+    const-string/jumbo v0, "55936"
+    const-string/jumbo v0, "55937"
+    const-string/jumbo v0, "55938"
+    const-string/jumbo v0, "55939"
+    const-string/jumbo v0, "55940"
+    const-string/jumbo v0, "55941"
+    const-string/jumbo v0, "55942"
+    const-string/jumbo v0, "55943"
+    const-string/jumbo v0, "55944"
+    const-string/jumbo v0, "55945"
+    const-string/jumbo v0, "55946"
+    const-string/jumbo v0, "55947"
+    const-string/jumbo v0, "55948"
+    const-string/jumbo v0, "55949"
+    const-string/jumbo v0, "55950"
+    const-string/jumbo v0, "55951"
+    const-string/jumbo v0, "55952"
+    const-string/jumbo v0, "55953"
+    const-string/jumbo v0, "55954"
+    const-string/jumbo v0, "55955"
+    const-string/jumbo v0, "55956"
+    const-string/jumbo v0, "55957"
+    const-string/jumbo v0, "55958"
+    const-string/jumbo v0, "55959"
+    const-string/jumbo v0, "55960"
+    const-string/jumbo v0, "55961"
+    const-string/jumbo v0, "55962"
+    const-string/jumbo v0, "55963"
+    const-string/jumbo v0, "55964"
+    const-string/jumbo v0, "55965"
+    const-string/jumbo v0, "55966"
+    const-string/jumbo v0, "55967"
+    const-string/jumbo v0, "55968"
+    const-string/jumbo v0, "55969"
+    const-string/jumbo v0, "55970"
+    const-string/jumbo v0, "55971"
+    const-string/jumbo v0, "55972"
+    const-string/jumbo v0, "55973"
+    const-string/jumbo v0, "55974"
+    const-string/jumbo v0, "55975"
+    const-string/jumbo v0, "55976"
+    const-string/jumbo v0, "55977"
+    const-string/jumbo v0, "55978"
+    const-string/jumbo v0, "55979"
+    const-string/jumbo v0, "55980"
+    const-string/jumbo v0, "55981"
+    const-string/jumbo v0, "55982"
+    const-string/jumbo v0, "55983"
+    const-string/jumbo v0, "55984"
+    const-string/jumbo v0, "55985"
+    const-string/jumbo v0, "55986"
+    const-string/jumbo v0, "55987"
+    const-string/jumbo v0, "55988"
+    const-string/jumbo v0, "55989"
+    const-string/jumbo v0, "55990"
+    const-string/jumbo v0, "55991"
+    const-string/jumbo v0, "55992"
+    const-string/jumbo v0, "55993"
+    const-string/jumbo v0, "55994"
+    const-string/jumbo v0, "55995"
+    const-string/jumbo v0, "55996"
+    const-string/jumbo v0, "55997"
+    const-string/jumbo v0, "55998"
+    const-string/jumbo v0, "55999"
+    const-string/jumbo v0, "56000"
+    const-string/jumbo v0, "56001"
+    const-string/jumbo v0, "56002"
+    const-string/jumbo v0, "56003"
+    const-string/jumbo v0, "56004"
+    const-string/jumbo v0, "56005"
+    const-string/jumbo v0, "56006"
+    const-string/jumbo v0, "56007"
+    const-string/jumbo v0, "56008"
+    const-string/jumbo v0, "56009"
+    const-string/jumbo v0, "56010"
+    const-string/jumbo v0, "56011"
+    const-string/jumbo v0, "56012"
+    const-string/jumbo v0, "56013"
+    const-string/jumbo v0, "56014"
+    const-string/jumbo v0, "56015"
+    const-string/jumbo v0, "56016"
+    const-string/jumbo v0, "56017"
+    const-string/jumbo v0, "56018"
+    const-string/jumbo v0, "56019"
+    const-string/jumbo v0, "56020"
+    const-string/jumbo v0, "56021"
+    const-string/jumbo v0, "56022"
+    const-string/jumbo v0, "56023"
+    const-string/jumbo v0, "56024"
+    const-string/jumbo v0, "56025"
+    const-string/jumbo v0, "56026"
+    const-string/jumbo v0, "56027"
+    const-string/jumbo v0, "56028"
+    const-string/jumbo v0, "56029"
+    const-string/jumbo v0, "56030"
+    const-string/jumbo v0, "56031"
+    const-string/jumbo v0, "56032"
+    const-string/jumbo v0, "56033"
+    const-string/jumbo v0, "56034"
+    const-string/jumbo v0, "56035"
+    const-string/jumbo v0, "56036"
+    const-string/jumbo v0, "56037"
+    const-string/jumbo v0, "56038"
+    const-string/jumbo v0, "56039"
+    const-string/jumbo v0, "56040"
+    const-string/jumbo v0, "56041"
+    const-string/jumbo v0, "56042"
+    const-string/jumbo v0, "56043"
+    const-string/jumbo v0, "56044"
+    const-string/jumbo v0, "56045"
+    const-string/jumbo v0, "56046"
+    const-string/jumbo v0, "56047"
+    const-string/jumbo v0, "56048"
+    const-string/jumbo v0, "56049"
+    const-string/jumbo v0, "56050"
+    const-string/jumbo v0, "56051"
+    const-string/jumbo v0, "56052"
+    const-string/jumbo v0, "56053"
+    const-string/jumbo v0, "56054"
+    const-string/jumbo v0, "56055"
+    const-string/jumbo v0, "56056"
+    const-string/jumbo v0, "56057"
+    const-string/jumbo v0, "56058"
+    const-string/jumbo v0, "56059"
+    const-string/jumbo v0, "56060"
+    const-string/jumbo v0, "56061"
+    const-string/jumbo v0, "56062"
+    const-string/jumbo v0, "56063"
+    const-string/jumbo v0, "56064"
+    const-string/jumbo v0, "56065"
+    const-string/jumbo v0, "56066"
+    const-string/jumbo v0, "56067"
+    const-string/jumbo v0, "56068"
+    const-string/jumbo v0, "56069"
+    const-string/jumbo v0, "56070"
+    const-string/jumbo v0, "56071"
+    const-string/jumbo v0, "56072"
+    const-string/jumbo v0, "56073"
+    const-string/jumbo v0, "56074"
+    const-string/jumbo v0, "56075"
+    const-string/jumbo v0, "56076"
+    const-string/jumbo v0, "56077"
+    const-string/jumbo v0, "56078"
+    const-string/jumbo v0, "56079"
+    const-string/jumbo v0, "56080"
+    const-string/jumbo v0, "56081"
+    const-string/jumbo v0, "56082"
+    const-string/jumbo v0, "56083"
+    const-string/jumbo v0, "56084"
+    const-string/jumbo v0, "56085"
+    const-string/jumbo v0, "56086"
+    const-string/jumbo v0, "56087"
+    const-string/jumbo v0, "56088"
+    const-string/jumbo v0, "56089"
+    const-string/jumbo v0, "56090"
+    const-string/jumbo v0, "56091"
+    const-string/jumbo v0, "56092"
+    const-string/jumbo v0, "56093"
+    const-string/jumbo v0, "56094"
+    const-string/jumbo v0, "56095"
+    const-string/jumbo v0, "56096"
+    const-string/jumbo v0, "56097"
+    const-string/jumbo v0, "56098"
+    const-string/jumbo v0, "56099"
+    const-string/jumbo v0, "56100"
+    const-string/jumbo v0, "56101"
+    const-string/jumbo v0, "56102"
+    const-string/jumbo v0, "56103"
+    const-string/jumbo v0, "56104"
+    const-string/jumbo v0, "56105"
+    const-string/jumbo v0, "56106"
+    const-string/jumbo v0, "56107"
+    const-string/jumbo v0, "56108"
+    const-string/jumbo v0, "56109"
+    const-string/jumbo v0, "56110"
+    const-string/jumbo v0, "56111"
+    const-string/jumbo v0, "56112"
+    const-string/jumbo v0, "56113"
+    const-string/jumbo v0, "56114"
+    const-string/jumbo v0, "56115"
+    const-string/jumbo v0, "56116"
+    const-string/jumbo v0, "56117"
+    const-string/jumbo v0, "56118"
+    const-string/jumbo v0, "56119"
+    const-string/jumbo v0, "56120"
+    const-string/jumbo v0, "56121"
+    const-string/jumbo v0, "56122"
+    const-string/jumbo v0, "56123"
+    const-string/jumbo v0, "56124"
+    const-string/jumbo v0, "56125"
+    const-string/jumbo v0, "56126"
+    const-string/jumbo v0, "56127"
+    const-string/jumbo v0, "56128"
+    const-string/jumbo v0, "56129"
+    const-string/jumbo v0, "56130"
+    const-string/jumbo v0, "56131"
+    const-string/jumbo v0, "56132"
+    const-string/jumbo v0, "56133"
+    const-string/jumbo v0, "56134"
+    const-string/jumbo v0, "56135"
+    const-string/jumbo v0, "56136"
+    const-string/jumbo v0, "56137"
+    const-string/jumbo v0, "56138"
+    const-string/jumbo v0, "56139"
+    const-string/jumbo v0, "56140"
+    const-string/jumbo v0, "56141"
+    const-string/jumbo v0, "56142"
+    const-string/jumbo v0, "56143"
+    const-string/jumbo v0, "56144"
+    const-string/jumbo v0, "56145"
+    const-string/jumbo v0, "56146"
+    const-string/jumbo v0, "56147"
+    const-string/jumbo v0, "56148"
+    const-string/jumbo v0, "56149"
+    const-string/jumbo v0, "56150"
+    const-string/jumbo v0, "56151"
+    const-string/jumbo v0, "56152"
+    const-string/jumbo v0, "56153"
+    const-string/jumbo v0, "56154"
+    const-string/jumbo v0, "56155"
+    const-string/jumbo v0, "56156"
+    const-string/jumbo v0, "56157"
+    const-string/jumbo v0, "56158"
+    const-string/jumbo v0, "56159"
+    const-string/jumbo v0, "56160"
+    const-string/jumbo v0, "56161"
+    const-string/jumbo v0, "56162"
+    const-string/jumbo v0, "56163"
+    const-string/jumbo v0, "56164"
+    const-string/jumbo v0, "56165"
+    const-string/jumbo v0, "56166"
+    const-string/jumbo v0, "56167"
+    const-string/jumbo v0, "56168"
+    const-string/jumbo v0, "56169"
+    const-string/jumbo v0, "56170"
+    const-string/jumbo v0, "56171"
+    const-string/jumbo v0, "56172"
+    const-string/jumbo v0, "56173"
+    const-string/jumbo v0, "56174"
+    const-string/jumbo v0, "56175"
+    const-string/jumbo v0, "56176"
+    const-string/jumbo v0, "56177"
+    const-string/jumbo v0, "56178"
+    const-string/jumbo v0, "56179"
+    const-string/jumbo v0, "56180"
+    const-string/jumbo v0, "56181"
+    const-string/jumbo v0, "56182"
+    const-string/jumbo v0, "56183"
+    const-string/jumbo v0, "56184"
+    const-string/jumbo v0, "56185"
+    const-string/jumbo v0, "56186"
+    const-string/jumbo v0, "56187"
+    const-string/jumbo v0, "56188"
+    const-string/jumbo v0, "56189"
+    const-string/jumbo v0, "56190"
+    const-string/jumbo v0, "56191"
+    const-string/jumbo v0, "56192"
+    const-string/jumbo v0, "56193"
+    const-string/jumbo v0, "56194"
+    const-string/jumbo v0, "56195"
+    const-string/jumbo v0, "56196"
+    const-string/jumbo v0, "56197"
+    const-string/jumbo v0, "56198"
+    const-string/jumbo v0, "56199"
+    const-string/jumbo v0, "56200"
+    const-string/jumbo v0, "56201"
+    const-string/jumbo v0, "56202"
+    const-string/jumbo v0, "56203"
+    const-string/jumbo v0, "56204"
+    const-string/jumbo v0, "56205"
+    const-string/jumbo v0, "56206"
+    const-string/jumbo v0, "56207"
+    const-string/jumbo v0, "56208"
+    const-string/jumbo v0, "56209"
+    const-string/jumbo v0, "56210"
+    const-string/jumbo v0, "56211"
+    const-string/jumbo v0, "56212"
+    const-string/jumbo v0, "56213"
+    const-string/jumbo v0, "56214"
+    const-string/jumbo v0, "56215"
+    const-string/jumbo v0, "56216"
+    const-string/jumbo v0, "56217"
+    const-string/jumbo v0, "56218"
+    const-string/jumbo v0, "56219"
+    const-string/jumbo v0, "56220"
+    const-string/jumbo v0, "56221"
+    const-string/jumbo v0, "56222"
+    const-string/jumbo v0, "56223"
+    const-string/jumbo v0, "56224"
+    const-string/jumbo v0, "56225"
+    const-string/jumbo v0, "56226"
+    const-string/jumbo v0, "56227"
+    const-string/jumbo v0, "56228"
+    const-string/jumbo v0, "56229"
+    const-string/jumbo v0, "56230"
+    const-string/jumbo v0, "56231"
+    const-string/jumbo v0, "56232"
+    const-string/jumbo v0, "56233"
+    const-string/jumbo v0, "56234"
+    const-string/jumbo v0, "56235"
+    const-string/jumbo v0, "56236"
+    const-string/jumbo v0, "56237"
+    const-string/jumbo v0, "56238"
+    const-string/jumbo v0, "56239"
+    const-string/jumbo v0, "56240"
+    const-string/jumbo v0, "56241"
+    const-string/jumbo v0, "56242"
+    const-string/jumbo v0, "56243"
+    const-string/jumbo v0, "56244"
+    const-string/jumbo v0, "56245"
+    const-string/jumbo v0, "56246"
+    const-string/jumbo v0, "56247"
+    const-string/jumbo v0, "56248"
+    const-string/jumbo v0, "56249"
+    const-string/jumbo v0, "56250"
+    const-string/jumbo v0, "56251"
+    const-string/jumbo v0, "56252"
+    const-string/jumbo v0, "56253"
+    const-string/jumbo v0, "56254"
+    const-string/jumbo v0, "56255"
+    const-string/jumbo v0, "56256"
+    const-string/jumbo v0, "56257"
+    const-string/jumbo v0, "56258"
+    const-string/jumbo v0, "56259"
+    const-string/jumbo v0, "56260"
+    const-string/jumbo v0, "56261"
+    const-string/jumbo v0, "56262"
+    const-string/jumbo v0, "56263"
+    const-string/jumbo v0, "56264"
+    const-string/jumbo v0, "56265"
+    const-string/jumbo v0, "56266"
+    const-string/jumbo v0, "56267"
+    const-string/jumbo v0, "56268"
+    const-string/jumbo v0, "56269"
+    const-string/jumbo v0, "56270"
+    const-string/jumbo v0, "56271"
+    const-string/jumbo v0, "56272"
+    const-string/jumbo v0, "56273"
+    const-string/jumbo v0, "56274"
+    const-string/jumbo v0, "56275"
+    const-string/jumbo v0, "56276"
+    const-string/jumbo v0, "56277"
+    const-string/jumbo v0, "56278"
+    const-string/jumbo v0, "56279"
+    const-string/jumbo v0, "56280"
+    const-string/jumbo v0, "56281"
+    const-string/jumbo v0, "56282"
+    const-string/jumbo v0, "56283"
+    const-string/jumbo v0, "56284"
+    const-string/jumbo v0, "56285"
+    const-string/jumbo v0, "56286"
+    const-string/jumbo v0, "56287"
+    const-string/jumbo v0, "56288"
+    const-string/jumbo v0, "56289"
+    const-string/jumbo v0, "56290"
+    const-string/jumbo v0, "56291"
+    const-string/jumbo v0, "56292"
+    const-string/jumbo v0, "56293"
+    const-string/jumbo v0, "56294"
+    const-string/jumbo v0, "56295"
+    const-string/jumbo v0, "56296"
+    const-string/jumbo v0, "56297"
+    const-string/jumbo v0, "56298"
+    const-string/jumbo v0, "56299"
+    const-string/jumbo v0, "56300"
+    const-string/jumbo v0, "56301"
+    const-string/jumbo v0, "56302"
+    const-string/jumbo v0, "56303"
+    const-string/jumbo v0, "56304"
+    const-string/jumbo v0, "56305"
+    const-string/jumbo v0, "56306"
+    const-string/jumbo v0, "56307"
+    const-string/jumbo v0, "56308"
+    const-string/jumbo v0, "56309"
+    const-string/jumbo v0, "56310"
+    const-string/jumbo v0, "56311"
+    const-string/jumbo v0, "56312"
+    const-string/jumbo v0, "56313"
+    const-string/jumbo v0, "56314"
+    const-string/jumbo v0, "56315"
+    const-string/jumbo v0, "56316"
+    const-string/jumbo v0, "56317"
+    const-string/jumbo v0, "56318"
+    const-string/jumbo v0, "56319"
+    const-string/jumbo v0, "56320"
+    const-string/jumbo v0, "56321"
+    const-string/jumbo v0, "56322"
+    const-string/jumbo v0, "56323"
+    const-string/jumbo v0, "56324"
+    const-string/jumbo v0, "56325"
+    const-string/jumbo v0, "56326"
+    const-string/jumbo v0, "56327"
+    const-string/jumbo v0, "56328"
+    const-string/jumbo v0, "56329"
+    const-string/jumbo v0, "56330"
+    const-string/jumbo v0, "56331"
+    const-string/jumbo v0, "56332"
+    const-string/jumbo v0, "56333"
+    const-string/jumbo v0, "56334"
+    const-string/jumbo v0, "56335"
+    const-string/jumbo v0, "56336"
+    const-string/jumbo v0, "56337"
+    const-string/jumbo v0, "56338"
+    const-string/jumbo v0, "56339"
+    const-string/jumbo v0, "56340"
+    const-string/jumbo v0, "56341"
+    const-string/jumbo v0, "56342"
+    const-string/jumbo v0, "56343"
+    const-string/jumbo v0, "56344"
+    const-string/jumbo v0, "56345"
+    const-string/jumbo v0, "56346"
+    const-string/jumbo v0, "56347"
+    const-string/jumbo v0, "56348"
+    const-string/jumbo v0, "56349"
+    const-string/jumbo v0, "56350"
+    const-string/jumbo v0, "56351"
+    const-string/jumbo v0, "56352"
+    const-string/jumbo v0, "56353"
+    const-string/jumbo v0, "56354"
+    const-string/jumbo v0, "56355"
+    const-string/jumbo v0, "56356"
+    const-string/jumbo v0, "56357"
+    const-string/jumbo v0, "56358"
+    const-string/jumbo v0, "56359"
+    const-string/jumbo v0, "56360"
+    const-string/jumbo v0, "56361"
+    const-string/jumbo v0, "56362"
+    const-string/jumbo v0, "56363"
+    const-string/jumbo v0, "56364"
+    const-string/jumbo v0, "56365"
+    const-string/jumbo v0, "56366"
+    const-string/jumbo v0, "56367"
+    const-string/jumbo v0, "56368"
+    const-string/jumbo v0, "56369"
+    const-string/jumbo v0, "56370"
+    const-string/jumbo v0, "56371"
+    const-string/jumbo v0, "56372"
+    const-string/jumbo v0, "56373"
+    const-string/jumbo v0, "56374"
+    const-string/jumbo v0, "56375"
+    const-string/jumbo v0, "56376"
+    const-string/jumbo v0, "56377"
+    const-string/jumbo v0, "56378"
+    const-string/jumbo v0, "56379"
+    const-string/jumbo v0, "56380"
+    const-string/jumbo v0, "56381"
+    const-string/jumbo v0, "56382"
+    const-string/jumbo v0, "56383"
+    const-string/jumbo v0, "56384"
+    const-string/jumbo v0, "56385"
+    const-string/jumbo v0, "56386"
+    const-string/jumbo v0, "56387"
+    const-string/jumbo v0, "56388"
+    const-string/jumbo v0, "56389"
+    const-string/jumbo v0, "56390"
+    const-string/jumbo v0, "56391"
+    const-string/jumbo v0, "56392"
+    const-string/jumbo v0, "56393"
+    const-string/jumbo v0, "56394"
+    const-string/jumbo v0, "56395"
+    const-string/jumbo v0, "56396"
+    const-string/jumbo v0, "56397"
+    const-string/jumbo v0, "56398"
+    const-string/jumbo v0, "56399"
+    const-string/jumbo v0, "56400"
+    const-string/jumbo v0, "56401"
+    const-string/jumbo v0, "56402"
+    const-string/jumbo v0, "56403"
+    const-string/jumbo v0, "56404"
+    const-string/jumbo v0, "56405"
+    const-string/jumbo v0, "56406"
+    const-string/jumbo v0, "56407"
+    const-string/jumbo v0, "56408"
+    const-string/jumbo v0, "56409"
+    const-string/jumbo v0, "56410"
+    const-string/jumbo v0, "56411"
+    const-string/jumbo v0, "56412"
+    const-string/jumbo v0, "56413"
+    const-string/jumbo v0, "56414"
+    const-string/jumbo v0, "56415"
+    const-string/jumbo v0, "56416"
+    const-string/jumbo v0, "56417"
+    const-string/jumbo v0, "56418"
+    const-string/jumbo v0, "56419"
+    const-string/jumbo v0, "56420"
+    const-string/jumbo v0, "56421"
+    const-string/jumbo v0, "56422"
+    const-string/jumbo v0, "56423"
+    const-string/jumbo v0, "56424"
+    const-string/jumbo v0, "56425"
+    const-string/jumbo v0, "56426"
+    const-string/jumbo v0, "56427"
+    const-string/jumbo v0, "56428"
+    const-string/jumbo v0, "56429"
+    const-string/jumbo v0, "56430"
+    const-string/jumbo v0, "56431"
+    const-string/jumbo v0, "56432"
+    const-string/jumbo v0, "56433"
+    const-string/jumbo v0, "56434"
+    const-string/jumbo v0, "56435"
+    const-string/jumbo v0, "56436"
+    const-string/jumbo v0, "56437"
+    const-string/jumbo v0, "56438"
+    const-string/jumbo v0, "56439"
+    const-string/jumbo v0, "56440"
+    const-string/jumbo v0, "56441"
+    const-string/jumbo v0, "56442"
+    const-string/jumbo v0, "56443"
+    const-string/jumbo v0, "56444"
+    const-string/jumbo v0, "56445"
+    const-string/jumbo v0, "56446"
+    const-string/jumbo v0, "56447"
+    const-string/jumbo v0, "56448"
+    const-string/jumbo v0, "56449"
+    const-string/jumbo v0, "56450"
+    const-string/jumbo v0, "56451"
+    const-string/jumbo v0, "56452"
+    const-string/jumbo v0, "56453"
+    const-string/jumbo v0, "56454"
+    const-string/jumbo v0, "56455"
+    const-string/jumbo v0, "56456"
+    const-string/jumbo v0, "56457"
+    const-string/jumbo v0, "56458"
+    const-string/jumbo v0, "56459"
+    const-string/jumbo v0, "56460"
+    const-string/jumbo v0, "56461"
+    const-string/jumbo v0, "56462"
+    const-string/jumbo v0, "56463"
+    const-string/jumbo v0, "56464"
+    const-string/jumbo v0, "56465"
+    const-string/jumbo v0, "56466"
+    const-string/jumbo v0, "56467"
+    const-string/jumbo v0, "56468"
+    const-string/jumbo v0, "56469"
+    const-string/jumbo v0, "56470"
+    const-string/jumbo v0, "56471"
+    const-string/jumbo v0, "56472"
+    const-string/jumbo v0, "56473"
+    const-string/jumbo v0, "56474"
+    const-string/jumbo v0, "56475"
+    const-string/jumbo v0, "56476"
+    const-string/jumbo v0, "56477"
+    const-string/jumbo v0, "56478"
+    const-string/jumbo v0, "56479"
+    const-string/jumbo v0, "56480"
+    const-string/jumbo v0, "56481"
+    const-string/jumbo v0, "56482"
+    const-string/jumbo v0, "56483"
+    const-string/jumbo v0, "56484"
+    const-string/jumbo v0, "56485"
+    const-string/jumbo v0, "56486"
+    const-string/jumbo v0, "56487"
+    const-string/jumbo v0, "56488"
+    const-string/jumbo v0, "56489"
+    const-string/jumbo v0, "56490"
+    const-string/jumbo v0, "56491"
+    const-string/jumbo v0, "56492"
+    const-string/jumbo v0, "56493"
+    const-string/jumbo v0, "56494"
+    const-string/jumbo v0, "56495"
+    const-string/jumbo v0, "56496"
+    const-string/jumbo v0, "56497"
+    const-string/jumbo v0, "56498"
+    const-string/jumbo v0, "56499"
+    const-string/jumbo v0, "56500"
+    const-string/jumbo v0, "56501"
+    const-string/jumbo v0, "56502"
+    const-string/jumbo v0, "56503"
+    const-string/jumbo v0, "56504"
+    const-string/jumbo v0, "56505"
+    const-string/jumbo v0, "56506"
+    const-string/jumbo v0, "56507"
+    const-string/jumbo v0, "56508"
+    const-string/jumbo v0, "56509"
+    const-string/jumbo v0, "56510"
+    const-string/jumbo v0, "56511"
+    const-string/jumbo v0, "56512"
+    const-string/jumbo v0, "56513"
+    const-string/jumbo v0, "56514"
+    const-string/jumbo v0, "56515"
+    const-string/jumbo v0, "56516"
+    const-string/jumbo v0, "56517"
+    const-string/jumbo v0, "56518"
+    const-string/jumbo v0, "56519"
+    const-string/jumbo v0, "56520"
+    const-string/jumbo v0, "56521"
+    const-string/jumbo v0, "56522"
+    const-string/jumbo v0, "56523"
+    const-string/jumbo v0, "56524"
+    const-string/jumbo v0, "56525"
+    const-string/jumbo v0, "56526"
+    const-string/jumbo v0, "56527"
+    const-string/jumbo v0, "56528"
+    const-string/jumbo v0, "56529"
+    const-string/jumbo v0, "56530"
+    const-string/jumbo v0, "56531"
+    const-string/jumbo v0, "56532"
+    const-string/jumbo v0, "56533"
+    const-string/jumbo v0, "56534"
+    const-string/jumbo v0, "56535"
+    const-string/jumbo v0, "56536"
+    const-string/jumbo v0, "56537"
+    const-string/jumbo v0, "56538"
+    const-string/jumbo v0, "56539"
+    const-string/jumbo v0, "56540"
+    const-string/jumbo v0, "56541"
+    const-string/jumbo v0, "56542"
+    const-string/jumbo v0, "56543"
+    const-string/jumbo v0, "56544"
+    const-string/jumbo v0, "56545"
+    const-string/jumbo v0, "56546"
+    const-string/jumbo v0, "56547"
+    const-string/jumbo v0, "56548"
+    const-string/jumbo v0, "56549"
+    const-string/jumbo v0, "56550"
+    const-string/jumbo v0, "56551"
+    const-string/jumbo v0, "56552"
+    const-string/jumbo v0, "56553"
+    const-string/jumbo v0, "56554"
+    const-string/jumbo v0, "56555"
+    const-string/jumbo v0, "56556"
+    const-string/jumbo v0, "56557"
+    const-string/jumbo v0, "56558"
+    const-string/jumbo v0, "56559"
+    const-string/jumbo v0, "56560"
+    const-string/jumbo v0, "56561"
+    const-string/jumbo v0, "56562"
+    const-string/jumbo v0, "56563"
+    const-string/jumbo v0, "56564"
+    const-string/jumbo v0, "56565"
+    const-string/jumbo v0, "56566"
+    const-string/jumbo v0, "56567"
+    const-string/jumbo v0, "56568"
+    const-string/jumbo v0, "56569"
+    const-string/jumbo v0, "56570"
+    const-string/jumbo v0, "56571"
+    const-string/jumbo v0, "56572"
+    const-string/jumbo v0, "56573"
+    const-string/jumbo v0, "56574"
+    const-string/jumbo v0, "56575"
+    const-string/jumbo v0, "56576"
+    const-string/jumbo v0, "56577"
+    const-string/jumbo v0, "56578"
+    const-string/jumbo v0, "56579"
+    const-string/jumbo v0, "56580"
+    const-string/jumbo v0, "56581"
+    const-string/jumbo v0, "56582"
+    const-string/jumbo v0, "56583"
+    const-string/jumbo v0, "56584"
+    const-string/jumbo v0, "56585"
+    const-string/jumbo v0, "56586"
+    const-string/jumbo v0, "56587"
+    const-string/jumbo v0, "56588"
+    const-string/jumbo v0, "56589"
+    const-string/jumbo v0, "56590"
+    const-string/jumbo v0, "56591"
+    const-string/jumbo v0, "56592"
+    const-string/jumbo v0, "56593"
+    const-string/jumbo v0, "56594"
+    const-string/jumbo v0, "56595"
+    const-string/jumbo v0, "56596"
+    const-string/jumbo v0, "56597"
+    const-string/jumbo v0, "56598"
+    const-string/jumbo v0, "56599"
+    const-string/jumbo v0, "56600"
+    const-string/jumbo v0, "56601"
+    const-string/jumbo v0, "56602"
+    const-string/jumbo v0, "56603"
+    const-string/jumbo v0, "56604"
+    const-string/jumbo v0, "56605"
+    const-string/jumbo v0, "56606"
+    const-string/jumbo v0, "56607"
+    const-string/jumbo v0, "56608"
+    const-string/jumbo v0, "56609"
+    const-string/jumbo v0, "56610"
+    const-string/jumbo v0, "56611"
+    const-string/jumbo v0, "56612"
+    const-string/jumbo v0, "56613"
+    const-string/jumbo v0, "56614"
+    const-string/jumbo v0, "56615"
+    const-string/jumbo v0, "56616"
+    const-string/jumbo v0, "56617"
+    const-string/jumbo v0, "56618"
+    const-string/jumbo v0, "56619"
+    const-string/jumbo v0, "56620"
+    const-string/jumbo v0, "56621"
+    const-string/jumbo v0, "56622"
+    const-string/jumbo v0, "56623"
+    const-string/jumbo v0, "56624"
+    const-string/jumbo v0, "56625"
+    const-string/jumbo v0, "56626"
+    const-string/jumbo v0, "56627"
+    const-string/jumbo v0, "56628"
+    const-string/jumbo v0, "56629"
+    const-string/jumbo v0, "56630"
+    const-string/jumbo v0, "56631"
+    const-string/jumbo v0, "56632"
+    const-string/jumbo v0, "56633"
+    const-string/jumbo v0, "56634"
+    const-string/jumbo v0, "56635"
+    const-string/jumbo v0, "56636"
+    const-string/jumbo v0, "56637"
+    const-string/jumbo v0, "56638"
+    const-string/jumbo v0, "56639"
+    const-string/jumbo v0, "56640"
+    const-string/jumbo v0, "56641"
+    const-string/jumbo v0, "56642"
+    const-string/jumbo v0, "56643"
+    const-string/jumbo v0, "56644"
+    const-string/jumbo v0, "56645"
+    const-string/jumbo v0, "56646"
+    const-string/jumbo v0, "56647"
+    const-string/jumbo v0, "56648"
+    const-string/jumbo v0, "56649"
+    const-string/jumbo v0, "56650"
+    const-string/jumbo v0, "56651"
+    const-string/jumbo v0, "56652"
+    const-string/jumbo v0, "56653"
+    const-string/jumbo v0, "56654"
+    const-string/jumbo v0, "56655"
+    const-string/jumbo v0, "56656"
+    const-string/jumbo v0, "56657"
+    const-string/jumbo v0, "56658"
+    const-string/jumbo v0, "56659"
+    const-string/jumbo v0, "56660"
+    const-string/jumbo v0, "56661"
+    const-string/jumbo v0, "56662"
+    const-string/jumbo v0, "56663"
+    const-string/jumbo v0, "56664"
+    const-string/jumbo v0, "56665"
+    const-string/jumbo v0, "56666"
+    const-string/jumbo v0, "56667"
+    const-string/jumbo v0, "56668"
+    const-string/jumbo v0, "56669"
+    const-string/jumbo v0, "56670"
+    const-string/jumbo v0, "56671"
+    const-string/jumbo v0, "56672"
+    const-string/jumbo v0, "56673"
+    const-string/jumbo v0, "56674"
+    const-string/jumbo v0, "56675"
+    const-string/jumbo v0, "56676"
+    const-string/jumbo v0, "56677"
+    const-string/jumbo v0, "56678"
+    const-string/jumbo v0, "56679"
+    const-string/jumbo v0, "56680"
+    const-string/jumbo v0, "56681"
+    const-string/jumbo v0, "56682"
+    const-string/jumbo v0, "56683"
+    const-string/jumbo v0, "56684"
+    const-string/jumbo v0, "56685"
+    const-string/jumbo v0, "56686"
+    const-string/jumbo v0, "56687"
+    const-string/jumbo v0, "56688"
+    const-string/jumbo v0, "56689"
+    const-string/jumbo v0, "56690"
+    const-string/jumbo v0, "56691"
+    const-string/jumbo v0, "56692"
+    const-string/jumbo v0, "56693"
+    const-string/jumbo v0, "56694"
+    const-string/jumbo v0, "56695"
+    const-string/jumbo v0, "56696"
+    const-string/jumbo v0, "56697"
+    const-string/jumbo v0, "56698"
+    const-string/jumbo v0, "56699"
+    const-string/jumbo v0, "56700"
+    const-string/jumbo v0, "56701"
+    const-string/jumbo v0, "56702"
+    const-string/jumbo v0, "56703"
+    const-string/jumbo v0, "56704"
+    const-string/jumbo v0, "56705"
+    const-string/jumbo v0, "56706"
+    const-string/jumbo v0, "56707"
+    const-string/jumbo v0, "56708"
+    const-string/jumbo v0, "56709"
+    const-string/jumbo v0, "56710"
+    const-string/jumbo v0, "56711"
+    const-string/jumbo v0, "56712"
+    const-string/jumbo v0, "56713"
+    const-string/jumbo v0, "56714"
+    const-string/jumbo v0, "56715"
+    const-string/jumbo v0, "56716"
+    const-string/jumbo v0, "56717"
+    const-string/jumbo v0, "56718"
+    const-string/jumbo v0, "56719"
+    const-string/jumbo v0, "56720"
+    const-string/jumbo v0, "56721"
+    const-string/jumbo v0, "56722"
+    const-string/jumbo v0, "56723"
+    const-string/jumbo v0, "56724"
+    const-string/jumbo v0, "56725"
+    const-string/jumbo v0, "56726"
+    const-string/jumbo v0, "56727"
+    const-string/jumbo v0, "56728"
+    const-string/jumbo v0, "56729"
+    const-string/jumbo v0, "56730"
+    const-string/jumbo v0, "56731"
+    const-string/jumbo v0, "56732"
+    const-string/jumbo v0, "56733"
+    const-string/jumbo v0, "56734"
+    const-string/jumbo v0, "56735"
+    const-string/jumbo v0, "56736"
+    const-string/jumbo v0, "56737"
+    const-string/jumbo v0, "56738"
+    const-string/jumbo v0, "56739"
+    const-string/jumbo v0, "56740"
+    const-string/jumbo v0, "56741"
+    const-string/jumbo v0, "56742"
+    const-string/jumbo v0, "56743"
+    const-string/jumbo v0, "56744"
+    const-string/jumbo v0, "56745"
+    const-string/jumbo v0, "56746"
+    const-string/jumbo v0, "56747"
+    const-string/jumbo v0, "56748"
+    const-string/jumbo v0, "56749"
+    const-string/jumbo v0, "56750"
+    const-string/jumbo v0, "56751"
+    const-string/jumbo v0, "56752"
+    const-string/jumbo v0, "56753"
+    const-string/jumbo v0, "56754"
+    const-string/jumbo v0, "56755"
+    const-string/jumbo v0, "56756"
+    const-string/jumbo v0, "56757"
+    const-string/jumbo v0, "56758"
+    const-string/jumbo v0, "56759"
+    const-string/jumbo v0, "56760"
+    const-string/jumbo v0, "56761"
+    const-string/jumbo v0, "56762"
+    const-string/jumbo v0, "56763"
+    const-string/jumbo v0, "56764"
+    const-string/jumbo v0, "56765"
+    const-string/jumbo v0, "56766"
+    const-string/jumbo v0, "56767"
+    const-string/jumbo v0, "56768"
+    const-string/jumbo v0, "56769"
+    const-string/jumbo v0, "56770"
+    const-string/jumbo v0, "56771"
+    const-string/jumbo v0, "56772"
+    const-string/jumbo v0, "56773"
+    const-string/jumbo v0, "56774"
+    const-string/jumbo v0, "56775"
+    const-string/jumbo v0, "56776"
+    const-string/jumbo v0, "56777"
+    const-string/jumbo v0, "56778"
+    const-string/jumbo v0, "56779"
+    const-string/jumbo v0, "56780"
+    const-string/jumbo v0, "56781"
+    const-string/jumbo v0, "56782"
+    const-string/jumbo v0, "56783"
+    const-string/jumbo v0, "56784"
+    const-string/jumbo v0, "56785"
+    const-string/jumbo v0, "56786"
+    const-string/jumbo v0, "56787"
+    const-string/jumbo v0, "56788"
+    const-string/jumbo v0, "56789"
+    const-string/jumbo v0, "56790"
+    const-string/jumbo v0, "56791"
+    const-string/jumbo v0, "56792"
+    const-string/jumbo v0, "56793"
+    const-string/jumbo v0, "56794"
+    const-string/jumbo v0, "56795"
+    const-string/jumbo v0, "56796"
+    const-string/jumbo v0, "56797"
+    const-string/jumbo v0, "56798"
+    const-string/jumbo v0, "56799"
+    const-string/jumbo v0, "56800"
+    const-string/jumbo v0, "56801"
+    const-string/jumbo v0, "56802"
+    const-string/jumbo v0, "56803"
+    const-string/jumbo v0, "56804"
+    const-string/jumbo v0, "56805"
+    const-string/jumbo v0, "56806"
+    const-string/jumbo v0, "56807"
+    const-string/jumbo v0, "56808"
+    const-string/jumbo v0, "56809"
+    const-string/jumbo v0, "56810"
+    const-string/jumbo v0, "56811"
+    const-string/jumbo v0, "56812"
+    const-string/jumbo v0, "56813"
+    const-string/jumbo v0, "56814"
+    const-string/jumbo v0, "56815"
+    const-string/jumbo v0, "56816"
+    const-string/jumbo v0, "56817"
+    const-string/jumbo v0, "56818"
+    const-string/jumbo v0, "56819"
+    const-string/jumbo v0, "56820"
+    const-string/jumbo v0, "56821"
+    const-string/jumbo v0, "56822"
+    const-string/jumbo v0, "56823"
+    const-string/jumbo v0, "56824"
+    const-string/jumbo v0, "56825"
+    const-string/jumbo v0, "56826"
+    const-string/jumbo v0, "56827"
+    const-string/jumbo v0, "56828"
+    const-string/jumbo v0, "56829"
+    const-string/jumbo v0, "56830"
+    const-string/jumbo v0, "56831"
+    const-string/jumbo v0, "56832"
+    const-string/jumbo v0, "56833"
+    const-string/jumbo v0, "56834"
+    const-string/jumbo v0, "56835"
+    const-string/jumbo v0, "56836"
+    const-string/jumbo v0, "56837"
+    const-string/jumbo v0, "56838"
+    const-string/jumbo v0, "56839"
+    const-string/jumbo v0, "56840"
+    const-string/jumbo v0, "56841"
+    const-string/jumbo v0, "56842"
+    const-string/jumbo v0, "56843"
+    const-string/jumbo v0, "56844"
+    const-string/jumbo v0, "56845"
+    const-string/jumbo v0, "56846"
+    const-string/jumbo v0, "56847"
+    const-string/jumbo v0, "56848"
+    const-string/jumbo v0, "56849"
+    const-string/jumbo v0, "56850"
+    const-string/jumbo v0, "56851"
+    const-string/jumbo v0, "56852"
+    const-string/jumbo v0, "56853"
+    const-string/jumbo v0, "56854"
+    const-string/jumbo v0, "56855"
+    const-string/jumbo v0, "56856"
+    const-string/jumbo v0, "56857"
+    const-string/jumbo v0, "56858"
+    const-string/jumbo v0, "56859"
+    const-string/jumbo v0, "56860"
+    const-string/jumbo v0, "56861"
+    const-string/jumbo v0, "56862"
+    const-string/jumbo v0, "56863"
+    const-string/jumbo v0, "56864"
+    const-string/jumbo v0, "56865"
+    const-string/jumbo v0, "56866"
+    const-string/jumbo v0, "56867"
+    const-string/jumbo v0, "56868"
+    const-string/jumbo v0, "56869"
+    const-string/jumbo v0, "56870"
+    const-string/jumbo v0, "56871"
+    const-string/jumbo v0, "56872"
+    const-string/jumbo v0, "56873"
+    const-string/jumbo v0, "56874"
+    const-string/jumbo v0, "56875"
+    const-string/jumbo v0, "56876"
+    const-string/jumbo v0, "56877"
+    const-string/jumbo v0, "56878"
+    const-string/jumbo v0, "56879"
+    const-string/jumbo v0, "56880"
+    const-string/jumbo v0, "56881"
+    const-string/jumbo v0, "56882"
+    const-string/jumbo v0, "56883"
+    const-string/jumbo v0, "56884"
+    const-string/jumbo v0, "56885"
+    const-string/jumbo v0, "56886"
+    const-string/jumbo v0, "56887"
+    const-string/jumbo v0, "56888"
+    const-string/jumbo v0, "56889"
+    const-string/jumbo v0, "56890"
+    const-string/jumbo v0, "56891"
+    const-string/jumbo v0, "56892"
+    const-string/jumbo v0, "56893"
+    const-string/jumbo v0, "56894"
+    const-string/jumbo v0, "56895"
+    const-string/jumbo v0, "56896"
+    const-string/jumbo v0, "56897"
+    const-string/jumbo v0, "56898"
+    const-string/jumbo v0, "56899"
+    const-string/jumbo v0, "56900"
+    const-string/jumbo v0, "56901"
+    const-string/jumbo v0, "56902"
+    const-string/jumbo v0, "56903"
+    const-string/jumbo v0, "56904"
+    const-string/jumbo v0, "56905"
+    const-string/jumbo v0, "56906"
+    const-string/jumbo v0, "56907"
+    const-string/jumbo v0, "56908"
+    const-string/jumbo v0, "56909"
+    const-string/jumbo v0, "56910"
+    const-string/jumbo v0, "56911"
+    const-string/jumbo v0, "56912"
+    const-string/jumbo v0, "56913"
+    const-string/jumbo v0, "56914"
+    const-string/jumbo v0, "56915"
+    const-string/jumbo v0, "56916"
+    const-string/jumbo v0, "56917"
+    const-string/jumbo v0, "56918"
+    const-string/jumbo v0, "56919"
+    const-string/jumbo v0, "56920"
+    const-string/jumbo v0, "56921"
+    const-string/jumbo v0, "56922"
+    const-string/jumbo v0, "56923"
+    const-string/jumbo v0, "56924"
+    const-string/jumbo v0, "56925"
+    const-string/jumbo v0, "56926"
+    const-string/jumbo v0, "56927"
+    const-string/jumbo v0, "56928"
+    const-string/jumbo v0, "56929"
+    const-string/jumbo v0, "56930"
+    const-string/jumbo v0, "56931"
+    const-string/jumbo v0, "56932"
+    const-string/jumbo v0, "56933"
+    const-string/jumbo v0, "56934"
+    const-string/jumbo v0, "56935"
+    const-string/jumbo v0, "56936"
+    const-string/jumbo v0, "56937"
+    const-string/jumbo v0, "56938"
+    const-string/jumbo v0, "56939"
+    const-string/jumbo v0, "56940"
+    const-string/jumbo v0, "56941"
+    const-string/jumbo v0, "56942"
+    const-string/jumbo v0, "56943"
+    const-string/jumbo v0, "56944"
+    const-string/jumbo v0, "56945"
+    const-string/jumbo v0, "56946"
+    const-string/jumbo v0, "56947"
+    const-string/jumbo v0, "56948"
+    const-string/jumbo v0, "56949"
+    const-string/jumbo v0, "56950"
+    const-string/jumbo v0, "56951"
+    const-string/jumbo v0, "56952"
+    const-string/jumbo v0, "56953"
+    const-string/jumbo v0, "56954"
+    const-string/jumbo v0, "56955"
+    const-string/jumbo v0, "56956"
+    const-string/jumbo v0, "56957"
+    const-string/jumbo v0, "56958"
+    const-string/jumbo v0, "56959"
+    const-string/jumbo v0, "56960"
+    const-string/jumbo v0, "56961"
+    const-string/jumbo v0, "56962"
+    const-string/jumbo v0, "56963"
+    const-string/jumbo v0, "56964"
+    const-string/jumbo v0, "56965"
+    const-string/jumbo v0, "56966"
+    const-string/jumbo v0, "56967"
+    const-string/jumbo v0, "56968"
+    const-string/jumbo v0, "56969"
+    const-string/jumbo v0, "56970"
+    const-string/jumbo v0, "56971"
+    const-string/jumbo v0, "56972"
+    const-string/jumbo v0, "56973"
+    const-string/jumbo v0, "56974"
+    const-string/jumbo v0, "56975"
+    const-string/jumbo v0, "56976"
+    const-string/jumbo v0, "56977"
+    const-string/jumbo v0, "56978"
+    const-string/jumbo v0, "56979"
+    const-string/jumbo v0, "56980"
+    const-string/jumbo v0, "56981"
+    const-string/jumbo v0, "56982"
+    const-string/jumbo v0, "56983"
+    const-string/jumbo v0, "56984"
+    const-string/jumbo v0, "56985"
+    const-string/jumbo v0, "56986"
+    const-string/jumbo v0, "56987"
+    const-string/jumbo v0, "56988"
+    const-string/jumbo v0, "56989"
+    const-string/jumbo v0, "56990"
+    const-string/jumbo v0, "56991"
+    const-string/jumbo v0, "56992"
+    const-string/jumbo v0, "56993"
+    const-string/jumbo v0, "56994"
+    const-string/jumbo v0, "56995"
+    const-string/jumbo v0, "56996"
+    const-string/jumbo v0, "56997"
+    const-string/jumbo v0, "56998"
+    const-string/jumbo v0, "56999"
+    const-string/jumbo v0, "57000"
+    const-string/jumbo v0, "57001"
+    const-string/jumbo v0, "57002"
+    const-string/jumbo v0, "57003"
+    const-string/jumbo v0, "57004"
+    const-string/jumbo v0, "57005"
+    const-string/jumbo v0, "57006"
+    const-string/jumbo v0, "57007"
+    const-string/jumbo v0, "57008"
+    const-string/jumbo v0, "57009"
+    const-string/jumbo v0, "57010"
+    const-string/jumbo v0, "57011"
+    const-string/jumbo v0, "57012"
+    const-string/jumbo v0, "57013"
+    const-string/jumbo v0, "57014"
+    const-string/jumbo v0, "57015"
+    const-string/jumbo v0, "57016"
+    const-string/jumbo v0, "57017"
+    const-string/jumbo v0, "57018"
+    const-string/jumbo v0, "57019"
+    const-string/jumbo v0, "57020"
+    const-string/jumbo v0, "57021"
+    const-string/jumbo v0, "57022"
+    const-string/jumbo v0, "57023"
+    const-string/jumbo v0, "57024"
+    const-string/jumbo v0, "57025"
+    const-string/jumbo v0, "57026"
+    const-string/jumbo v0, "57027"
+    const-string/jumbo v0, "57028"
+    const-string/jumbo v0, "57029"
+    const-string/jumbo v0, "57030"
+    const-string/jumbo v0, "57031"
+    const-string/jumbo v0, "57032"
+    const-string/jumbo v0, "57033"
+    const-string/jumbo v0, "57034"
+    const-string/jumbo v0, "57035"
+    const-string/jumbo v0, "57036"
+    const-string/jumbo v0, "57037"
+    const-string/jumbo v0, "57038"
+    const-string/jumbo v0, "57039"
+    const-string/jumbo v0, "57040"
+    const-string/jumbo v0, "57041"
+    const-string/jumbo v0, "57042"
+    const-string/jumbo v0, "57043"
+    const-string/jumbo v0, "57044"
+    const-string/jumbo v0, "57045"
+    const-string/jumbo v0, "57046"
+    const-string/jumbo v0, "57047"
+    const-string/jumbo v0, "57048"
+    const-string/jumbo v0, "57049"
+    const-string/jumbo v0, "57050"
+    const-string/jumbo v0, "57051"
+    const-string/jumbo v0, "57052"
+    const-string/jumbo v0, "57053"
+    const-string/jumbo v0, "57054"
+    const-string/jumbo v0, "57055"
+    const-string/jumbo v0, "57056"
+    const-string/jumbo v0, "57057"
+    const-string/jumbo v0, "57058"
+    const-string/jumbo v0, "57059"
+    const-string/jumbo v0, "57060"
+    const-string/jumbo v0, "57061"
+    const-string/jumbo v0, "57062"
+    const-string/jumbo v0, "57063"
+    const-string/jumbo v0, "57064"
+    const-string/jumbo v0, "57065"
+    const-string/jumbo v0, "57066"
+    const-string/jumbo v0, "57067"
+    const-string/jumbo v0, "57068"
+    const-string/jumbo v0, "57069"
+    const-string/jumbo v0, "57070"
+    const-string/jumbo v0, "57071"
+    const-string/jumbo v0, "57072"
+    const-string/jumbo v0, "57073"
+    const-string/jumbo v0, "57074"
+    const-string/jumbo v0, "57075"
+    const-string/jumbo v0, "57076"
+    const-string/jumbo v0, "57077"
+    const-string/jumbo v0, "57078"
+    const-string/jumbo v0, "57079"
+    const-string/jumbo v0, "57080"
+    const-string/jumbo v0, "57081"
+    const-string/jumbo v0, "57082"
+    const-string/jumbo v0, "57083"
+    const-string/jumbo v0, "57084"
+    const-string/jumbo v0, "57085"
+    const-string/jumbo v0, "57086"
+    const-string/jumbo v0, "57087"
+    const-string/jumbo v0, "57088"
+    const-string/jumbo v0, "57089"
+    const-string/jumbo v0, "57090"
+    const-string/jumbo v0, "57091"
+    const-string/jumbo v0, "57092"
+    const-string/jumbo v0, "57093"
+    const-string/jumbo v0, "57094"
+    const-string/jumbo v0, "57095"
+    const-string/jumbo v0, "57096"
+    const-string/jumbo v0, "57097"
+    const-string/jumbo v0, "57098"
+    const-string/jumbo v0, "57099"
+    const-string/jumbo v0, "57100"
+    const-string/jumbo v0, "57101"
+    const-string/jumbo v0, "57102"
+    const-string/jumbo v0, "57103"
+    const-string/jumbo v0, "57104"
+    const-string/jumbo v0, "57105"
+    const-string/jumbo v0, "57106"
+    const-string/jumbo v0, "57107"
+    const-string/jumbo v0, "57108"
+    const-string/jumbo v0, "57109"
+    const-string/jumbo v0, "57110"
+    const-string/jumbo v0, "57111"
+    const-string/jumbo v0, "57112"
+    const-string/jumbo v0, "57113"
+    const-string/jumbo v0, "57114"
+    const-string/jumbo v0, "57115"
+    const-string/jumbo v0, "57116"
+    const-string/jumbo v0, "57117"
+    const-string/jumbo v0, "57118"
+    const-string/jumbo v0, "57119"
+    const-string/jumbo v0, "57120"
+    const-string/jumbo v0, "57121"
+    const-string/jumbo v0, "57122"
+    const-string/jumbo v0, "57123"
+    const-string/jumbo v0, "57124"
+    const-string/jumbo v0, "57125"
+    const-string/jumbo v0, "57126"
+    const-string/jumbo v0, "57127"
+    const-string/jumbo v0, "57128"
+    const-string/jumbo v0, "57129"
+    const-string/jumbo v0, "57130"
+    const-string/jumbo v0, "57131"
+    const-string/jumbo v0, "57132"
+    const-string/jumbo v0, "57133"
+    const-string/jumbo v0, "57134"
+    const-string/jumbo v0, "57135"
+    const-string/jumbo v0, "57136"
+    const-string/jumbo v0, "57137"
+    const-string/jumbo v0, "57138"
+    const-string/jumbo v0, "57139"
+    const-string/jumbo v0, "57140"
+    const-string/jumbo v0, "57141"
+    const-string/jumbo v0, "57142"
+    const-string/jumbo v0, "57143"
+    const-string/jumbo v0, "57144"
+    const-string/jumbo v0, "57145"
+    const-string/jumbo v0, "57146"
+    const-string/jumbo v0, "57147"
+    const-string/jumbo v0, "57148"
+    const-string/jumbo v0, "57149"
+    const-string/jumbo v0, "57150"
+    const-string/jumbo v0, "57151"
+    const-string/jumbo v0, "57152"
+    const-string/jumbo v0, "57153"
+    const-string/jumbo v0, "57154"
+    const-string/jumbo v0, "57155"
+    const-string/jumbo v0, "57156"
+    const-string/jumbo v0, "57157"
+    const-string/jumbo v0, "57158"
+    const-string/jumbo v0, "57159"
+    const-string/jumbo v0, "57160"
+    const-string/jumbo v0, "57161"
+    const-string/jumbo v0, "57162"
+    const-string/jumbo v0, "57163"
+    const-string/jumbo v0, "57164"
+    const-string/jumbo v0, "57165"
+    const-string/jumbo v0, "57166"
+    const-string/jumbo v0, "57167"
+    const-string/jumbo v0, "57168"
+    const-string/jumbo v0, "57169"
+    const-string/jumbo v0, "57170"
+    const-string/jumbo v0, "57171"
+    const-string/jumbo v0, "57172"
+    const-string/jumbo v0, "57173"
+    const-string/jumbo v0, "57174"
+    const-string/jumbo v0, "57175"
+    const-string/jumbo v0, "57176"
+    const-string/jumbo v0, "57177"
+    const-string/jumbo v0, "57178"
+    const-string/jumbo v0, "57179"
+    const-string/jumbo v0, "57180"
+    const-string/jumbo v0, "57181"
+    const-string/jumbo v0, "57182"
+    const-string/jumbo v0, "57183"
+    const-string/jumbo v0, "57184"
+    const-string/jumbo v0, "57185"
+    const-string/jumbo v0, "57186"
+    const-string/jumbo v0, "57187"
+    const-string/jumbo v0, "57188"
+    const-string/jumbo v0, "57189"
+    const-string/jumbo v0, "57190"
+    const-string/jumbo v0, "57191"
+    const-string/jumbo v0, "57192"
+    const-string/jumbo v0, "57193"
+    const-string/jumbo v0, "57194"
+    const-string/jumbo v0, "57195"
+    const-string/jumbo v0, "57196"
+    const-string/jumbo v0, "57197"
+    const-string/jumbo v0, "57198"
+    const-string/jumbo v0, "57199"
+    const-string/jumbo v0, "57200"
+    const-string/jumbo v0, "57201"
+    const-string/jumbo v0, "57202"
+    const-string/jumbo v0, "57203"
+    const-string/jumbo v0, "57204"
+    const-string/jumbo v0, "57205"
+    const-string/jumbo v0, "57206"
+    const-string/jumbo v0, "57207"
+    const-string/jumbo v0, "57208"
+    const-string/jumbo v0, "57209"
+    const-string/jumbo v0, "57210"
+    const-string/jumbo v0, "57211"
+    const-string/jumbo v0, "57212"
+    const-string/jumbo v0, "57213"
+    const-string/jumbo v0, "57214"
+    const-string/jumbo v0, "57215"
+    const-string/jumbo v0, "57216"
+    const-string/jumbo v0, "57217"
+    const-string/jumbo v0, "57218"
+    const-string/jumbo v0, "57219"
+    const-string/jumbo v0, "57220"
+    const-string/jumbo v0, "57221"
+    const-string/jumbo v0, "57222"
+    const-string/jumbo v0, "57223"
+    const-string/jumbo v0, "57224"
+    const-string/jumbo v0, "57225"
+    const-string/jumbo v0, "57226"
+    const-string/jumbo v0, "57227"
+    const-string/jumbo v0, "57228"
+    const-string/jumbo v0, "57229"
+    const-string/jumbo v0, "57230"
+    const-string/jumbo v0, "57231"
+    const-string/jumbo v0, "57232"
+    const-string/jumbo v0, "57233"
+    const-string/jumbo v0, "57234"
+    const-string/jumbo v0, "57235"
+    const-string/jumbo v0, "57236"
+    const-string/jumbo v0, "57237"
+    const-string/jumbo v0, "57238"
+    const-string/jumbo v0, "57239"
+    const-string/jumbo v0, "57240"
+    const-string/jumbo v0, "57241"
+    const-string/jumbo v0, "57242"
+    const-string/jumbo v0, "57243"
+    const-string/jumbo v0, "57244"
+    const-string/jumbo v0, "57245"
+    const-string/jumbo v0, "57246"
+    const-string/jumbo v0, "57247"
+    const-string/jumbo v0, "57248"
+    const-string/jumbo v0, "57249"
+    const-string/jumbo v0, "57250"
+    const-string/jumbo v0, "57251"
+    const-string/jumbo v0, "57252"
+    const-string/jumbo v0, "57253"
+    const-string/jumbo v0, "57254"
+    const-string/jumbo v0, "57255"
+    const-string/jumbo v0, "57256"
+    const-string/jumbo v0, "57257"
+    const-string/jumbo v0, "57258"
+    const-string/jumbo v0, "57259"
+    const-string/jumbo v0, "57260"
+    const-string/jumbo v0, "57261"
+    const-string/jumbo v0, "57262"
+    const-string/jumbo v0, "57263"
+    const-string/jumbo v0, "57264"
+    const-string/jumbo v0, "57265"
+    const-string/jumbo v0, "57266"
+    const-string/jumbo v0, "57267"
+    const-string/jumbo v0, "57268"
+    const-string/jumbo v0, "57269"
+    const-string/jumbo v0, "57270"
+    const-string/jumbo v0, "57271"
+    const-string/jumbo v0, "57272"
+    const-string/jumbo v0, "57273"
+    const-string/jumbo v0, "57274"
+    const-string/jumbo v0, "57275"
+    const-string/jumbo v0, "57276"
+    const-string/jumbo v0, "57277"
+    const-string/jumbo v0, "57278"
+    const-string/jumbo v0, "57279"
+    const-string/jumbo v0, "57280"
+    const-string/jumbo v0, "57281"
+    const-string/jumbo v0, "57282"
+    const-string/jumbo v0, "57283"
+    const-string/jumbo v0, "57284"
+    const-string/jumbo v0, "57285"
+    const-string/jumbo v0, "57286"
+    const-string/jumbo v0, "57287"
+    const-string/jumbo v0, "57288"
+    const-string/jumbo v0, "57289"
+    const-string/jumbo v0, "57290"
+    const-string/jumbo v0, "57291"
+    const-string/jumbo v0, "57292"
+    const-string/jumbo v0, "57293"
+    const-string/jumbo v0, "57294"
+    const-string/jumbo v0, "57295"
+    const-string/jumbo v0, "57296"
+    const-string/jumbo v0, "57297"
+    const-string/jumbo v0, "57298"
+    const-string/jumbo v0, "57299"
+    const-string/jumbo v0, "57300"
+    const-string/jumbo v0, "57301"
+    const-string/jumbo v0, "57302"
+    const-string/jumbo v0, "57303"
+    const-string/jumbo v0, "57304"
+    const-string/jumbo v0, "57305"
+    const-string/jumbo v0, "57306"
+    const-string/jumbo v0, "57307"
+    const-string/jumbo v0, "57308"
+    const-string/jumbo v0, "57309"
+    const-string/jumbo v0, "57310"
+    const-string/jumbo v0, "57311"
+    const-string/jumbo v0, "57312"
+    const-string/jumbo v0, "57313"
+    const-string/jumbo v0, "57314"
+    const-string/jumbo v0, "57315"
+    const-string/jumbo v0, "57316"
+    const-string/jumbo v0, "57317"
+    const-string/jumbo v0, "57318"
+    const-string/jumbo v0, "57319"
+    const-string/jumbo v0, "57320"
+    const-string/jumbo v0, "57321"
+    const-string/jumbo v0, "57322"
+    const-string/jumbo v0, "57323"
+    const-string/jumbo v0, "57324"
+    const-string/jumbo v0, "57325"
+    const-string/jumbo v0, "57326"
+    const-string/jumbo v0, "57327"
+    const-string/jumbo v0, "57328"
+    const-string/jumbo v0, "57329"
+    const-string/jumbo v0, "57330"
+    const-string/jumbo v0, "57331"
+    const-string/jumbo v0, "57332"
+    const-string/jumbo v0, "57333"
+    const-string/jumbo v0, "57334"
+    const-string/jumbo v0, "57335"
+    const-string/jumbo v0, "57336"
+    const-string/jumbo v0, "57337"
+    const-string/jumbo v0, "57338"
+    const-string/jumbo v0, "57339"
+    const-string/jumbo v0, "57340"
+    const-string/jumbo v0, "57341"
+    const-string/jumbo v0, "57342"
+    const-string/jumbo v0, "57343"
+    const-string/jumbo v0, "57344"
+    const-string/jumbo v0, "57345"
+    const-string/jumbo v0, "57346"
+    const-string/jumbo v0, "57347"
+    const-string/jumbo v0, "57348"
+    const-string/jumbo v0, "57349"
+    const-string/jumbo v0, "57350"
+    const-string/jumbo v0, "57351"
+    const-string/jumbo v0, "57352"
+    const-string/jumbo v0, "57353"
+    const-string/jumbo v0, "57354"
+    const-string/jumbo v0, "57355"
+    const-string/jumbo v0, "57356"
+    const-string/jumbo v0, "57357"
+    const-string/jumbo v0, "57358"
+    const-string/jumbo v0, "57359"
+    const-string/jumbo v0, "57360"
+    const-string/jumbo v0, "57361"
+    const-string/jumbo v0, "57362"
+    const-string/jumbo v0, "57363"
+    const-string/jumbo v0, "57364"
+    const-string/jumbo v0, "57365"
+    const-string/jumbo v0, "57366"
+    const-string/jumbo v0, "57367"
+    const-string/jumbo v0, "57368"
+    const-string/jumbo v0, "57369"
+    const-string/jumbo v0, "57370"
+    const-string/jumbo v0, "57371"
+    const-string/jumbo v0, "57372"
+    const-string/jumbo v0, "57373"
+    const-string/jumbo v0, "57374"
+    const-string/jumbo v0, "57375"
+    const-string/jumbo v0, "57376"
+    const-string/jumbo v0, "57377"
+    const-string/jumbo v0, "57378"
+    const-string/jumbo v0, "57379"
+    const-string/jumbo v0, "57380"
+    const-string/jumbo v0, "57381"
+    const-string/jumbo v0, "57382"
+    const-string/jumbo v0, "57383"
+    const-string/jumbo v0, "57384"
+    const-string/jumbo v0, "57385"
+    const-string/jumbo v0, "57386"
+    const-string/jumbo v0, "57387"
+    const-string/jumbo v0, "57388"
+    const-string/jumbo v0, "57389"
+    const-string/jumbo v0, "57390"
+    const-string/jumbo v0, "57391"
+    const-string/jumbo v0, "57392"
+    const-string/jumbo v0, "57393"
+    const-string/jumbo v0, "57394"
+    const-string/jumbo v0, "57395"
+    const-string/jumbo v0, "57396"
+    const-string/jumbo v0, "57397"
+    const-string/jumbo v0, "57398"
+    const-string/jumbo v0, "57399"
+    const-string/jumbo v0, "57400"
+    const-string/jumbo v0, "57401"
+    const-string/jumbo v0, "57402"
+    const-string/jumbo v0, "57403"
+    const-string/jumbo v0, "57404"
+    const-string/jumbo v0, "57405"
+    const-string/jumbo v0, "57406"
+    const-string/jumbo v0, "57407"
+    const-string/jumbo v0, "57408"
+    const-string/jumbo v0, "57409"
+    const-string/jumbo v0, "57410"
+    const-string/jumbo v0, "57411"
+    const-string/jumbo v0, "57412"
+    const-string/jumbo v0, "57413"
+    const-string/jumbo v0, "57414"
+    const-string/jumbo v0, "57415"
+    const-string/jumbo v0, "57416"
+    const-string/jumbo v0, "57417"
+    const-string/jumbo v0, "57418"
+    const-string/jumbo v0, "57419"
+    const-string/jumbo v0, "57420"
+    const-string/jumbo v0, "57421"
+    const-string/jumbo v0, "57422"
+    const-string/jumbo v0, "57423"
+    const-string/jumbo v0, "57424"
+    const-string/jumbo v0, "57425"
+    const-string/jumbo v0, "57426"
+    const-string/jumbo v0, "57427"
+    const-string/jumbo v0, "57428"
+    const-string/jumbo v0, "57429"
+    const-string/jumbo v0, "57430"
+    const-string/jumbo v0, "57431"
+    const-string/jumbo v0, "57432"
+    const-string/jumbo v0, "57433"
+    const-string/jumbo v0, "57434"
+    const-string/jumbo v0, "57435"
+    const-string/jumbo v0, "57436"
+    const-string/jumbo v0, "57437"
+    const-string/jumbo v0, "57438"
+    const-string/jumbo v0, "57439"
+    const-string/jumbo v0, "57440"
+    const-string/jumbo v0, "57441"
+    const-string/jumbo v0, "57442"
+    const-string/jumbo v0, "57443"
+    const-string/jumbo v0, "57444"
+    const-string/jumbo v0, "57445"
+    const-string/jumbo v0, "57446"
+    const-string/jumbo v0, "57447"
+    const-string/jumbo v0, "57448"
+    const-string/jumbo v0, "57449"
+    const-string/jumbo v0, "57450"
+    const-string/jumbo v0, "57451"
+    const-string/jumbo v0, "57452"
+    const-string/jumbo v0, "57453"
+    const-string/jumbo v0, "57454"
+    const-string/jumbo v0, "57455"
+    const-string/jumbo v0, "57456"
+    const-string/jumbo v0, "57457"
+    const-string/jumbo v0, "57458"
+    const-string/jumbo v0, "57459"
+    const-string/jumbo v0, "57460"
+    const-string/jumbo v0, "57461"
+    const-string/jumbo v0, "57462"
+    const-string/jumbo v0, "57463"
+    const-string/jumbo v0, "57464"
+    const-string/jumbo v0, "57465"
+    const-string/jumbo v0, "57466"
+    const-string/jumbo v0, "57467"
+    const-string/jumbo v0, "57468"
+    const-string/jumbo v0, "57469"
+    const-string/jumbo v0, "57470"
+    const-string/jumbo v0, "57471"
+    const-string/jumbo v0, "57472"
+    const-string/jumbo v0, "57473"
+    const-string/jumbo v0, "57474"
+    const-string/jumbo v0, "57475"
+    const-string/jumbo v0, "57476"
+    const-string/jumbo v0, "57477"
+    const-string/jumbo v0, "57478"
+    const-string/jumbo v0, "57479"
+    const-string/jumbo v0, "57480"
+    const-string/jumbo v0, "57481"
+    const-string/jumbo v0, "57482"
+    const-string/jumbo v0, "57483"
+    const-string/jumbo v0, "57484"
+    const-string/jumbo v0, "57485"
+    const-string/jumbo v0, "57486"
+    const-string/jumbo v0, "57487"
+    const-string/jumbo v0, "57488"
+    const-string/jumbo v0, "57489"
+    const-string/jumbo v0, "57490"
+    const-string/jumbo v0, "57491"
+    const-string/jumbo v0, "57492"
+    const-string/jumbo v0, "57493"
+    const-string/jumbo v0, "57494"
+    const-string/jumbo v0, "57495"
+    const-string/jumbo v0, "57496"
+    const-string/jumbo v0, "57497"
+    const-string/jumbo v0, "57498"
+    const-string/jumbo v0, "57499"
+    const-string/jumbo v0, "57500"
+    const-string/jumbo v0, "57501"
+    const-string/jumbo v0, "57502"
+    const-string/jumbo v0, "57503"
+    const-string/jumbo v0, "57504"
+    const-string/jumbo v0, "57505"
+    const-string/jumbo v0, "57506"
+    const-string/jumbo v0, "57507"
+    const-string/jumbo v0, "57508"
+    const-string/jumbo v0, "57509"
+    const-string/jumbo v0, "57510"
+    const-string/jumbo v0, "57511"
+    const-string/jumbo v0, "57512"
+    const-string/jumbo v0, "57513"
+    const-string/jumbo v0, "57514"
+    const-string/jumbo v0, "57515"
+    const-string/jumbo v0, "57516"
+    const-string/jumbo v0, "57517"
+    const-string/jumbo v0, "57518"
+    const-string/jumbo v0, "57519"
+    const-string/jumbo v0, "57520"
+    const-string/jumbo v0, "57521"
+    const-string/jumbo v0, "57522"
+    const-string/jumbo v0, "57523"
+    const-string/jumbo v0, "57524"
+    const-string/jumbo v0, "57525"
+    const-string/jumbo v0, "57526"
+    const-string/jumbo v0, "57527"
+    const-string/jumbo v0, "57528"
+    const-string/jumbo v0, "57529"
+    const-string/jumbo v0, "57530"
+    const-string/jumbo v0, "57531"
+    const-string/jumbo v0, "57532"
+    const-string/jumbo v0, "57533"
+    const-string/jumbo v0, "57534"
+    const-string/jumbo v0, "57535"
+    const-string/jumbo v0, "57536"
+    const-string/jumbo v0, "57537"
+    const-string/jumbo v0, "57538"
+    const-string/jumbo v0, "57539"
+    const-string/jumbo v0, "57540"
+    const-string/jumbo v0, "57541"
+    const-string/jumbo v0, "57542"
+    const-string/jumbo v0, "57543"
+    const-string/jumbo v0, "57544"
+    const-string/jumbo v0, "57545"
+    const-string/jumbo v0, "57546"
+    const-string/jumbo v0, "57547"
+    const-string/jumbo v0, "57548"
+    const-string/jumbo v0, "57549"
+    const-string/jumbo v0, "57550"
+    const-string/jumbo v0, "57551"
+    const-string/jumbo v0, "57552"
+    const-string/jumbo v0, "57553"
+    const-string/jumbo v0, "57554"
+    const-string/jumbo v0, "57555"
+    const-string/jumbo v0, "57556"
+    const-string/jumbo v0, "57557"
+    const-string/jumbo v0, "57558"
+    const-string/jumbo v0, "57559"
+    const-string/jumbo v0, "57560"
+    const-string/jumbo v0, "57561"
+    const-string/jumbo v0, "57562"
+    const-string/jumbo v0, "57563"
+    const-string/jumbo v0, "57564"
+    const-string/jumbo v0, "57565"
+    const-string/jumbo v0, "57566"
+    const-string/jumbo v0, "57567"
+    const-string/jumbo v0, "57568"
+    const-string/jumbo v0, "57569"
+    const-string/jumbo v0, "57570"
+    const-string/jumbo v0, "57571"
+    const-string/jumbo v0, "57572"
+    const-string/jumbo v0, "57573"
+    const-string/jumbo v0, "57574"
+    const-string/jumbo v0, "57575"
+    const-string/jumbo v0, "57576"
+    const-string/jumbo v0, "57577"
+    const-string/jumbo v0, "57578"
+    const-string/jumbo v0, "57579"
+    const-string/jumbo v0, "57580"
+    const-string/jumbo v0, "57581"
+    const-string/jumbo v0, "57582"
+    const-string/jumbo v0, "57583"
+    const-string/jumbo v0, "57584"
+    const-string/jumbo v0, "57585"
+    const-string/jumbo v0, "57586"
+    const-string/jumbo v0, "57587"
+    const-string/jumbo v0, "57588"
+    const-string/jumbo v0, "57589"
+    const-string/jumbo v0, "57590"
+    const-string/jumbo v0, "57591"
+    const-string/jumbo v0, "57592"
+    const-string/jumbo v0, "57593"
+    const-string/jumbo v0, "57594"
+    const-string/jumbo v0, "57595"
+    const-string/jumbo v0, "57596"
+    const-string/jumbo v0, "57597"
+    const-string/jumbo v0, "57598"
+    const-string/jumbo v0, "57599"
+    const-string/jumbo v0, "57600"
+    const-string/jumbo v0, "57601"
+    const-string/jumbo v0, "57602"
+    const-string/jumbo v0, "57603"
+    const-string/jumbo v0, "57604"
+    const-string/jumbo v0, "57605"
+    const-string/jumbo v0, "57606"
+    const-string/jumbo v0, "57607"
+    const-string/jumbo v0, "57608"
+    const-string/jumbo v0, "57609"
+    const-string/jumbo v0, "57610"
+    const-string/jumbo v0, "57611"
+    const-string/jumbo v0, "57612"
+    const-string/jumbo v0, "57613"
+    const-string/jumbo v0, "57614"
+    const-string/jumbo v0, "57615"
+    const-string/jumbo v0, "57616"
+    const-string/jumbo v0, "57617"
+    const-string/jumbo v0, "57618"
+    const-string/jumbo v0, "57619"
+    const-string/jumbo v0, "57620"
+    const-string/jumbo v0, "57621"
+    const-string/jumbo v0, "57622"
+    const-string/jumbo v0, "57623"
+    const-string/jumbo v0, "57624"
+    const-string/jumbo v0, "57625"
+    const-string/jumbo v0, "57626"
+    const-string/jumbo v0, "57627"
+    const-string/jumbo v0, "57628"
+    const-string/jumbo v0, "57629"
+    const-string/jumbo v0, "57630"
+    const-string/jumbo v0, "57631"
+    const-string/jumbo v0, "57632"
+    const-string/jumbo v0, "57633"
+    const-string/jumbo v0, "57634"
+    const-string/jumbo v0, "57635"
+    const-string/jumbo v0, "57636"
+    const-string/jumbo v0, "57637"
+    const-string/jumbo v0, "57638"
+    const-string/jumbo v0, "57639"
+    const-string/jumbo v0, "57640"
+    const-string/jumbo v0, "57641"
+    const-string/jumbo v0, "57642"
+    const-string/jumbo v0, "57643"
+    const-string/jumbo v0, "57644"
+    const-string/jumbo v0, "57645"
+    const-string/jumbo v0, "57646"
+    const-string/jumbo v0, "57647"
+    const-string/jumbo v0, "57648"
+    const-string/jumbo v0, "57649"
+    const-string/jumbo v0, "57650"
+    const-string/jumbo v0, "57651"
+    const-string/jumbo v0, "57652"
+    const-string/jumbo v0, "57653"
+    const-string/jumbo v0, "57654"
+    const-string/jumbo v0, "57655"
+    const-string/jumbo v0, "57656"
+    const-string/jumbo v0, "57657"
+    const-string/jumbo v0, "57658"
+    const-string/jumbo v0, "57659"
+    const-string/jumbo v0, "57660"
+    const-string/jumbo v0, "57661"
+    const-string/jumbo v0, "57662"
+    const-string/jumbo v0, "57663"
+    const-string/jumbo v0, "57664"
+    const-string/jumbo v0, "57665"
+    const-string/jumbo v0, "57666"
+    const-string/jumbo v0, "57667"
+    const-string/jumbo v0, "57668"
+    const-string/jumbo v0, "57669"
+    const-string/jumbo v0, "57670"
+    const-string/jumbo v0, "57671"
+    const-string/jumbo v0, "57672"
+    const-string/jumbo v0, "57673"
+    const-string/jumbo v0, "57674"
+    const-string/jumbo v0, "57675"
+    const-string/jumbo v0, "57676"
+    const-string/jumbo v0, "57677"
+    const-string/jumbo v0, "57678"
+    const-string/jumbo v0, "57679"
+    const-string/jumbo v0, "57680"
+    const-string/jumbo v0, "57681"
+    const-string/jumbo v0, "57682"
+    const-string/jumbo v0, "57683"
+    const-string/jumbo v0, "57684"
+    const-string/jumbo v0, "57685"
+    const-string/jumbo v0, "57686"
+    const-string/jumbo v0, "57687"
+    const-string/jumbo v0, "57688"
+    const-string/jumbo v0, "57689"
+    const-string/jumbo v0, "57690"
+    const-string/jumbo v0, "57691"
+    const-string/jumbo v0, "57692"
+    const-string/jumbo v0, "57693"
+    const-string/jumbo v0, "57694"
+    const-string/jumbo v0, "57695"
+    const-string/jumbo v0, "57696"
+    const-string/jumbo v0, "57697"
+    const-string/jumbo v0, "57698"
+    const-string/jumbo v0, "57699"
+    const-string/jumbo v0, "57700"
+    const-string/jumbo v0, "57701"
+    const-string/jumbo v0, "57702"
+    const-string/jumbo v0, "57703"
+    const-string/jumbo v0, "57704"
+    const-string/jumbo v0, "57705"
+    const-string/jumbo v0, "57706"
+    const-string/jumbo v0, "57707"
+    const-string/jumbo v0, "57708"
+    const-string/jumbo v0, "57709"
+    const-string/jumbo v0, "57710"
+    const-string/jumbo v0, "57711"
+    const-string/jumbo v0, "57712"
+    const-string/jumbo v0, "57713"
+    const-string/jumbo v0, "57714"
+    const-string/jumbo v0, "57715"
+    const-string/jumbo v0, "57716"
+    const-string/jumbo v0, "57717"
+    const-string/jumbo v0, "57718"
+    const-string/jumbo v0, "57719"
+    const-string/jumbo v0, "57720"
+    const-string/jumbo v0, "57721"
+    const-string/jumbo v0, "57722"
+    const-string/jumbo v0, "57723"
+    const-string/jumbo v0, "57724"
+    const-string/jumbo v0, "57725"
+    const-string/jumbo v0, "57726"
+    const-string/jumbo v0, "57727"
+    const-string/jumbo v0, "57728"
+    const-string/jumbo v0, "57729"
+    const-string/jumbo v0, "57730"
+    const-string/jumbo v0, "57731"
+    const-string/jumbo v0, "57732"
+    const-string/jumbo v0, "57733"
+    const-string/jumbo v0, "57734"
+    const-string/jumbo v0, "57735"
+    const-string/jumbo v0, "57736"
+    const-string/jumbo v0, "57737"
+    const-string/jumbo v0, "57738"
+    const-string/jumbo v0, "57739"
+    const-string/jumbo v0, "57740"
+    const-string/jumbo v0, "57741"
+    const-string/jumbo v0, "57742"
+    const-string/jumbo v0, "57743"
+    const-string/jumbo v0, "57744"
+    const-string/jumbo v0, "57745"
+    const-string/jumbo v0, "57746"
+    const-string/jumbo v0, "57747"
+    const-string/jumbo v0, "57748"
+    const-string/jumbo v0, "57749"
+    const-string/jumbo v0, "57750"
+    const-string/jumbo v0, "57751"
+    const-string/jumbo v0, "57752"
+    const-string/jumbo v0, "57753"
+    const-string/jumbo v0, "57754"
+    const-string/jumbo v0, "57755"
+    const-string/jumbo v0, "57756"
+    const-string/jumbo v0, "57757"
+    const-string/jumbo v0, "57758"
+    const-string/jumbo v0, "57759"
+    const-string/jumbo v0, "57760"
+    const-string/jumbo v0, "57761"
+    const-string/jumbo v0, "57762"
+    const-string/jumbo v0, "57763"
+    const-string/jumbo v0, "57764"
+    const-string/jumbo v0, "57765"
+    const-string/jumbo v0, "57766"
+    const-string/jumbo v0, "57767"
+    const-string/jumbo v0, "57768"
+    const-string/jumbo v0, "57769"
+    const-string/jumbo v0, "57770"
+    const-string/jumbo v0, "57771"
+    const-string/jumbo v0, "57772"
+    const-string/jumbo v0, "57773"
+    const-string/jumbo v0, "57774"
+    const-string/jumbo v0, "57775"
+    const-string/jumbo v0, "57776"
+    const-string/jumbo v0, "57777"
+    const-string/jumbo v0, "57778"
+    const-string/jumbo v0, "57779"
+    const-string/jumbo v0, "57780"
+    const-string/jumbo v0, "57781"
+    const-string/jumbo v0, "57782"
+    const-string/jumbo v0, "57783"
+    const-string/jumbo v0, "57784"
+    const-string/jumbo v0, "57785"
+    const-string/jumbo v0, "57786"
+    const-string/jumbo v0, "57787"
+    const-string/jumbo v0, "57788"
+    const-string/jumbo v0, "57789"
+    const-string/jumbo v0, "57790"
+    const-string/jumbo v0, "57791"
+    const-string/jumbo v0, "57792"
+    const-string/jumbo v0, "57793"
+    const-string/jumbo v0, "57794"
+    const-string/jumbo v0, "57795"
+    const-string/jumbo v0, "57796"
+    const-string/jumbo v0, "57797"
+    const-string/jumbo v0, "57798"
+    const-string/jumbo v0, "57799"
+    const-string/jumbo v0, "57800"
+    const-string/jumbo v0, "57801"
+    const-string/jumbo v0, "57802"
+    const-string/jumbo v0, "57803"
+    const-string/jumbo v0, "57804"
+    const-string/jumbo v0, "57805"
+    const-string/jumbo v0, "57806"
+    const-string/jumbo v0, "57807"
+    const-string/jumbo v0, "57808"
+    const-string/jumbo v0, "57809"
+    const-string/jumbo v0, "57810"
+    const-string/jumbo v0, "57811"
+    const-string/jumbo v0, "57812"
+    const-string/jumbo v0, "57813"
+    const-string/jumbo v0, "57814"
+    const-string/jumbo v0, "57815"
+    const-string/jumbo v0, "57816"
+    const-string/jumbo v0, "57817"
+    const-string/jumbo v0, "57818"
+    const-string/jumbo v0, "57819"
+    const-string/jumbo v0, "57820"
+    const-string/jumbo v0, "57821"
+    const-string/jumbo v0, "57822"
+    const-string/jumbo v0, "57823"
+    const-string/jumbo v0, "57824"
+    const-string/jumbo v0, "57825"
+    const-string/jumbo v0, "57826"
+    const-string/jumbo v0, "57827"
+    const-string/jumbo v0, "57828"
+    const-string/jumbo v0, "57829"
+    const-string/jumbo v0, "57830"
+    const-string/jumbo v0, "57831"
+    const-string/jumbo v0, "57832"
+    const-string/jumbo v0, "57833"
+    const-string/jumbo v0, "57834"
+    const-string/jumbo v0, "57835"
+    const-string/jumbo v0, "57836"
+    const-string/jumbo v0, "57837"
+    const-string/jumbo v0, "57838"
+    const-string/jumbo v0, "57839"
+    const-string/jumbo v0, "57840"
+    const-string/jumbo v0, "57841"
+    const-string/jumbo v0, "57842"
+    const-string/jumbo v0, "57843"
+    const-string/jumbo v0, "57844"
+    const-string/jumbo v0, "57845"
+    const-string/jumbo v0, "57846"
+    const-string/jumbo v0, "57847"
+    const-string/jumbo v0, "57848"
+    const-string/jumbo v0, "57849"
+    const-string/jumbo v0, "57850"
+    const-string/jumbo v0, "57851"
+    const-string/jumbo v0, "57852"
+    const-string/jumbo v0, "57853"
+    const-string/jumbo v0, "57854"
+    const-string/jumbo v0, "57855"
+    const-string/jumbo v0, "57856"
+    const-string/jumbo v0, "57857"
+    const-string/jumbo v0, "57858"
+    const-string/jumbo v0, "57859"
+    const-string/jumbo v0, "57860"
+    const-string/jumbo v0, "57861"
+    const-string/jumbo v0, "57862"
+    const-string/jumbo v0, "57863"
+    const-string/jumbo v0, "57864"
+    const-string/jumbo v0, "57865"
+    const-string/jumbo v0, "57866"
+    const-string/jumbo v0, "57867"
+    const-string/jumbo v0, "57868"
+    const-string/jumbo v0, "57869"
+    const-string/jumbo v0, "57870"
+    const-string/jumbo v0, "57871"
+    const-string/jumbo v0, "57872"
+    const-string/jumbo v0, "57873"
+    const-string/jumbo v0, "57874"
+    const-string/jumbo v0, "57875"
+    const-string/jumbo v0, "57876"
+    const-string/jumbo v0, "57877"
+    const-string/jumbo v0, "57878"
+    const-string/jumbo v0, "57879"
+    const-string/jumbo v0, "57880"
+    const-string/jumbo v0, "57881"
+    const-string/jumbo v0, "57882"
+    const-string/jumbo v0, "57883"
+    const-string/jumbo v0, "57884"
+    const-string/jumbo v0, "57885"
+    const-string/jumbo v0, "57886"
+    const-string/jumbo v0, "57887"
+    const-string/jumbo v0, "57888"
+    const-string/jumbo v0, "57889"
+    const-string/jumbo v0, "57890"
+    const-string/jumbo v0, "57891"
+    const-string/jumbo v0, "57892"
+    const-string/jumbo v0, "57893"
+    const-string/jumbo v0, "57894"
+    const-string/jumbo v0, "57895"
+    const-string/jumbo v0, "57896"
+    const-string/jumbo v0, "57897"
+    const-string/jumbo v0, "57898"
+    const-string/jumbo v0, "57899"
+    const-string/jumbo v0, "57900"
+    const-string/jumbo v0, "57901"
+    const-string/jumbo v0, "57902"
+    const-string/jumbo v0, "57903"
+    const-string/jumbo v0, "57904"
+    const-string/jumbo v0, "57905"
+    const-string/jumbo v0, "57906"
+    const-string/jumbo v0, "57907"
+    const-string/jumbo v0, "57908"
+    const-string/jumbo v0, "57909"
+    const-string/jumbo v0, "57910"
+    const-string/jumbo v0, "57911"
+    const-string/jumbo v0, "57912"
+    const-string/jumbo v0, "57913"
+    const-string/jumbo v0, "57914"
+    const-string/jumbo v0, "57915"
+    const-string/jumbo v0, "57916"
+    const-string/jumbo v0, "57917"
+    const-string/jumbo v0, "57918"
+    const-string/jumbo v0, "57919"
+    const-string/jumbo v0, "57920"
+    const-string/jumbo v0, "57921"
+    const-string/jumbo v0, "57922"
+    const-string/jumbo v0, "57923"
+    const-string/jumbo v0, "57924"
+    const-string/jumbo v0, "57925"
+    const-string/jumbo v0, "57926"
+    const-string/jumbo v0, "57927"
+    const-string/jumbo v0, "57928"
+    const-string/jumbo v0, "57929"
+    const-string/jumbo v0, "57930"
+    const-string/jumbo v0, "57931"
+    const-string/jumbo v0, "57932"
+    const-string/jumbo v0, "57933"
+    const-string/jumbo v0, "57934"
+    const-string/jumbo v0, "57935"
+    const-string/jumbo v0, "57936"
+    const-string/jumbo v0, "57937"
+    const-string/jumbo v0, "57938"
+    const-string/jumbo v0, "57939"
+    const-string/jumbo v0, "57940"
+    const-string/jumbo v0, "57941"
+    const-string/jumbo v0, "57942"
+    const-string/jumbo v0, "57943"
+    const-string/jumbo v0, "57944"
+    const-string/jumbo v0, "57945"
+    const-string/jumbo v0, "57946"
+    const-string/jumbo v0, "57947"
+    const-string/jumbo v0, "57948"
+    const-string/jumbo v0, "57949"
+    const-string/jumbo v0, "57950"
+    const-string/jumbo v0, "57951"
+    const-string/jumbo v0, "57952"
+    const-string/jumbo v0, "57953"
+    const-string/jumbo v0, "57954"
+    const-string/jumbo v0, "57955"
+    const-string/jumbo v0, "57956"
+    const-string/jumbo v0, "57957"
+    const-string/jumbo v0, "57958"
+    const-string/jumbo v0, "57959"
+    const-string/jumbo v0, "57960"
+    const-string/jumbo v0, "57961"
+    const-string/jumbo v0, "57962"
+    const-string/jumbo v0, "57963"
+    const-string/jumbo v0, "57964"
+    const-string/jumbo v0, "57965"
+    const-string/jumbo v0, "57966"
+    const-string/jumbo v0, "57967"
+    const-string/jumbo v0, "57968"
+    const-string/jumbo v0, "57969"
+    const-string/jumbo v0, "57970"
+    const-string/jumbo v0, "57971"
+    const-string/jumbo v0, "57972"
+    const-string/jumbo v0, "57973"
+    const-string/jumbo v0, "57974"
+    const-string/jumbo v0, "57975"
+    const-string/jumbo v0, "57976"
+    const-string/jumbo v0, "57977"
+    const-string/jumbo v0, "57978"
+    const-string/jumbo v0, "57979"
+    const-string/jumbo v0, "57980"
+    const-string/jumbo v0, "57981"
+    const-string/jumbo v0, "57982"
+    const-string/jumbo v0, "57983"
+    const-string/jumbo v0, "57984"
+    const-string/jumbo v0, "57985"
+    const-string/jumbo v0, "57986"
+    const-string/jumbo v0, "57987"
+    const-string/jumbo v0, "57988"
+    const-string/jumbo v0, "57989"
+    const-string/jumbo v0, "57990"
+    const-string/jumbo v0, "57991"
+    const-string/jumbo v0, "57992"
+    const-string/jumbo v0, "57993"
+    const-string/jumbo v0, "57994"
+    const-string/jumbo v0, "57995"
+    const-string/jumbo v0, "57996"
+    const-string/jumbo v0, "57997"
+    const-string/jumbo v0, "57998"
+    const-string/jumbo v0, "57999"
+    const-string/jumbo v0, "58000"
+    const-string/jumbo v0, "58001"
+    const-string/jumbo v0, "58002"
+    const-string/jumbo v0, "58003"
+    const-string/jumbo v0, "58004"
+    const-string/jumbo v0, "58005"
+    const-string/jumbo v0, "58006"
+    const-string/jumbo v0, "58007"
+    const-string/jumbo v0, "58008"
+    const-string/jumbo v0, "58009"
+    const-string/jumbo v0, "58010"
+    const-string/jumbo v0, "58011"
+    const-string/jumbo v0, "58012"
+    const-string/jumbo v0, "58013"
+    const-string/jumbo v0, "58014"
+    const-string/jumbo v0, "58015"
+    const-string/jumbo v0, "58016"
+    const-string/jumbo v0, "58017"
+    const-string/jumbo v0, "58018"
+    const-string/jumbo v0, "58019"
+    const-string/jumbo v0, "58020"
+    const-string/jumbo v0, "58021"
+    const-string/jumbo v0, "58022"
+    const-string/jumbo v0, "58023"
+    const-string/jumbo v0, "58024"
+    const-string/jumbo v0, "58025"
+    const-string/jumbo v0, "58026"
+    const-string/jumbo v0, "58027"
+    const-string/jumbo v0, "58028"
+    const-string/jumbo v0, "58029"
+    const-string/jumbo v0, "58030"
+    const-string/jumbo v0, "58031"
+    const-string/jumbo v0, "58032"
+    const-string/jumbo v0, "58033"
+    const-string/jumbo v0, "58034"
+    const-string/jumbo v0, "58035"
+    const-string/jumbo v0, "58036"
+    const-string/jumbo v0, "58037"
+    const-string/jumbo v0, "58038"
+    const-string/jumbo v0, "58039"
+    const-string/jumbo v0, "58040"
+    const-string/jumbo v0, "58041"
+    const-string/jumbo v0, "58042"
+    const-string/jumbo v0, "58043"
+    const-string/jumbo v0, "58044"
+    const-string/jumbo v0, "58045"
+    const-string/jumbo v0, "58046"
+    const-string/jumbo v0, "58047"
+    const-string/jumbo v0, "58048"
+    const-string/jumbo v0, "58049"
+    const-string/jumbo v0, "58050"
+    const-string/jumbo v0, "58051"
+    const-string/jumbo v0, "58052"
+    const-string/jumbo v0, "58053"
+    const-string/jumbo v0, "58054"
+    const-string/jumbo v0, "58055"
+    const-string/jumbo v0, "58056"
+    const-string/jumbo v0, "58057"
+    const-string/jumbo v0, "58058"
+    const-string/jumbo v0, "58059"
+    const-string/jumbo v0, "58060"
+    const-string/jumbo v0, "58061"
+    const-string/jumbo v0, "58062"
+    const-string/jumbo v0, "58063"
+    const-string/jumbo v0, "58064"
+    const-string/jumbo v0, "58065"
+    const-string/jumbo v0, "58066"
+    const-string/jumbo v0, "58067"
+    const-string/jumbo v0, "58068"
+    const-string/jumbo v0, "58069"
+    const-string/jumbo v0, "58070"
+    const-string/jumbo v0, "58071"
+    const-string/jumbo v0, "58072"
+    const-string/jumbo v0, "58073"
+    const-string/jumbo v0, "58074"
+    const-string/jumbo v0, "58075"
+    const-string/jumbo v0, "58076"
+    const-string/jumbo v0, "58077"
+    const-string/jumbo v0, "58078"
+    const-string/jumbo v0, "58079"
+    const-string/jumbo v0, "58080"
+    const-string/jumbo v0, "58081"
+    const-string/jumbo v0, "58082"
+    const-string/jumbo v0, "58083"
+    const-string/jumbo v0, "58084"
+    const-string/jumbo v0, "58085"
+    const-string/jumbo v0, "58086"
+    const-string/jumbo v0, "58087"
+    const-string/jumbo v0, "58088"
+    const-string/jumbo v0, "58089"
+    const-string/jumbo v0, "58090"
+    const-string/jumbo v0, "58091"
+    const-string/jumbo v0, "58092"
+    const-string/jumbo v0, "58093"
+    const-string/jumbo v0, "58094"
+    const-string/jumbo v0, "58095"
+    const-string/jumbo v0, "58096"
+    const-string/jumbo v0, "58097"
+    const-string/jumbo v0, "58098"
+    const-string/jumbo v0, "58099"
+    const-string/jumbo v0, "58100"
+    const-string/jumbo v0, "58101"
+    const-string/jumbo v0, "58102"
+    const-string/jumbo v0, "58103"
+    const-string/jumbo v0, "58104"
+    const-string/jumbo v0, "58105"
+    const-string/jumbo v0, "58106"
+    const-string/jumbo v0, "58107"
+    const-string/jumbo v0, "58108"
+    const-string/jumbo v0, "58109"
+    const-string/jumbo v0, "58110"
+    const-string/jumbo v0, "58111"
+    const-string/jumbo v0, "58112"
+    const-string/jumbo v0, "58113"
+    const-string/jumbo v0, "58114"
+    const-string/jumbo v0, "58115"
+    const-string/jumbo v0, "58116"
+    const-string/jumbo v0, "58117"
+    const-string/jumbo v0, "58118"
+    const-string/jumbo v0, "58119"
+    const-string/jumbo v0, "58120"
+    const-string/jumbo v0, "58121"
+    const-string/jumbo v0, "58122"
+    const-string/jumbo v0, "58123"
+    const-string/jumbo v0, "58124"
+    const-string/jumbo v0, "58125"
+    const-string/jumbo v0, "58126"
+    const-string/jumbo v0, "58127"
+    const-string/jumbo v0, "58128"
+    const-string/jumbo v0, "58129"
+    const-string/jumbo v0, "58130"
+    const-string/jumbo v0, "58131"
+    const-string/jumbo v0, "58132"
+    const-string/jumbo v0, "58133"
+    const-string/jumbo v0, "58134"
+    const-string/jumbo v0, "58135"
+    const-string/jumbo v0, "58136"
+    const-string/jumbo v0, "58137"
+    const-string/jumbo v0, "58138"
+    const-string/jumbo v0, "58139"
+    const-string/jumbo v0, "58140"
+    const-string/jumbo v0, "58141"
+    const-string/jumbo v0, "58142"
+    const-string/jumbo v0, "58143"
+    const-string/jumbo v0, "58144"
+    const-string/jumbo v0, "58145"
+    const-string/jumbo v0, "58146"
+    const-string/jumbo v0, "58147"
+    const-string/jumbo v0, "58148"
+    const-string/jumbo v0, "58149"
+    const-string/jumbo v0, "58150"
+    const-string/jumbo v0, "58151"
+    const-string/jumbo v0, "58152"
+    const-string/jumbo v0, "58153"
+    const-string/jumbo v0, "58154"
+    const-string/jumbo v0, "58155"
+    const-string/jumbo v0, "58156"
+    const-string/jumbo v0, "58157"
+    const-string/jumbo v0, "58158"
+    const-string/jumbo v0, "58159"
+    const-string/jumbo v0, "58160"
+    const-string/jumbo v0, "58161"
+    const-string/jumbo v0, "58162"
+    const-string/jumbo v0, "58163"
+    const-string/jumbo v0, "58164"
+    const-string/jumbo v0, "58165"
+    const-string/jumbo v0, "58166"
+    const-string/jumbo v0, "58167"
+    const-string/jumbo v0, "58168"
+    const-string/jumbo v0, "58169"
+    const-string/jumbo v0, "58170"
+    const-string/jumbo v0, "58171"
+    const-string/jumbo v0, "58172"
+    const-string/jumbo v0, "58173"
+    const-string/jumbo v0, "58174"
+    const-string/jumbo v0, "58175"
+    const-string/jumbo v0, "58176"
+    const-string/jumbo v0, "58177"
+    const-string/jumbo v0, "58178"
+    const-string/jumbo v0, "58179"
+    const-string/jumbo v0, "58180"
+    const-string/jumbo v0, "58181"
+    const-string/jumbo v0, "58182"
+    const-string/jumbo v0, "58183"
+    const-string/jumbo v0, "58184"
+    const-string/jumbo v0, "58185"
+    const-string/jumbo v0, "58186"
+    const-string/jumbo v0, "58187"
+    const-string/jumbo v0, "58188"
+    const-string/jumbo v0, "58189"
+    const-string/jumbo v0, "58190"
+    const-string/jumbo v0, "58191"
+    const-string/jumbo v0, "58192"
+    const-string/jumbo v0, "58193"
+    const-string/jumbo v0, "58194"
+    const-string/jumbo v0, "58195"
+    const-string/jumbo v0, "58196"
+    const-string/jumbo v0, "58197"
+    const-string/jumbo v0, "58198"
+    const-string/jumbo v0, "58199"
+    const-string/jumbo v0, "58200"
+    const-string/jumbo v0, "58201"
+    const-string/jumbo v0, "58202"
+    const-string/jumbo v0, "58203"
+    const-string/jumbo v0, "58204"
+    const-string/jumbo v0, "58205"
+    const-string/jumbo v0, "58206"
+    const-string/jumbo v0, "58207"
+    const-string/jumbo v0, "58208"
+    const-string/jumbo v0, "58209"
+    const-string/jumbo v0, "58210"
+    const-string/jumbo v0, "58211"
+    const-string/jumbo v0, "58212"
+    const-string/jumbo v0, "58213"
+    const-string/jumbo v0, "58214"
+    const-string/jumbo v0, "58215"
+    const-string/jumbo v0, "58216"
+    const-string/jumbo v0, "58217"
+    const-string/jumbo v0, "58218"
+    const-string/jumbo v0, "58219"
+    const-string/jumbo v0, "58220"
+    const-string/jumbo v0, "58221"
+    const-string/jumbo v0, "58222"
+    const-string/jumbo v0, "58223"
+    const-string/jumbo v0, "58224"
+    const-string/jumbo v0, "58225"
+    const-string/jumbo v0, "58226"
+    const-string/jumbo v0, "58227"
+    const-string/jumbo v0, "58228"
+    const-string/jumbo v0, "58229"
+    const-string/jumbo v0, "58230"
+    const-string/jumbo v0, "58231"
+    const-string/jumbo v0, "58232"
+    const-string/jumbo v0, "58233"
+    const-string/jumbo v0, "58234"
+    const-string/jumbo v0, "58235"
+    const-string/jumbo v0, "58236"
+    const-string/jumbo v0, "58237"
+    const-string/jumbo v0, "58238"
+    const-string/jumbo v0, "58239"
+    const-string/jumbo v0, "58240"
+    const-string/jumbo v0, "58241"
+    const-string/jumbo v0, "58242"
+    const-string/jumbo v0, "58243"
+    const-string/jumbo v0, "58244"
+    const-string/jumbo v0, "58245"
+    const-string/jumbo v0, "58246"
+    const-string/jumbo v0, "58247"
+    const-string/jumbo v0, "58248"
+    const-string/jumbo v0, "58249"
+    const-string/jumbo v0, "58250"
+    const-string/jumbo v0, "58251"
+    const-string/jumbo v0, "58252"
+    const-string/jumbo v0, "58253"
+    const-string/jumbo v0, "58254"
+    const-string/jumbo v0, "58255"
+    const-string/jumbo v0, "58256"
+    const-string/jumbo v0, "58257"
+    const-string/jumbo v0, "58258"
+    const-string/jumbo v0, "58259"
+    const-string/jumbo v0, "58260"
+    const-string/jumbo v0, "58261"
+    const-string/jumbo v0, "58262"
+    const-string/jumbo v0, "58263"
+    const-string/jumbo v0, "58264"
+    const-string/jumbo v0, "58265"
+    const-string/jumbo v0, "58266"
+    const-string/jumbo v0, "58267"
+    const-string/jumbo v0, "58268"
+    const-string/jumbo v0, "58269"
+    const-string/jumbo v0, "58270"
+    const-string/jumbo v0, "58271"
+    const-string/jumbo v0, "58272"
+    const-string/jumbo v0, "58273"
+    const-string/jumbo v0, "58274"
+    const-string/jumbo v0, "58275"
+    const-string/jumbo v0, "58276"
+    const-string/jumbo v0, "58277"
+    const-string/jumbo v0, "58278"
+    const-string/jumbo v0, "58279"
+    const-string/jumbo v0, "58280"
+    const-string/jumbo v0, "58281"
+    const-string/jumbo v0, "58282"
+    const-string/jumbo v0, "58283"
+    const-string/jumbo v0, "58284"
+    const-string/jumbo v0, "58285"
+    const-string/jumbo v0, "58286"
+    const-string/jumbo v0, "58287"
+    const-string/jumbo v0, "58288"
+    const-string/jumbo v0, "58289"
+    const-string/jumbo v0, "58290"
+    const-string/jumbo v0, "58291"
+    const-string/jumbo v0, "58292"
+    const-string/jumbo v0, "58293"
+    const-string/jumbo v0, "58294"
+    const-string/jumbo v0, "58295"
+    const-string/jumbo v0, "58296"
+    const-string/jumbo v0, "58297"
+    const-string/jumbo v0, "58298"
+    const-string/jumbo v0, "58299"
+    const-string/jumbo v0, "58300"
+    const-string/jumbo v0, "58301"
+    const-string/jumbo v0, "58302"
+    const-string/jumbo v0, "58303"
+    const-string/jumbo v0, "58304"
+    const-string/jumbo v0, "58305"
+    const-string/jumbo v0, "58306"
+    const-string/jumbo v0, "58307"
+    const-string/jumbo v0, "58308"
+    const-string/jumbo v0, "58309"
+    const-string/jumbo v0, "58310"
+    const-string/jumbo v0, "58311"
+    const-string/jumbo v0, "58312"
+    const-string/jumbo v0, "58313"
+    const-string/jumbo v0, "58314"
+    const-string/jumbo v0, "58315"
+    const-string/jumbo v0, "58316"
+    const-string/jumbo v0, "58317"
+    const-string/jumbo v0, "58318"
+    const-string/jumbo v0, "58319"
+    const-string/jumbo v0, "58320"
+    const-string/jumbo v0, "58321"
+    const-string/jumbo v0, "58322"
+    const-string/jumbo v0, "58323"
+    const-string/jumbo v0, "58324"
+    const-string/jumbo v0, "58325"
+    const-string/jumbo v0, "58326"
+    const-string/jumbo v0, "58327"
+    const-string/jumbo v0, "58328"
+    const-string/jumbo v0, "58329"
+    const-string/jumbo v0, "58330"
+    const-string/jumbo v0, "58331"
+    const-string/jumbo v0, "58332"
+    const-string/jumbo v0, "58333"
+    const-string/jumbo v0, "58334"
+    const-string/jumbo v0, "58335"
+    const-string/jumbo v0, "58336"
+    const-string/jumbo v0, "58337"
+    const-string/jumbo v0, "58338"
+    const-string/jumbo v0, "58339"
+    const-string/jumbo v0, "58340"
+    const-string/jumbo v0, "58341"
+    const-string/jumbo v0, "58342"
+    const-string/jumbo v0, "58343"
+    const-string/jumbo v0, "58344"
+    const-string/jumbo v0, "58345"
+    const-string/jumbo v0, "58346"
+    const-string/jumbo v0, "58347"
+    const-string/jumbo v0, "58348"
+    const-string/jumbo v0, "58349"
+    const-string/jumbo v0, "58350"
+    const-string/jumbo v0, "58351"
+    const-string/jumbo v0, "58352"
+    const-string/jumbo v0, "58353"
+    const-string/jumbo v0, "58354"
+    const-string/jumbo v0, "58355"
+    const-string/jumbo v0, "58356"
+    const-string/jumbo v0, "58357"
+    const-string/jumbo v0, "58358"
+    const-string/jumbo v0, "58359"
+    const-string/jumbo v0, "58360"
+    const-string/jumbo v0, "58361"
+    const-string/jumbo v0, "58362"
+    const-string/jumbo v0, "58363"
+    const-string/jumbo v0, "58364"
+    const-string/jumbo v0, "58365"
+    const-string/jumbo v0, "58366"
+    const-string/jumbo v0, "58367"
+    const-string/jumbo v0, "58368"
+    const-string/jumbo v0, "58369"
+    const-string/jumbo v0, "58370"
+    const-string/jumbo v0, "58371"
+    const-string/jumbo v0, "58372"
+    const-string/jumbo v0, "58373"
+    const-string/jumbo v0, "58374"
+    const-string/jumbo v0, "58375"
+    const-string/jumbo v0, "58376"
+    const-string/jumbo v0, "58377"
+    const-string/jumbo v0, "58378"
+    const-string/jumbo v0, "58379"
+    const-string/jumbo v0, "58380"
+    const-string/jumbo v0, "58381"
+    const-string/jumbo v0, "58382"
+    const-string/jumbo v0, "58383"
+    const-string/jumbo v0, "58384"
+    const-string/jumbo v0, "58385"
+    const-string/jumbo v0, "58386"
+    const-string/jumbo v0, "58387"
+    const-string/jumbo v0, "58388"
+    const-string/jumbo v0, "58389"
+    const-string/jumbo v0, "58390"
+    const-string/jumbo v0, "58391"
+    const-string/jumbo v0, "58392"
+    const-string/jumbo v0, "58393"
+    const-string/jumbo v0, "58394"
+    const-string/jumbo v0, "58395"
+    const-string/jumbo v0, "58396"
+    const-string/jumbo v0, "58397"
+    const-string/jumbo v0, "58398"
+    const-string/jumbo v0, "58399"
+    const-string/jumbo v0, "58400"
+    const-string/jumbo v0, "58401"
+    const-string/jumbo v0, "58402"
+    const-string/jumbo v0, "58403"
+    const-string/jumbo v0, "58404"
+    const-string/jumbo v0, "58405"
+    const-string/jumbo v0, "58406"
+    const-string/jumbo v0, "58407"
+    const-string/jumbo v0, "58408"
+    const-string/jumbo v0, "58409"
+    const-string/jumbo v0, "58410"
+    const-string/jumbo v0, "58411"
+    const-string/jumbo v0, "58412"
+    const-string/jumbo v0, "58413"
+    const-string/jumbo v0, "58414"
+    const-string/jumbo v0, "58415"
+    const-string/jumbo v0, "58416"
+    const-string/jumbo v0, "58417"
+    const-string/jumbo v0, "58418"
+    const-string/jumbo v0, "58419"
+    const-string/jumbo v0, "58420"
+    const-string/jumbo v0, "58421"
+    const-string/jumbo v0, "58422"
+    const-string/jumbo v0, "58423"
+    const-string/jumbo v0, "58424"
+    const-string/jumbo v0, "58425"
+    const-string/jumbo v0, "58426"
+    const-string/jumbo v0, "58427"
+    const-string/jumbo v0, "58428"
+    const-string/jumbo v0, "58429"
+    const-string/jumbo v0, "58430"
+    const-string/jumbo v0, "58431"
+    const-string/jumbo v0, "58432"
+    const-string/jumbo v0, "58433"
+    const-string/jumbo v0, "58434"
+    const-string/jumbo v0, "58435"
+    const-string/jumbo v0, "58436"
+    const-string/jumbo v0, "58437"
+    const-string/jumbo v0, "58438"
+    const-string/jumbo v0, "58439"
+    const-string/jumbo v0, "58440"
+    const-string/jumbo v0, "58441"
+    const-string/jumbo v0, "58442"
+    const-string/jumbo v0, "58443"
+    const-string/jumbo v0, "58444"
+    const-string/jumbo v0, "58445"
+    const-string/jumbo v0, "58446"
+    const-string/jumbo v0, "58447"
+    const-string/jumbo v0, "58448"
+    const-string/jumbo v0, "58449"
+    const-string/jumbo v0, "58450"
+    const-string/jumbo v0, "58451"
+    const-string/jumbo v0, "58452"
+    const-string/jumbo v0, "58453"
+    const-string/jumbo v0, "58454"
+    const-string/jumbo v0, "58455"
+    const-string/jumbo v0, "58456"
+    const-string/jumbo v0, "58457"
+    const-string/jumbo v0, "58458"
+    const-string/jumbo v0, "58459"
+    const-string/jumbo v0, "58460"
+    const-string/jumbo v0, "58461"
+    const-string/jumbo v0, "58462"
+    const-string/jumbo v0, "58463"
+    const-string/jumbo v0, "58464"
+    const-string/jumbo v0, "58465"
+    const-string/jumbo v0, "58466"
+    const-string/jumbo v0, "58467"
+    const-string/jumbo v0, "58468"
+    const-string/jumbo v0, "58469"
+    const-string/jumbo v0, "58470"
+    const-string/jumbo v0, "58471"
+    const-string/jumbo v0, "58472"
+    const-string/jumbo v0, "58473"
+    const-string/jumbo v0, "58474"
+    const-string/jumbo v0, "58475"
+    const-string/jumbo v0, "58476"
+    const-string/jumbo v0, "58477"
+    const-string/jumbo v0, "58478"
+    const-string/jumbo v0, "58479"
+    const-string/jumbo v0, "58480"
+    const-string/jumbo v0, "58481"
+    const-string/jumbo v0, "58482"
+    const-string/jumbo v0, "58483"
+    const-string/jumbo v0, "58484"
+    const-string/jumbo v0, "58485"
+    const-string/jumbo v0, "58486"
+    const-string/jumbo v0, "58487"
+    const-string/jumbo v0, "58488"
+    const-string/jumbo v0, "58489"
+    const-string/jumbo v0, "58490"
+    const-string/jumbo v0, "58491"
+    const-string/jumbo v0, "58492"
+    const-string/jumbo v0, "58493"
+    const-string/jumbo v0, "58494"
+    const-string/jumbo v0, "58495"
+    const-string/jumbo v0, "58496"
+    const-string/jumbo v0, "58497"
+    const-string/jumbo v0, "58498"
+    const-string/jumbo v0, "58499"
+    const-string/jumbo v0, "58500"
+    const-string/jumbo v0, "58501"
+    const-string/jumbo v0, "58502"
+    const-string/jumbo v0, "58503"
+    const-string/jumbo v0, "58504"
+    const-string/jumbo v0, "58505"
+    const-string/jumbo v0, "58506"
+    const-string/jumbo v0, "58507"
+    const-string/jumbo v0, "58508"
+    const-string/jumbo v0, "58509"
+    const-string/jumbo v0, "58510"
+    const-string/jumbo v0, "58511"
+    const-string/jumbo v0, "58512"
+    const-string/jumbo v0, "58513"
+    const-string/jumbo v0, "58514"
+    const-string/jumbo v0, "58515"
+    const-string/jumbo v0, "58516"
+    const-string/jumbo v0, "58517"
+    const-string/jumbo v0, "58518"
+    const-string/jumbo v0, "58519"
+    const-string/jumbo v0, "58520"
+    const-string/jumbo v0, "58521"
+    const-string/jumbo v0, "58522"
+    const-string/jumbo v0, "58523"
+    const-string/jumbo v0, "58524"
+    const-string/jumbo v0, "58525"
+    const-string/jumbo v0, "58526"
+    const-string/jumbo v0, "58527"
+    const-string/jumbo v0, "58528"
+    const-string/jumbo v0, "58529"
+    const-string/jumbo v0, "58530"
+    const-string/jumbo v0, "58531"
+    const-string/jumbo v0, "58532"
+    const-string/jumbo v0, "58533"
+    const-string/jumbo v0, "58534"
+    const-string/jumbo v0, "58535"
+    const-string/jumbo v0, "58536"
+    const-string/jumbo v0, "58537"
+    const-string/jumbo v0, "58538"
+    const-string/jumbo v0, "58539"
+    const-string/jumbo v0, "58540"
+    const-string/jumbo v0, "58541"
+    const-string/jumbo v0, "58542"
+    const-string/jumbo v0, "58543"
+    const-string/jumbo v0, "58544"
+    const-string/jumbo v0, "58545"
+    const-string/jumbo v0, "58546"
+    const-string/jumbo v0, "58547"
+    const-string/jumbo v0, "58548"
+    const-string/jumbo v0, "58549"
+    const-string/jumbo v0, "58550"
+    const-string/jumbo v0, "58551"
+    const-string/jumbo v0, "58552"
+    const-string/jumbo v0, "58553"
+    const-string/jumbo v0, "58554"
+    const-string/jumbo v0, "58555"
+    const-string/jumbo v0, "58556"
+    const-string/jumbo v0, "58557"
+    const-string/jumbo v0, "58558"
+    const-string/jumbo v0, "58559"
+    const-string/jumbo v0, "58560"
+    const-string/jumbo v0, "58561"
+    const-string/jumbo v0, "58562"
+    const-string/jumbo v0, "58563"
+    const-string/jumbo v0, "58564"
+    const-string/jumbo v0, "58565"
+    const-string/jumbo v0, "58566"
+    const-string/jumbo v0, "58567"
+    const-string/jumbo v0, "58568"
+    const-string/jumbo v0, "58569"
+    const-string/jumbo v0, "58570"
+    const-string/jumbo v0, "58571"
+    const-string/jumbo v0, "58572"
+    const-string/jumbo v0, "58573"
+    const-string/jumbo v0, "58574"
+    const-string/jumbo v0, "58575"
+    const-string/jumbo v0, "58576"
+    const-string/jumbo v0, "58577"
+    const-string/jumbo v0, "58578"
+    const-string/jumbo v0, "58579"
+    const-string/jumbo v0, "58580"
+    const-string/jumbo v0, "58581"
+    const-string/jumbo v0, "58582"
+    const-string/jumbo v0, "58583"
+    const-string/jumbo v0, "58584"
+    const-string/jumbo v0, "58585"
+    const-string/jumbo v0, "58586"
+    const-string/jumbo v0, "58587"
+    const-string/jumbo v0, "58588"
+    const-string/jumbo v0, "58589"
+    const-string/jumbo v0, "58590"
+    const-string/jumbo v0, "58591"
+    const-string/jumbo v0, "58592"
+    const-string/jumbo v0, "58593"
+    const-string/jumbo v0, "58594"
+    const-string/jumbo v0, "58595"
+    const-string/jumbo v0, "58596"
+    const-string/jumbo v0, "58597"
+    const-string/jumbo v0, "58598"
+    const-string/jumbo v0, "58599"
+    const-string/jumbo v0, "58600"
+    const-string/jumbo v0, "58601"
+    const-string/jumbo v0, "58602"
+    const-string/jumbo v0, "58603"
+    const-string/jumbo v0, "58604"
+    const-string/jumbo v0, "58605"
+    const-string/jumbo v0, "58606"
+    const-string/jumbo v0, "58607"
+    const-string/jumbo v0, "58608"
+    const-string/jumbo v0, "58609"
+    const-string/jumbo v0, "58610"
+    const-string/jumbo v0, "58611"
+    const-string/jumbo v0, "58612"
+    const-string/jumbo v0, "58613"
+    const-string/jumbo v0, "58614"
+    const-string/jumbo v0, "58615"
+    const-string/jumbo v0, "58616"
+    const-string/jumbo v0, "58617"
+    const-string/jumbo v0, "58618"
+    const-string/jumbo v0, "58619"
+    const-string/jumbo v0, "58620"
+    const-string/jumbo v0, "58621"
+    const-string/jumbo v0, "58622"
+    const-string/jumbo v0, "58623"
+    const-string/jumbo v0, "58624"
+    const-string/jumbo v0, "58625"
+    const-string/jumbo v0, "58626"
+    const-string/jumbo v0, "58627"
+    const-string/jumbo v0, "58628"
+    const-string/jumbo v0, "58629"
+    const-string/jumbo v0, "58630"
+    const-string/jumbo v0, "58631"
+    const-string/jumbo v0, "58632"
+    const-string/jumbo v0, "58633"
+    const-string/jumbo v0, "58634"
+    const-string/jumbo v0, "58635"
+    const-string/jumbo v0, "58636"
+    const-string/jumbo v0, "58637"
+    const-string/jumbo v0, "58638"
+    const-string/jumbo v0, "58639"
+    const-string/jumbo v0, "58640"
+    const-string/jumbo v0, "58641"
+    const-string/jumbo v0, "58642"
+    const-string/jumbo v0, "58643"
+    const-string/jumbo v0, "58644"
+    const-string/jumbo v0, "58645"
+    const-string/jumbo v0, "58646"
+    const-string/jumbo v0, "58647"
+    const-string/jumbo v0, "58648"
+    const-string/jumbo v0, "58649"
+    const-string/jumbo v0, "58650"
+    const-string/jumbo v0, "58651"
+    const-string/jumbo v0, "58652"
+    const-string/jumbo v0, "58653"
+    const-string/jumbo v0, "58654"
+    const-string/jumbo v0, "58655"
+    const-string/jumbo v0, "58656"
+    const-string/jumbo v0, "58657"
+    const-string/jumbo v0, "58658"
+    const-string/jumbo v0, "58659"
+    const-string/jumbo v0, "58660"
+    const-string/jumbo v0, "58661"
+    const-string/jumbo v0, "58662"
+    const-string/jumbo v0, "58663"
+    const-string/jumbo v0, "58664"
+    const-string/jumbo v0, "58665"
+    const-string/jumbo v0, "58666"
+    const-string/jumbo v0, "58667"
+    const-string/jumbo v0, "58668"
+    const-string/jumbo v0, "58669"
+    const-string/jumbo v0, "58670"
+    const-string/jumbo v0, "58671"
+    const-string/jumbo v0, "58672"
+    const-string/jumbo v0, "58673"
+    const-string/jumbo v0, "58674"
+    const-string/jumbo v0, "58675"
+    const-string/jumbo v0, "58676"
+    const-string/jumbo v0, "58677"
+    const-string/jumbo v0, "58678"
+    const-string/jumbo v0, "58679"
+    const-string/jumbo v0, "58680"
+    const-string/jumbo v0, "58681"
+    const-string/jumbo v0, "58682"
+    const-string/jumbo v0, "58683"
+    const-string/jumbo v0, "58684"
+    const-string/jumbo v0, "58685"
+    const-string/jumbo v0, "58686"
+    const-string/jumbo v0, "58687"
+    const-string/jumbo v0, "58688"
+    const-string/jumbo v0, "58689"
+    const-string/jumbo v0, "58690"
+    const-string/jumbo v0, "58691"
+    const-string/jumbo v0, "58692"
+    const-string/jumbo v0, "58693"
+    const-string/jumbo v0, "58694"
+    const-string/jumbo v0, "58695"
+    const-string/jumbo v0, "58696"
+    const-string/jumbo v0, "58697"
+    const-string/jumbo v0, "58698"
+    const-string/jumbo v0, "58699"
+    const-string/jumbo v0, "58700"
+    const-string/jumbo v0, "58701"
+    const-string/jumbo v0, "58702"
+    const-string/jumbo v0, "58703"
+    const-string/jumbo v0, "58704"
+    const-string/jumbo v0, "58705"
+    const-string/jumbo v0, "58706"
+    const-string/jumbo v0, "58707"
+    const-string/jumbo v0, "58708"
+    const-string/jumbo v0, "58709"
+    const-string/jumbo v0, "58710"
+    const-string/jumbo v0, "58711"
+    const-string/jumbo v0, "58712"
+    const-string/jumbo v0, "58713"
+    const-string/jumbo v0, "58714"
+    const-string/jumbo v0, "58715"
+    const-string/jumbo v0, "58716"
+    const-string/jumbo v0, "58717"
+    const-string/jumbo v0, "58718"
+    const-string/jumbo v0, "58719"
+    const-string/jumbo v0, "58720"
+    const-string/jumbo v0, "58721"
+    const-string/jumbo v0, "58722"
+    const-string/jumbo v0, "58723"
+    const-string/jumbo v0, "58724"
+    const-string/jumbo v0, "58725"
+    const-string/jumbo v0, "58726"
+    const-string/jumbo v0, "58727"
+    const-string/jumbo v0, "58728"
+    const-string/jumbo v0, "58729"
+    const-string/jumbo v0, "58730"
+    const-string/jumbo v0, "58731"
+    const-string/jumbo v0, "58732"
+    const-string/jumbo v0, "58733"
+    const-string/jumbo v0, "58734"
+    const-string/jumbo v0, "58735"
+    const-string/jumbo v0, "58736"
+    const-string/jumbo v0, "58737"
+    const-string/jumbo v0, "58738"
+    const-string/jumbo v0, "58739"
+    const-string/jumbo v0, "58740"
+    const-string/jumbo v0, "58741"
+    const-string/jumbo v0, "58742"
+    const-string/jumbo v0, "58743"
+    const-string/jumbo v0, "58744"
+    const-string/jumbo v0, "58745"
+    const-string/jumbo v0, "58746"
+    const-string/jumbo v0, "58747"
+    const-string/jumbo v0, "58748"
+    const-string/jumbo v0, "58749"
+    const-string/jumbo v0, "58750"
+    const-string/jumbo v0, "58751"
+    const-string/jumbo v0, "58752"
+    const-string/jumbo v0, "58753"
+    const-string/jumbo v0, "58754"
+    const-string/jumbo v0, "58755"
+    const-string/jumbo v0, "58756"
+    const-string/jumbo v0, "58757"
+    const-string/jumbo v0, "58758"
+    const-string/jumbo v0, "58759"
+    const-string/jumbo v0, "58760"
+    const-string/jumbo v0, "58761"
+    const-string/jumbo v0, "58762"
+    const-string/jumbo v0, "58763"
+    const-string/jumbo v0, "58764"
+    const-string/jumbo v0, "58765"
+    const-string/jumbo v0, "58766"
+    const-string/jumbo v0, "58767"
+    const-string/jumbo v0, "58768"
+    const-string/jumbo v0, "58769"
+    const-string/jumbo v0, "58770"
+    const-string/jumbo v0, "58771"
+    const-string/jumbo v0, "58772"
+    const-string/jumbo v0, "58773"
+    const-string/jumbo v0, "58774"
+    const-string/jumbo v0, "58775"
+    const-string/jumbo v0, "58776"
+    const-string/jumbo v0, "58777"
+    const-string/jumbo v0, "58778"
+    const-string/jumbo v0, "58779"
+    const-string/jumbo v0, "58780"
+    const-string/jumbo v0, "58781"
+    const-string/jumbo v0, "58782"
+    const-string/jumbo v0, "58783"
+    const-string/jumbo v0, "58784"
+    const-string/jumbo v0, "58785"
+    const-string/jumbo v0, "58786"
+    const-string/jumbo v0, "58787"
+    const-string/jumbo v0, "58788"
+    const-string/jumbo v0, "58789"
+    const-string/jumbo v0, "58790"
+    const-string/jumbo v0, "58791"
+    const-string/jumbo v0, "58792"
+    const-string/jumbo v0, "58793"
+    const-string/jumbo v0, "58794"
+    const-string/jumbo v0, "58795"
+    const-string/jumbo v0, "58796"
+    const-string/jumbo v0, "58797"
+    const-string/jumbo v0, "58798"
+    const-string/jumbo v0, "58799"
+    const-string/jumbo v0, "58800"
+    const-string/jumbo v0, "58801"
+    const-string/jumbo v0, "58802"
+    const-string/jumbo v0, "58803"
+    const-string/jumbo v0, "58804"
+    const-string/jumbo v0, "58805"
+    const-string/jumbo v0, "58806"
+    const-string/jumbo v0, "58807"
+    const-string/jumbo v0, "58808"
+    const-string/jumbo v0, "58809"
+    const-string/jumbo v0, "58810"
+    const-string/jumbo v0, "58811"
+    const-string/jumbo v0, "58812"
+    const-string/jumbo v0, "58813"
+    const-string/jumbo v0, "58814"
+    const-string/jumbo v0, "58815"
+    const-string/jumbo v0, "58816"
+    const-string/jumbo v0, "58817"
+    const-string/jumbo v0, "58818"
+    const-string/jumbo v0, "58819"
+    const-string/jumbo v0, "58820"
+    const-string/jumbo v0, "58821"
+    const-string/jumbo v0, "58822"
+    const-string/jumbo v0, "58823"
+    const-string/jumbo v0, "58824"
+    const-string/jumbo v0, "58825"
+    const-string/jumbo v0, "58826"
+    const-string/jumbo v0, "58827"
+    const-string/jumbo v0, "58828"
+    const-string/jumbo v0, "58829"
+    const-string/jumbo v0, "58830"
+    const-string/jumbo v0, "58831"
+    const-string/jumbo v0, "58832"
+    const-string/jumbo v0, "58833"
+    const-string/jumbo v0, "58834"
+    const-string/jumbo v0, "58835"
+    const-string/jumbo v0, "58836"
+    const-string/jumbo v0, "58837"
+    const-string/jumbo v0, "58838"
+    const-string/jumbo v0, "58839"
+    const-string/jumbo v0, "58840"
+    const-string/jumbo v0, "58841"
+    const-string/jumbo v0, "58842"
+    const-string/jumbo v0, "58843"
+    const-string/jumbo v0, "58844"
+    const-string/jumbo v0, "58845"
+    const-string/jumbo v0, "58846"
+    const-string/jumbo v0, "58847"
+    const-string/jumbo v0, "58848"
+    const-string/jumbo v0, "58849"
+    const-string/jumbo v0, "58850"
+    const-string/jumbo v0, "58851"
+    const-string/jumbo v0, "58852"
+    const-string/jumbo v0, "58853"
+    const-string/jumbo v0, "58854"
+    const-string/jumbo v0, "58855"
+    const-string/jumbo v0, "58856"
+    const-string/jumbo v0, "58857"
+    const-string/jumbo v0, "58858"
+    const-string/jumbo v0, "58859"
+    const-string/jumbo v0, "58860"
+    const-string/jumbo v0, "58861"
+    const-string/jumbo v0, "58862"
+    const-string/jumbo v0, "58863"
+    const-string/jumbo v0, "58864"
+    const-string/jumbo v0, "58865"
+    const-string/jumbo v0, "58866"
+    const-string/jumbo v0, "58867"
+    const-string/jumbo v0, "58868"
+    const-string/jumbo v0, "58869"
+    const-string/jumbo v0, "58870"
+    const-string/jumbo v0, "58871"
+    const-string/jumbo v0, "58872"
+    const-string/jumbo v0, "58873"
+    const-string/jumbo v0, "58874"
+    const-string/jumbo v0, "58875"
+    const-string/jumbo v0, "58876"
+    const-string/jumbo v0, "58877"
+    const-string/jumbo v0, "58878"
+    const-string/jumbo v0, "58879"
+    const-string/jumbo v0, "58880"
+    const-string/jumbo v0, "58881"
+    const-string/jumbo v0, "58882"
+    const-string/jumbo v0, "58883"
+    const-string/jumbo v0, "58884"
+    const-string/jumbo v0, "58885"
+    const-string/jumbo v0, "58886"
+    const-string/jumbo v0, "58887"
+    const-string/jumbo v0, "58888"
+    const-string/jumbo v0, "58889"
+    const-string/jumbo v0, "58890"
+    const-string/jumbo v0, "58891"
+    const-string/jumbo v0, "58892"
+    const-string/jumbo v0, "58893"
+    const-string/jumbo v0, "58894"
+    const-string/jumbo v0, "58895"
+    const-string/jumbo v0, "58896"
+    const-string/jumbo v0, "58897"
+    const-string/jumbo v0, "58898"
+    const-string/jumbo v0, "58899"
+    const-string/jumbo v0, "58900"
+    const-string/jumbo v0, "58901"
+    const-string/jumbo v0, "58902"
+    const-string/jumbo v0, "58903"
+    const-string/jumbo v0, "58904"
+    const-string/jumbo v0, "58905"
+    const-string/jumbo v0, "58906"
+    const-string/jumbo v0, "58907"
+    const-string/jumbo v0, "58908"
+    const-string/jumbo v0, "58909"
+    const-string/jumbo v0, "58910"
+    const-string/jumbo v0, "58911"
+    const-string/jumbo v0, "58912"
+    const-string/jumbo v0, "58913"
+    const-string/jumbo v0, "58914"
+    const-string/jumbo v0, "58915"
+    const-string/jumbo v0, "58916"
+    const-string/jumbo v0, "58917"
+    const-string/jumbo v0, "58918"
+    const-string/jumbo v0, "58919"
+    const-string/jumbo v0, "58920"
+    const-string/jumbo v0, "58921"
+    const-string/jumbo v0, "58922"
+    const-string/jumbo v0, "58923"
+    const-string/jumbo v0, "58924"
+    const-string/jumbo v0, "58925"
+    const-string/jumbo v0, "58926"
+    const-string/jumbo v0, "58927"
+    const-string/jumbo v0, "58928"
+    const-string/jumbo v0, "58929"
+    const-string/jumbo v0, "58930"
+    const-string/jumbo v0, "58931"
+    const-string/jumbo v0, "58932"
+    const-string/jumbo v0, "58933"
+    const-string/jumbo v0, "58934"
+    const-string/jumbo v0, "58935"
+    const-string/jumbo v0, "58936"
+    const-string/jumbo v0, "58937"
+    const-string/jumbo v0, "58938"
+    const-string/jumbo v0, "58939"
+    const-string/jumbo v0, "58940"
+    const-string/jumbo v0, "58941"
+    const-string/jumbo v0, "58942"
+    const-string/jumbo v0, "58943"
+    const-string/jumbo v0, "58944"
+    const-string/jumbo v0, "58945"
+    const-string/jumbo v0, "58946"
+    const-string/jumbo v0, "58947"
+    const-string/jumbo v0, "58948"
+    const-string/jumbo v0, "58949"
+    const-string/jumbo v0, "58950"
+    const-string/jumbo v0, "58951"
+    const-string/jumbo v0, "58952"
+    const-string/jumbo v0, "58953"
+    const-string/jumbo v0, "58954"
+    const-string/jumbo v0, "58955"
+    const-string/jumbo v0, "58956"
+    const-string/jumbo v0, "58957"
+    const-string/jumbo v0, "58958"
+    const-string/jumbo v0, "58959"
+    const-string/jumbo v0, "58960"
+    const-string/jumbo v0, "58961"
+    const-string/jumbo v0, "58962"
+    const-string/jumbo v0, "58963"
+    const-string/jumbo v0, "58964"
+    const-string/jumbo v0, "58965"
+    const-string/jumbo v0, "58966"
+    const-string/jumbo v0, "58967"
+    const-string/jumbo v0, "58968"
+    const-string/jumbo v0, "58969"
+    const-string/jumbo v0, "58970"
+    const-string/jumbo v0, "58971"
+    const-string/jumbo v0, "58972"
+    const-string/jumbo v0, "58973"
+    const-string/jumbo v0, "58974"
+    const-string/jumbo v0, "58975"
+    const-string/jumbo v0, "58976"
+    const-string/jumbo v0, "58977"
+    const-string/jumbo v0, "58978"
+    const-string/jumbo v0, "58979"
+    const-string/jumbo v0, "58980"
+    const-string/jumbo v0, "58981"
+    const-string/jumbo v0, "58982"
+    const-string/jumbo v0, "58983"
+    const-string/jumbo v0, "58984"
+    const-string/jumbo v0, "58985"
+    const-string/jumbo v0, "58986"
+    const-string/jumbo v0, "58987"
+    const-string/jumbo v0, "58988"
+    const-string/jumbo v0, "58989"
+    const-string/jumbo v0, "58990"
+    const-string/jumbo v0, "58991"
+    const-string/jumbo v0, "58992"
+    const-string/jumbo v0, "58993"
+    const-string/jumbo v0, "58994"
+    const-string/jumbo v0, "58995"
+    const-string/jumbo v0, "58996"
+    const-string/jumbo v0, "58997"
+    const-string/jumbo v0, "58998"
+    const-string/jumbo v0, "58999"
+    const-string/jumbo v0, "59000"
+    const-string/jumbo v0, "59001"
+    const-string/jumbo v0, "59002"
+    const-string/jumbo v0, "59003"
+    const-string/jumbo v0, "59004"
+    const-string/jumbo v0, "59005"
+    const-string/jumbo v0, "59006"
+    const-string/jumbo v0, "59007"
+    const-string/jumbo v0, "59008"
+    const-string/jumbo v0, "59009"
+    const-string/jumbo v0, "59010"
+    const-string/jumbo v0, "59011"
+    const-string/jumbo v0, "59012"
+    const-string/jumbo v0, "59013"
+    const-string/jumbo v0, "59014"
+    const-string/jumbo v0, "59015"
+    const-string/jumbo v0, "59016"
+    const-string/jumbo v0, "59017"
+    const-string/jumbo v0, "59018"
+    const-string/jumbo v0, "59019"
+    const-string/jumbo v0, "59020"
+    const-string/jumbo v0, "59021"
+    const-string/jumbo v0, "59022"
+    const-string/jumbo v0, "59023"
+    const-string/jumbo v0, "59024"
+    const-string/jumbo v0, "59025"
+    const-string/jumbo v0, "59026"
+    const-string/jumbo v0, "59027"
+    const-string/jumbo v0, "59028"
+    const-string/jumbo v0, "59029"
+    const-string/jumbo v0, "59030"
+    const-string/jumbo v0, "59031"
+    const-string/jumbo v0, "59032"
+    const-string/jumbo v0, "59033"
+    const-string/jumbo v0, "59034"
+    const-string/jumbo v0, "59035"
+    const-string/jumbo v0, "59036"
+    const-string/jumbo v0, "59037"
+    const-string/jumbo v0, "59038"
+    const-string/jumbo v0, "59039"
+    const-string/jumbo v0, "59040"
+    const-string/jumbo v0, "59041"
+    const-string/jumbo v0, "59042"
+    const-string/jumbo v0, "59043"
+    const-string/jumbo v0, "59044"
+    const-string/jumbo v0, "59045"
+    const-string/jumbo v0, "59046"
+    const-string/jumbo v0, "59047"
+    const-string/jumbo v0, "59048"
+    const-string/jumbo v0, "59049"
+    const-string/jumbo v0, "59050"
+    const-string/jumbo v0, "59051"
+    const-string/jumbo v0, "59052"
+    const-string/jumbo v0, "59053"
+    const-string/jumbo v0, "59054"
+    const-string/jumbo v0, "59055"
+    const-string/jumbo v0, "59056"
+    const-string/jumbo v0, "59057"
+    const-string/jumbo v0, "59058"
+    const-string/jumbo v0, "59059"
+    const-string/jumbo v0, "59060"
+    const-string/jumbo v0, "59061"
+    const-string/jumbo v0, "59062"
+    const-string/jumbo v0, "59063"
+    const-string/jumbo v0, "59064"
+    const-string/jumbo v0, "59065"
+    const-string/jumbo v0, "59066"
+    const-string/jumbo v0, "59067"
+    const-string/jumbo v0, "59068"
+    const-string/jumbo v0, "59069"
+    const-string/jumbo v0, "59070"
+    const-string/jumbo v0, "59071"
+    const-string/jumbo v0, "59072"
+    const-string/jumbo v0, "59073"
+    const-string/jumbo v0, "59074"
+    const-string/jumbo v0, "59075"
+    const-string/jumbo v0, "59076"
+    const-string/jumbo v0, "59077"
+    const-string/jumbo v0, "59078"
+    const-string/jumbo v0, "59079"
+    const-string/jumbo v0, "59080"
+    const-string/jumbo v0, "59081"
+    const-string/jumbo v0, "59082"
+    const-string/jumbo v0, "59083"
+    const-string/jumbo v0, "59084"
+    const-string/jumbo v0, "59085"
+    const-string/jumbo v0, "59086"
+    const-string/jumbo v0, "59087"
+    const-string/jumbo v0, "59088"
+    const-string/jumbo v0, "59089"
+    const-string/jumbo v0, "59090"
+    const-string/jumbo v0, "59091"
+    const-string/jumbo v0, "59092"
+    const-string/jumbo v0, "59093"
+    const-string/jumbo v0, "59094"
+    const-string/jumbo v0, "59095"
+    const-string/jumbo v0, "59096"
+    const-string/jumbo v0, "59097"
+    const-string/jumbo v0, "59098"
+    const-string/jumbo v0, "59099"
+    const-string/jumbo v0, "59100"
+    const-string/jumbo v0, "59101"
+    const-string/jumbo v0, "59102"
+    const-string/jumbo v0, "59103"
+    const-string/jumbo v0, "59104"
+    const-string/jumbo v0, "59105"
+    const-string/jumbo v0, "59106"
+    const-string/jumbo v0, "59107"
+    const-string/jumbo v0, "59108"
+    const-string/jumbo v0, "59109"
+    const-string/jumbo v0, "59110"
+    const-string/jumbo v0, "59111"
+    const-string/jumbo v0, "59112"
+    const-string/jumbo v0, "59113"
+    const-string/jumbo v0, "59114"
+    const-string/jumbo v0, "59115"
+    const-string/jumbo v0, "59116"
+    const-string/jumbo v0, "59117"
+    const-string/jumbo v0, "59118"
+    const-string/jumbo v0, "59119"
+    const-string/jumbo v0, "59120"
+    const-string/jumbo v0, "59121"
+    const-string/jumbo v0, "59122"
+    const-string/jumbo v0, "59123"
+    const-string/jumbo v0, "59124"
+    const-string/jumbo v0, "59125"
+    const-string/jumbo v0, "59126"
+    const-string/jumbo v0, "59127"
+    const-string/jumbo v0, "59128"
+    const-string/jumbo v0, "59129"
+    const-string/jumbo v0, "59130"
+    const-string/jumbo v0, "59131"
+    const-string/jumbo v0, "59132"
+    const-string/jumbo v0, "59133"
+    const-string/jumbo v0, "59134"
+    const-string/jumbo v0, "59135"
+    const-string/jumbo v0, "59136"
+    const-string/jumbo v0, "59137"
+    const-string/jumbo v0, "59138"
+    const-string/jumbo v0, "59139"
+    const-string/jumbo v0, "59140"
+    const-string/jumbo v0, "59141"
+    const-string/jumbo v0, "59142"
+    const-string/jumbo v0, "59143"
+    const-string/jumbo v0, "59144"
+    const-string/jumbo v0, "59145"
+    const-string/jumbo v0, "59146"
+    const-string/jumbo v0, "59147"
+    const-string/jumbo v0, "59148"
+    const-string/jumbo v0, "59149"
+    const-string/jumbo v0, "59150"
+    const-string/jumbo v0, "59151"
+    const-string/jumbo v0, "59152"
+    const-string/jumbo v0, "59153"
+    const-string/jumbo v0, "59154"
+    const-string/jumbo v0, "59155"
+    const-string/jumbo v0, "59156"
+    const-string/jumbo v0, "59157"
+    const-string/jumbo v0, "59158"
+    const-string/jumbo v0, "59159"
+    const-string/jumbo v0, "59160"
+    const-string/jumbo v0, "59161"
+    const-string/jumbo v0, "59162"
+    const-string/jumbo v0, "59163"
+    const-string/jumbo v0, "59164"
+    const-string/jumbo v0, "59165"
+    const-string/jumbo v0, "59166"
+    const-string/jumbo v0, "59167"
+    const-string/jumbo v0, "59168"
+    const-string/jumbo v0, "59169"
+    const-string/jumbo v0, "59170"
+    const-string/jumbo v0, "59171"
+    const-string/jumbo v0, "59172"
+    const-string/jumbo v0, "59173"
+    const-string/jumbo v0, "59174"
+    const-string/jumbo v0, "59175"
+    const-string/jumbo v0, "59176"
+    const-string/jumbo v0, "59177"
+    const-string/jumbo v0, "59178"
+    const-string/jumbo v0, "59179"
+    const-string/jumbo v0, "59180"
+    const-string/jumbo v0, "59181"
+    const-string/jumbo v0, "59182"
+    const-string/jumbo v0, "59183"
+    const-string/jumbo v0, "59184"
+    const-string/jumbo v0, "59185"
+    const-string/jumbo v0, "59186"
+    const-string/jumbo v0, "59187"
+    const-string/jumbo v0, "59188"
+    const-string/jumbo v0, "59189"
+    const-string/jumbo v0, "59190"
+    const-string/jumbo v0, "59191"
+    const-string/jumbo v0, "59192"
+    const-string/jumbo v0, "59193"
+    const-string/jumbo v0, "59194"
+    const-string/jumbo v0, "59195"
+    const-string/jumbo v0, "59196"
+    const-string/jumbo v0, "59197"
+    const-string/jumbo v0, "59198"
+    const-string/jumbo v0, "59199"
+    const-string/jumbo v0, "59200"
+    const-string/jumbo v0, "59201"
+    const-string/jumbo v0, "59202"
+    const-string/jumbo v0, "59203"
+    const-string/jumbo v0, "59204"
+    const-string/jumbo v0, "59205"
+    const-string/jumbo v0, "59206"
+    const-string/jumbo v0, "59207"
+    const-string/jumbo v0, "59208"
+    const-string/jumbo v0, "59209"
+    const-string/jumbo v0, "59210"
+    const-string/jumbo v0, "59211"
+    const-string/jumbo v0, "59212"
+    const-string/jumbo v0, "59213"
+    const-string/jumbo v0, "59214"
+    const-string/jumbo v0, "59215"
+    const-string/jumbo v0, "59216"
+    const-string/jumbo v0, "59217"
+    const-string/jumbo v0, "59218"
+    const-string/jumbo v0, "59219"
+    const-string/jumbo v0, "59220"
+    const-string/jumbo v0, "59221"
+    const-string/jumbo v0, "59222"
+    const-string/jumbo v0, "59223"
+    const-string/jumbo v0, "59224"
+    const-string/jumbo v0, "59225"
+    const-string/jumbo v0, "59226"
+    const-string/jumbo v0, "59227"
+    const-string/jumbo v0, "59228"
+    const-string/jumbo v0, "59229"
+    const-string/jumbo v0, "59230"
+    const-string/jumbo v0, "59231"
+    const-string/jumbo v0, "59232"
+    const-string/jumbo v0, "59233"
+    const-string/jumbo v0, "59234"
+    const-string/jumbo v0, "59235"
+    const-string/jumbo v0, "59236"
+    const-string/jumbo v0, "59237"
+    const-string/jumbo v0, "59238"
+    const-string/jumbo v0, "59239"
+    const-string/jumbo v0, "59240"
+    const-string/jumbo v0, "59241"
+    const-string/jumbo v0, "59242"
+    const-string/jumbo v0, "59243"
+    const-string/jumbo v0, "59244"
+    const-string/jumbo v0, "59245"
+    const-string/jumbo v0, "59246"
+    const-string/jumbo v0, "59247"
+    const-string/jumbo v0, "59248"
+    const-string/jumbo v0, "59249"
+    const-string/jumbo v0, "59250"
+    const-string/jumbo v0, "59251"
+    const-string/jumbo v0, "59252"
+    const-string/jumbo v0, "59253"
+    const-string/jumbo v0, "59254"
+    const-string/jumbo v0, "59255"
+    const-string/jumbo v0, "59256"
+    const-string/jumbo v0, "59257"
+    const-string/jumbo v0, "59258"
+    const-string/jumbo v0, "59259"
+    const-string/jumbo v0, "59260"
+    const-string/jumbo v0, "59261"
+    const-string/jumbo v0, "59262"
+    const-string/jumbo v0, "59263"
+    const-string/jumbo v0, "59264"
+    const-string/jumbo v0, "59265"
+    const-string/jumbo v0, "59266"
+    const-string/jumbo v0, "59267"
+    const-string/jumbo v0, "59268"
+    const-string/jumbo v0, "59269"
+    const-string/jumbo v0, "59270"
+    const-string/jumbo v0, "59271"
+    const-string/jumbo v0, "59272"
+    const-string/jumbo v0, "59273"
+    const-string/jumbo v0, "59274"
+    const-string/jumbo v0, "59275"
+    const-string/jumbo v0, "59276"
+    const-string/jumbo v0, "59277"
+    const-string/jumbo v0, "59278"
+    const-string/jumbo v0, "59279"
+    const-string/jumbo v0, "59280"
+    const-string/jumbo v0, "59281"
+    const-string/jumbo v0, "59282"
+    const-string/jumbo v0, "59283"
+    const-string/jumbo v0, "59284"
+    const-string/jumbo v0, "59285"
+    const-string/jumbo v0, "59286"
+    const-string/jumbo v0, "59287"
+    const-string/jumbo v0, "59288"
+    const-string/jumbo v0, "59289"
+    const-string/jumbo v0, "59290"
+    const-string/jumbo v0, "59291"
+    const-string/jumbo v0, "59292"
+    const-string/jumbo v0, "59293"
+    const-string/jumbo v0, "59294"
+    const-string/jumbo v0, "59295"
+    const-string/jumbo v0, "59296"
+    const-string/jumbo v0, "59297"
+    const-string/jumbo v0, "59298"
+    const-string/jumbo v0, "59299"
+    const-string/jumbo v0, "59300"
+    const-string/jumbo v0, "59301"
+    const-string/jumbo v0, "59302"
+    const-string/jumbo v0, "59303"
+    const-string/jumbo v0, "59304"
+    const-string/jumbo v0, "59305"
+    const-string/jumbo v0, "59306"
+    const-string/jumbo v0, "59307"
+    const-string/jumbo v0, "59308"
+    const-string/jumbo v0, "59309"
+    const-string/jumbo v0, "59310"
+    const-string/jumbo v0, "59311"
+    const-string/jumbo v0, "59312"
+    const-string/jumbo v0, "59313"
+    const-string/jumbo v0, "59314"
+    const-string/jumbo v0, "59315"
+    const-string/jumbo v0, "59316"
+    const-string/jumbo v0, "59317"
+    const-string/jumbo v0, "59318"
+    const-string/jumbo v0, "59319"
+    const-string/jumbo v0, "59320"
+    const-string/jumbo v0, "59321"
+    const-string/jumbo v0, "59322"
+    const-string/jumbo v0, "59323"
+    const-string/jumbo v0, "59324"
+    const-string/jumbo v0, "59325"
+    const-string/jumbo v0, "59326"
+    const-string/jumbo v0, "59327"
+    const-string/jumbo v0, "59328"
+    const-string/jumbo v0, "59329"
+    const-string/jumbo v0, "59330"
+    const-string/jumbo v0, "59331"
+    const-string/jumbo v0, "59332"
+    const-string/jumbo v0, "59333"
+    const-string/jumbo v0, "59334"
+    const-string/jumbo v0, "59335"
+    const-string/jumbo v0, "59336"
+    const-string/jumbo v0, "59337"
+    const-string/jumbo v0, "59338"
+    const-string/jumbo v0, "59339"
+    const-string/jumbo v0, "59340"
+    const-string/jumbo v0, "59341"
+    const-string/jumbo v0, "59342"
+    const-string/jumbo v0, "59343"
+    const-string/jumbo v0, "59344"
+    const-string/jumbo v0, "59345"
+    const-string/jumbo v0, "59346"
+    const-string/jumbo v0, "59347"
+    const-string/jumbo v0, "59348"
+    const-string/jumbo v0, "59349"
+    const-string/jumbo v0, "59350"
+    const-string/jumbo v0, "59351"
+    const-string/jumbo v0, "59352"
+    const-string/jumbo v0, "59353"
+    const-string/jumbo v0, "59354"
+    const-string/jumbo v0, "59355"
+    const-string/jumbo v0, "59356"
+    const-string/jumbo v0, "59357"
+    const-string/jumbo v0, "59358"
+    const-string/jumbo v0, "59359"
+    const-string/jumbo v0, "59360"
+    const-string/jumbo v0, "59361"
+    const-string/jumbo v0, "59362"
+    const-string/jumbo v0, "59363"
+    const-string/jumbo v0, "59364"
+    const-string/jumbo v0, "59365"
+    const-string/jumbo v0, "59366"
+    const-string/jumbo v0, "59367"
+    const-string/jumbo v0, "59368"
+    const-string/jumbo v0, "59369"
+    const-string/jumbo v0, "59370"
+    const-string/jumbo v0, "59371"
+    const-string/jumbo v0, "59372"
+    const-string/jumbo v0, "59373"
+    const-string/jumbo v0, "59374"
+    const-string/jumbo v0, "59375"
+    const-string/jumbo v0, "59376"
+    const-string/jumbo v0, "59377"
+    const-string/jumbo v0, "59378"
+    const-string/jumbo v0, "59379"
+    const-string/jumbo v0, "59380"
+    const-string/jumbo v0, "59381"
+    const-string/jumbo v0, "59382"
+    const-string/jumbo v0, "59383"
+    const-string/jumbo v0, "59384"
+    const-string/jumbo v0, "59385"
+    const-string/jumbo v0, "59386"
+    const-string/jumbo v0, "59387"
+    const-string/jumbo v0, "59388"
+    const-string/jumbo v0, "59389"
+    const-string/jumbo v0, "59390"
+    const-string/jumbo v0, "59391"
+    const-string/jumbo v0, "59392"
+    const-string/jumbo v0, "59393"
+    const-string/jumbo v0, "59394"
+    const-string/jumbo v0, "59395"
+    const-string/jumbo v0, "59396"
+    const-string/jumbo v0, "59397"
+    const-string/jumbo v0, "59398"
+    const-string/jumbo v0, "59399"
+    const-string/jumbo v0, "59400"
+    const-string/jumbo v0, "59401"
+    const-string/jumbo v0, "59402"
+    const-string/jumbo v0, "59403"
+    const-string/jumbo v0, "59404"
+    const-string/jumbo v0, "59405"
+    const-string/jumbo v0, "59406"
+    const-string/jumbo v0, "59407"
+    const-string/jumbo v0, "59408"
+    const-string/jumbo v0, "59409"
+    const-string/jumbo v0, "59410"
+    const-string/jumbo v0, "59411"
+    const-string/jumbo v0, "59412"
+    const-string/jumbo v0, "59413"
+    const-string/jumbo v0, "59414"
+    const-string/jumbo v0, "59415"
+    const-string/jumbo v0, "59416"
+    const-string/jumbo v0, "59417"
+    const-string/jumbo v0, "59418"
+    const-string/jumbo v0, "59419"
+    const-string/jumbo v0, "59420"
+    const-string/jumbo v0, "59421"
+    const-string/jumbo v0, "59422"
+    const-string/jumbo v0, "59423"
+    const-string/jumbo v0, "59424"
+    const-string/jumbo v0, "59425"
+    const-string/jumbo v0, "59426"
+    const-string/jumbo v0, "59427"
+    const-string/jumbo v0, "59428"
+    const-string/jumbo v0, "59429"
+    const-string/jumbo v0, "59430"
+    const-string/jumbo v0, "59431"
+    const-string/jumbo v0, "59432"
+    const-string/jumbo v0, "59433"
+    const-string/jumbo v0, "59434"
+    const-string/jumbo v0, "59435"
+    const-string/jumbo v0, "59436"
+    const-string/jumbo v0, "59437"
+    const-string/jumbo v0, "59438"
+    const-string/jumbo v0, "59439"
+    const-string/jumbo v0, "59440"
+    const-string/jumbo v0, "59441"
+    const-string/jumbo v0, "59442"
+    const-string/jumbo v0, "59443"
+    const-string/jumbo v0, "59444"
+    const-string/jumbo v0, "59445"
+    const-string/jumbo v0, "59446"
+    const-string/jumbo v0, "59447"
+    const-string/jumbo v0, "59448"
+    const-string/jumbo v0, "59449"
+    const-string/jumbo v0, "59450"
+    const-string/jumbo v0, "59451"
+    const-string/jumbo v0, "59452"
+    const-string/jumbo v0, "59453"
+    const-string/jumbo v0, "59454"
+    const-string/jumbo v0, "59455"
+    const-string/jumbo v0, "59456"
+    const-string/jumbo v0, "59457"
+    const-string/jumbo v0, "59458"
+    const-string/jumbo v0, "59459"
+    const-string/jumbo v0, "59460"
+    const-string/jumbo v0, "59461"
+    const-string/jumbo v0, "59462"
+    const-string/jumbo v0, "59463"
+    const-string/jumbo v0, "59464"
+    const-string/jumbo v0, "59465"
+    const-string/jumbo v0, "59466"
+    const-string/jumbo v0, "59467"
+    const-string/jumbo v0, "59468"
+    const-string/jumbo v0, "59469"
+    const-string/jumbo v0, "59470"
+    const-string/jumbo v0, "59471"
+    const-string/jumbo v0, "59472"
+    const-string/jumbo v0, "59473"
+    const-string/jumbo v0, "59474"
+    const-string/jumbo v0, "59475"
+    const-string/jumbo v0, "59476"
+    const-string/jumbo v0, "59477"
+    const-string/jumbo v0, "59478"
+    const-string/jumbo v0, "59479"
+    const-string/jumbo v0, "59480"
+    const-string/jumbo v0, "59481"
+    const-string/jumbo v0, "59482"
+    const-string/jumbo v0, "59483"
+    const-string/jumbo v0, "59484"
+    const-string/jumbo v0, "59485"
+    const-string/jumbo v0, "59486"
+    const-string/jumbo v0, "59487"
+    const-string/jumbo v0, "59488"
+    const-string/jumbo v0, "59489"
+    const-string/jumbo v0, "59490"
+    const-string/jumbo v0, "59491"
+    const-string/jumbo v0, "59492"
+    const-string/jumbo v0, "59493"
+    const-string/jumbo v0, "59494"
+    const-string/jumbo v0, "59495"
+    const-string/jumbo v0, "59496"
+    const-string/jumbo v0, "59497"
+    const-string/jumbo v0, "59498"
+    const-string/jumbo v0, "59499"
+    const-string/jumbo v0, "59500"
+    const-string/jumbo v0, "59501"
+    const-string/jumbo v0, "59502"
+    const-string/jumbo v0, "59503"
+    const-string/jumbo v0, "59504"
+    const-string/jumbo v0, "59505"
+    const-string/jumbo v0, "59506"
+    const-string/jumbo v0, "59507"
+    const-string/jumbo v0, "59508"
+    const-string/jumbo v0, "59509"
+    const-string/jumbo v0, "59510"
+    const-string/jumbo v0, "59511"
+    const-string/jumbo v0, "59512"
+    const-string/jumbo v0, "59513"
+    const-string/jumbo v0, "59514"
+    const-string/jumbo v0, "59515"
+    const-string/jumbo v0, "59516"
+    const-string/jumbo v0, "59517"
+    const-string/jumbo v0, "59518"
+    const-string/jumbo v0, "59519"
+    const-string/jumbo v0, "59520"
+    const-string/jumbo v0, "59521"
+    const-string/jumbo v0, "59522"
+    const-string/jumbo v0, "59523"
+    const-string/jumbo v0, "59524"
+    const-string/jumbo v0, "59525"
+    const-string/jumbo v0, "59526"
+    const-string/jumbo v0, "59527"
+    const-string/jumbo v0, "59528"
+    const-string/jumbo v0, "59529"
+    const-string/jumbo v0, "59530"
+    const-string/jumbo v0, "59531"
+    const-string/jumbo v0, "59532"
+    const-string/jumbo v0, "59533"
+    const-string/jumbo v0, "59534"
+    const-string/jumbo v0, "59535"
+    const-string/jumbo v0, "59536"
+    const-string/jumbo v0, "59537"
+    const-string/jumbo v0, "59538"
+    const-string/jumbo v0, "59539"
+    const-string/jumbo v0, "59540"
+    const-string/jumbo v0, "59541"
+    const-string/jumbo v0, "59542"
+    const-string/jumbo v0, "59543"
+    const-string/jumbo v0, "59544"
+    const-string/jumbo v0, "59545"
+    const-string/jumbo v0, "59546"
+    const-string/jumbo v0, "59547"
+    const-string/jumbo v0, "59548"
+    const-string/jumbo v0, "59549"
+    const-string/jumbo v0, "59550"
+    const-string/jumbo v0, "59551"
+    const-string/jumbo v0, "59552"
+    const-string/jumbo v0, "59553"
+    const-string/jumbo v0, "59554"
+    const-string/jumbo v0, "59555"
+    const-string/jumbo v0, "59556"
+    const-string/jumbo v0, "59557"
+    const-string/jumbo v0, "59558"
+    const-string/jumbo v0, "59559"
+    const-string/jumbo v0, "59560"
+    const-string/jumbo v0, "59561"
+    const-string/jumbo v0, "59562"
+    const-string/jumbo v0, "59563"
+    const-string/jumbo v0, "59564"
+    const-string/jumbo v0, "59565"
+    const-string/jumbo v0, "59566"
+    const-string/jumbo v0, "59567"
+    const-string/jumbo v0, "59568"
+    const-string/jumbo v0, "59569"
+    const-string/jumbo v0, "59570"
+    const-string/jumbo v0, "59571"
+    const-string/jumbo v0, "59572"
+    const-string/jumbo v0, "59573"
+    const-string/jumbo v0, "59574"
+    const-string/jumbo v0, "59575"
+    const-string/jumbo v0, "59576"
+    const-string/jumbo v0, "59577"
+    const-string/jumbo v0, "59578"
+    const-string/jumbo v0, "59579"
+    const-string/jumbo v0, "59580"
+    const-string/jumbo v0, "59581"
+    const-string/jumbo v0, "59582"
+    const-string/jumbo v0, "59583"
+    const-string/jumbo v0, "59584"
+    const-string/jumbo v0, "59585"
+    const-string/jumbo v0, "59586"
+    const-string/jumbo v0, "59587"
+    const-string/jumbo v0, "59588"
+    const-string/jumbo v0, "59589"
+    const-string/jumbo v0, "59590"
+    const-string/jumbo v0, "59591"
+    const-string/jumbo v0, "59592"
+    const-string/jumbo v0, "59593"
+    const-string/jumbo v0, "59594"
+    const-string/jumbo v0, "59595"
+    const-string/jumbo v0, "59596"
+    const-string/jumbo v0, "59597"
+    const-string/jumbo v0, "59598"
+    const-string/jumbo v0, "59599"
+    const-string/jumbo v0, "59600"
+    const-string/jumbo v0, "59601"
+    const-string/jumbo v0, "59602"
+    const-string/jumbo v0, "59603"
+    const-string/jumbo v0, "59604"
+    const-string/jumbo v0, "59605"
+    const-string/jumbo v0, "59606"
+    const-string/jumbo v0, "59607"
+    const-string/jumbo v0, "59608"
+    const-string/jumbo v0, "59609"
+    const-string/jumbo v0, "59610"
+    const-string/jumbo v0, "59611"
+    const-string/jumbo v0, "59612"
+    const-string/jumbo v0, "59613"
+    const-string/jumbo v0, "59614"
+    const-string/jumbo v0, "59615"
+    const-string/jumbo v0, "59616"
+    const-string/jumbo v0, "59617"
+    const-string/jumbo v0, "59618"
+    const-string/jumbo v0, "59619"
+    const-string/jumbo v0, "59620"
+    const-string/jumbo v0, "59621"
+    const-string/jumbo v0, "59622"
+    const-string/jumbo v0, "59623"
+    const-string/jumbo v0, "59624"
+    const-string/jumbo v0, "59625"
+    const-string/jumbo v0, "59626"
+    const-string/jumbo v0, "59627"
+    const-string/jumbo v0, "59628"
+    const-string/jumbo v0, "59629"
+    const-string/jumbo v0, "59630"
+    const-string/jumbo v0, "59631"
+    const-string/jumbo v0, "59632"
+    const-string/jumbo v0, "59633"
+    const-string/jumbo v0, "59634"
+    const-string/jumbo v0, "59635"
+    const-string/jumbo v0, "59636"
+    const-string/jumbo v0, "59637"
+    const-string/jumbo v0, "59638"
+    const-string/jumbo v0, "59639"
+    const-string/jumbo v0, "59640"
+    const-string/jumbo v0, "59641"
+    const-string/jumbo v0, "59642"
+    const-string/jumbo v0, "59643"
+    const-string/jumbo v0, "59644"
+    const-string/jumbo v0, "59645"
+    const-string/jumbo v0, "59646"
+    const-string/jumbo v0, "59647"
+    const-string/jumbo v0, "59648"
+    const-string/jumbo v0, "59649"
+    const-string/jumbo v0, "59650"
+    const-string/jumbo v0, "59651"
+    const-string/jumbo v0, "59652"
+    const-string/jumbo v0, "59653"
+    const-string/jumbo v0, "59654"
+    const-string/jumbo v0, "59655"
+    const-string/jumbo v0, "59656"
+    const-string/jumbo v0, "59657"
+    const-string/jumbo v0, "59658"
+    const-string/jumbo v0, "59659"
+    const-string/jumbo v0, "59660"
+    const-string/jumbo v0, "59661"
+    const-string/jumbo v0, "59662"
+    const-string/jumbo v0, "59663"
+    const-string/jumbo v0, "59664"
+    const-string/jumbo v0, "59665"
+    const-string/jumbo v0, "59666"
+    const-string/jumbo v0, "59667"
+    const-string/jumbo v0, "59668"
+    const-string/jumbo v0, "59669"
+    const-string/jumbo v0, "59670"
+    const-string/jumbo v0, "59671"
+    const-string/jumbo v0, "59672"
+    const-string/jumbo v0, "59673"
+    const-string/jumbo v0, "59674"
+    const-string/jumbo v0, "59675"
+    const-string/jumbo v0, "59676"
+    const-string/jumbo v0, "59677"
+    const-string/jumbo v0, "59678"
+    const-string/jumbo v0, "59679"
+    const-string/jumbo v0, "59680"
+    const-string/jumbo v0, "59681"
+    const-string/jumbo v0, "59682"
+    const-string/jumbo v0, "59683"
+    const-string/jumbo v0, "59684"
+    const-string/jumbo v0, "59685"
+    const-string/jumbo v0, "59686"
+    const-string/jumbo v0, "59687"
+    const-string/jumbo v0, "59688"
+    const-string/jumbo v0, "59689"
+    const-string/jumbo v0, "59690"
+    const-string/jumbo v0, "59691"
+    const-string/jumbo v0, "59692"
+    const-string/jumbo v0, "59693"
+    const-string/jumbo v0, "59694"
+    const-string/jumbo v0, "59695"
+    const-string/jumbo v0, "59696"
+    const-string/jumbo v0, "59697"
+    const-string/jumbo v0, "59698"
+    const-string/jumbo v0, "59699"
+    const-string/jumbo v0, "59700"
+    const-string/jumbo v0, "59701"
+    const-string/jumbo v0, "59702"
+    const-string/jumbo v0, "59703"
+    const-string/jumbo v0, "59704"
+    const-string/jumbo v0, "59705"
+    const-string/jumbo v0, "59706"
+    const-string/jumbo v0, "59707"
+    const-string/jumbo v0, "59708"
+    const-string/jumbo v0, "59709"
+    const-string/jumbo v0, "59710"
+    const-string/jumbo v0, "59711"
+    const-string/jumbo v0, "59712"
+    const-string/jumbo v0, "59713"
+    const-string/jumbo v0, "59714"
+    const-string/jumbo v0, "59715"
+    const-string/jumbo v0, "59716"
+    const-string/jumbo v0, "59717"
+    const-string/jumbo v0, "59718"
+    const-string/jumbo v0, "59719"
+    const-string/jumbo v0, "59720"
+    const-string/jumbo v0, "59721"
+    const-string/jumbo v0, "59722"
+    const-string/jumbo v0, "59723"
+    const-string/jumbo v0, "59724"
+    const-string/jumbo v0, "59725"
+    const-string/jumbo v0, "59726"
+    const-string/jumbo v0, "59727"
+    const-string/jumbo v0, "59728"
+    const-string/jumbo v0, "59729"
+    const-string/jumbo v0, "59730"
+    const-string/jumbo v0, "59731"
+    const-string/jumbo v0, "59732"
+    const-string/jumbo v0, "59733"
+    const-string/jumbo v0, "59734"
+    const-string/jumbo v0, "59735"
+    const-string/jumbo v0, "59736"
+    const-string/jumbo v0, "59737"
+    const-string/jumbo v0, "59738"
+    const-string/jumbo v0, "59739"
+    const-string/jumbo v0, "59740"
+    const-string/jumbo v0, "59741"
+    const-string/jumbo v0, "59742"
+    const-string/jumbo v0, "59743"
+    const-string/jumbo v0, "59744"
+    const-string/jumbo v0, "59745"
+    const-string/jumbo v0, "59746"
+    const-string/jumbo v0, "59747"
+    const-string/jumbo v0, "59748"
+    const-string/jumbo v0, "59749"
+    const-string/jumbo v0, "59750"
+    const-string/jumbo v0, "59751"
+    const-string/jumbo v0, "59752"
+    const-string/jumbo v0, "59753"
+    const-string/jumbo v0, "59754"
+    const-string/jumbo v0, "59755"
+    const-string/jumbo v0, "59756"
+    const-string/jumbo v0, "59757"
+    const-string/jumbo v0, "59758"
+    const-string/jumbo v0, "59759"
+    const-string/jumbo v0, "59760"
+    const-string/jumbo v0, "59761"
+    const-string/jumbo v0, "59762"
+    const-string/jumbo v0, "59763"
+    const-string/jumbo v0, "59764"
+    const-string/jumbo v0, "59765"
+    const-string/jumbo v0, "59766"
+    const-string/jumbo v0, "59767"
+    const-string/jumbo v0, "59768"
+    const-string/jumbo v0, "59769"
+    const-string/jumbo v0, "59770"
+    const-string/jumbo v0, "59771"
+    const-string/jumbo v0, "59772"
+    const-string/jumbo v0, "59773"
+    const-string/jumbo v0, "59774"
+    const-string/jumbo v0, "59775"
+    const-string/jumbo v0, "59776"
+    const-string/jumbo v0, "59777"
+    const-string/jumbo v0, "59778"
+    const-string/jumbo v0, "59779"
+    const-string/jumbo v0, "59780"
+    const-string/jumbo v0, "59781"
+    const-string/jumbo v0, "59782"
+    const-string/jumbo v0, "59783"
+    const-string/jumbo v0, "59784"
+    const-string/jumbo v0, "59785"
+    const-string/jumbo v0, "59786"
+    const-string/jumbo v0, "59787"
+    const-string/jumbo v0, "59788"
+    const-string/jumbo v0, "59789"
+    const-string/jumbo v0, "59790"
+    const-string/jumbo v0, "59791"
+    const-string/jumbo v0, "59792"
+    const-string/jumbo v0, "59793"
+    const-string/jumbo v0, "59794"
+    const-string/jumbo v0, "59795"
+    const-string/jumbo v0, "59796"
+    const-string/jumbo v0, "59797"
+    const-string/jumbo v0, "59798"
+    const-string/jumbo v0, "59799"
+    const-string/jumbo v0, "59800"
+    const-string/jumbo v0, "59801"
+    const-string/jumbo v0, "59802"
+    const-string/jumbo v0, "59803"
+    const-string/jumbo v0, "59804"
+    const-string/jumbo v0, "59805"
+    const-string/jumbo v0, "59806"
+    const-string/jumbo v0, "59807"
+    const-string/jumbo v0, "59808"
+    const-string/jumbo v0, "59809"
+    const-string/jumbo v0, "59810"
+    const-string/jumbo v0, "59811"
+    const-string/jumbo v0, "59812"
+    const-string/jumbo v0, "59813"
+    const-string/jumbo v0, "59814"
+    const-string/jumbo v0, "59815"
+    const-string/jumbo v0, "59816"
+    const-string/jumbo v0, "59817"
+    const-string/jumbo v0, "59818"
+    const-string/jumbo v0, "59819"
+    const-string/jumbo v0, "59820"
+    const-string/jumbo v0, "59821"
+    const-string/jumbo v0, "59822"
+    const-string/jumbo v0, "59823"
+    const-string/jumbo v0, "59824"
+    const-string/jumbo v0, "59825"
+    const-string/jumbo v0, "59826"
+    const-string/jumbo v0, "59827"
+    const-string/jumbo v0, "59828"
+    const-string/jumbo v0, "59829"
+    const-string/jumbo v0, "59830"
+    const-string/jumbo v0, "59831"
+    const-string/jumbo v0, "59832"
+    const-string/jumbo v0, "59833"
+    const-string/jumbo v0, "59834"
+    const-string/jumbo v0, "59835"
+    const-string/jumbo v0, "59836"
+    const-string/jumbo v0, "59837"
+    const-string/jumbo v0, "59838"
+    const-string/jumbo v0, "59839"
+    const-string/jumbo v0, "59840"
+    const-string/jumbo v0, "59841"
+    const-string/jumbo v0, "59842"
+    const-string/jumbo v0, "59843"
+    const-string/jumbo v0, "59844"
+    const-string/jumbo v0, "59845"
+    const-string/jumbo v0, "59846"
+    const-string/jumbo v0, "59847"
+    const-string/jumbo v0, "59848"
+    const-string/jumbo v0, "59849"
+    const-string/jumbo v0, "59850"
+    const-string/jumbo v0, "59851"
+    const-string/jumbo v0, "59852"
+    const-string/jumbo v0, "59853"
+    const-string/jumbo v0, "59854"
+    const-string/jumbo v0, "59855"
+    const-string/jumbo v0, "59856"
+    const-string/jumbo v0, "59857"
+    const-string/jumbo v0, "59858"
+    const-string/jumbo v0, "59859"
+    const-string/jumbo v0, "59860"
+    const-string/jumbo v0, "59861"
+    const-string/jumbo v0, "59862"
+    const-string/jumbo v0, "59863"
+    const-string/jumbo v0, "59864"
+    const-string/jumbo v0, "59865"
+    const-string/jumbo v0, "59866"
+    const-string/jumbo v0, "59867"
+    const-string/jumbo v0, "59868"
+    const-string/jumbo v0, "59869"
+    const-string/jumbo v0, "59870"
+    const-string/jumbo v0, "59871"
+    const-string/jumbo v0, "59872"
+    const-string/jumbo v0, "59873"
+    const-string/jumbo v0, "59874"
+    const-string/jumbo v0, "59875"
+    const-string/jumbo v0, "59876"
+    const-string/jumbo v0, "59877"
+    const-string/jumbo v0, "59878"
+    const-string/jumbo v0, "59879"
+    const-string/jumbo v0, "59880"
+    const-string/jumbo v0, "59881"
+    const-string/jumbo v0, "59882"
+    const-string/jumbo v0, "59883"
+    const-string/jumbo v0, "59884"
+    const-string/jumbo v0, "59885"
+    const-string/jumbo v0, "59886"
+    const-string/jumbo v0, "59887"
+    const-string/jumbo v0, "59888"
+    const-string/jumbo v0, "59889"
+    const-string/jumbo v0, "59890"
+    const-string/jumbo v0, "59891"
+    const-string/jumbo v0, "59892"
+    const-string/jumbo v0, "59893"
+    const-string/jumbo v0, "59894"
+    const-string/jumbo v0, "59895"
+    const-string/jumbo v0, "59896"
+    const-string/jumbo v0, "59897"
+    const-string/jumbo v0, "59898"
+    const-string/jumbo v0, "59899"
+    const-string/jumbo v0, "59900"
+    const-string/jumbo v0, "59901"
+    const-string/jumbo v0, "59902"
+    const-string/jumbo v0, "59903"
+    const-string/jumbo v0, "59904"
+    const-string/jumbo v0, "59905"
+    const-string/jumbo v0, "59906"
+    const-string/jumbo v0, "59907"
+    const-string/jumbo v0, "59908"
+    const-string/jumbo v0, "59909"
+    const-string/jumbo v0, "59910"
+    const-string/jumbo v0, "59911"
+    const-string/jumbo v0, "59912"
+    const-string/jumbo v0, "59913"
+    const-string/jumbo v0, "59914"
+    const-string/jumbo v0, "59915"
+    const-string/jumbo v0, "59916"
+    const-string/jumbo v0, "59917"
+    const-string/jumbo v0, "59918"
+    const-string/jumbo v0, "59919"
+    const-string/jumbo v0, "59920"
+    const-string/jumbo v0, "59921"
+    const-string/jumbo v0, "59922"
+    const-string/jumbo v0, "59923"
+    const-string/jumbo v0, "59924"
+    const-string/jumbo v0, "59925"
+    const-string/jumbo v0, "59926"
+    const-string/jumbo v0, "59927"
+    const-string/jumbo v0, "59928"
+    const-string/jumbo v0, "59929"
+    const-string/jumbo v0, "59930"
+    const-string/jumbo v0, "59931"
+    const-string/jumbo v0, "59932"
+    const-string/jumbo v0, "59933"
+    const-string/jumbo v0, "59934"
+    const-string/jumbo v0, "59935"
+    const-string/jumbo v0, "59936"
+    const-string/jumbo v0, "59937"
+    const-string/jumbo v0, "59938"
+    const-string/jumbo v0, "59939"
+    const-string/jumbo v0, "59940"
+    const-string/jumbo v0, "59941"
+    const-string/jumbo v0, "59942"
+    const-string/jumbo v0, "59943"
+    const-string/jumbo v0, "59944"
+    const-string/jumbo v0, "59945"
+    const-string/jumbo v0, "59946"
+    const-string/jumbo v0, "59947"
+    const-string/jumbo v0, "59948"
+    const-string/jumbo v0, "59949"
+    const-string/jumbo v0, "59950"
+    const-string/jumbo v0, "59951"
+    const-string/jumbo v0, "59952"
+    const-string/jumbo v0, "59953"
+    const-string/jumbo v0, "59954"
+    const-string/jumbo v0, "59955"
+    const-string/jumbo v0, "59956"
+    const-string/jumbo v0, "59957"
+    const-string/jumbo v0, "59958"
+    const-string/jumbo v0, "59959"
+    const-string/jumbo v0, "59960"
+    const-string/jumbo v0, "59961"
+    const-string/jumbo v0, "59962"
+    const-string/jumbo v0, "59963"
+    const-string/jumbo v0, "59964"
+    const-string/jumbo v0, "59965"
+    const-string/jumbo v0, "59966"
+    const-string/jumbo v0, "59967"
+    const-string/jumbo v0, "59968"
+    const-string/jumbo v0, "59969"
+    const-string/jumbo v0, "59970"
+    const-string/jumbo v0, "59971"
+    const-string/jumbo v0, "59972"
+    const-string/jumbo v0, "59973"
+    const-string/jumbo v0, "59974"
+    const-string/jumbo v0, "59975"
+    const-string/jumbo v0, "59976"
+    const-string/jumbo v0, "59977"
+    const-string/jumbo v0, "59978"
+    const-string/jumbo v0, "59979"
+    const-string/jumbo v0, "59980"
+    const-string/jumbo v0, "59981"
+    const-string/jumbo v0, "59982"
+    const-string/jumbo v0, "59983"
+    const-string/jumbo v0, "59984"
+    const-string/jumbo v0, "59985"
+    const-string/jumbo v0, "59986"
+    const-string/jumbo v0, "59987"
+    const-string/jumbo v0, "59988"
+    const-string/jumbo v0, "59989"
+    const-string/jumbo v0, "59990"
+    const-string/jumbo v0, "59991"
+    const-string/jumbo v0, "59992"
+    const-string/jumbo v0, "59993"
+    const-string/jumbo v0, "59994"
+    const-string/jumbo v0, "59995"
+    const-string/jumbo v0, "59996"
+    const-string/jumbo v0, "59997"
+    const-string/jumbo v0, "59998"
+    const-string/jumbo v0, "59999"
+    const-string/jumbo v0, "60000"
+    const-string/jumbo v0, "60001"
+    const-string/jumbo v0, "60002"
+    const-string/jumbo v0, "60003"
+    const-string/jumbo v0, "60004"
+    const-string/jumbo v0, "60005"
+    const-string/jumbo v0, "60006"
+    const-string/jumbo v0, "60007"
+    const-string/jumbo v0, "60008"
+    const-string/jumbo v0, "60009"
+    const-string/jumbo v0, "60010"
+    const-string/jumbo v0, "60011"
+    const-string/jumbo v0, "60012"
+    const-string/jumbo v0, "60013"
+    const-string/jumbo v0, "60014"
+    const-string/jumbo v0, "60015"
+    const-string/jumbo v0, "60016"
+    const-string/jumbo v0, "60017"
+    const-string/jumbo v0, "60018"
+    const-string/jumbo v0, "60019"
+    const-string/jumbo v0, "60020"
+    const-string/jumbo v0, "60021"
+    const-string/jumbo v0, "60022"
+    const-string/jumbo v0, "60023"
+    const-string/jumbo v0, "60024"
+    const-string/jumbo v0, "60025"
+    const-string/jumbo v0, "60026"
+    const-string/jumbo v0, "60027"
+    const-string/jumbo v0, "60028"
+    const-string/jumbo v0, "60029"
+    const-string/jumbo v0, "60030"
+    const-string/jumbo v0, "60031"
+    const-string/jumbo v0, "60032"
+    const-string/jumbo v0, "60033"
+    const-string/jumbo v0, "60034"
+    const-string/jumbo v0, "60035"
+    const-string/jumbo v0, "60036"
+    const-string/jumbo v0, "60037"
+    const-string/jumbo v0, "60038"
+    const-string/jumbo v0, "60039"
+    const-string/jumbo v0, "60040"
+    const-string/jumbo v0, "60041"
+    const-string/jumbo v0, "60042"
+    const-string/jumbo v0, "60043"
+    const-string/jumbo v0, "60044"
+    const-string/jumbo v0, "60045"
+    const-string/jumbo v0, "60046"
+    const-string/jumbo v0, "60047"
+    const-string/jumbo v0, "60048"
+    const-string/jumbo v0, "60049"
+    const-string/jumbo v0, "60050"
+    const-string/jumbo v0, "60051"
+    const-string/jumbo v0, "60052"
+    const-string/jumbo v0, "60053"
+    const-string/jumbo v0, "60054"
+    const-string/jumbo v0, "60055"
+    const-string/jumbo v0, "60056"
+    const-string/jumbo v0, "60057"
+    const-string/jumbo v0, "60058"
+    const-string/jumbo v0, "60059"
+    const-string/jumbo v0, "60060"
+    const-string/jumbo v0, "60061"
+    const-string/jumbo v0, "60062"
+    const-string/jumbo v0, "60063"
+    const-string/jumbo v0, "60064"
+    const-string/jumbo v0, "60065"
+    const-string/jumbo v0, "60066"
+    const-string/jumbo v0, "60067"
+    const-string/jumbo v0, "60068"
+    const-string/jumbo v0, "60069"
+    const-string/jumbo v0, "60070"
+    const-string/jumbo v0, "60071"
+    const-string/jumbo v0, "60072"
+    const-string/jumbo v0, "60073"
+    const-string/jumbo v0, "60074"
+    const-string/jumbo v0, "60075"
+    const-string/jumbo v0, "60076"
+    const-string/jumbo v0, "60077"
+    const-string/jumbo v0, "60078"
+    const-string/jumbo v0, "60079"
+    const-string/jumbo v0, "60080"
+    const-string/jumbo v0, "60081"
+    const-string/jumbo v0, "60082"
+    const-string/jumbo v0, "60083"
+    const-string/jumbo v0, "60084"
+    const-string/jumbo v0, "60085"
+    const-string/jumbo v0, "60086"
+    const-string/jumbo v0, "60087"
+    const-string/jumbo v0, "60088"
+    const-string/jumbo v0, "60089"
+    const-string/jumbo v0, "60090"
+    const-string/jumbo v0, "60091"
+    const-string/jumbo v0, "60092"
+    const-string/jumbo v0, "60093"
+    const-string/jumbo v0, "60094"
+    const-string/jumbo v0, "60095"
+    const-string/jumbo v0, "60096"
+    const-string/jumbo v0, "60097"
+    const-string/jumbo v0, "60098"
+    const-string/jumbo v0, "60099"
+    const-string/jumbo v0, "60100"
+    const-string/jumbo v0, "60101"
+    const-string/jumbo v0, "60102"
+    const-string/jumbo v0, "60103"
+    const-string/jumbo v0, "60104"
+    const-string/jumbo v0, "60105"
+    const-string/jumbo v0, "60106"
+    const-string/jumbo v0, "60107"
+    const-string/jumbo v0, "60108"
+    const-string/jumbo v0, "60109"
+    const-string/jumbo v0, "60110"
+    const-string/jumbo v0, "60111"
+    const-string/jumbo v0, "60112"
+    const-string/jumbo v0, "60113"
+    const-string/jumbo v0, "60114"
+    const-string/jumbo v0, "60115"
+    const-string/jumbo v0, "60116"
+    const-string/jumbo v0, "60117"
+    const-string/jumbo v0, "60118"
+    const-string/jumbo v0, "60119"
+    const-string/jumbo v0, "60120"
+    const-string/jumbo v0, "60121"
+    const-string/jumbo v0, "60122"
+    const-string/jumbo v0, "60123"
+    const-string/jumbo v0, "60124"
+    const-string/jumbo v0, "60125"
+    const-string/jumbo v0, "60126"
+    const-string/jumbo v0, "60127"
+    const-string/jumbo v0, "60128"
+    const-string/jumbo v0, "60129"
+    const-string/jumbo v0, "60130"
+    const-string/jumbo v0, "60131"
+    const-string/jumbo v0, "60132"
+    const-string/jumbo v0, "60133"
+    const-string/jumbo v0, "60134"
+    const-string/jumbo v0, "60135"
+    const-string/jumbo v0, "60136"
+    const-string/jumbo v0, "60137"
+    const-string/jumbo v0, "60138"
+    const-string/jumbo v0, "60139"
+    const-string/jumbo v0, "60140"
+    const-string/jumbo v0, "60141"
+    const-string/jumbo v0, "60142"
+    const-string/jumbo v0, "60143"
+    const-string/jumbo v0, "60144"
+    const-string/jumbo v0, "60145"
+    const-string/jumbo v0, "60146"
+    const-string/jumbo v0, "60147"
+    const-string/jumbo v0, "60148"
+    const-string/jumbo v0, "60149"
+    const-string/jumbo v0, "60150"
+    const-string/jumbo v0, "60151"
+    const-string/jumbo v0, "60152"
+    const-string/jumbo v0, "60153"
+    const-string/jumbo v0, "60154"
+    const-string/jumbo v0, "60155"
+    const-string/jumbo v0, "60156"
+    const-string/jumbo v0, "60157"
+    const-string/jumbo v0, "60158"
+    const-string/jumbo v0, "60159"
+    const-string/jumbo v0, "60160"
+    const-string/jumbo v0, "60161"
+    const-string/jumbo v0, "60162"
+    const-string/jumbo v0, "60163"
+    const-string/jumbo v0, "60164"
+    const-string/jumbo v0, "60165"
+    const-string/jumbo v0, "60166"
+    const-string/jumbo v0, "60167"
+    const-string/jumbo v0, "60168"
+    const-string/jumbo v0, "60169"
+    const-string/jumbo v0, "60170"
+    const-string/jumbo v0, "60171"
+    const-string/jumbo v0, "60172"
+    const-string/jumbo v0, "60173"
+    const-string/jumbo v0, "60174"
+    const-string/jumbo v0, "60175"
+    const-string/jumbo v0, "60176"
+    const-string/jumbo v0, "60177"
+    const-string/jumbo v0, "60178"
+    const-string/jumbo v0, "60179"
+    const-string/jumbo v0, "60180"
+    const-string/jumbo v0, "60181"
+    const-string/jumbo v0, "60182"
+    const-string/jumbo v0, "60183"
+    const-string/jumbo v0, "60184"
+    const-string/jumbo v0, "60185"
+    const-string/jumbo v0, "60186"
+    const-string/jumbo v0, "60187"
+    const-string/jumbo v0, "60188"
+    const-string/jumbo v0, "60189"
+    const-string/jumbo v0, "60190"
+    const-string/jumbo v0, "60191"
+    const-string/jumbo v0, "60192"
+    const-string/jumbo v0, "60193"
+    const-string/jumbo v0, "60194"
+    const-string/jumbo v0, "60195"
+    const-string/jumbo v0, "60196"
+    const-string/jumbo v0, "60197"
+    const-string/jumbo v0, "60198"
+    const-string/jumbo v0, "60199"
+    const-string/jumbo v0, "60200"
+    const-string/jumbo v0, "60201"
+    const-string/jumbo v0, "60202"
+    const-string/jumbo v0, "60203"
+    const-string/jumbo v0, "60204"
+    const-string/jumbo v0, "60205"
+    const-string/jumbo v0, "60206"
+    const-string/jumbo v0, "60207"
+    const-string/jumbo v0, "60208"
+    const-string/jumbo v0, "60209"
+    const-string/jumbo v0, "60210"
+    const-string/jumbo v0, "60211"
+    const-string/jumbo v0, "60212"
+    const-string/jumbo v0, "60213"
+    const-string/jumbo v0, "60214"
+    const-string/jumbo v0, "60215"
+    const-string/jumbo v0, "60216"
+    const-string/jumbo v0, "60217"
+    const-string/jumbo v0, "60218"
+    const-string/jumbo v0, "60219"
+    const-string/jumbo v0, "60220"
+    const-string/jumbo v0, "60221"
+    const-string/jumbo v0, "60222"
+    const-string/jumbo v0, "60223"
+    const-string/jumbo v0, "60224"
+    const-string/jumbo v0, "60225"
+    const-string/jumbo v0, "60226"
+    const-string/jumbo v0, "60227"
+    const-string/jumbo v0, "60228"
+    const-string/jumbo v0, "60229"
+    const-string/jumbo v0, "60230"
+    const-string/jumbo v0, "60231"
+    const-string/jumbo v0, "60232"
+    const-string/jumbo v0, "60233"
+    const-string/jumbo v0, "60234"
+    const-string/jumbo v0, "60235"
+    const-string/jumbo v0, "60236"
+    const-string/jumbo v0, "60237"
+    const-string/jumbo v0, "60238"
+    const-string/jumbo v0, "60239"
+    const-string/jumbo v0, "60240"
+    const-string/jumbo v0, "60241"
+    const-string/jumbo v0, "60242"
+    const-string/jumbo v0, "60243"
+    const-string/jumbo v0, "60244"
+    const-string/jumbo v0, "60245"
+    const-string/jumbo v0, "60246"
+    const-string/jumbo v0, "60247"
+    const-string/jumbo v0, "60248"
+    const-string/jumbo v0, "60249"
+    const-string/jumbo v0, "60250"
+    const-string/jumbo v0, "60251"
+    const-string/jumbo v0, "60252"
+    const-string/jumbo v0, "60253"
+    const-string/jumbo v0, "60254"
+    const-string/jumbo v0, "60255"
+    const-string/jumbo v0, "60256"
+    const-string/jumbo v0, "60257"
+    const-string/jumbo v0, "60258"
+    const-string/jumbo v0, "60259"
+    const-string/jumbo v0, "60260"
+    const-string/jumbo v0, "60261"
+    const-string/jumbo v0, "60262"
+    const-string/jumbo v0, "60263"
+    const-string/jumbo v0, "60264"
+    const-string/jumbo v0, "60265"
+    const-string/jumbo v0, "60266"
+    const-string/jumbo v0, "60267"
+    const-string/jumbo v0, "60268"
+    const-string/jumbo v0, "60269"
+    const-string/jumbo v0, "60270"
+    const-string/jumbo v0, "60271"
+    const-string/jumbo v0, "60272"
+    const-string/jumbo v0, "60273"
+    const-string/jumbo v0, "60274"
+    const-string/jumbo v0, "60275"
+    const-string/jumbo v0, "60276"
+    const-string/jumbo v0, "60277"
+    const-string/jumbo v0, "60278"
+    const-string/jumbo v0, "60279"
+    const-string/jumbo v0, "60280"
+    const-string/jumbo v0, "60281"
+    const-string/jumbo v0, "60282"
+    const-string/jumbo v0, "60283"
+    const-string/jumbo v0, "60284"
+    const-string/jumbo v0, "60285"
+    const-string/jumbo v0, "60286"
+    const-string/jumbo v0, "60287"
+    const-string/jumbo v0, "60288"
+    const-string/jumbo v0, "60289"
+    const-string/jumbo v0, "60290"
+    const-string/jumbo v0, "60291"
+    const-string/jumbo v0, "60292"
+    const-string/jumbo v0, "60293"
+    const-string/jumbo v0, "60294"
+    const-string/jumbo v0, "60295"
+    const-string/jumbo v0, "60296"
+    const-string/jumbo v0, "60297"
+    const-string/jumbo v0, "60298"
+    const-string/jumbo v0, "60299"
+    const-string/jumbo v0, "60300"
+    const-string/jumbo v0, "60301"
+    const-string/jumbo v0, "60302"
+    const-string/jumbo v0, "60303"
+    const-string/jumbo v0, "60304"
+    const-string/jumbo v0, "60305"
+    const-string/jumbo v0, "60306"
+    const-string/jumbo v0, "60307"
+    const-string/jumbo v0, "60308"
+    const-string/jumbo v0, "60309"
+    const-string/jumbo v0, "60310"
+    const-string/jumbo v0, "60311"
+    const-string/jumbo v0, "60312"
+    const-string/jumbo v0, "60313"
+    const-string/jumbo v0, "60314"
+    const-string/jumbo v0, "60315"
+    const-string/jumbo v0, "60316"
+    const-string/jumbo v0, "60317"
+    const-string/jumbo v0, "60318"
+    const-string/jumbo v0, "60319"
+    const-string/jumbo v0, "60320"
+    const-string/jumbo v0, "60321"
+    const-string/jumbo v0, "60322"
+    const-string/jumbo v0, "60323"
+    const-string/jumbo v0, "60324"
+    const-string/jumbo v0, "60325"
+    const-string/jumbo v0, "60326"
+    const-string/jumbo v0, "60327"
+    const-string/jumbo v0, "60328"
+    const-string/jumbo v0, "60329"
+    const-string/jumbo v0, "60330"
+    const-string/jumbo v0, "60331"
+    const-string/jumbo v0, "60332"
+    const-string/jumbo v0, "60333"
+    const-string/jumbo v0, "60334"
+    const-string/jumbo v0, "60335"
+    const-string/jumbo v0, "60336"
+    const-string/jumbo v0, "60337"
+    const-string/jumbo v0, "60338"
+    const-string/jumbo v0, "60339"
+    const-string/jumbo v0, "60340"
+    const-string/jumbo v0, "60341"
+    const-string/jumbo v0, "60342"
+    const-string/jumbo v0, "60343"
+    const-string/jumbo v0, "60344"
+    const-string/jumbo v0, "60345"
+    const-string/jumbo v0, "60346"
+    const-string/jumbo v0, "60347"
+    const-string/jumbo v0, "60348"
+    const-string/jumbo v0, "60349"
+    const-string/jumbo v0, "60350"
+    const-string/jumbo v0, "60351"
+    const-string/jumbo v0, "60352"
+    const-string/jumbo v0, "60353"
+    const-string/jumbo v0, "60354"
+    const-string/jumbo v0, "60355"
+    const-string/jumbo v0, "60356"
+    const-string/jumbo v0, "60357"
+    const-string/jumbo v0, "60358"
+    const-string/jumbo v0, "60359"
+    const-string/jumbo v0, "60360"
+    const-string/jumbo v0, "60361"
+    const-string/jumbo v0, "60362"
+    const-string/jumbo v0, "60363"
+    const-string/jumbo v0, "60364"
+    const-string/jumbo v0, "60365"
+    const-string/jumbo v0, "60366"
+    const-string/jumbo v0, "60367"
+    const-string/jumbo v0, "60368"
+    const-string/jumbo v0, "60369"
+    const-string/jumbo v0, "60370"
+    const-string/jumbo v0, "60371"
+    const-string/jumbo v0, "60372"
+    const-string/jumbo v0, "60373"
+    const-string/jumbo v0, "60374"
+    const-string/jumbo v0, "60375"
+    const-string/jumbo v0, "60376"
+    const-string/jumbo v0, "60377"
+    const-string/jumbo v0, "60378"
+    const-string/jumbo v0, "60379"
+    const-string/jumbo v0, "60380"
+    const-string/jumbo v0, "60381"
+    const-string/jumbo v0, "60382"
+    const-string/jumbo v0, "60383"
+    const-string/jumbo v0, "60384"
+    const-string/jumbo v0, "60385"
+    const-string/jumbo v0, "60386"
+    const-string/jumbo v0, "60387"
+    const-string/jumbo v0, "60388"
+    const-string/jumbo v0, "60389"
+    const-string/jumbo v0, "60390"
+    const-string/jumbo v0, "60391"
+    const-string/jumbo v0, "60392"
+    const-string/jumbo v0, "60393"
+    const-string/jumbo v0, "60394"
+    const-string/jumbo v0, "60395"
+    const-string/jumbo v0, "60396"
+    const-string/jumbo v0, "60397"
+    const-string/jumbo v0, "60398"
+    const-string/jumbo v0, "60399"
+    const-string/jumbo v0, "60400"
+    const-string/jumbo v0, "60401"
+    const-string/jumbo v0, "60402"
+    const-string/jumbo v0, "60403"
+    const-string/jumbo v0, "60404"
+    const-string/jumbo v0, "60405"
+    const-string/jumbo v0, "60406"
+    const-string/jumbo v0, "60407"
+    const-string/jumbo v0, "60408"
+    const-string/jumbo v0, "60409"
+    const-string/jumbo v0, "60410"
+    const-string/jumbo v0, "60411"
+    const-string/jumbo v0, "60412"
+    const-string/jumbo v0, "60413"
+    const-string/jumbo v0, "60414"
+    const-string/jumbo v0, "60415"
+    const-string/jumbo v0, "60416"
+    const-string/jumbo v0, "60417"
+    const-string/jumbo v0, "60418"
+    const-string/jumbo v0, "60419"
+    const-string/jumbo v0, "60420"
+    const-string/jumbo v0, "60421"
+    const-string/jumbo v0, "60422"
+    const-string/jumbo v0, "60423"
+    const-string/jumbo v0, "60424"
+    const-string/jumbo v0, "60425"
+    const-string/jumbo v0, "60426"
+    const-string/jumbo v0, "60427"
+    const-string/jumbo v0, "60428"
+    const-string/jumbo v0, "60429"
+    const-string/jumbo v0, "60430"
+    const-string/jumbo v0, "60431"
+    const-string/jumbo v0, "60432"
+    const-string/jumbo v0, "60433"
+    const-string/jumbo v0, "60434"
+    const-string/jumbo v0, "60435"
+    const-string/jumbo v0, "60436"
+    const-string/jumbo v0, "60437"
+    const-string/jumbo v0, "60438"
+    const-string/jumbo v0, "60439"
+    const-string/jumbo v0, "60440"
+    const-string/jumbo v0, "60441"
+    const-string/jumbo v0, "60442"
+    const-string/jumbo v0, "60443"
+    const-string/jumbo v0, "60444"
+    const-string/jumbo v0, "60445"
+    const-string/jumbo v0, "60446"
+    const-string/jumbo v0, "60447"
+    const-string/jumbo v0, "60448"
+    const-string/jumbo v0, "60449"
+    const-string/jumbo v0, "60450"
+    const-string/jumbo v0, "60451"
+    const-string/jumbo v0, "60452"
+    const-string/jumbo v0, "60453"
+    const-string/jumbo v0, "60454"
+    const-string/jumbo v0, "60455"
+    const-string/jumbo v0, "60456"
+    const-string/jumbo v0, "60457"
+    const-string/jumbo v0, "60458"
+    const-string/jumbo v0, "60459"
+    const-string/jumbo v0, "60460"
+    const-string/jumbo v0, "60461"
+    const-string/jumbo v0, "60462"
+    const-string/jumbo v0, "60463"
+    const-string/jumbo v0, "60464"
+    const-string/jumbo v0, "60465"
+    const-string/jumbo v0, "60466"
+    const-string/jumbo v0, "60467"
+    const-string/jumbo v0, "60468"
+    const-string/jumbo v0, "60469"
+    const-string/jumbo v0, "60470"
+    const-string/jumbo v0, "60471"
+    const-string/jumbo v0, "60472"
+    const-string/jumbo v0, "60473"
+    const-string/jumbo v0, "60474"
+    const-string/jumbo v0, "60475"
+    const-string/jumbo v0, "60476"
+    const-string/jumbo v0, "60477"
+    const-string/jumbo v0, "60478"
+    const-string/jumbo v0, "60479"
+    const-string/jumbo v0, "60480"
+    const-string/jumbo v0, "60481"
+    const-string/jumbo v0, "60482"
+    const-string/jumbo v0, "60483"
+    const-string/jumbo v0, "60484"
+    const-string/jumbo v0, "60485"
+    const-string/jumbo v0, "60486"
+    const-string/jumbo v0, "60487"
+    const-string/jumbo v0, "60488"
+    const-string/jumbo v0, "60489"
+    const-string/jumbo v0, "60490"
+    const-string/jumbo v0, "60491"
+    const-string/jumbo v0, "60492"
+    const-string/jumbo v0, "60493"
+    const-string/jumbo v0, "60494"
+    const-string/jumbo v0, "60495"
+    const-string/jumbo v0, "60496"
+    const-string/jumbo v0, "60497"
+    const-string/jumbo v0, "60498"
+    const-string/jumbo v0, "60499"
+    const-string/jumbo v0, "60500"
+    const-string/jumbo v0, "60501"
+    const-string/jumbo v0, "60502"
+    const-string/jumbo v0, "60503"
+    const-string/jumbo v0, "60504"
+    const-string/jumbo v0, "60505"
+    const-string/jumbo v0, "60506"
+    const-string/jumbo v0, "60507"
+    const-string/jumbo v0, "60508"
+    const-string/jumbo v0, "60509"
+    const-string/jumbo v0, "60510"
+    const-string/jumbo v0, "60511"
+    const-string/jumbo v0, "60512"
+    const-string/jumbo v0, "60513"
+    const-string/jumbo v0, "60514"
+    const-string/jumbo v0, "60515"
+    const-string/jumbo v0, "60516"
+    const-string/jumbo v0, "60517"
+    const-string/jumbo v0, "60518"
+    const-string/jumbo v0, "60519"
+    const-string/jumbo v0, "60520"
+    const-string/jumbo v0, "60521"
+    const-string/jumbo v0, "60522"
+    const-string/jumbo v0, "60523"
+    const-string/jumbo v0, "60524"
+    const-string/jumbo v0, "60525"
+    const-string/jumbo v0, "60526"
+    const-string/jumbo v0, "60527"
+    const-string/jumbo v0, "60528"
+    const-string/jumbo v0, "60529"
+    const-string/jumbo v0, "60530"
+    const-string/jumbo v0, "60531"
+    const-string/jumbo v0, "60532"
+    const-string/jumbo v0, "60533"
+    const-string/jumbo v0, "60534"
+    const-string/jumbo v0, "60535"
+    const-string/jumbo v0, "60536"
+    const-string/jumbo v0, "60537"
+    const-string/jumbo v0, "60538"
+    const-string/jumbo v0, "60539"
+    const-string/jumbo v0, "60540"
+    const-string/jumbo v0, "60541"
+    const-string/jumbo v0, "60542"
+    const-string/jumbo v0, "60543"
+    const-string/jumbo v0, "60544"
+    const-string/jumbo v0, "60545"
+    const-string/jumbo v0, "60546"
+    const-string/jumbo v0, "60547"
+    const-string/jumbo v0, "60548"
+    const-string/jumbo v0, "60549"
+    const-string/jumbo v0, "60550"
+    const-string/jumbo v0, "60551"
+    const-string/jumbo v0, "60552"
+    const-string/jumbo v0, "60553"
+    const-string/jumbo v0, "60554"
+    const-string/jumbo v0, "60555"
+    const-string/jumbo v0, "60556"
+    const-string/jumbo v0, "60557"
+    const-string/jumbo v0, "60558"
+    const-string/jumbo v0, "60559"
+    const-string/jumbo v0, "60560"
+    const-string/jumbo v0, "60561"
+    const-string/jumbo v0, "60562"
+    const-string/jumbo v0, "60563"
+    const-string/jumbo v0, "60564"
+    const-string/jumbo v0, "60565"
+    const-string/jumbo v0, "60566"
+    const-string/jumbo v0, "60567"
+    const-string/jumbo v0, "60568"
+    const-string/jumbo v0, "60569"
+    const-string/jumbo v0, "60570"
+    const-string/jumbo v0, "60571"
+    const-string/jumbo v0, "60572"
+    const-string/jumbo v0, "60573"
+    const-string/jumbo v0, "60574"
+    const-string/jumbo v0, "60575"
+    const-string/jumbo v0, "60576"
+    const-string/jumbo v0, "60577"
+    const-string/jumbo v0, "60578"
+    const-string/jumbo v0, "60579"
+    const-string/jumbo v0, "60580"
+    const-string/jumbo v0, "60581"
+    const-string/jumbo v0, "60582"
+    const-string/jumbo v0, "60583"
+    const-string/jumbo v0, "60584"
+    const-string/jumbo v0, "60585"
+    const-string/jumbo v0, "60586"
+    const-string/jumbo v0, "60587"
+    const-string/jumbo v0, "60588"
+    const-string/jumbo v0, "60589"
+    const-string/jumbo v0, "60590"
+    const-string/jumbo v0, "60591"
+    const-string/jumbo v0, "60592"
+    const-string/jumbo v0, "60593"
+    const-string/jumbo v0, "60594"
+    const-string/jumbo v0, "60595"
+    const-string/jumbo v0, "60596"
+    const-string/jumbo v0, "60597"
+    const-string/jumbo v0, "60598"
+    const-string/jumbo v0, "60599"
+    const-string/jumbo v0, "60600"
+    const-string/jumbo v0, "60601"
+    const-string/jumbo v0, "60602"
+    const-string/jumbo v0, "60603"
+    const-string/jumbo v0, "60604"
+    const-string/jumbo v0, "60605"
+    const-string/jumbo v0, "60606"
+    const-string/jumbo v0, "60607"
+    const-string/jumbo v0, "60608"
+    const-string/jumbo v0, "60609"
+    const-string/jumbo v0, "60610"
+    const-string/jumbo v0, "60611"
+    const-string/jumbo v0, "60612"
+    const-string/jumbo v0, "60613"
+    const-string/jumbo v0, "60614"
+    const-string/jumbo v0, "60615"
+    const-string/jumbo v0, "60616"
+    const-string/jumbo v0, "60617"
+    const-string/jumbo v0, "60618"
+    const-string/jumbo v0, "60619"
+    const-string/jumbo v0, "60620"
+    const-string/jumbo v0, "60621"
+    const-string/jumbo v0, "60622"
+    const-string/jumbo v0, "60623"
+    const-string/jumbo v0, "60624"
+    const-string/jumbo v0, "60625"
+    const-string/jumbo v0, "60626"
+    const-string/jumbo v0, "60627"
+    const-string/jumbo v0, "60628"
+    const-string/jumbo v0, "60629"
+    const-string/jumbo v0, "60630"
+    const-string/jumbo v0, "60631"
+    const-string/jumbo v0, "60632"
+    const-string/jumbo v0, "60633"
+    const-string/jumbo v0, "60634"
+    const-string/jumbo v0, "60635"
+    const-string/jumbo v0, "60636"
+    const-string/jumbo v0, "60637"
+    const-string/jumbo v0, "60638"
+    const-string/jumbo v0, "60639"
+    const-string/jumbo v0, "60640"
+    const-string/jumbo v0, "60641"
+    const-string/jumbo v0, "60642"
+    const-string/jumbo v0, "60643"
+    const-string/jumbo v0, "60644"
+    const-string/jumbo v0, "60645"
+    const-string/jumbo v0, "60646"
+    const-string/jumbo v0, "60647"
+    const-string/jumbo v0, "60648"
+    const-string/jumbo v0, "60649"
+    const-string/jumbo v0, "60650"
+    const-string/jumbo v0, "60651"
+    const-string/jumbo v0, "60652"
+    const-string/jumbo v0, "60653"
+    const-string/jumbo v0, "60654"
+    const-string/jumbo v0, "60655"
+    const-string/jumbo v0, "60656"
+    const-string/jumbo v0, "60657"
+    const-string/jumbo v0, "60658"
+    const-string/jumbo v0, "60659"
+    const-string/jumbo v0, "60660"
+    const-string/jumbo v0, "60661"
+    const-string/jumbo v0, "60662"
+    const-string/jumbo v0, "60663"
+    const-string/jumbo v0, "60664"
+    const-string/jumbo v0, "60665"
+    const-string/jumbo v0, "60666"
+    const-string/jumbo v0, "60667"
+    const-string/jumbo v0, "60668"
+    const-string/jumbo v0, "60669"
+    const-string/jumbo v0, "60670"
+    const-string/jumbo v0, "60671"
+    const-string/jumbo v0, "60672"
+    const-string/jumbo v0, "60673"
+    const-string/jumbo v0, "60674"
+    const-string/jumbo v0, "60675"
+    const-string/jumbo v0, "60676"
+    const-string/jumbo v0, "60677"
+    const-string/jumbo v0, "60678"
+    const-string/jumbo v0, "60679"
+    const-string/jumbo v0, "60680"
+    const-string/jumbo v0, "60681"
+    const-string/jumbo v0, "60682"
+    const-string/jumbo v0, "60683"
+    const-string/jumbo v0, "60684"
+    const-string/jumbo v0, "60685"
+    const-string/jumbo v0, "60686"
+    const-string/jumbo v0, "60687"
+    const-string/jumbo v0, "60688"
+    const-string/jumbo v0, "60689"
+    const-string/jumbo v0, "60690"
+    const-string/jumbo v0, "60691"
+    const-string/jumbo v0, "60692"
+    const-string/jumbo v0, "60693"
+    const-string/jumbo v0, "60694"
+    const-string/jumbo v0, "60695"
+    const-string/jumbo v0, "60696"
+    const-string/jumbo v0, "60697"
+    const-string/jumbo v0, "60698"
+    const-string/jumbo v0, "60699"
+    const-string/jumbo v0, "60700"
+    const-string/jumbo v0, "60701"
+    const-string/jumbo v0, "60702"
+    const-string/jumbo v0, "60703"
+    const-string/jumbo v0, "60704"
+    const-string/jumbo v0, "60705"
+    const-string/jumbo v0, "60706"
+    const-string/jumbo v0, "60707"
+    const-string/jumbo v0, "60708"
+    const-string/jumbo v0, "60709"
+    const-string/jumbo v0, "60710"
+    const-string/jumbo v0, "60711"
+    const-string/jumbo v0, "60712"
+    const-string/jumbo v0, "60713"
+    const-string/jumbo v0, "60714"
+    const-string/jumbo v0, "60715"
+    const-string/jumbo v0, "60716"
+    const-string/jumbo v0, "60717"
+    const-string/jumbo v0, "60718"
+    const-string/jumbo v0, "60719"
+    const-string/jumbo v0, "60720"
+    const-string/jumbo v0, "60721"
+    const-string/jumbo v0, "60722"
+    const-string/jumbo v0, "60723"
+    const-string/jumbo v0, "60724"
+    const-string/jumbo v0, "60725"
+    const-string/jumbo v0, "60726"
+    const-string/jumbo v0, "60727"
+    const-string/jumbo v0, "60728"
+    const-string/jumbo v0, "60729"
+    const-string/jumbo v0, "60730"
+    const-string/jumbo v0, "60731"
+    const-string/jumbo v0, "60732"
+    const-string/jumbo v0, "60733"
+    const-string/jumbo v0, "60734"
+    const-string/jumbo v0, "60735"
+    const-string/jumbo v0, "60736"
+    const-string/jumbo v0, "60737"
+    const-string/jumbo v0, "60738"
+    const-string/jumbo v0, "60739"
+    const-string/jumbo v0, "60740"
+    const-string/jumbo v0, "60741"
+    const-string/jumbo v0, "60742"
+    const-string/jumbo v0, "60743"
+    const-string/jumbo v0, "60744"
+    const-string/jumbo v0, "60745"
+    const-string/jumbo v0, "60746"
+    const-string/jumbo v0, "60747"
+    const-string/jumbo v0, "60748"
+    const-string/jumbo v0, "60749"
+    const-string/jumbo v0, "60750"
+    const-string/jumbo v0, "60751"
+    const-string/jumbo v0, "60752"
+    const-string/jumbo v0, "60753"
+    const-string/jumbo v0, "60754"
+    const-string/jumbo v0, "60755"
+    const-string/jumbo v0, "60756"
+    const-string/jumbo v0, "60757"
+    const-string/jumbo v0, "60758"
+    const-string/jumbo v0, "60759"
+    const-string/jumbo v0, "60760"
+    const-string/jumbo v0, "60761"
+    const-string/jumbo v0, "60762"
+    const-string/jumbo v0, "60763"
+    const-string/jumbo v0, "60764"
+    const-string/jumbo v0, "60765"
+    const-string/jumbo v0, "60766"
+    const-string/jumbo v0, "60767"
+    const-string/jumbo v0, "60768"
+    const-string/jumbo v0, "60769"
+    const-string/jumbo v0, "60770"
+    const-string/jumbo v0, "60771"
+    const-string/jumbo v0, "60772"
+    const-string/jumbo v0, "60773"
+    const-string/jumbo v0, "60774"
+    const-string/jumbo v0, "60775"
+    const-string/jumbo v0, "60776"
+    const-string/jumbo v0, "60777"
+    const-string/jumbo v0, "60778"
+    const-string/jumbo v0, "60779"
+    const-string/jumbo v0, "60780"
+    const-string/jumbo v0, "60781"
+    const-string/jumbo v0, "60782"
+    const-string/jumbo v0, "60783"
+    const-string/jumbo v0, "60784"
+    const-string/jumbo v0, "60785"
+    const-string/jumbo v0, "60786"
+    const-string/jumbo v0, "60787"
+    const-string/jumbo v0, "60788"
+    const-string/jumbo v0, "60789"
+    const-string/jumbo v0, "60790"
+    const-string/jumbo v0, "60791"
+    const-string/jumbo v0, "60792"
+    const-string/jumbo v0, "60793"
+    const-string/jumbo v0, "60794"
+    const-string/jumbo v0, "60795"
+    const-string/jumbo v0, "60796"
+    const-string/jumbo v0, "60797"
+    const-string/jumbo v0, "60798"
+    const-string/jumbo v0, "60799"
+    const-string/jumbo v0, "60800"
+    const-string/jumbo v0, "60801"
+    const-string/jumbo v0, "60802"
+    const-string/jumbo v0, "60803"
+    const-string/jumbo v0, "60804"
+    const-string/jumbo v0, "60805"
+    const-string/jumbo v0, "60806"
+    const-string/jumbo v0, "60807"
+    const-string/jumbo v0, "60808"
+    const-string/jumbo v0, "60809"
+    const-string/jumbo v0, "60810"
+    const-string/jumbo v0, "60811"
+    const-string/jumbo v0, "60812"
+    const-string/jumbo v0, "60813"
+    const-string/jumbo v0, "60814"
+    const-string/jumbo v0, "60815"
+    const-string/jumbo v0, "60816"
+    const-string/jumbo v0, "60817"
+    const-string/jumbo v0, "60818"
+    const-string/jumbo v0, "60819"
+    const-string/jumbo v0, "60820"
+    const-string/jumbo v0, "60821"
+    const-string/jumbo v0, "60822"
+    const-string/jumbo v0, "60823"
+    const-string/jumbo v0, "60824"
+    const-string/jumbo v0, "60825"
+    const-string/jumbo v0, "60826"
+    const-string/jumbo v0, "60827"
+    const-string/jumbo v0, "60828"
+    const-string/jumbo v0, "60829"
+    const-string/jumbo v0, "60830"
+    const-string/jumbo v0, "60831"
+    const-string/jumbo v0, "60832"
+    const-string/jumbo v0, "60833"
+    const-string/jumbo v0, "60834"
+    const-string/jumbo v0, "60835"
+    const-string/jumbo v0, "60836"
+    const-string/jumbo v0, "60837"
+    const-string/jumbo v0, "60838"
+    const-string/jumbo v0, "60839"
+    const-string/jumbo v0, "60840"
+    const-string/jumbo v0, "60841"
+    const-string/jumbo v0, "60842"
+    const-string/jumbo v0, "60843"
+    const-string/jumbo v0, "60844"
+    const-string/jumbo v0, "60845"
+    const-string/jumbo v0, "60846"
+    const-string/jumbo v0, "60847"
+    const-string/jumbo v0, "60848"
+    const-string/jumbo v0, "60849"
+    const-string/jumbo v0, "60850"
+    const-string/jumbo v0, "60851"
+    const-string/jumbo v0, "60852"
+    const-string/jumbo v0, "60853"
+    const-string/jumbo v0, "60854"
+    const-string/jumbo v0, "60855"
+    const-string/jumbo v0, "60856"
+    const-string/jumbo v0, "60857"
+    const-string/jumbo v0, "60858"
+    const-string/jumbo v0, "60859"
+    const-string/jumbo v0, "60860"
+    const-string/jumbo v0, "60861"
+    const-string/jumbo v0, "60862"
+    const-string/jumbo v0, "60863"
+    const-string/jumbo v0, "60864"
+    const-string/jumbo v0, "60865"
+    const-string/jumbo v0, "60866"
+    const-string/jumbo v0, "60867"
+    const-string/jumbo v0, "60868"
+    const-string/jumbo v0, "60869"
+    const-string/jumbo v0, "60870"
+    const-string/jumbo v0, "60871"
+    const-string/jumbo v0, "60872"
+    const-string/jumbo v0, "60873"
+    const-string/jumbo v0, "60874"
+    const-string/jumbo v0, "60875"
+    const-string/jumbo v0, "60876"
+    const-string/jumbo v0, "60877"
+    const-string/jumbo v0, "60878"
+    const-string/jumbo v0, "60879"
+    const-string/jumbo v0, "60880"
+    const-string/jumbo v0, "60881"
+    const-string/jumbo v0, "60882"
+    const-string/jumbo v0, "60883"
+    const-string/jumbo v0, "60884"
+    const-string/jumbo v0, "60885"
+    const-string/jumbo v0, "60886"
+    const-string/jumbo v0, "60887"
+    const-string/jumbo v0, "60888"
+    const-string/jumbo v0, "60889"
+    const-string/jumbo v0, "60890"
+    const-string/jumbo v0, "60891"
+    const-string/jumbo v0, "60892"
+    const-string/jumbo v0, "60893"
+    const-string/jumbo v0, "60894"
+    const-string/jumbo v0, "60895"
+    const-string/jumbo v0, "60896"
+    const-string/jumbo v0, "60897"
+    const-string/jumbo v0, "60898"
+    const-string/jumbo v0, "60899"
+    const-string/jumbo v0, "60900"
+    const-string/jumbo v0, "60901"
+    const-string/jumbo v0, "60902"
+    const-string/jumbo v0, "60903"
+    const-string/jumbo v0, "60904"
+    const-string/jumbo v0, "60905"
+    const-string/jumbo v0, "60906"
+    const-string/jumbo v0, "60907"
+    const-string/jumbo v0, "60908"
+    const-string/jumbo v0, "60909"
+    const-string/jumbo v0, "60910"
+    const-string/jumbo v0, "60911"
+    const-string/jumbo v0, "60912"
+    const-string/jumbo v0, "60913"
+    const-string/jumbo v0, "60914"
+    const-string/jumbo v0, "60915"
+    const-string/jumbo v0, "60916"
+    const-string/jumbo v0, "60917"
+    const-string/jumbo v0, "60918"
+    const-string/jumbo v0, "60919"
+    const-string/jumbo v0, "60920"
+    const-string/jumbo v0, "60921"
+    const-string/jumbo v0, "60922"
+    const-string/jumbo v0, "60923"
+    const-string/jumbo v0, "60924"
+    const-string/jumbo v0, "60925"
+    const-string/jumbo v0, "60926"
+    const-string/jumbo v0, "60927"
+    const-string/jumbo v0, "60928"
+    const-string/jumbo v0, "60929"
+    const-string/jumbo v0, "60930"
+    const-string/jumbo v0, "60931"
+    const-string/jumbo v0, "60932"
+    const-string/jumbo v0, "60933"
+    const-string/jumbo v0, "60934"
+    const-string/jumbo v0, "60935"
+    const-string/jumbo v0, "60936"
+    const-string/jumbo v0, "60937"
+    const-string/jumbo v0, "60938"
+    const-string/jumbo v0, "60939"
+    const-string/jumbo v0, "60940"
+    const-string/jumbo v0, "60941"
+    const-string/jumbo v0, "60942"
+    const-string/jumbo v0, "60943"
+    const-string/jumbo v0, "60944"
+    const-string/jumbo v0, "60945"
+    const-string/jumbo v0, "60946"
+    const-string/jumbo v0, "60947"
+    const-string/jumbo v0, "60948"
+    const-string/jumbo v0, "60949"
+    const-string/jumbo v0, "60950"
+    const-string/jumbo v0, "60951"
+    const-string/jumbo v0, "60952"
+    const-string/jumbo v0, "60953"
+    const-string/jumbo v0, "60954"
+    const-string/jumbo v0, "60955"
+    const-string/jumbo v0, "60956"
+    const-string/jumbo v0, "60957"
+    const-string/jumbo v0, "60958"
+    const-string/jumbo v0, "60959"
+    const-string/jumbo v0, "60960"
+    const-string/jumbo v0, "60961"
+    const-string/jumbo v0, "60962"
+    const-string/jumbo v0, "60963"
+    const-string/jumbo v0, "60964"
+    const-string/jumbo v0, "60965"
+    const-string/jumbo v0, "60966"
+    const-string/jumbo v0, "60967"
+    const-string/jumbo v0, "60968"
+    const-string/jumbo v0, "60969"
+    const-string/jumbo v0, "60970"
+    const-string/jumbo v0, "60971"
+    const-string/jumbo v0, "60972"
+    const-string/jumbo v0, "60973"
+    const-string/jumbo v0, "60974"
+    const-string/jumbo v0, "60975"
+    const-string/jumbo v0, "60976"
+    const-string/jumbo v0, "60977"
+    const-string/jumbo v0, "60978"
+    const-string/jumbo v0, "60979"
+    const-string/jumbo v0, "60980"
+    const-string/jumbo v0, "60981"
+    const-string/jumbo v0, "60982"
+    const-string/jumbo v0, "60983"
+    const-string/jumbo v0, "60984"
+    const-string/jumbo v0, "60985"
+    const-string/jumbo v0, "60986"
+    const-string/jumbo v0, "60987"
+    const-string/jumbo v0, "60988"
+    const-string/jumbo v0, "60989"
+    const-string/jumbo v0, "60990"
+    const-string/jumbo v0, "60991"
+    const-string/jumbo v0, "60992"
+    const-string/jumbo v0, "60993"
+    const-string/jumbo v0, "60994"
+    const-string/jumbo v0, "60995"
+    const-string/jumbo v0, "60996"
+    const-string/jumbo v0, "60997"
+    const-string/jumbo v0, "60998"
+    const-string/jumbo v0, "60999"
+    const-string/jumbo v0, "61000"
+    const-string/jumbo v0, "61001"
+    const-string/jumbo v0, "61002"
+    const-string/jumbo v0, "61003"
+    const-string/jumbo v0, "61004"
+    const-string/jumbo v0, "61005"
+    const-string/jumbo v0, "61006"
+    const-string/jumbo v0, "61007"
+    const-string/jumbo v0, "61008"
+    const-string/jumbo v0, "61009"
+    const-string/jumbo v0, "61010"
+    const-string/jumbo v0, "61011"
+    const-string/jumbo v0, "61012"
+    const-string/jumbo v0, "61013"
+    const-string/jumbo v0, "61014"
+    const-string/jumbo v0, "61015"
+    const-string/jumbo v0, "61016"
+    const-string/jumbo v0, "61017"
+    const-string/jumbo v0, "61018"
+    const-string/jumbo v0, "61019"
+    const-string/jumbo v0, "61020"
+    const-string/jumbo v0, "61021"
+    const-string/jumbo v0, "61022"
+    const-string/jumbo v0, "61023"
+    const-string/jumbo v0, "61024"
+    const-string/jumbo v0, "61025"
+    const-string/jumbo v0, "61026"
+    const-string/jumbo v0, "61027"
+    const-string/jumbo v0, "61028"
+    const-string/jumbo v0, "61029"
+    const-string/jumbo v0, "61030"
+    const-string/jumbo v0, "61031"
+    const-string/jumbo v0, "61032"
+    const-string/jumbo v0, "61033"
+    const-string/jumbo v0, "61034"
+    const-string/jumbo v0, "61035"
+    const-string/jumbo v0, "61036"
+    const-string/jumbo v0, "61037"
+    const-string/jumbo v0, "61038"
+    const-string/jumbo v0, "61039"
+    const-string/jumbo v0, "61040"
+    const-string/jumbo v0, "61041"
+    const-string/jumbo v0, "61042"
+    const-string/jumbo v0, "61043"
+    const-string/jumbo v0, "61044"
+    const-string/jumbo v0, "61045"
+    const-string/jumbo v0, "61046"
+    const-string/jumbo v0, "61047"
+    const-string/jumbo v0, "61048"
+    const-string/jumbo v0, "61049"
+    const-string/jumbo v0, "61050"
+    const-string/jumbo v0, "61051"
+    const-string/jumbo v0, "61052"
+    const-string/jumbo v0, "61053"
+    const-string/jumbo v0, "61054"
+    const-string/jumbo v0, "61055"
+    const-string/jumbo v0, "61056"
+    const-string/jumbo v0, "61057"
+    const-string/jumbo v0, "61058"
+    const-string/jumbo v0, "61059"
+    const-string/jumbo v0, "61060"
+    const-string/jumbo v0, "61061"
+    const-string/jumbo v0, "61062"
+    const-string/jumbo v0, "61063"
+    const-string/jumbo v0, "61064"
+    const-string/jumbo v0, "61065"
+    const-string/jumbo v0, "61066"
+    const-string/jumbo v0, "61067"
+    const-string/jumbo v0, "61068"
+    const-string/jumbo v0, "61069"
+    const-string/jumbo v0, "61070"
+    const-string/jumbo v0, "61071"
+    const-string/jumbo v0, "61072"
+    const-string/jumbo v0, "61073"
+    const-string/jumbo v0, "61074"
+    const-string/jumbo v0, "61075"
+    const-string/jumbo v0, "61076"
+    const-string/jumbo v0, "61077"
+    const-string/jumbo v0, "61078"
+    const-string/jumbo v0, "61079"
+    const-string/jumbo v0, "61080"
+    const-string/jumbo v0, "61081"
+    const-string/jumbo v0, "61082"
+    const-string/jumbo v0, "61083"
+    const-string/jumbo v0, "61084"
+    const-string/jumbo v0, "61085"
+    const-string/jumbo v0, "61086"
+    const-string/jumbo v0, "61087"
+    const-string/jumbo v0, "61088"
+    const-string/jumbo v0, "61089"
+    const-string/jumbo v0, "61090"
+    const-string/jumbo v0, "61091"
+    const-string/jumbo v0, "61092"
+    const-string/jumbo v0, "61093"
+    const-string/jumbo v0, "61094"
+    const-string/jumbo v0, "61095"
+    const-string/jumbo v0, "61096"
+    const-string/jumbo v0, "61097"
+    const-string/jumbo v0, "61098"
+    const-string/jumbo v0, "61099"
+    const-string/jumbo v0, "61100"
+    const-string/jumbo v0, "61101"
+    const-string/jumbo v0, "61102"
+    const-string/jumbo v0, "61103"
+    const-string/jumbo v0, "61104"
+    const-string/jumbo v0, "61105"
+    const-string/jumbo v0, "61106"
+    const-string/jumbo v0, "61107"
+    const-string/jumbo v0, "61108"
+    const-string/jumbo v0, "61109"
+    const-string/jumbo v0, "61110"
+    const-string/jumbo v0, "61111"
+    const-string/jumbo v0, "61112"
+    const-string/jumbo v0, "61113"
+    const-string/jumbo v0, "61114"
+    const-string/jumbo v0, "61115"
+    const-string/jumbo v0, "61116"
+    const-string/jumbo v0, "61117"
+    const-string/jumbo v0, "61118"
+    const-string/jumbo v0, "61119"
+    const-string/jumbo v0, "61120"
+    const-string/jumbo v0, "61121"
+    const-string/jumbo v0, "61122"
+    const-string/jumbo v0, "61123"
+    const-string/jumbo v0, "61124"
+    const-string/jumbo v0, "61125"
+    const-string/jumbo v0, "61126"
+    const-string/jumbo v0, "61127"
+    const-string/jumbo v0, "61128"
+    const-string/jumbo v0, "61129"
+    const-string/jumbo v0, "61130"
+    const-string/jumbo v0, "61131"
+    const-string/jumbo v0, "61132"
+    const-string/jumbo v0, "61133"
+    const-string/jumbo v0, "61134"
+    const-string/jumbo v0, "61135"
+    const-string/jumbo v0, "61136"
+    const-string/jumbo v0, "61137"
+    const-string/jumbo v0, "61138"
+    const-string/jumbo v0, "61139"
+    const-string/jumbo v0, "61140"
+    const-string/jumbo v0, "61141"
+    const-string/jumbo v0, "61142"
+    const-string/jumbo v0, "61143"
+    const-string/jumbo v0, "61144"
+    const-string/jumbo v0, "61145"
+    const-string/jumbo v0, "61146"
+    const-string/jumbo v0, "61147"
+    const-string/jumbo v0, "61148"
+    const-string/jumbo v0, "61149"
+    const-string/jumbo v0, "61150"
+    const-string/jumbo v0, "61151"
+    const-string/jumbo v0, "61152"
+    const-string/jumbo v0, "61153"
+    const-string/jumbo v0, "61154"
+    const-string/jumbo v0, "61155"
+    const-string/jumbo v0, "61156"
+    const-string/jumbo v0, "61157"
+    const-string/jumbo v0, "61158"
+    const-string/jumbo v0, "61159"
+    const-string/jumbo v0, "61160"
+    const-string/jumbo v0, "61161"
+    const-string/jumbo v0, "61162"
+    const-string/jumbo v0, "61163"
+    const-string/jumbo v0, "61164"
+    const-string/jumbo v0, "61165"
+    const-string/jumbo v0, "61166"
+    const-string/jumbo v0, "61167"
+    const-string/jumbo v0, "61168"
+    const-string/jumbo v0, "61169"
+    const-string/jumbo v0, "61170"
+    const-string/jumbo v0, "61171"
+    const-string/jumbo v0, "61172"
+    const-string/jumbo v0, "61173"
+    const-string/jumbo v0, "61174"
+    const-string/jumbo v0, "61175"
+    const-string/jumbo v0, "61176"
+    const-string/jumbo v0, "61177"
+    const-string/jumbo v0, "61178"
+    const-string/jumbo v0, "61179"
+    const-string/jumbo v0, "61180"
+    const-string/jumbo v0, "61181"
+    const-string/jumbo v0, "61182"
+    const-string/jumbo v0, "61183"
+    const-string/jumbo v0, "61184"
+    const-string/jumbo v0, "61185"
+    const-string/jumbo v0, "61186"
+    const-string/jumbo v0, "61187"
+    const-string/jumbo v0, "61188"
+    const-string/jumbo v0, "61189"
+    const-string/jumbo v0, "61190"
+    const-string/jumbo v0, "61191"
+    const-string/jumbo v0, "61192"
+    const-string/jumbo v0, "61193"
+    const-string/jumbo v0, "61194"
+    const-string/jumbo v0, "61195"
+    const-string/jumbo v0, "61196"
+    const-string/jumbo v0, "61197"
+    const-string/jumbo v0, "61198"
+    const-string/jumbo v0, "61199"
+    const-string/jumbo v0, "61200"
+    const-string/jumbo v0, "61201"
+    const-string/jumbo v0, "61202"
+    const-string/jumbo v0, "61203"
+    const-string/jumbo v0, "61204"
+    const-string/jumbo v0, "61205"
+    const-string/jumbo v0, "61206"
+    const-string/jumbo v0, "61207"
+    const-string/jumbo v0, "61208"
+    const-string/jumbo v0, "61209"
+    const-string/jumbo v0, "61210"
+    const-string/jumbo v0, "61211"
+    const-string/jumbo v0, "61212"
+    const-string/jumbo v0, "61213"
+    const-string/jumbo v0, "61214"
+    const-string/jumbo v0, "61215"
+    const-string/jumbo v0, "61216"
+    const-string/jumbo v0, "61217"
+    const-string/jumbo v0, "61218"
+    const-string/jumbo v0, "61219"
+    const-string/jumbo v0, "61220"
+    const-string/jumbo v0, "61221"
+    const-string/jumbo v0, "61222"
+    const-string/jumbo v0, "61223"
+    const-string/jumbo v0, "61224"
+    const-string/jumbo v0, "61225"
+    const-string/jumbo v0, "61226"
+    const-string/jumbo v0, "61227"
+    const-string/jumbo v0, "61228"
+    const-string/jumbo v0, "61229"
+    const-string/jumbo v0, "61230"
+    const-string/jumbo v0, "61231"
+    const-string/jumbo v0, "61232"
+    const-string/jumbo v0, "61233"
+    const-string/jumbo v0, "61234"
+    const-string/jumbo v0, "61235"
+    const-string/jumbo v0, "61236"
+    const-string/jumbo v0, "61237"
+    const-string/jumbo v0, "61238"
+    const-string/jumbo v0, "61239"
+    const-string/jumbo v0, "61240"
+    const-string/jumbo v0, "61241"
+    const-string/jumbo v0, "61242"
+    const-string/jumbo v0, "61243"
+    const-string/jumbo v0, "61244"
+    const-string/jumbo v0, "61245"
+    const-string/jumbo v0, "61246"
+    const-string/jumbo v0, "61247"
+    const-string/jumbo v0, "61248"
+    const-string/jumbo v0, "61249"
+    const-string/jumbo v0, "61250"
+    const-string/jumbo v0, "61251"
+    const-string/jumbo v0, "61252"
+    const-string/jumbo v0, "61253"
+    const-string/jumbo v0, "61254"
+    const-string/jumbo v0, "61255"
+    const-string/jumbo v0, "61256"
+    const-string/jumbo v0, "61257"
+    const-string/jumbo v0, "61258"
+    const-string/jumbo v0, "61259"
+    const-string/jumbo v0, "61260"
+    const-string/jumbo v0, "61261"
+    const-string/jumbo v0, "61262"
+    const-string/jumbo v0, "61263"
+    const-string/jumbo v0, "61264"
+    const-string/jumbo v0, "61265"
+    const-string/jumbo v0, "61266"
+    const-string/jumbo v0, "61267"
+    const-string/jumbo v0, "61268"
+    const-string/jumbo v0, "61269"
+    const-string/jumbo v0, "61270"
+    const-string/jumbo v0, "61271"
+    const-string/jumbo v0, "61272"
+    const-string/jumbo v0, "61273"
+    const-string/jumbo v0, "61274"
+    const-string/jumbo v0, "61275"
+    const-string/jumbo v0, "61276"
+    const-string/jumbo v0, "61277"
+    const-string/jumbo v0, "61278"
+    const-string/jumbo v0, "61279"
+    const-string/jumbo v0, "61280"
+    const-string/jumbo v0, "61281"
+    const-string/jumbo v0, "61282"
+    const-string/jumbo v0, "61283"
+    const-string/jumbo v0, "61284"
+    const-string/jumbo v0, "61285"
+    const-string/jumbo v0, "61286"
+    const-string/jumbo v0, "61287"
+    const-string/jumbo v0, "61288"
+    const-string/jumbo v0, "61289"
+    const-string/jumbo v0, "61290"
+    const-string/jumbo v0, "61291"
+    const-string/jumbo v0, "61292"
+    const-string/jumbo v0, "61293"
+    const-string/jumbo v0, "61294"
+    const-string/jumbo v0, "61295"
+    const-string/jumbo v0, "61296"
+    const-string/jumbo v0, "61297"
+    const-string/jumbo v0, "61298"
+    const-string/jumbo v0, "61299"
+    const-string/jumbo v0, "61300"
+    const-string/jumbo v0, "61301"
+    const-string/jumbo v0, "61302"
+    const-string/jumbo v0, "61303"
+    const-string/jumbo v0, "61304"
+    const-string/jumbo v0, "61305"
+    const-string/jumbo v0, "61306"
+    const-string/jumbo v0, "61307"
+    const-string/jumbo v0, "61308"
+    const-string/jumbo v0, "61309"
+    const-string/jumbo v0, "61310"
+    const-string/jumbo v0, "61311"
+    const-string/jumbo v0, "61312"
+    const-string/jumbo v0, "61313"
+    const-string/jumbo v0, "61314"
+    const-string/jumbo v0, "61315"
+    const-string/jumbo v0, "61316"
+    const-string/jumbo v0, "61317"
+    const-string/jumbo v0, "61318"
+    const-string/jumbo v0, "61319"
+    const-string/jumbo v0, "61320"
+    const-string/jumbo v0, "61321"
+    const-string/jumbo v0, "61322"
+    const-string/jumbo v0, "61323"
+    const-string/jumbo v0, "61324"
+    const-string/jumbo v0, "61325"
+    const-string/jumbo v0, "61326"
+    const-string/jumbo v0, "61327"
+    const-string/jumbo v0, "61328"
+    const-string/jumbo v0, "61329"
+    const-string/jumbo v0, "61330"
+    const-string/jumbo v0, "61331"
+    const-string/jumbo v0, "61332"
+    const-string/jumbo v0, "61333"
+    const-string/jumbo v0, "61334"
+    const-string/jumbo v0, "61335"
+    const-string/jumbo v0, "61336"
+    const-string/jumbo v0, "61337"
+    const-string/jumbo v0, "61338"
+    const-string/jumbo v0, "61339"
+    const-string/jumbo v0, "61340"
+    const-string/jumbo v0, "61341"
+    const-string/jumbo v0, "61342"
+    const-string/jumbo v0, "61343"
+    const-string/jumbo v0, "61344"
+    const-string/jumbo v0, "61345"
+    const-string/jumbo v0, "61346"
+    const-string/jumbo v0, "61347"
+    const-string/jumbo v0, "61348"
+    const-string/jumbo v0, "61349"
+    const-string/jumbo v0, "61350"
+    const-string/jumbo v0, "61351"
+    const-string/jumbo v0, "61352"
+    const-string/jumbo v0, "61353"
+    const-string/jumbo v0, "61354"
+    const-string/jumbo v0, "61355"
+    const-string/jumbo v0, "61356"
+    const-string/jumbo v0, "61357"
+    const-string/jumbo v0, "61358"
+    const-string/jumbo v0, "61359"
+    const-string/jumbo v0, "61360"
+    const-string/jumbo v0, "61361"
+    const-string/jumbo v0, "61362"
+    const-string/jumbo v0, "61363"
+    const-string/jumbo v0, "61364"
+    const-string/jumbo v0, "61365"
+    const-string/jumbo v0, "61366"
+    const-string/jumbo v0, "61367"
+    const-string/jumbo v0, "61368"
+    const-string/jumbo v0, "61369"
+    const-string/jumbo v0, "61370"
+    const-string/jumbo v0, "61371"
+    const-string/jumbo v0, "61372"
+    const-string/jumbo v0, "61373"
+    const-string/jumbo v0, "61374"
+    const-string/jumbo v0, "61375"
+    const-string/jumbo v0, "61376"
+    const-string/jumbo v0, "61377"
+    const-string/jumbo v0, "61378"
+    const-string/jumbo v0, "61379"
+    const-string/jumbo v0, "61380"
+    const-string/jumbo v0, "61381"
+    const-string/jumbo v0, "61382"
+    const-string/jumbo v0, "61383"
+    const-string/jumbo v0, "61384"
+    const-string/jumbo v0, "61385"
+    const-string/jumbo v0, "61386"
+    const-string/jumbo v0, "61387"
+    const-string/jumbo v0, "61388"
+    const-string/jumbo v0, "61389"
+    const-string/jumbo v0, "61390"
+    const-string/jumbo v0, "61391"
+    const-string/jumbo v0, "61392"
+    const-string/jumbo v0, "61393"
+    const-string/jumbo v0, "61394"
+    const-string/jumbo v0, "61395"
+    const-string/jumbo v0, "61396"
+    const-string/jumbo v0, "61397"
+    const-string/jumbo v0, "61398"
+    const-string/jumbo v0, "61399"
+    const-string/jumbo v0, "61400"
+    const-string/jumbo v0, "61401"
+    const-string/jumbo v0, "61402"
+    const-string/jumbo v0, "61403"
+    const-string/jumbo v0, "61404"
+    const-string/jumbo v0, "61405"
+    const-string/jumbo v0, "61406"
+    const-string/jumbo v0, "61407"
+    const-string/jumbo v0, "61408"
+    const-string/jumbo v0, "61409"
+    const-string/jumbo v0, "61410"
+    const-string/jumbo v0, "61411"
+    const-string/jumbo v0, "61412"
+    const-string/jumbo v0, "61413"
+    const-string/jumbo v0, "61414"
+    const-string/jumbo v0, "61415"
+    const-string/jumbo v0, "61416"
+    const-string/jumbo v0, "61417"
+    const-string/jumbo v0, "61418"
+    const-string/jumbo v0, "61419"
+    const-string/jumbo v0, "61420"
+    const-string/jumbo v0, "61421"
+    const-string/jumbo v0, "61422"
+    const-string/jumbo v0, "61423"
+    const-string/jumbo v0, "61424"
+    const-string/jumbo v0, "61425"
+    const-string/jumbo v0, "61426"
+    const-string/jumbo v0, "61427"
+    const-string/jumbo v0, "61428"
+    const-string/jumbo v0, "61429"
+    const-string/jumbo v0, "61430"
+    const-string/jumbo v0, "61431"
+    const-string/jumbo v0, "61432"
+    const-string/jumbo v0, "61433"
+    const-string/jumbo v0, "61434"
+    const-string/jumbo v0, "61435"
+    const-string/jumbo v0, "61436"
+    const-string/jumbo v0, "61437"
+    const-string/jumbo v0, "61438"
+    const-string/jumbo v0, "61439"
+    const-string/jumbo v0, "61440"
+    const-string/jumbo v0, "61441"
+    const-string/jumbo v0, "61442"
+    const-string/jumbo v0, "61443"
+    const-string/jumbo v0, "61444"
+    const-string/jumbo v0, "61445"
+    const-string/jumbo v0, "61446"
+    const-string/jumbo v0, "61447"
+    const-string/jumbo v0, "61448"
+    const-string/jumbo v0, "61449"
+    const-string/jumbo v0, "61450"
+    const-string/jumbo v0, "61451"
+    const-string/jumbo v0, "61452"
+    const-string/jumbo v0, "61453"
+    const-string/jumbo v0, "61454"
+    const-string/jumbo v0, "61455"
+    const-string/jumbo v0, "61456"
+    const-string/jumbo v0, "61457"
+    const-string/jumbo v0, "61458"
+    const-string/jumbo v0, "61459"
+    const-string/jumbo v0, "61460"
+    const-string/jumbo v0, "61461"
+    const-string/jumbo v0, "61462"
+    const-string/jumbo v0, "61463"
+    const-string/jumbo v0, "61464"
+    const-string/jumbo v0, "61465"
+    const-string/jumbo v0, "61466"
+    const-string/jumbo v0, "61467"
+    const-string/jumbo v0, "61468"
+    const-string/jumbo v0, "61469"
+    const-string/jumbo v0, "61470"
+    const-string/jumbo v0, "61471"
+    const-string/jumbo v0, "61472"
+    const-string/jumbo v0, "61473"
+    const-string/jumbo v0, "61474"
+    const-string/jumbo v0, "61475"
+    const-string/jumbo v0, "61476"
+    const-string/jumbo v0, "61477"
+    const-string/jumbo v0, "61478"
+    const-string/jumbo v0, "61479"
+    const-string/jumbo v0, "61480"
+    const-string/jumbo v0, "61481"
+    const-string/jumbo v0, "61482"
+    const-string/jumbo v0, "61483"
+    const-string/jumbo v0, "61484"
+    const-string/jumbo v0, "61485"
+    const-string/jumbo v0, "61486"
+    const-string/jumbo v0, "61487"
+    const-string/jumbo v0, "61488"
+    const-string/jumbo v0, "61489"
+    const-string/jumbo v0, "61490"
+    const-string/jumbo v0, "61491"
+    const-string/jumbo v0, "61492"
+    const-string/jumbo v0, "61493"
+    const-string/jumbo v0, "61494"
+    const-string/jumbo v0, "61495"
+    const-string/jumbo v0, "61496"
+    const-string/jumbo v0, "61497"
+    const-string/jumbo v0, "61498"
+    const-string/jumbo v0, "61499"
+    const-string/jumbo v0, "61500"
+    const-string/jumbo v0, "61501"
+    const-string/jumbo v0, "61502"
+    const-string/jumbo v0, "61503"
+    const-string/jumbo v0, "61504"
+    const-string/jumbo v0, "61505"
+    const-string/jumbo v0, "61506"
+    const-string/jumbo v0, "61507"
+    const-string/jumbo v0, "61508"
+    const-string/jumbo v0, "61509"
+    const-string/jumbo v0, "61510"
+    const-string/jumbo v0, "61511"
+    const-string/jumbo v0, "61512"
+    const-string/jumbo v0, "61513"
+    const-string/jumbo v0, "61514"
+    const-string/jumbo v0, "61515"
+    const-string/jumbo v0, "61516"
+    const-string/jumbo v0, "61517"
+    const-string/jumbo v0, "61518"
+    const-string/jumbo v0, "61519"
+    const-string/jumbo v0, "61520"
+    const-string/jumbo v0, "61521"
+    const-string/jumbo v0, "61522"
+    const-string/jumbo v0, "61523"
+    const-string/jumbo v0, "61524"
+    const-string/jumbo v0, "61525"
+    const-string/jumbo v0, "61526"
+    const-string/jumbo v0, "61527"
+    const-string/jumbo v0, "61528"
+    const-string/jumbo v0, "61529"
+    const-string/jumbo v0, "61530"
+    const-string/jumbo v0, "61531"
+    const-string/jumbo v0, "61532"
+    const-string/jumbo v0, "61533"
+    const-string/jumbo v0, "61534"
+    const-string/jumbo v0, "61535"
+    const-string/jumbo v0, "61536"
+    const-string/jumbo v0, "61537"
+    const-string/jumbo v0, "61538"
+    const-string/jumbo v0, "61539"
+    const-string/jumbo v0, "61540"
+    const-string/jumbo v0, "61541"
+    const-string/jumbo v0, "61542"
+    const-string/jumbo v0, "61543"
+    const-string/jumbo v0, "61544"
+    const-string/jumbo v0, "61545"
+    const-string/jumbo v0, "61546"
+    const-string/jumbo v0, "61547"
+    const-string/jumbo v0, "61548"
+    const-string/jumbo v0, "61549"
+    const-string/jumbo v0, "61550"
+    const-string/jumbo v0, "61551"
+    const-string/jumbo v0, "61552"
+    const-string/jumbo v0, "61553"
+    const-string/jumbo v0, "61554"
+    const-string/jumbo v0, "61555"
+    const-string/jumbo v0, "61556"
+    const-string/jumbo v0, "61557"
+    const-string/jumbo v0, "61558"
+    const-string/jumbo v0, "61559"
+    const-string/jumbo v0, "61560"
+    const-string/jumbo v0, "61561"
+    const-string/jumbo v0, "61562"
+    const-string/jumbo v0, "61563"
+    const-string/jumbo v0, "61564"
+    const-string/jumbo v0, "61565"
+    const-string/jumbo v0, "61566"
+    const-string/jumbo v0, "61567"
+    const-string/jumbo v0, "61568"
+    const-string/jumbo v0, "61569"
+    const-string/jumbo v0, "61570"
+    const-string/jumbo v0, "61571"
+    const-string/jumbo v0, "61572"
+    const-string/jumbo v0, "61573"
+    const-string/jumbo v0, "61574"
+    const-string/jumbo v0, "61575"
+    const-string/jumbo v0, "61576"
+    const-string/jumbo v0, "61577"
+    const-string/jumbo v0, "61578"
+    const-string/jumbo v0, "61579"
+    const-string/jumbo v0, "61580"
+    const-string/jumbo v0, "61581"
+    const-string/jumbo v0, "61582"
+    const-string/jumbo v0, "61583"
+    const-string/jumbo v0, "61584"
+    const-string/jumbo v0, "61585"
+    const-string/jumbo v0, "61586"
+    const-string/jumbo v0, "61587"
+    const-string/jumbo v0, "61588"
+    const-string/jumbo v0, "61589"
+    const-string/jumbo v0, "61590"
+    const-string/jumbo v0, "61591"
+    const-string/jumbo v0, "61592"
+    const-string/jumbo v0, "61593"
+    const-string/jumbo v0, "61594"
+    const-string/jumbo v0, "61595"
+    const-string/jumbo v0, "61596"
+    const-string/jumbo v0, "61597"
+    const-string/jumbo v0, "61598"
+    const-string/jumbo v0, "61599"
+    const-string/jumbo v0, "61600"
+    const-string/jumbo v0, "61601"
+    const-string/jumbo v0, "61602"
+    const-string/jumbo v0, "61603"
+    const-string/jumbo v0, "61604"
+    const-string/jumbo v0, "61605"
+    const-string/jumbo v0, "61606"
+    const-string/jumbo v0, "61607"
+    const-string/jumbo v0, "61608"
+    const-string/jumbo v0, "61609"
+    const-string/jumbo v0, "61610"
+    const-string/jumbo v0, "61611"
+    const-string/jumbo v0, "61612"
+    const-string/jumbo v0, "61613"
+    const-string/jumbo v0, "61614"
+    const-string/jumbo v0, "61615"
+    const-string/jumbo v0, "61616"
+    const-string/jumbo v0, "61617"
+    const-string/jumbo v0, "61618"
+    const-string/jumbo v0, "61619"
+    const-string/jumbo v0, "61620"
+    const-string/jumbo v0, "61621"
+    const-string/jumbo v0, "61622"
+    const-string/jumbo v0, "61623"
+    const-string/jumbo v0, "61624"
+    const-string/jumbo v0, "61625"
+    const-string/jumbo v0, "61626"
+    const-string/jumbo v0, "61627"
+    const-string/jumbo v0, "61628"
+    const-string/jumbo v0, "61629"
+    const-string/jumbo v0, "61630"
+    const-string/jumbo v0, "61631"
+    const-string/jumbo v0, "61632"
+    const-string/jumbo v0, "61633"
+    const-string/jumbo v0, "61634"
+    const-string/jumbo v0, "61635"
+    const-string/jumbo v0, "61636"
+    const-string/jumbo v0, "61637"
+    const-string/jumbo v0, "61638"
+    const-string/jumbo v0, "61639"
+    const-string/jumbo v0, "61640"
+    const-string/jumbo v0, "61641"
+    const-string/jumbo v0, "61642"
+    const-string/jumbo v0, "61643"
+    const-string/jumbo v0, "61644"
+    const-string/jumbo v0, "61645"
+    const-string/jumbo v0, "61646"
+    const-string/jumbo v0, "61647"
+    const-string/jumbo v0, "61648"
+    const-string/jumbo v0, "61649"
+    const-string/jumbo v0, "61650"
+    const-string/jumbo v0, "61651"
+    const-string/jumbo v0, "61652"
+    const-string/jumbo v0, "61653"
+    const-string/jumbo v0, "61654"
+    const-string/jumbo v0, "61655"
+    const-string/jumbo v0, "61656"
+    const-string/jumbo v0, "61657"
+    const-string/jumbo v0, "61658"
+    const-string/jumbo v0, "61659"
+    const-string/jumbo v0, "61660"
+    const-string/jumbo v0, "61661"
+    const-string/jumbo v0, "61662"
+    const-string/jumbo v0, "61663"
+    const-string/jumbo v0, "61664"
+    const-string/jumbo v0, "61665"
+    const-string/jumbo v0, "61666"
+    const-string/jumbo v0, "61667"
+    const-string/jumbo v0, "61668"
+    const-string/jumbo v0, "61669"
+    const-string/jumbo v0, "61670"
+    const-string/jumbo v0, "61671"
+    const-string/jumbo v0, "61672"
+    const-string/jumbo v0, "61673"
+    const-string/jumbo v0, "61674"
+    const-string/jumbo v0, "61675"
+    const-string/jumbo v0, "61676"
+    const-string/jumbo v0, "61677"
+    const-string/jumbo v0, "61678"
+    const-string/jumbo v0, "61679"
+    const-string/jumbo v0, "61680"
+    const-string/jumbo v0, "61681"
+    const-string/jumbo v0, "61682"
+    const-string/jumbo v0, "61683"
+    const-string/jumbo v0, "61684"
+    const-string/jumbo v0, "61685"
+    const-string/jumbo v0, "61686"
+    const-string/jumbo v0, "61687"
+    const-string/jumbo v0, "61688"
+    const-string/jumbo v0, "61689"
+    const-string/jumbo v0, "61690"
+    const-string/jumbo v0, "61691"
+    const-string/jumbo v0, "61692"
+    const-string/jumbo v0, "61693"
+    const-string/jumbo v0, "61694"
+    const-string/jumbo v0, "61695"
+    const-string/jumbo v0, "61696"
+    const-string/jumbo v0, "61697"
+    const-string/jumbo v0, "61698"
+    const-string/jumbo v0, "61699"
+    const-string/jumbo v0, "61700"
+    const-string/jumbo v0, "61701"
+    const-string/jumbo v0, "61702"
+    const-string/jumbo v0, "61703"
+    const-string/jumbo v0, "61704"
+    const-string/jumbo v0, "61705"
+    const-string/jumbo v0, "61706"
+    const-string/jumbo v0, "61707"
+    const-string/jumbo v0, "61708"
+    const-string/jumbo v0, "61709"
+    const-string/jumbo v0, "61710"
+    const-string/jumbo v0, "61711"
+    const-string/jumbo v0, "61712"
+    const-string/jumbo v0, "61713"
+    const-string/jumbo v0, "61714"
+    const-string/jumbo v0, "61715"
+    const-string/jumbo v0, "61716"
+    const-string/jumbo v0, "61717"
+    const-string/jumbo v0, "61718"
+    const-string/jumbo v0, "61719"
+    const-string/jumbo v0, "61720"
+    const-string/jumbo v0, "61721"
+    const-string/jumbo v0, "61722"
+    const-string/jumbo v0, "61723"
+    const-string/jumbo v0, "61724"
+    const-string/jumbo v0, "61725"
+    const-string/jumbo v0, "61726"
+    const-string/jumbo v0, "61727"
+    const-string/jumbo v0, "61728"
+    const-string/jumbo v0, "61729"
+    const-string/jumbo v0, "61730"
+    const-string/jumbo v0, "61731"
+    const-string/jumbo v0, "61732"
+    const-string/jumbo v0, "61733"
+    const-string/jumbo v0, "61734"
+    const-string/jumbo v0, "61735"
+    const-string/jumbo v0, "61736"
+    const-string/jumbo v0, "61737"
+    const-string/jumbo v0, "61738"
+    const-string/jumbo v0, "61739"
+    const-string/jumbo v0, "61740"
+    const-string/jumbo v0, "61741"
+    const-string/jumbo v0, "61742"
+    const-string/jumbo v0, "61743"
+    const-string/jumbo v0, "61744"
+    const-string/jumbo v0, "61745"
+    const-string/jumbo v0, "61746"
+    const-string/jumbo v0, "61747"
+    const-string/jumbo v0, "61748"
+    const-string/jumbo v0, "61749"
+    const-string/jumbo v0, "61750"
+    const-string/jumbo v0, "61751"
+    const-string/jumbo v0, "61752"
+    const-string/jumbo v0, "61753"
+    const-string/jumbo v0, "61754"
+    const-string/jumbo v0, "61755"
+    const-string/jumbo v0, "61756"
+    const-string/jumbo v0, "61757"
+    const-string/jumbo v0, "61758"
+    const-string/jumbo v0, "61759"
+    const-string/jumbo v0, "61760"
+    const-string/jumbo v0, "61761"
+    const-string/jumbo v0, "61762"
+    const-string/jumbo v0, "61763"
+    const-string/jumbo v0, "61764"
+    const-string/jumbo v0, "61765"
+    const-string/jumbo v0, "61766"
+    const-string/jumbo v0, "61767"
+    const-string/jumbo v0, "61768"
+    const-string/jumbo v0, "61769"
+    const-string/jumbo v0, "61770"
+    const-string/jumbo v0, "61771"
+    const-string/jumbo v0, "61772"
+    const-string/jumbo v0, "61773"
+    const-string/jumbo v0, "61774"
+    const-string/jumbo v0, "61775"
+    const-string/jumbo v0, "61776"
+    const-string/jumbo v0, "61777"
+    const-string/jumbo v0, "61778"
+    const-string/jumbo v0, "61779"
+    const-string/jumbo v0, "61780"
+    const-string/jumbo v0, "61781"
+    const-string/jumbo v0, "61782"
+    const-string/jumbo v0, "61783"
+    const-string/jumbo v0, "61784"
+    const-string/jumbo v0, "61785"
+    const-string/jumbo v0, "61786"
+    const-string/jumbo v0, "61787"
+    const-string/jumbo v0, "61788"
+    const-string/jumbo v0, "61789"
+    const-string/jumbo v0, "61790"
+    const-string/jumbo v0, "61791"
+    const-string/jumbo v0, "61792"
+    const-string/jumbo v0, "61793"
+    const-string/jumbo v0, "61794"
+    const-string/jumbo v0, "61795"
+    const-string/jumbo v0, "61796"
+    const-string/jumbo v0, "61797"
+    const-string/jumbo v0, "61798"
+    const-string/jumbo v0, "61799"
+    const-string/jumbo v0, "61800"
+    const-string/jumbo v0, "61801"
+    const-string/jumbo v0, "61802"
+    const-string/jumbo v0, "61803"
+    const-string/jumbo v0, "61804"
+    const-string/jumbo v0, "61805"
+    const-string/jumbo v0, "61806"
+    const-string/jumbo v0, "61807"
+    const-string/jumbo v0, "61808"
+    const-string/jumbo v0, "61809"
+    const-string/jumbo v0, "61810"
+    const-string/jumbo v0, "61811"
+    const-string/jumbo v0, "61812"
+    const-string/jumbo v0, "61813"
+    const-string/jumbo v0, "61814"
+    const-string/jumbo v0, "61815"
+    const-string/jumbo v0, "61816"
+    const-string/jumbo v0, "61817"
+    const-string/jumbo v0, "61818"
+    const-string/jumbo v0, "61819"
+    const-string/jumbo v0, "61820"
+    const-string/jumbo v0, "61821"
+    const-string/jumbo v0, "61822"
+    const-string/jumbo v0, "61823"
+    const-string/jumbo v0, "61824"
+    const-string/jumbo v0, "61825"
+    const-string/jumbo v0, "61826"
+    const-string/jumbo v0, "61827"
+    const-string/jumbo v0, "61828"
+    const-string/jumbo v0, "61829"
+    const-string/jumbo v0, "61830"
+    const-string/jumbo v0, "61831"
+    const-string/jumbo v0, "61832"
+    const-string/jumbo v0, "61833"
+    const-string/jumbo v0, "61834"
+    const-string/jumbo v0, "61835"
+    const-string/jumbo v0, "61836"
+    const-string/jumbo v0, "61837"
+    const-string/jumbo v0, "61838"
+    const-string/jumbo v0, "61839"
+    const-string/jumbo v0, "61840"
+    const-string/jumbo v0, "61841"
+    const-string/jumbo v0, "61842"
+    const-string/jumbo v0, "61843"
+    const-string/jumbo v0, "61844"
+    const-string/jumbo v0, "61845"
+    const-string/jumbo v0, "61846"
+    const-string/jumbo v0, "61847"
+    const-string/jumbo v0, "61848"
+    const-string/jumbo v0, "61849"
+    const-string/jumbo v0, "61850"
+    const-string/jumbo v0, "61851"
+    const-string/jumbo v0, "61852"
+    const-string/jumbo v0, "61853"
+    const-string/jumbo v0, "61854"
+    const-string/jumbo v0, "61855"
+    const-string/jumbo v0, "61856"
+    const-string/jumbo v0, "61857"
+    const-string/jumbo v0, "61858"
+    const-string/jumbo v0, "61859"
+    const-string/jumbo v0, "61860"
+    const-string/jumbo v0, "61861"
+    const-string/jumbo v0, "61862"
+    const-string/jumbo v0, "61863"
+    const-string/jumbo v0, "61864"
+    const-string/jumbo v0, "61865"
+    const-string/jumbo v0, "61866"
+    const-string/jumbo v0, "61867"
+    const-string/jumbo v0, "61868"
+    const-string/jumbo v0, "61869"
+    const-string/jumbo v0, "61870"
+    const-string/jumbo v0, "61871"
+    const-string/jumbo v0, "61872"
+    const-string/jumbo v0, "61873"
+    const-string/jumbo v0, "61874"
+    const-string/jumbo v0, "61875"
+    const-string/jumbo v0, "61876"
+    const-string/jumbo v0, "61877"
+    const-string/jumbo v0, "61878"
+    const-string/jumbo v0, "61879"
+    const-string/jumbo v0, "61880"
+    const-string/jumbo v0, "61881"
+    const-string/jumbo v0, "61882"
+    const-string/jumbo v0, "61883"
+    const-string/jumbo v0, "61884"
+    const-string/jumbo v0, "61885"
+    const-string/jumbo v0, "61886"
+    const-string/jumbo v0, "61887"
+    const-string/jumbo v0, "61888"
+    const-string/jumbo v0, "61889"
+    const-string/jumbo v0, "61890"
+    const-string/jumbo v0, "61891"
+    const-string/jumbo v0, "61892"
+    const-string/jumbo v0, "61893"
+    const-string/jumbo v0, "61894"
+    const-string/jumbo v0, "61895"
+    const-string/jumbo v0, "61896"
+    const-string/jumbo v0, "61897"
+    const-string/jumbo v0, "61898"
+    const-string/jumbo v0, "61899"
+    const-string/jumbo v0, "61900"
+    const-string/jumbo v0, "61901"
+    const-string/jumbo v0, "61902"
+    const-string/jumbo v0, "61903"
+    const-string/jumbo v0, "61904"
+    const-string/jumbo v0, "61905"
+    const-string/jumbo v0, "61906"
+    const-string/jumbo v0, "61907"
+    const-string/jumbo v0, "61908"
+    const-string/jumbo v0, "61909"
+    const-string/jumbo v0, "61910"
+    const-string/jumbo v0, "61911"
+    const-string/jumbo v0, "61912"
+    const-string/jumbo v0, "61913"
+    const-string/jumbo v0, "61914"
+    const-string/jumbo v0, "61915"
+    const-string/jumbo v0, "61916"
+    const-string/jumbo v0, "61917"
+    const-string/jumbo v0, "61918"
+    const-string/jumbo v0, "61919"
+    const-string/jumbo v0, "61920"
+    const-string/jumbo v0, "61921"
+    const-string/jumbo v0, "61922"
+    const-string/jumbo v0, "61923"
+    const-string/jumbo v0, "61924"
+    const-string/jumbo v0, "61925"
+    const-string/jumbo v0, "61926"
+    const-string/jumbo v0, "61927"
+    const-string/jumbo v0, "61928"
+    const-string/jumbo v0, "61929"
+    const-string/jumbo v0, "61930"
+    const-string/jumbo v0, "61931"
+    const-string/jumbo v0, "61932"
+    const-string/jumbo v0, "61933"
+    const-string/jumbo v0, "61934"
+    const-string/jumbo v0, "61935"
+    const-string/jumbo v0, "61936"
+    const-string/jumbo v0, "61937"
+    const-string/jumbo v0, "61938"
+    const-string/jumbo v0, "61939"
+    const-string/jumbo v0, "61940"
+    const-string/jumbo v0, "61941"
+    const-string/jumbo v0, "61942"
+    const-string/jumbo v0, "61943"
+    const-string/jumbo v0, "61944"
+    const-string/jumbo v0, "61945"
+    const-string/jumbo v0, "61946"
+    const-string/jumbo v0, "61947"
+    const-string/jumbo v0, "61948"
+    const-string/jumbo v0, "61949"
+    const-string/jumbo v0, "61950"
+    const-string/jumbo v0, "61951"
+    const-string/jumbo v0, "61952"
+    const-string/jumbo v0, "61953"
+    const-string/jumbo v0, "61954"
+    const-string/jumbo v0, "61955"
+    const-string/jumbo v0, "61956"
+    const-string/jumbo v0, "61957"
+    const-string/jumbo v0, "61958"
+    const-string/jumbo v0, "61959"
+    const-string/jumbo v0, "61960"
+    const-string/jumbo v0, "61961"
+    const-string/jumbo v0, "61962"
+    const-string/jumbo v0, "61963"
+    const-string/jumbo v0, "61964"
+    const-string/jumbo v0, "61965"
+    const-string/jumbo v0, "61966"
+    const-string/jumbo v0, "61967"
+    const-string/jumbo v0, "61968"
+    const-string/jumbo v0, "61969"
+    const-string/jumbo v0, "61970"
+    const-string/jumbo v0, "61971"
+    const-string/jumbo v0, "61972"
+    const-string/jumbo v0, "61973"
+    const-string/jumbo v0, "61974"
+    const-string/jumbo v0, "61975"
+    const-string/jumbo v0, "61976"
+    const-string/jumbo v0, "61977"
+    const-string/jumbo v0, "61978"
+    const-string/jumbo v0, "61979"
+    const-string/jumbo v0, "61980"
+    const-string/jumbo v0, "61981"
+    const-string/jumbo v0, "61982"
+    const-string/jumbo v0, "61983"
+    const-string/jumbo v0, "61984"
+    const-string/jumbo v0, "61985"
+    const-string/jumbo v0, "61986"
+    const-string/jumbo v0, "61987"
+    const-string/jumbo v0, "61988"
+    const-string/jumbo v0, "61989"
+    const-string/jumbo v0, "61990"
+    const-string/jumbo v0, "61991"
+    const-string/jumbo v0, "61992"
+    const-string/jumbo v0, "61993"
+    const-string/jumbo v0, "61994"
+    const-string/jumbo v0, "61995"
+    const-string/jumbo v0, "61996"
+    const-string/jumbo v0, "61997"
+    const-string/jumbo v0, "61998"
+    const-string/jumbo v0, "61999"
+    const-string/jumbo v0, "62000"
+    const-string/jumbo v0, "62001"
+    const-string/jumbo v0, "62002"
+    const-string/jumbo v0, "62003"
+    const-string/jumbo v0, "62004"
+    const-string/jumbo v0, "62005"
+    const-string/jumbo v0, "62006"
+    const-string/jumbo v0, "62007"
+    const-string/jumbo v0, "62008"
+    const-string/jumbo v0, "62009"
+    const-string/jumbo v0, "62010"
+    const-string/jumbo v0, "62011"
+    const-string/jumbo v0, "62012"
+    const-string/jumbo v0, "62013"
+    const-string/jumbo v0, "62014"
+    const-string/jumbo v0, "62015"
+    const-string/jumbo v0, "62016"
+    const-string/jumbo v0, "62017"
+    const-string/jumbo v0, "62018"
+    const-string/jumbo v0, "62019"
+    const-string/jumbo v0, "62020"
+    const-string/jumbo v0, "62021"
+    const-string/jumbo v0, "62022"
+    const-string/jumbo v0, "62023"
+    const-string/jumbo v0, "62024"
+    const-string/jumbo v0, "62025"
+    const-string/jumbo v0, "62026"
+    const-string/jumbo v0, "62027"
+    const-string/jumbo v0, "62028"
+    const-string/jumbo v0, "62029"
+    const-string/jumbo v0, "62030"
+    const-string/jumbo v0, "62031"
+    const-string/jumbo v0, "62032"
+    const-string/jumbo v0, "62033"
+    const-string/jumbo v0, "62034"
+    const-string/jumbo v0, "62035"
+    const-string/jumbo v0, "62036"
+    const-string/jumbo v0, "62037"
+    const-string/jumbo v0, "62038"
+    const-string/jumbo v0, "62039"
+    const-string/jumbo v0, "62040"
+    const-string/jumbo v0, "62041"
+    const-string/jumbo v0, "62042"
+    const-string/jumbo v0, "62043"
+    const-string/jumbo v0, "62044"
+    const-string/jumbo v0, "62045"
+    const-string/jumbo v0, "62046"
+    const-string/jumbo v0, "62047"
+    const-string/jumbo v0, "62048"
+    const-string/jumbo v0, "62049"
+    const-string/jumbo v0, "62050"
+    const-string/jumbo v0, "62051"
+    const-string/jumbo v0, "62052"
+    const-string/jumbo v0, "62053"
+    const-string/jumbo v0, "62054"
+    const-string/jumbo v0, "62055"
+    const-string/jumbo v0, "62056"
+    const-string/jumbo v0, "62057"
+    const-string/jumbo v0, "62058"
+    const-string/jumbo v0, "62059"
+    const-string/jumbo v0, "62060"
+    const-string/jumbo v0, "62061"
+    const-string/jumbo v0, "62062"
+    const-string/jumbo v0, "62063"
+    const-string/jumbo v0, "62064"
+    const-string/jumbo v0, "62065"
+    const-string/jumbo v0, "62066"
+    const-string/jumbo v0, "62067"
+    const-string/jumbo v0, "62068"
+    const-string/jumbo v0, "62069"
+    const-string/jumbo v0, "62070"
+    const-string/jumbo v0, "62071"
+    const-string/jumbo v0, "62072"
+    const-string/jumbo v0, "62073"
+    const-string/jumbo v0, "62074"
+    const-string/jumbo v0, "62075"
+    const-string/jumbo v0, "62076"
+    const-string/jumbo v0, "62077"
+    const-string/jumbo v0, "62078"
+    const-string/jumbo v0, "62079"
+    const-string/jumbo v0, "62080"
+    const-string/jumbo v0, "62081"
+    const-string/jumbo v0, "62082"
+    const-string/jumbo v0, "62083"
+    const-string/jumbo v0, "62084"
+    const-string/jumbo v0, "62085"
+    const-string/jumbo v0, "62086"
+    const-string/jumbo v0, "62087"
+    const-string/jumbo v0, "62088"
+    const-string/jumbo v0, "62089"
+    const-string/jumbo v0, "62090"
+    const-string/jumbo v0, "62091"
+    const-string/jumbo v0, "62092"
+    const-string/jumbo v0, "62093"
+    const-string/jumbo v0, "62094"
+    const-string/jumbo v0, "62095"
+    const-string/jumbo v0, "62096"
+    const-string/jumbo v0, "62097"
+    const-string/jumbo v0, "62098"
+    const-string/jumbo v0, "62099"
+    const-string/jumbo v0, "62100"
+    const-string/jumbo v0, "62101"
+    const-string/jumbo v0, "62102"
+    const-string/jumbo v0, "62103"
+    const-string/jumbo v0, "62104"
+    const-string/jumbo v0, "62105"
+    const-string/jumbo v0, "62106"
+    const-string/jumbo v0, "62107"
+    const-string/jumbo v0, "62108"
+    const-string/jumbo v0, "62109"
+    const-string/jumbo v0, "62110"
+    const-string/jumbo v0, "62111"
+    const-string/jumbo v0, "62112"
+    const-string/jumbo v0, "62113"
+    const-string/jumbo v0, "62114"
+    const-string/jumbo v0, "62115"
+    const-string/jumbo v0, "62116"
+    const-string/jumbo v0, "62117"
+    const-string/jumbo v0, "62118"
+    const-string/jumbo v0, "62119"
+    const-string/jumbo v0, "62120"
+    const-string/jumbo v0, "62121"
+    const-string/jumbo v0, "62122"
+    const-string/jumbo v0, "62123"
+    const-string/jumbo v0, "62124"
+    const-string/jumbo v0, "62125"
+    const-string/jumbo v0, "62126"
+    const-string/jumbo v0, "62127"
+    const-string/jumbo v0, "62128"
+    const-string/jumbo v0, "62129"
+    const-string/jumbo v0, "62130"
+    const-string/jumbo v0, "62131"
+    const-string/jumbo v0, "62132"
+    const-string/jumbo v0, "62133"
+    const-string/jumbo v0, "62134"
+    const-string/jumbo v0, "62135"
+    const-string/jumbo v0, "62136"
+    const-string/jumbo v0, "62137"
+    const-string/jumbo v0, "62138"
+    const-string/jumbo v0, "62139"
+    const-string/jumbo v0, "62140"
+    const-string/jumbo v0, "62141"
+    const-string/jumbo v0, "62142"
+    const-string/jumbo v0, "62143"
+    const-string/jumbo v0, "62144"
+    const-string/jumbo v0, "62145"
+    const-string/jumbo v0, "62146"
+    const-string/jumbo v0, "62147"
+    const-string/jumbo v0, "62148"
+    const-string/jumbo v0, "62149"
+    const-string/jumbo v0, "62150"
+    const-string/jumbo v0, "62151"
+    const-string/jumbo v0, "62152"
+    const-string/jumbo v0, "62153"
+    const-string/jumbo v0, "62154"
+    const-string/jumbo v0, "62155"
+    const-string/jumbo v0, "62156"
+    const-string/jumbo v0, "62157"
+    const-string/jumbo v0, "62158"
+    const-string/jumbo v0, "62159"
+    const-string/jumbo v0, "62160"
+    const-string/jumbo v0, "62161"
+    const-string/jumbo v0, "62162"
+    const-string/jumbo v0, "62163"
+    const-string/jumbo v0, "62164"
+    const-string/jumbo v0, "62165"
+    const-string/jumbo v0, "62166"
+    const-string/jumbo v0, "62167"
+    const-string/jumbo v0, "62168"
+    const-string/jumbo v0, "62169"
+    const-string/jumbo v0, "62170"
+    const-string/jumbo v0, "62171"
+    const-string/jumbo v0, "62172"
+    const-string/jumbo v0, "62173"
+    const-string/jumbo v0, "62174"
+    const-string/jumbo v0, "62175"
+    const-string/jumbo v0, "62176"
+    const-string/jumbo v0, "62177"
+    const-string/jumbo v0, "62178"
+    const-string/jumbo v0, "62179"
+    const-string/jumbo v0, "62180"
+    const-string/jumbo v0, "62181"
+    const-string/jumbo v0, "62182"
+    const-string/jumbo v0, "62183"
+    const-string/jumbo v0, "62184"
+    const-string/jumbo v0, "62185"
+    const-string/jumbo v0, "62186"
+    const-string/jumbo v0, "62187"
+    const-string/jumbo v0, "62188"
+    const-string/jumbo v0, "62189"
+    const-string/jumbo v0, "62190"
+    const-string/jumbo v0, "62191"
+    const-string/jumbo v0, "62192"
+    const-string/jumbo v0, "62193"
+    const-string/jumbo v0, "62194"
+    const-string/jumbo v0, "62195"
+    const-string/jumbo v0, "62196"
+    const-string/jumbo v0, "62197"
+    const-string/jumbo v0, "62198"
+    const-string/jumbo v0, "62199"
+    const-string/jumbo v0, "62200"
+    const-string/jumbo v0, "62201"
+    const-string/jumbo v0, "62202"
+    const-string/jumbo v0, "62203"
+    const-string/jumbo v0, "62204"
+    const-string/jumbo v0, "62205"
+    const-string/jumbo v0, "62206"
+    const-string/jumbo v0, "62207"
+    const-string/jumbo v0, "62208"
+    const-string/jumbo v0, "62209"
+    const-string/jumbo v0, "62210"
+    const-string/jumbo v0, "62211"
+    const-string/jumbo v0, "62212"
+    const-string/jumbo v0, "62213"
+    const-string/jumbo v0, "62214"
+    const-string/jumbo v0, "62215"
+    const-string/jumbo v0, "62216"
+    const-string/jumbo v0, "62217"
+    const-string/jumbo v0, "62218"
+    const-string/jumbo v0, "62219"
+    const-string/jumbo v0, "62220"
+    const-string/jumbo v0, "62221"
+    const-string/jumbo v0, "62222"
+    const-string/jumbo v0, "62223"
+    const-string/jumbo v0, "62224"
+    const-string/jumbo v0, "62225"
+    const-string/jumbo v0, "62226"
+    const-string/jumbo v0, "62227"
+    const-string/jumbo v0, "62228"
+    const-string/jumbo v0, "62229"
+    const-string/jumbo v0, "62230"
+    const-string/jumbo v0, "62231"
+    const-string/jumbo v0, "62232"
+    const-string/jumbo v0, "62233"
+    const-string/jumbo v0, "62234"
+    const-string/jumbo v0, "62235"
+    const-string/jumbo v0, "62236"
+    const-string/jumbo v0, "62237"
+    const-string/jumbo v0, "62238"
+    const-string/jumbo v0, "62239"
+    const-string/jumbo v0, "62240"
+    const-string/jumbo v0, "62241"
+    const-string/jumbo v0, "62242"
+    const-string/jumbo v0, "62243"
+    const-string/jumbo v0, "62244"
+    const-string/jumbo v0, "62245"
+    const-string/jumbo v0, "62246"
+    const-string/jumbo v0, "62247"
+    const-string/jumbo v0, "62248"
+    const-string/jumbo v0, "62249"
+    const-string/jumbo v0, "62250"
+    const-string/jumbo v0, "62251"
+    const-string/jumbo v0, "62252"
+    const-string/jumbo v0, "62253"
+    const-string/jumbo v0, "62254"
+    const-string/jumbo v0, "62255"
+    const-string/jumbo v0, "62256"
+    const-string/jumbo v0, "62257"
+    const-string/jumbo v0, "62258"
+    const-string/jumbo v0, "62259"
+    const-string/jumbo v0, "62260"
+    const-string/jumbo v0, "62261"
+    const-string/jumbo v0, "62262"
+    const-string/jumbo v0, "62263"
+    const-string/jumbo v0, "62264"
+    const-string/jumbo v0, "62265"
+    const-string/jumbo v0, "62266"
+    const-string/jumbo v0, "62267"
+    const-string/jumbo v0, "62268"
+    const-string/jumbo v0, "62269"
+    const-string/jumbo v0, "62270"
+    const-string/jumbo v0, "62271"
+    const-string/jumbo v0, "62272"
+    const-string/jumbo v0, "62273"
+    const-string/jumbo v0, "62274"
+    const-string/jumbo v0, "62275"
+    const-string/jumbo v0, "62276"
+    const-string/jumbo v0, "62277"
+    const-string/jumbo v0, "62278"
+    const-string/jumbo v0, "62279"
+    const-string/jumbo v0, "62280"
+    const-string/jumbo v0, "62281"
+    const-string/jumbo v0, "62282"
+    const-string/jumbo v0, "62283"
+    const-string/jumbo v0, "62284"
+    const-string/jumbo v0, "62285"
+    const-string/jumbo v0, "62286"
+    const-string/jumbo v0, "62287"
+    const-string/jumbo v0, "62288"
+    const-string/jumbo v0, "62289"
+    const-string/jumbo v0, "62290"
+    const-string/jumbo v0, "62291"
+    const-string/jumbo v0, "62292"
+    const-string/jumbo v0, "62293"
+    const-string/jumbo v0, "62294"
+    const-string/jumbo v0, "62295"
+    const-string/jumbo v0, "62296"
+    const-string/jumbo v0, "62297"
+    const-string/jumbo v0, "62298"
+    const-string/jumbo v0, "62299"
+    const-string/jumbo v0, "62300"
+    const-string/jumbo v0, "62301"
+    const-string/jumbo v0, "62302"
+    const-string/jumbo v0, "62303"
+    const-string/jumbo v0, "62304"
+    const-string/jumbo v0, "62305"
+    const-string/jumbo v0, "62306"
+    const-string/jumbo v0, "62307"
+    const-string/jumbo v0, "62308"
+    const-string/jumbo v0, "62309"
+    const-string/jumbo v0, "62310"
+    const-string/jumbo v0, "62311"
+    const-string/jumbo v0, "62312"
+    const-string/jumbo v0, "62313"
+    const-string/jumbo v0, "62314"
+    const-string/jumbo v0, "62315"
+    const-string/jumbo v0, "62316"
+    const-string/jumbo v0, "62317"
+    const-string/jumbo v0, "62318"
+    const-string/jumbo v0, "62319"
+    const-string/jumbo v0, "62320"
+    const-string/jumbo v0, "62321"
+    const-string/jumbo v0, "62322"
+    const-string/jumbo v0, "62323"
+    const-string/jumbo v0, "62324"
+    const-string/jumbo v0, "62325"
+    const-string/jumbo v0, "62326"
+    const-string/jumbo v0, "62327"
+    const-string/jumbo v0, "62328"
+    const-string/jumbo v0, "62329"
+    const-string/jumbo v0, "62330"
+    const-string/jumbo v0, "62331"
+    const-string/jumbo v0, "62332"
+    const-string/jumbo v0, "62333"
+    const-string/jumbo v0, "62334"
+    const-string/jumbo v0, "62335"
+    const-string/jumbo v0, "62336"
+    const-string/jumbo v0, "62337"
+    const-string/jumbo v0, "62338"
+    const-string/jumbo v0, "62339"
+    const-string/jumbo v0, "62340"
+    const-string/jumbo v0, "62341"
+    const-string/jumbo v0, "62342"
+    const-string/jumbo v0, "62343"
+    const-string/jumbo v0, "62344"
+    const-string/jumbo v0, "62345"
+    const-string/jumbo v0, "62346"
+    const-string/jumbo v0, "62347"
+    const-string/jumbo v0, "62348"
+    const-string/jumbo v0, "62349"
+    const-string/jumbo v0, "62350"
+    const-string/jumbo v0, "62351"
+    const-string/jumbo v0, "62352"
+    const-string/jumbo v0, "62353"
+    const-string/jumbo v0, "62354"
+    const-string/jumbo v0, "62355"
+    const-string/jumbo v0, "62356"
+    const-string/jumbo v0, "62357"
+    const-string/jumbo v0, "62358"
+    const-string/jumbo v0, "62359"
+    const-string/jumbo v0, "62360"
+    const-string/jumbo v0, "62361"
+    const-string/jumbo v0, "62362"
+    const-string/jumbo v0, "62363"
+    const-string/jumbo v0, "62364"
+    const-string/jumbo v0, "62365"
+    const-string/jumbo v0, "62366"
+    const-string/jumbo v0, "62367"
+    const-string/jumbo v0, "62368"
+    const-string/jumbo v0, "62369"
+    const-string/jumbo v0, "62370"
+    const-string/jumbo v0, "62371"
+    const-string/jumbo v0, "62372"
+    const-string/jumbo v0, "62373"
+    const-string/jumbo v0, "62374"
+    const-string/jumbo v0, "62375"
+    const-string/jumbo v0, "62376"
+    const-string/jumbo v0, "62377"
+    const-string/jumbo v0, "62378"
+    const-string/jumbo v0, "62379"
+    const-string/jumbo v0, "62380"
+    const-string/jumbo v0, "62381"
+    const-string/jumbo v0, "62382"
+    const-string/jumbo v0, "62383"
+    const-string/jumbo v0, "62384"
+    const-string/jumbo v0, "62385"
+    const-string/jumbo v0, "62386"
+    const-string/jumbo v0, "62387"
+    const-string/jumbo v0, "62388"
+    const-string/jumbo v0, "62389"
+    const-string/jumbo v0, "62390"
+    const-string/jumbo v0, "62391"
+    const-string/jumbo v0, "62392"
+    const-string/jumbo v0, "62393"
+    const-string/jumbo v0, "62394"
+    const-string/jumbo v0, "62395"
+    const-string/jumbo v0, "62396"
+    const-string/jumbo v0, "62397"
+    const-string/jumbo v0, "62398"
+    const-string/jumbo v0, "62399"
+    const-string/jumbo v0, "62400"
+    const-string/jumbo v0, "62401"
+    const-string/jumbo v0, "62402"
+    const-string/jumbo v0, "62403"
+    const-string/jumbo v0, "62404"
+    const-string/jumbo v0, "62405"
+    const-string/jumbo v0, "62406"
+    const-string/jumbo v0, "62407"
+    const-string/jumbo v0, "62408"
+    const-string/jumbo v0, "62409"
+    const-string/jumbo v0, "62410"
+    const-string/jumbo v0, "62411"
+    const-string/jumbo v0, "62412"
+    const-string/jumbo v0, "62413"
+    const-string/jumbo v0, "62414"
+    const-string/jumbo v0, "62415"
+    const-string/jumbo v0, "62416"
+    const-string/jumbo v0, "62417"
+    const-string/jumbo v0, "62418"
+    const-string/jumbo v0, "62419"
+    const-string/jumbo v0, "62420"
+    const-string/jumbo v0, "62421"
+    const-string/jumbo v0, "62422"
+    const-string/jumbo v0, "62423"
+    const-string/jumbo v0, "62424"
+    const-string/jumbo v0, "62425"
+    const-string/jumbo v0, "62426"
+    const-string/jumbo v0, "62427"
+    const-string/jumbo v0, "62428"
+    const-string/jumbo v0, "62429"
+    const-string/jumbo v0, "62430"
+    const-string/jumbo v0, "62431"
+    const-string/jumbo v0, "62432"
+    const-string/jumbo v0, "62433"
+    const-string/jumbo v0, "62434"
+    const-string/jumbo v0, "62435"
+    const-string/jumbo v0, "62436"
+    const-string/jumbo v0, "62437"
+    const-string/jumbo v0, "62438"
+    const-string/jumbo v0, "62439"
+    const-string/jumbo v0, "62440"
+    const-string/jumbo v0, "62441"
+    const-string/jumbo v0, "62442"
+    const-string/jumbo v0, "62443"
+    const-string/jumbo v0, "62444"
+    const-string/jumbo v0, "62445"
+    const-string/jumbo v0, "62446"
+    const-string/jumbo v0, "62447"
+    const-string/jumbo v0, "62448"
+    const-string/jumbo v0, "62449"
+    const-string/jumbo v0, "62450"
+    const-string/jumbo v0, "62451"
+    const-string/jumbo v0, "62452"
+    const-string/jumbo v0, "62453"
+    const-string/jumbo v0, "62454"
+    const-string/jumbo v0, "62455"
+    const-string/jumbo v0, "62456"
+    const-string/jumbo v0, "62457"
+    const-string/jumbo v0, "62458"
+    const-string/jumbo v0, "62459"
+    const-string/jumbo v0, "62460"
+    const-string/jumbo v0, "62461"
+    const-string/jumbo v0, "62462"
+    const-string/jumbo v0, "62463"
+    const-string/jumbo v0, "62464"
+    const-string/jumbo v0, "62465"
+    const-string/jumbo v0, "62466"
+    const-string/jumbo v0, "62467"
+    const-string/jumbo v0, "62468"
+    const-string/jumbo v0, "62469"
+    const-string/jumbo v0, "62470"
+    const-string/jumbo v0, "62471"
+    const-string/jumbo v0, "62472"
+    const-string/jumbo v0, "62473"
+    const-string/jumbo v0, "62474"
+    const-string/jumbo v0, "62475"
+    const-string/jumbo v0, "62476"
+    const-string/jumbo v0, "62477"
+    const-string/jumbo v0, "62478"
+    const-string/jumbo v0, "62479"
+    const-string/jumbo v0, "62480"
+    const-string/jumbo v0, "62481"
+    const-string/jumbo v0, "62482"
+    const-string/jumbo v0, "62483"
+    const-string/jumbo v0, "62484"
+    const-string/jumbo v0, "62485"
+    const-string/jumbo v0, "62486"
+    const-string/jumbo v0, "62487"
+    const-string/jumbo v0, "62488"
+    const-string/jumbo v0, "62489"
+    const-string/jumbo v0, "62490"
+    const-string/jumbo v0, "62491"
+    const-string/jumbo v0, "62492"
+    const-string/jumbo v0, "62493"
+    const-string/jumbo v0, "62494"
+    const-string/jumbo v0, "62495"
+    const-string/jumbo v0, "62496"
+    const-string/jumbo v0, "62497"
+    const-string/jumbo v0, "62498"
+    const-string/jumbo v0, "62499"
+    const-string/jumbo v0, "62500"
+    const-string/jumbo v0, "62501"
+    const-string/jumbo v0, "62502"
+    const-string/jumbo v0, "62503"
+    const-string/jumbo v0, "62504"
+    const-string/jumbo v0, "62505"
+    const-string/jumbo v0, "62506"
+    const-string/jumbo v0, "62507"
+    const-string/jumbo v0, "62508"
+    const-string/jumbo v0, "62509"
+    const-string/jumbo v0, "62510"
+    const-string/jumbo v0, "62511"
+    const-string/jumbo v0, "62512"
+    const-string/jumbo v0, "62513"
+    const-string/jumbo v0, "62514"
+    const-string/jumbo v0, "62515"
+    const-string/jumbo v0, "62516"
+    const-string/jumbo v0, "62517"
+    const-string/jumbo v0, "62518"
+    const-string/jumbo v0, "62519"
+    const-string/jumbo v0, "62520"
+    const-string/jumbo v0, "62521"
+    const-string/jumbo v0, "62522"
+    const-string/jumbo v0, "62523"
+    const-string/jumbo v0, "62524"
+    const-string/jumbo v0, "62525"
+    const-string/jumbo v0, "62526"
+    const-string/jumbo v0, "62527"
+    const-string/jumbo v0, "62528"
+    const-string/jumbo v0, "62529"
+    const-string/jumbo v0, "62530"
+    const-string/jumbo v0, "62531"
+    const-string/jumbo v0, "62532"
+    const-string/jumbo v0, "62533"
+    const-string/jumbo v0, "62534"
+    const-string/jumbo v0, "62535"
+    const-string/jumbo v0, "62536"
+    const-string/jumbo v0, "62537"
+    const-string/jumbo v0, "62538"
+    const-string/jumbo v0, "62539"
+    const-string/jumbo v0, "62540"
+    const-string/jumbo v0, "62541"
+    const-string/jumbo v0, "62542"
+    const-string/jumbo v0, "62543"
+    const-string/jumbo v0, "62544"
+    const-string/jumbo v0, "62545"
+    const-string/jumbo v0, "62546"
+    const-string/jumbo v0, "62547"
+    const-string/jumbo v0, "62548"
+    const-string/jumbo v0, "62549"
+    const-string/jumbo v0, "62550"
+    const-string/jumbo v0, "62551"
+    const-string/jumbo v0, "62552"
+    const-string/jumbo v0, "62553"
+    const-string/jumbo v0, "62554"
+    const-string/jumbo v0, "62555"
+    const-string/jumbo v0, "62556"
+    const-string/jumbo v0, "62557"
+    const-string/jumbo v0, "62558"
+    const-string/jumbo v0, "62559"
+    const-string/jumbo v0, "62560"
+    const-string/jumbo v0, "62561"
+    const-string/jumbo v0, "62562"
+    const-string/jumbo v0, "62563"
+    const-string/jumbo v0, "62564"
+    const-string/jumbo v0, "62565"
+    const-string/jumbo v0, "62566"
+    const-string/jumbo v0, "62567"
+    const-string/jumbo v0, "62568"
+    const-string/jumbo v0, "62569"
+    const-string/jumbo v0, "62570"
+    const-string/jumbo v0, "62571"
+    const-string/jumbo v0, "62572"
+    const-string/jumbo v0, "62573"
+    const-string/jumbo v0, "62574"
+    const-string/jumbo v0, "62575"
+    const-string/jumbo v0, "62576"
+    const-string/jumbo v0, "62577"
+    const-string/jumbo v0, "62578"
+    const-string/jumbo v0, "62579"
+    const-string/jumbo v0, "62580"
+    const-string/jumbo v0, "62581"
+    const-string/jumbo v0, "62582"
+    const-string/jumbo v0, "62583"
+    const-string/jumbo v0, "62584"
+    const-string/jumbo v0, "62585"
+    const-string/jumbo v0, "62586"
+    const-string/jumbo v0, "62587"
+    const-string/jumbo v0, "62588"
+    const-string/jumbo v0, "62589"
+    const-string/jumbo v0, "62590"
+    const-string/jumbo v0, "62591"
+    const-string/jumbo v0, "62592"
+    const-string/jumbo v0, "62593"
+    const-string/jumbo v0, "62594"
+    const-string/jumbo v0, "62595"
+    const-string/jumbo v0, "62596"
+    const-string/jumbo v0, "62597"
+    const-string/jumbo v0, "62598"
+    const-string/jumbo v0, "62599"
+    const-string/jumbo v0, "62600"
+    const-string/jumbo v0, "62601"
+    const-string/jumbo v0, "62602"
+    const-string/jumbo v0, "62603"
+    const-string/jumbo v0, "62604"
+    const-string/jumbo v0, "62605"
+    const-string/jumbo v0, "62606"
+    const-string/jumbo v0, "62607"
+    const-string/jumbo v0, "62608"
+    const-string/jumbo v0, "62609"
+    const-string/jumbo v0, "62610"
+    const-string/jumbo v0, "62611"
+    const-string/jumbo v0, "62612"
+    const-string/jumbo v0, "62613"
+    const-string/jumbo v0, "62614"
+    const-string/jumbo v0, "62615"
+    const-string/jumbo v0, "62616"
+    const-string/jumbo v0, "62617"
+    const-string/jumbo v0, "62618"
+    const-string/jumbo v0, "62619"
+    const-string/jumbo v0, "62620"
+    const-string/jumbo v0, "62621"
+    const-string/jumbo v0, "62622"
+    const-string/jumbo v0, "62623"
+    const-string/jumbo v0, "62624"
+    const-string/jumbo v0, "62625"
+    const-string/jumbo v0, "62626"
+    const-string/jumbo v0, "62627"
+    const-string/jumbo v0, "62628"
+    const-string/jumbo v0, "62629"
+    const-string/jumbo v0, "62630"
+    const-string/jumbo v0, "62631"
+    const-string/jumbo v0, "62632"
+    const-string/jumbo v0, "62633"
+    const-string/jumbo v0, "62634"
+    const-string/jumbo v0, "62635"
+    const-string/jumbo v0, "62636"
+    const-string/jumbo v0, "62637"
+    const-string/jumbo v0, "62638"
+    const-string/jumbo v0, "62639"
+    const-string/jumbo v0, "62640"
+    const-string/jumbo v0, "62641"
+    const-string/jumbo v0, "62642"
+    const-string/jumbo v0, "62643"
+    const-string/jumbo v0, "62644"
+    const-string/jumbo v0, "62645"
+    const-string/jumbo v0, "62646"
+    const-string/jumbo v0, "62647"
+    const-string/jumbo v0, "62648"
+    const-string/jumbo v0, "62649"
+    const-string/jumbo v0, "62650"
+    const-string/jumbo v0, "62651"
+    const-string/jumbo v0, "62652"
+    const-string/jumbo v0, "62653"
+    const-string/jumbo v0, "62654"
+    const-string/jumbo v0, "62655"
+    const-string/jumbo v0, "62656"
+    const-string/jumbo v0, "62657"
+    const-string/jumbo v0, "62658"
+    const-string/jumbo v0, "62659"
+    const-string/jumbo v0, "62660"
+    const-string/jumbo v0, "62661"
+    const-string/jumbo v0, "62662"
+    const-string/jumbo v0, "62663"
+    const-string/jumbo v0, "62664"
+    const-string/jumbo v0, "62665"
+    const-string/jumbo v0, "62666"
+    const-string/jumbo v0, "62667"
+    const-string/jumbo v0, "62668"
+    const-string/jumbo v0, "62669"
+    const-string/jumbo v0, "62670"
+    const-string/jumbo v0, "62671"
+    const-string/jumbo v0, "62672"
+    const-string/jumbo v0, "62673"
+    const-string/jumbo v0, "62674"
+    const-string/jumbo v0, "62675"
+    const-string/jumbo v0, "62676"
+    const-string/jumbo v0, "62677"
+    const-string/jumbo v0, "62678"
+    const-string/jumbo v0, "62679"
+    const-string/jumbo v0, "62680"
+    const-string/jumbo v0, "62681"
+    const-string/jumbo v0, "62682"
+    const-string/jumbo v0, "62683"
+    const-string/jumbo v0, "62684"
+    const-string/jumbo v0, "62685"
+    const-string/jumbo v0, "62686"
+    const-string/jumbo v0, "62687"
+    const-string/jumbo v0, "62688"
+    const-string/jumbo v0, "62689"
+    const-string/jumbo v0, "62690"
+    const-string/jumbo v0, "62691"
+    const-string/jumbo v0, "62692"
+    const-string/jumbo v0, "62693"
+    const-string/jumbo v0, "62694"
+    const-string/jumbo v0, "62695"
+    const-string/jumbo v0, "62696"
+    const-string/jumbo v0, "62697"
+    const-string/jumbo v0, "62698"
+    const-string/jumbo v0, "62699"
+    const-string/jumbo v0, "62700"
+    const-string/jumbo v0, "62701"
+    const-string/jumbo v0, "62702"
+    const-string/jumbo v0, "62703"
+    const-string/jumbo v0, "62704"
+    const-string/jumbo v0, "62705"
+    const-string/jumbo v0, "62706"
+    const-string/jumbo v0, "62707"
+    const-string/jumbo v0, "62708"
+    const-string/jumbo v0, "62709"
+    const-string/jumbo v0, "62710"
+    const-string/jumbo v0, "62711"
+    const-string/jumbo v0, "62712"
+    const-string/jumbo v0, "62713"
+    const-string/jumbo v0, "62714"
+    const-string/jumbo v0, "62715"
+    const-string/jumbo v0, "62716"
+    const-string/jumbo v0, "62717"
+    const-string/jumbo v0, "62718"
+    const-string/jumbo v0, "62719"
+    const-string/jumbo v0, "62720"
+    const-string/jumbo v0, "62721"
+    const-string/jumbo v0, "62722"
+    const-string/jumbo v0, "62723"
+    const-string/jumbo v0, "62724"
+    const-string/jumbo v0, "62725"
+    const-string/jumbo v0, "62726"
+    const-string/jumbo v0, "62727"
+    const-string/jumbo v0, "62728"
+    const-string/jumbo v0, "62729"
+    const-string/jumbo v0, "62730"
+    const-string/jumbo v0, "62731"
+    const-string/jumbo v0, "62732"
+    const-string/jumbo v0, "62733"
+    const-string/jumbo v0, "62734"
+    const-string/jumbo v0, "62735"
+    const-string/jumbo v0, "62736"
+    const-string/jumbo v0, "62737"
+    const-string/jumbo v0, "62738"
+    const-string/jumbo v0, "62739"
+    const-string/jumbo v0, "62740"
+    const-string/jumbo v0, "62741"
+    const-string/jumbo v0, "62742"
+    const-string/jumbo v0, "62743"
+    const-string/jumbo v0, "62744"
+    const-string/jumbo v0, "62745"
+    const-string/jumbo v0, "62746"
+    const-string/jumbo v0, "62747"
+    const-string/jumbo v0, "62748"
+    const-string/jumbo v0, "62749"
+    const-string/jumbo v0, "62750"
+    const-string/jumbo v0, "62751"
+    const-string/jumbo v0, "62752"
+    const-string/jumbo v0, "62753"
+    const-string/jumbo v0, "62754"
+    const-string/jumbo v0, "62755"
+    const-string/jumbo v0, "62756"
+    const-string/jumbo v0, "62757"
+    const-string/jumbo v0, "62758"
+    const-string/jumbo v0, "62759"
+    const-string/jumbo v0, "62760"
+    const-string/jumbo v0, "62761"
+    const-string/jumbo v0, "62762"
+    const-string/jumbo v0, "62763"
+    const-string/jumbo v0, "62764"
+    const-string/jumbo v0, "62765"
+    const-string/jumbo v0, "62766"
+    const-string/jumbo v0, "62767"
+    const-string/jumbo v0, "62768"
+    const-string/jumbo v0, "62769"
+    const-string/jumbo v0, "62770"
+    const-string/jumbo v0, "62771"
+    const-string/jumbo v0, "62772"
+    const-string/jumbo v0, "62773"
+    const-string/jumbo v0, "62774"
+    const-string/jumbo v0, "62775"
+    const-string/jumbo v0, "62776"
+    const-string/jumbo v0, "62777"
+    const-string/jumbo v0, "62778"
+    const-string/jumbo v0, "62779"
+    const-string/jumbo v0, "62780"
+    const-string/jumbo v0, "62781"
+    const-string/jumbo v0, "62782"
+    const-string/jumbo v0, "62783"
+    const-string/jumbo v0, "62784"
+    const-string/jumbo v0, "62785"
+    const-string/jumbo v0, "62786"
+    const-string/jumbo v0, "62787"
+    const-string/jumbo v0, "62788"
+    const-string/jumbo v0, "62789"
+    const-string/jumbo v0, "62790"
+    const-string/jumbo v0, "62791"
+    const-string/jumbo v0, "62792"
+    const-string/jumbo v0, "62793"
+    const-string/jumbo v0, "62794"
+    const-string/jumbo v0, "62795"
+    const-string/jumbo v0, "62796"
+    const-string/jumbo v0, "62797"
+    const-string/jumbo v0, "62798"
+    const-string/jumbo v0, "62799"
+    const-string/jumbo v0, "62800"
+    const-string/jumbo v0, "62801"
+    const-string/jumbo v0, "62802"
+    const-string/jumbo v0, "62803"
+    const-string/jumbo v0, "62804"
+    const-string/jumbo v0, "62805"
+    const-string/jumbo v0, "62806"
+    const-string/jumbo v0, "62807"
+    const-string/jumbo v0, "62808"
+    const-string/jumbo v0, "62809"
+    const-string/jumbo v0, "62810"
+    const-string/jumbo v0, "62811"
+    const-string/jumbo v0, "62812"
+    const-string/jumbo v0, "62813"
+    const-string/jumbo v0, "62814"
+    const-string/jumbo v0, "62815"
+    const-string/jumbo v0, "62816"
+    const-string/jumbo v0, "62817"
+    const-string/jumbo v0, "62818"
+    const-string/jumbo v0, "62819"
+    const-string/jumbo v0, "62820"
+    const-string/jumbo v0, "62821"
+    const-string/jumbo v0, "62822"
+    const-string/jumbo v0, "62823"
+    const-string/jumbo v0, "62824"
+    const-string/jumbo v0, "62825"
+    const-string/jumbo v0, "62826"
+    const-string/jumbo v0, "62827"
+    const-string/jumbo v0, "62828"
+    const-string/jumbo v0, "62829"
+    const-string/jumbo v0, "62830"
+    const-string/jumbo v0, "62831"
+    const-string/jumbo v0, "62832"
+    const-string/jumbo v0, "62833"
+    const-string/jumbo v0, "62834"
+    const-string/jumbo v0, "62835"
+    const-string/jumbo v0, "62836"
+    const-string/jumbo v0, "62837"
+    const-string/jumbo v0, "62838"
+    const-string/jumbo v0, "62839"
+    const-string/jumbo v0, "62840"
+    const-string/jumbo v0, "62841"
+    const-string/jumbo v0, "62842"
+    const-string/jumbo v0, "62843"
+    const-string/jumbo v0, "62844"
+    const-string/jumbo v0, "62845"
+    const-string/jumbo v0, "62846"
+    const-string/jumbo v0, "62847"
+    const-string/jumbo v0, "62848"
+    const-string/jumbo v0, "62849"
+    const-string/jumbo v0, "62850"
+    const-string/jumbo v0, "62851"
+    const-string/jumbo v0, "62852"
+    const-string/jumbo v0, "62853"
+    const-string/jumbo v0, "62854"
+    const-string/jumbo v0, "62855"
+    const-string/jumbo v0, "62856"
+    const-string/jumbo v0, "62857"
+    const-string/jumbo v0, "62858"
+    const-string/jumbo v0, "62859"
+    const-string/jumbo v0, "62860"
+    const-string/jumbo v0, "62861"
+    const-string/jumbo v0, "62862"
+    const-string/jumbo v0, "62863"
+    const-string/jumbo v0, "62864"
+    const-string/jumbo v0, "62865"
+    const-string/jumbo v0, "62866"
+    const-string/jumbo v0, "62867"
+    const-string/jumbo v0, "62868"
+    const-string/jumbo v0, "62869"
+    const-string/jumbo v0, "62870"
+    const-string/jumbo v0, "62871"
+    const-string/jumbo v0, "62872"
+    const-string/jumbo v0, "62873"
+    const-string/jumbo v0, "62874"
+    const-string/jumbo v0, "62875"
+    const-string/jumbo v0, "62876"
+    const-string/jumbo v0, "62877"
+    const-string/jumbo v0, "62878"
+    const-string/jumbo v0, "62879"
+    const-string/jumbo v0, "62880"
+    const-string/jumbo v0, "62881"
+    const-string/jumbo v0, "62882"
+    const-string/jumbo v0, "62883"
+    const-string/jumbo v0, "62884"
+    const-string/jumbo v0, "62885"
+    const-string/jumbo v0, "62886"
+    const-string/jumbo v0, "62887"
+    const-string/jumbo v0, "62888"
+    const-string/jumbo v0, "62889"
+    const-string/jumbo v0, "62890"
+    const-string/jumbo v0, "62891"
+    const-string/jumbo v0, "62892"
+    const-string/jumbo v0, "62893"
+    const-string/jumbo v0, "62894"
+    const-string/jumbo v0, "62895"
+    const-string/jumbo v0, "62896"
+    const-string/jumbo v0, "62897"
+    const-string/jumbo v0, "62898"
+    const-string/jumbo v0, "62899"
+    const-string/jumbo v0, "62900"
+    const-string/jumbo v0, "62901"
+    const-string/jumbo v0, "62902"
+    const-string/jumbo v0, "62903"
+    const-string/jumbo v0, "62904"
+    const-string/jumbo v0, "62905"
+    const-string/jumbo v0, "62906"
+    const-string/jumbo v0, "62907"
+    const-string/jumbo v0, "62908"
+    const-string/jumbo v0, "62909"
+    const-string/jumbo v0, "62910"
+    const-string/jumbo v0, "62911"
+    const-string/jumbo v0, "62912"
+    const-string/jumbo v0, "62913"
+    const-string/jumbo v0, "62914"
+    const-string/jumbo v0, "62915"
+    const-string/jumbo v0, "62916"
+    const-string/jumbo v0, "62917"
+    const-string/jumbo v0, "62918"
+    const-string/jumbo v0, "62919"
+    const-string/jumbo v0, "62920"
+    const-string/jumbo v0, "62921"
+    const-string/jumbo v0, "62922"
+    const-string/jumbo v0, "62923"
+    const-string/jumbo v0, "62924"
+    const-string/jumbo v0, "62925"
+    const-string/jumbo v0, "62926"
+    const-string/jumbo v0, "62927"
+    const-string/jumbo v0, "62928"
+    const-string/jumbo v0, "62929"
+    const-string/jumbo v0, "62930"
+    const-string/jumbo v0, "62931"
+    const-string/jumbo v0, "62932"
+    const-string/jumbo v0, "62933"
+    const-string/jumbo v0, "62934"
+    const-string/jumbo v0, "62935"
+    const-string/jumbo v0, "62936"
+    const-string/jumbo v0, "62937"
+    const-string/jumbo v0, "62938"
+    const-string/jumbo v0, "62939"
+    const-string/jumbo v0, "62940"
+    const-string/jumbo v0, "62941"
+    const-string/jumbo v0, "62942"
+    const-string/jumbo v0, "62943"
+    const-string/jumbo v0, "62944"
+    const-string/jumbo v0, "62945"
+    const-string/jumbo v0, "62946"
+    const-string/jumbo v0, "62947"
+    const-string/jumbo v0, "62948"
+    const-string/jumbo v0, "62949"
+    const-string/jumbo v0, "62950"
+    const-string/jumbo v0, "62951"
+    const-string/jumbo v0, "62952"
+    const-string/jumbo v0, "62953"
+    const-string/jumbo v0, "62954"
+    const-string/jumbo v0, "62955"
+    const-string/jumbo v0, "62956"
+    const-string/jumbo v0, "62957"
+    const-string/jumbo v0, "62958"
+    const-string/jumbo v0, "62959"
+    const-string/jumbo v0, "62960"
+    const-string/jumbo v0, "62961"
+    const-string/jumbo v0, "62962"
+    const-string/jumbo v0, "62963"
+    const-string/jumbo v0, "62964"
+    const-string/jumbo v0, "62965"
+    const-string/jumbo v0, "62966"
+    const-string/jumbo v0, "62967"
+    const-string/jumbo v0, "62968"
+    const-string/jumbo v0, "62969"
+    const-string/jumbo v0, "62970"
+    const-string/jumbo v0, "62971"
+    const-string/jumbo v0, "62972"
+    const-string/jumbo v0, "62973"
+    const-string/jumbo v0, "62974"
+    const-string/jumbo v0, "62975"
+    const-string/jumbo v0, "62976"
+    const-string/jumbo v0, "62977"
+    const-string/jumbo v0, "62978"
+    const-string/jumbo v0, "62979"
+    const-string/jumbo v0, "62980"
+    const-string/jumbo v0, "62981"
+    const-string/jumbo v0, "62982"
+    const-string/jumbo v0, "62983"
+    const-string/jumbo v0, "62984"
+    const-string/jumbo v0, "62985"
+    const-string/jumbo v0, "62986"
+    const-string/jumbo v0, "62987"
+    const-string/jumbo v0, "62988"
+    const-string/jumbo v0, "62989"
+    const-string/jumbo v0, "62990"
+    const-string/jumbo v0, "62991"
+    const-string/jumbo v0, "62992"
+    const-string/jumbo v0, "62993"
+    const-string/jumbo v0, "62994"
+    const-string/jumbo v0, "62995"
+    const-string/jumbo v0, "62996"
+    const-string/jumbo v0, "62997"
+    const-string/jumbo v0, "62998"
+    const-string/jumbo v0, "62999"
+    const-string/jumbo v0, "63000"
+    const-string/jumbo v0, "63001"
+    const-string/jumbo v0, "63002"
+    const-string/jumbo v0, "63003"
+    const-string/jumbo v0, "63004"
+    const-string/jumbo v0, "63005"
+    const-string/jumbo v0, "63006"
+    const-string/jumbo v0, "63007"
+    const-string/jumbo v0, "63008"
+    const-string/jumbo v0, "63009"
+    const-string/jumbo v0, "63010"
+    const-string/jumbo v0, "63011"
+    const-string/jumbo v0, "63012"
+    const-string/jumbo v0, "63013"
+    const-string/jumbo v0, "63014"
+    const-string/jumbo v0, "63015"
+    const-string/jumbo v0, "63016"
+    const-string/jumbo v0, "63017"
+    const-string/jumbo v0, "63018"
+    const-string/jumbo v0, "63019"
+    const-string/jumbo v0, "63020"
+    const-string/jumbo v0, "63021"
+    const-string/jumbo v0, "63022"
+    const-string/jumbo v0, "63023"
+    const-string/jumbo v0, "63024"
+    const-string/jumbo v0, "63025"
+    const-string/jumbo v0, "63026"
+    const-string/jumbo v0, "63027"
+    const-string/jumbo v0, "63028"
+    const-string/jumbo v0, "63029"
+    const-string/jumbo v0, "63030"
+    const-string/jumbo v0, "63031"
+    const-string/jumbo v0, "63032"
+    const-string/jumbo v0, "63033"
+    const-string/jumbo v0, "63034"
+    const-string/jumbo v0, "63035"
+    const-string/jumbo v0, "63036"
+    const-string/jumbo v0, "63037"
+    const-string/jumbo v0, "63038"
+    const-string/jumbo v0, "63039"
+    const-string/jumbo v0, "63040"
+    const-string/jumbo v0, "63041"
+    const-string/jumbo v0, "63042"
+    const-string/jumbo v0, "63043"
+    const-string/jumbo v0, "63044"
+    const-string/jumbo v0, "63045"
+    const-string/jumbo v0, "63046"
+    const-string/jumbo v0, "63047"
+    const-string/jumbo v0, "63048"
+    const-string/jumbo v0, "63049"
+    const-string/jumbo v0, "63050"
+    const-string/jumbo v0, "63051"
+    const-string/jumbo v0, "63052"
+    const-string/jumbo v0, "63053"
+    const-string/jumbo v0, "63054"
+    const-string/jumbo v0, "63055"
+    const-string/jumbo v0, "63056"
+    const-string/jumbo v0, "63057"
+    const-string/jumbo v0, "63058"
+    const-string/jumbo v0, "63059"
+    const-string/jumbo v0, "63060"
+    const-string/jumbo v0, "63061"
+    const-string/jumbo v0, "63062"
+    const-string/jumbo v0, "63063"
+    const-string/jumbo v0, "63064"
+    const-string/jumbo v0, "63065"
+    const-string/jumbo v0, "63066"
+    const-string/jumbo v0, "63067"
+    const-string/jumbo v0, "63068"
+    const-string/jumbo v0, "63069"
+    const-string/jumbo v0, "63070"
+    const-string/jumbo v0, "63071"
+    const-string/jumbo v0, "63072"
+    const-string/jumbo v0, "63073"
+    const-string/jumbo v0, "63074"
+    const-string/jumbo v0, "63075"
+    const-string/jumbo v0, "63076"
+    const-string/jumbo v0, "63077"
+    const-string/jumbo v0, "63078"
+    const-string/jumbo v0, "63079"
+    const-string/jumbo v0, "63080"
+    const-string/jumbo v0, "63081"
+    const-string/jumbo v0, "63082"
+    const-string/jumbo v0, "63083"
+    const-string/jumbo v0, "63084"
+    const-string/jumbo v0, "63085"
+    const-string/jumbo v0, "63086"
+    const-string/jumbo v0, "63087"
+    const-string/jumbo v0, "63088"
+    const-string/jumbo v0, "63089"
+    const-string/jumbo v0, "63090"
+    const-string/jumbo v0, "63091"
+    const-string/jumbo v0, "63092"
+    const-string/jumbo v0, "63093"
+    const-string/jumbo v0, "63094"
+    const-string/jumbo v0, "63095"
+    const-string/jumbo v0, "63096"
+    const-string/jumbo v0, "63097"
+    const-string/jumbo v0, "63098"
+    const-string/jumbo v0, "63099"
+    const-string/jumbo v0, "63100"
+    const-string/jumbo v0, "63101"
+    const-string/jumbo v0, "63102"
+    const-string/jumbo v0, "63103"
+    const-string/jumbo v0, "63104"
+    const-string/jumbo v0, "63105"
+    const-string/jumbo v0, "63106"
+    const-string/jumbo v0, "63107"
+    const-string/jumbo v0, "63108"
+    const-string/jumbo v0, "63109"
+    const-string/jumbo v0, "63110"
+    const-string/jumbo v0, "63111"
+    const-string/jumbo v0, "63112"
+    const-string/jumbo v0, "63113"
+    const-string/jumbo v0, "63114"
+    const-string/jumbo v0, "63115"
+    const-string/jumbo v0, "63116"
+    const-string/jumbo v0, "63117"
+    const-string/jumbo v0, "63118"
+    const-string/jumbo v0, "63119"
+    const-string/jumbo v0, "63120"
+    const-string/jumbo v0, "63121"
+    const-string/jumbo v0, "63122"
+    const-string/jumbo v0, "63123"
+    const-string/jumbo v0, "63124"
+    const-string/jumbo v0, "63125"
+    const-string/jumbo v0, "63126"
+    const-string/jumbo v0, "63127"
+    const-string/jumbo v0, "63128"
+    const-string/jumbo v0, "63129"
+    const-string/jumbo v0, "63130"
+    const-string/jumbo v0, "63131"
+    const-string/jumbo v0, "63132"
+    const-string/jumbo v0, "63133"
+    const-string/jumbo v0, "63134"
+    const-string/jumbo v0, "63135"
+    const-string/jumbo v0, "63136"
+    const-string/jumbo v0, "63137"
+    const-string/jumbo v0, "63138"
+    const-string/jumbo v0, "63139"
+    const-string/jumbo v0, "63140"
+    const-string/jumbo v0, "63141"
+    const-string/jumbo v0, "63142"
+    const-string/jumbo v0, "63143"
+    const-string/jumbo v0, "63144"
+    const-string/jumbo v0, "63145"
+    const-string/jumbo v0, "63146"
+    const-string/jumbo v0, "63147"
+    const-string/jumbo v0, "63148"
+    const-string/jumbo v0, "63149"
+    const-string/jumbo v0, "63150"
+    const-string/jumbo v0, "63151"
+    const-string/jumbo v0, "63152"
+    const-string/jumbo v0, "63153"
+    const-string/jumbo v0, "63154"
+    const-string/jumbo v0, "63155"
+    const-string/jumbo v0, "63156"
+    const-string/jumbo v0, "63157"
+    const-string/jumbo v0, "63158"
+    const-string/jumbo v0, "63159"
+    const-string/jumbo v0, "63160"
+    const-string/jumbo v0, "63161"
+    const-string/jumbo v0, "63162"
+    const-string/jumbo v0, "63163"
+    const-string/jumbo v0, "63164"
+    const-string/jumbo v0, "63165"
+    const-string/jumbo v0, "63166"
+    const-string/jumbo v0, "63167"
+    const-string/jumbo v0, "63168"
+    const-string/jumbo v0, "63169"
+    const-string/jumbo v0, "63170"
+    const-string/jumbo v0, "63171"
+    const-string/jumbo v0, "63172"
+    const-string/jumbo v0, "63173"
+    const-string/jumbo v0, "63174"
+    const-string/jumbo v0, "63175"
+    const-string/jumbo v0, "63176"
+    const-string/jumbo v0, "63177"
+    const-string/jumbo v0, "63178"
+    const-string/jumbo v0, "63179"
+    const-string/jumbo v0, "63180"
+    const-string/jumbo v0, "63181"
+    const-string/jumbo v0, "63182"
+    const-string/jumbo v0, "63183"
+    const-string/jumbo v0, "63184"
+    const-string/jumbo v0, "63185"
+    const-string/jumbo v0, "63186"
+    const-string/jumbo v0, "63187"
+    const-string/jumbo v0, "63188"
+    const-string/jumbo v0, "63189"
+    const-string/jumbo v0, "63190"
+    const-string/jumbo v0, "63191"
+    const-string/jumbo v0, "63192"
+    const-string/jumbo v0, "63193"
+    const-string/jumbo v0, "63194"
+    const-string/jumbo v0, "63195"
+    const-string/jumbo v0, "63196"
+    const-string/jumbo v0, "63197"
+    const-string/jumbo v0, "63198"
+    const-string/jumbo v0, "63199"
+    const-string/jumbo v0, "63200"
+    const-string/jumbo v0, "63201"
+    const-string/jumbo v0, "63202"
+    const-string/jumbo v0, "63203"
+    const-string/jumbo v0, "63204"
+    const-string/jumbo v0, "63205"
+    const-string/jumbo v0, "63206"
+    const-string/jumbo v0, "63207"
+    const-string/jumbo v0, "63208"
+    const-string/jumbo v0, "63209"
+    const-string/jumbo v0, "63210"
+    const-string/jumbo v0, "63211"
+    const-string/jumbo v0, "63212"
+    const-string/jumbo v0, "63213"
+    const-string/jumbo v0, "63214"
+    const-string/jumbo v0, "63215"
+    const-string/jumbo v0, "63216"
+    const-string/jumbo v0, "63217"
+    const-string/jumbo v0, "63218"
+    const-string/jumbo v0, "63219"
+    const-string/jumbo v0, "63220"
+    const-string/jumbo v0, "63221"
+    const-string/jumbo v0, "63222"
+    const-string/jumbo v0, "63223"
+    const-string/jumbo v0, "63224"
+    const-string/jumbo v0, "63225"
+    const-string/jumbo v0, "63226"
+    const-string/jumbo v0, "63227"
+    const-string/jumbo v0, "63228"
+    const-string/jumbo v0, "63229"
+    const-string/jumbo v0, "63230"
+    const-string/jumbo v0, "63231"
+    const-string/jumbo v0, "63232"
+    const-string/jumbo v0, "63233"
+    const-string/jumbo v0, "63234"
+    const-string/jumbo v0, "63235"
+    const-string/jumbo v0, "63236"
+    const-string/jumbo v0, "63237"
+    const-string/jumbo v0, "63238"
+    const-string/jumbo v0, "63239"
+    const-string/jumbo v0, "63240"
+    const-string/jumbo v0, "63241"
+    const-string/jumbo v0, "63242"
+    const-string/jumbo v0, "63243"
+    const-string/jumbo v0, "63244"
+    const-string/jumbo v0, "63245"
+    const-string/jumbo v0, "63246"
+    const-string/jumbo v0, "63247"
+    const-string/jumbo v0, "63248"
+    const-string/jumbo v0, "63249"
+    const-string/jumbo v0, "63250"
+    const-string/jumbo v0, "63251"
+    const-string/jumbo v0, "63252"
+    const-string/jumbo v0, "63253"
+    const-string/jumbo v0, "63254"
+    const-string/jumbo v0, "63255"
+    const-string/jumbo v0, "63256"
+    const-string/jumbo v0, "63257"
+    const-string/jumbo v0, "63258"
+    const-string/jumbo v0, "63259"
+    const-string/jumbo v0, "63260"
+    const-string/jumbo v0, "63261"
+    const-string/jumbo v0, "63262"
+    const-string/jumbo v0, "63263"
+    const-string/jumbo v0, "63264"
+    const-string/jumbo v0, "63265"
+    const-string/jumbo v0, "63266"
+    const-string/jumbo v0, "63267"
+    const-string/jumbo v0, "63268"
+    const-string/jumbo v0, "63269"
+    const-string/jumbo v0, "63270"
+    const-string/jumbo v0, "63271"
+    const-string/jumbo v0, "63272"
+    const-string/jumbo v0, "63273"
+    const-string/jumbo v0, "63274"
+    const-string/jumbo v0, "63275"
+    const-string/jumbo v0, "63276"
+    const-string/jumbo v0, "63277"
+    const-string/jumbo v0, "63278"
+    const-string/jumbo v0, "63279"
+    const-string/jumbo v0, "63280"
+    const-string/jumbo v0, "63281"
+    const-string/jumbo v0, "63282"
+    const-string/jumbo v0, "63283"
+    const-string/jumbo v0, "63284"
+    const-string/jumbo v0, "63285"
+    const-string/jumbo v0, "63286"
+    const-string/jumbo v0, "63287"
+    const-string/jumbo v0, "63288"
+    const-string/jumbo v0, "63289"
+    const-string/jumbo v0, "63290"
+    const-string/jumbo v0, "63291"
+    const-string/jumbo v0, "63292"
+    const-string/jumbo v0, "63293"
+    const-string/jumbo v0, "63294"
+    const-string/jumbo v0, "63295"
+    const-string/jumbo v0, "63296"
+    const-string/jumbo v0, "63297"
+    const-string/jumbo v0, "63298"
+    const-string/jumbo v0, "63299"
+    const-string/jumbo v0, "63300"
+    const-string/jumbo v0, "63301"
+    const-string/jumbo v0, "63302"
+    const-string/jumbo v0, "63303"
+    const-string/jumbo v0, "63304"
+    const-string/jumbo v0, "63305"
+    const-string/jumbo v0, "63306"
+    const-string/jumbo v0, "63307"
+    const-string/jumbo v0, "63308"
+    const-string/jumbo v0, "63309"
+    const-string/jumbo v0, "63310"
+    const-string/jumbo v0, "63311"
+    const-string/jumbo v0, "63312"
+    const-string/jumbo v0, "63313"
+    const-string/jumbo v0, "63314"
+    const-string/jumbo v0, "63315"
+    const-string/jumbo v0, "63316"
+    const-string/jumbo v0, "63317"
+    const-string/jumbo v0, "63318"
+    const-string/jumbo v0, "63319"
+    const-string/jumbo v0, "63320"
+    const-string/jumbo v0, "63321"
+    const-string/jumbo v0, "63322"
+    const-string/jumbo v0, "63323"
+    const-string/jumbo v0, "63324"
+    const-string/jumbo v0, "63325"
+    const-string/jumbo v0, "63326"
+    const-string/jumbo v0, "63327"
+    const-string/jumbo v0, "63328"
+    const-string/jumbo v0, "63329"
+    const-string/jumbo v0, "63330"
+    const-string/jumbo v0, "63331"
+    const-string/jumbo v0, "63332"
+    const-string/jumbo v0, "63333"
+    const-string/jumbo v0, "63334"
+    const-string/jumbo v0, "63335"
+    const-string/jumbo v0, "63336"
+    const-string/jumbo v0, "63337"
+    const-string/jumbo v0, "63338"
+    const-string/jumbo v0, "63339"
+    const-string/jumbo v0, "63340"
+    const-string/jumbo v0, "63341"
+    const-string/jumbo v0, "63342"
+    const-string/jumbo v0, "63343"
+    const-string/jumbo v0, "63344"
+    const-string/jumbo v0, "63345"
+    const-string/jumbo v0, "63346"
+    const-string/jumbo v0, "63347"
+    const-string/jumbo v0, "63348"
+    const-string/jumbo v0, "63349"
+    const-string/jumbo v0, "63350"
+    const-string/jumbo v0, "63351"
+    const-string/jumbo v0, "63352"
+    const-string/jumbo v0, "63353"
+    const-string/jumbo v0, "63354"
+    const-string/jumbo v0, "63355"
+    const-string/jumbo v0, "63356"
+    const-string/jumbo v0, "63357"
+    const-string/jumbo v0, "63358"
+    const-string/jumbo v0, "63359"
+    const-string/jumbo v0, "63360"
+    const-string/jumbo v0, "63361"
+    const-string/jumbo v0, "63362"
+    const-string/jumbo v0, "63363"
+    const-string/jumbo v0, "63364"
+    const-string/jumbo v0, "63365"
+    const-string/jumbo v0, "63366"
+    const-string/jumbo v0, "63367"
+    const-string/jumbo v0, "63368"
+    const-string/jumbo v0, "63369"
+    const-string/jumbo v0, "63370"
+    const-string/jumbo v0, "63371"
+    const-string/jumbo v0, "63372"
+    const-string/jumbo v0, "63373"
+    const-string/jumbo v0, "63374"
+    const-string/jumbo v0, "63375"
+    const-string/jumbo v0, "63376"
+    const-string/jumbo v0, "63377"
+    const-string/jumbo v0, "63378"
+    const-string/jumbo v0, "63379"
+    const-string/jumbo v0, "63380"
+    const-string/jumbo v0, "63381"
+    const-string/jumbo v0, "63382"
+    const-string/jumbo v0, "63383"
+    const-string/jumbo v0, "63384"
+    const-string/jumbo v0, "63385"
+    const-string/jumbo v0, "63386"
+    const-string/jumbo v0, "63387"
+    const-string/jumbo v0, "63388"
+    const-string/jumbo v0, "63389"
+    const-string/jumbo v0, "63390"
+    const-string/jumbo v0, "63391"
+    const-string/jumbo v0, "63392"
+    const-string/jumbo v0, "63393"
+    const-string/jumbo v0, "63394"
+    const-string/jumbo v0, "63395"
+    const-string/jumbo v0, "63396"
+    const-string/jumbo v0, "63397"
+    const-string/jumbo v0, "63398"
+    const-string/jumbo v0, "63399"
+    const-string/jumbo v0, "63400"
+    const-string/jumbo v0, "63401"
+    const-string/jumbo v0, "63402"
+    const-string/jumbo v0, "63403"
+    const-string/jumbo v0, "63404"
+    const-string/jumbo v0, "63405"
+    const-string/jumbo v0, "63406"
+    const-string/jumbo v0, "63407"
+    const-string/jumbo v0, "63408"
+    const-string/jumbo v0, "63409"
+    const-string/jumbo v0, "63410"
+    const-string/jumbo v0, "63411"
+    const-string/jumbo v0, "63412"
+    const-string/jumbo v0, "63413"
+    const-string/jumbo v0, "63414"
+    const-string/jumbo v0, "63415"
+    const-string/jumbo v0, "63416"
+    const-string/jumbo v0, "63417"
+    const-string/jumbo v0, "63418"
+    const-string/jumbo v0, "63419"
+    const-string/jumbo v0, "63420"
+    const-string/jumbo v0, "63421"
+    const-string/jumbo v0, "63422"
+    const-string/jumbo v0, "63423"
+    const-string/jumbo v0, "63424"
+    const-string/jumbo v0, "63425"
+    const-string/jumbo v0, "63426"
+    const-string/jumbo v0, "63427"
+    const-string/jumbo v0, "63428"
+    const-string/jumbo v0, "63429"
+    const-string/jumbo v0, "63430"
+    const-string/jumbo v0, "63431"
+    const-string/jumbo v0, "63432"
+    const-string/jumbo v0, "63433"
+    const-string/jumbo v0, "63434"
+    const-string/jumbo v0, "63435"
+    const-string/jumbo v0, "63436"
+    const-string/jumbo v0, "63437"
+    const-string/jumbo v0, "63438"
+    const-string/jumbo v0, "63439"
+    const-string/jumbo v0, "63440"
+    const-string/jumbo v0, "63441"
+    const-string/jumbo v0, "63442"
+    const-string/jumbo v0, "63443"
+    const-string/jumbo v0, "63444"
+    const-string/jumbo v0, "63445"
+    const-string/jumbo v0, "63446"
+    const-string/jumbo v0, "63447"
+    const-string/jumbo v0, "63448"
+    const-string/jumbo v0, "63449"
+    const-string/jumbo v0, "63450"
+    const-string/jumbo v0, "63451"
+    const-string/jumbo v0, "63452"
+    const-string/jumbo v0, "63453"
+    const-string/jumbo v0, "63454"
+    const-string/jumbo v0, "63455"
+    const-string/jumbo v0, "63456"
+    const-string/jumbo v0, "63457"
+    const-string/jumbo v0, "63458"
+    const-string/jumbo v0, "63459"
+    const-string/jumbo v0, "63460"
+    const-string/jumbo v0, "63461"
+    const-string/jumbo v0, "63462"
+    const-string/jumbo v0, "63463"
+    const-string/jumbo v0, "63464"
+    const-string/jumbo v0, "63465"
+    const-string/jumbo v0, "63466"
+    const-string/jumbo v0, "63467"
+    const-string/jumbo v0, "63468"
+    const-string/jumbo v0, "63469"
+    const-string/jumbo v0, "63470"
+    const-string/jumbo v0, "63471"
+    const-string/jumbo v0, "63472"
+    const-string/jumbo v0, "63473"
+    const-string/jumbo v0, "63474"
+    const-string/jumbo v0, "63475"
+    const-string/jumbo v0, "63476"
+    const-string/jumbo v0, "63477"
+    const-string/jumbo v0, "63478"
+    const-string/jumbo v0, "63479"
+    const-string/jumbo v0, "63480"
+    const-string/jumbo v0, "63481"
+    const-string/jumbo v0, "63482"
+    const-string/jumbo v0, "63483"
+    const-string/jumbo v0, "63484"
+    const-string/jumbo v0, "63485"
+    const-string/jumbo v0, "63486"
+    const-string/jumbo v0, "63487"
+    const-string/jumbo v0, "63488"
+    const-string/jumbo v0, "63489"
+    const-string/jumbo v0, "63490"
+    const-string/jumbo v0, "63491"
+    const-string/jumbo v0, "63492"
+    const-string/jumbo v0, "63493"
+    const-string/jumbo v0, "63494"
+    const-string/jumbo v0, "63495"
+    const-string/jumbo v0, "63496"
+    const-string/jumbo v0, "63497"
+    const-string/jumbo v0, "63498"
+    const-string/jumbo v0, "63499"
+    const-string/jumbo v0, "63500"
+    const-string/jumbo v0, "63501"
+    const-string/jumbo v0, "63502"
+    const-string/jumbo v0, "63503"
+    const-string/jumbo v0, "63504"
+    const-string/jumbo v0, "63505"
+    const-string/jumbo v0, "63506"
+    const-string/jumbo v0, "63507"
+    const-string/jumbo v0, "63508"
+    const-string/jumbo v0, "63509"
+    const-string/jumbo v0, "63510"
+    const-string/jumbo v0, "63511"
+    const-string/jumbo v0, "63512"
+    const-string/jumbo v0, "63513"
+    const-string/jumbo v0, "63514"
+    const-string/jumbo v0, "63515"
+    const-string/jumbo v0, "63516"
+    const-string/jumbo v0, "63517"
+    const-string/jumbo v0, "63518"
+    const-string/jumbo v0, "63519"
+    const-string/jumbo v0, "63520"
+    const-string/jumbo v0, "63521"
+    const-string/jumbo v0, "63522"
+    const-string/jumbo v0, "63523"
+    const-string/jumbo v0, "63524"
+    const-string/jumbo v0, "63525"
+    const-string/jumbo v0, "63526"
+    const-string/jumbo v0, "63527"
+    const-string/jumbo v0, "63528"
+    const-string/jumbo v0, "63529"
+    const-string/jumbo v0, "63530"
+    const-string/jumbo v0, "63531"
+    const-string/jumbo v0, "63532"
+    const-string/jumbo v0, "63533"
+    const-string/jumbo v0, "63534"
+    const-string/jumbo v0, "63535"
+    const-string/jumbo v0, "63536"
+    const-string/jumbo v0, "63537"
+    const-string/jumbo v0, "63538"
+    const-string/jumbo v0, "63539"
+    const-string/jumbo v0, "63540"
+    const-string/jumbo v0, "63541"
+    const-string/jumbo v0, "63542"
+    const-string/jumbo v0, "63543"
+    const-string/jumbo v0, "63544"
+    const-string/jumbo v0, "63545"
+    const-string/jumbo v0, "63546"
+    const-string/jumbo v0, "63547"
+    const-string/jumbo v0, "63548"
+    const-string/jumbo v0, "63549"
+    const-string/jumbo v0, "63550"
+    const-string/jumbo v0, "63551"
+    const-string/jumbo v0, "63552"
+    const-string/jumbo v0, "63553"
+    const-string/jumbo v0, "63554"
+    const-string/jumbo v0, "63555"
+    const-string/jumbo v0, "63556"
+    const-string/jumbo v0, "63557"
+    const-string/jumbo v0, "63558"
+    const-string/jumbo v0, "63559"
+    const-string/jumbo v0, "63560"
+    const-string/jumbo v0, "63561"
+    const-string/jumbo v0, "63562"
+    const-string/jumbo v0, "63563"
+    const-string/jumbo v0, "63564"
+    const-string/jumbo v0, "63565"
+    const-string/jumbo v0, "63566"
+    const-string/jumbo v0, "63567"
+    const-string/jumbo v0, "63568"
+    const-string/jumbo v0, "63569"
+    const-string/jumbo v0, "63570"
+    const-string/jumbo v0, "63571"
+    const-string/jumbo v0, "63572"
+    const-string/jumbo v0, "63573"
+    const-string/jumbo v0, "63574"
+    const-string/jumbo v0, "63575"
+    const-string/jumbo v0, "63576"
+    const-string/jumbo v0, "63577"
+    const-string/jumbo v0, "63578"
+    const-string/jumbo v0, "63579"
+    const-string/jumbo v0, "63580"
+    const-string/jumbo v0, "63581"
+    const-string/jumbo v0, "63582"
+    const-string/jumbo v0, "63583"
+    const-string/jumbo v0, "63584"
+    const-string/jumbo v0, "63585"
+    const-string/jumbo v0, "63586"
+    const-string/jumbo v0, "63587"
+    const-string/jumbo v0, "63588"
+    const-string/jumbo v0, "63589"
+    const-string/jumbo v0, "63590"
+    const-string/jumbo v0, "63591"
+    const-string/jumbo v0, "63592"
+    const-string/jumbo v0, "63593"
+    const-string/jumbo v0, "63594"
+    const-string/jumbo v0, "63595"
+    const-string/jumbo v0, "63596"
+    const-string/jumbo v0, "63597"
+    const-string/jumbo v0, "63598"
+    const-string/jumbo v0, "63599"
+    const-string/jumbo v0, "63600"
+    const-string/jumbo v0, "63601"
+    const-string/jumbo v0, "63602"
+    const-string/jumbo v0, "63603"
+    const-string/jumbo v0, "63604"
+    const-string/jumbo v0, "63605"
+    const-string/jumbo v0, "63606"
+    const-string/jumbo v0, "63607"
+    const-string/jumbo v0, "63608"
+    const-string/jumbo v0, "63609"
+    const-string/jumbo v0, "63610"
+    const-string/jumbo v0, "63611"
+    const-string/jumbo v0, "63612"
+    const-string/jumbo v0, "63613"
+    const-string/jumbo v0, "63614"
+    const-string/jumbo v0, "63615"
+    const-string/jumbo v0, "63616"
+    const-string/jumbo v0, "63617"
+    const-string/jumbo v0, "63618"
+    const-string/jumbo v0, "63619"
+    const-string/jumbo v0, "63620"
+    const-string/jumbo v0, "63621"
+    const-string/jumbo v0, "63622"
+    const-string/jumbo v0, "63623"
+    const-string/jumbo v0, "63624"
+    const-string/jumbo v0, "63625"
+    const-string/jumbo v0, "63626"
+    const-string/jumbo v0, "63627"
+    const-string/jumbo v0, "63628"
+    const-string/jumbo v0, "63629"
+    const-string/jumbo v0, "63630"
+    const-string/jumbo v0, "63631"
+    const-string/jumbo v0, "63632"
+    const-string/jumbo v0, "63633"
+    const-string/jumbo v0, "63634"
+    const-string/jumbo v0, "63635"
+    const-string/jumbo v0, "63636"
+    const-string/jumbo v0, "63637"
+    const-string/jumbo v0, "63638"
+    const-string/jumbo v0, "63639"
+    const-string/jumbo v0, "63640"
+    const-string/jumbo v0, "63641"
+    const-string/jumbo v0, "63642"
+    const-string/jumbo v0, "63643"
+    const-string/jumbo v0, "63644"
+    const-string/jumbo v0, "63645"
+    const-string/jumbo v0, "63646"
+    const-string/jumbo v0, "63647"
+    const-string/jumbo v0, "63648"
+    const-string/jumbo v0, "63649"
+    const-string/jumbo v0, "63650"
+    const-string/jumbo v0, "63651"
+    const-string/jumbo v0, "63652"
+    const-string/jumbo v0, "63653"
+    const-string/jumbo v0, "63654"
+    const-string/jumbo v0, "63655"
+    const-string/jumbo v0, "63656"
+    const-string/jumbo v0, "63657"
+    const-string/jumbo v0, "63658"
+    const-string/jumbo v0, "63659"
+    const-string/jumbo v0, "63660"
+    const-string/jumbo v0, "63661"
+    const-string/jumbo v0, "63662"
+    const-string/jumbo v0, "63663"
+    const-string/jumbo v0, "63664"
+    const-string/jumbo v0, "63665"
+    const-string/jumbo v0, "63666"
+    const-string/jumbo v0, "63667"
+    const-string/jumbo v0, "63668"
+    const-string/jumbo v0, "63669"
+    const-string/jumbo v0, "63670"
+    const-string/jumbo v0, "63671"
+    const-string/jumbo v0, "63672"
+    const-string/jumbo v0, "63673"
+    const-string/jumbo v0, "63674"
+    const-string/jumbo v0, "63675"
+    const-string/jumbo v0, "63676"
+    const-string/jumbo v0, "63677"
+    const-string/jumbo v0, "63678"
+    const-string/jumbo v0, "63679"
+    const-string/jumbo v0, "63680"
+    const-string/jumbo v0, "63681"
+    const-string/jumbo v0, "63682"
+    const-string/jumbo v0, "63683"
+    const-string/jumbo v0, "63684"
+    const-string/jumbo v0, "63685"
+    const-string/jumbo v0, "63686"
+    const-string/jumbo v0, "63687"
+    const-string/jumbo v0, "63688"
+    const-string/jumbo v0, "63689"
+    const-string/jumbo v0, "63690"
+    const-string/jumbo v0, "63691"
+    const-string/jumbo v0, "63692"
+    const-string/jumbo v0, "63693"
+    const-string/jumbo v0, "63694"
+    const-string/jumbo v0, "63695"
+    const-string/jumbo v0, "63696"
+    const-string/jumbo v0, "63697"
+    const-string/jumbo v0, "63698"
+    const-string/jumbo v0, "63699"
+    const-string/jumbo v0, "63700"
+    const-string/jumbo v0, "63701"
+    const-string/jumbo v0, "63702"
+    const-string/jumbo v0, "63703"
+    const-string/jumbo v0, "63704"
+    const-string/jumbo v0, "63705"
+    const-string/jumbo v0, "63706"
+    const-string/jumbo v0, "63707"
+    const-string/jumbo v0, "63708"
+    const-string/jumbo v0, "63709"
+    const-string/jumbo v0, "63710"
+    const-string/jumbo v0, "63711"
+    const-string/jumbo v0, "63712"
+    const-string/jumbo v0, "63713"
+    const-string/jumbo v0, "63714"
+    const-string/jumbo v0, "63715"
+    const-string/jumbo v0, "63716"
+    const-string/jumbo v0, "63717"
+    const-string/jumbo v0, "63718"
+    const-string/jumbo v0, "63719"
+    const-string/jumbo v0, "63720"
+    const-string/jumbo v0, "63721"
+    const-string/jumbo v0, "63722"
+    const-string/jumbo v0, "63723"
+    const-string/jumbo v0, "63724"
+    const-string/jumbo v0, "63725"
+    const-string/jumbo v0, "63726"
+    const-string/jumbo v0, "63727"
+    const-string/jumbo v0, "63728"
+    const-string/jumbo v0, "63729"
+    const-string/jumbo v0, "63730"
+    const-string/jumbo v0, "63731"
+    const-string/jumbo v0, "63732"
+    const-string/jumbo v0, "63733"
+    const-string/jumbo v0, "63734"
+    const-string/jumbo v0, "63735"
+    const-string/jumbo v0, "63736"
+    const-string/jumbo v0, "63737"
+    const-string/jumbo v0, "63738"
+    const-string/jumbo v0, "63739"
+    const-string/jumbo v0, "63740"
+    const-string/jumbo v0, "63741"
+    const-string/jumbo v0, "63742"
+    const-string/jumbo v0, "63743"
+    const-string/jumbo v0, "63744"
+    const-string/jumbo v0, "63745"
+    const-string/jumbo v0, "63746"
+    const-string/jumbo v0, "63747"
+    const-string/jumbo v0, "63748"
+    const-string/jumbo v0, "63749"
+    const-string/jumbo v0, "63750"
+    const-string/jumbo v0, "63751"
+    const-string/jumbo v0, "63752"
+    const-string/jumbo v0, "63753"
+    const-string/jumbo v0, "63754"
+    const-string/jumbo v0, "63755"
+    const-string/jumbo v0, "63756"
+    const-string/jumbo v0, "63757"
+    const-string/jumbo v0, "63758"
+    const-string/jumbo v0, "63759"
+    const-string/jumbo v0, "63760"
+    const-string/jumbo v0, "63761"
+    const-string/jumbo v0, "63762"
+    const-string/jumbo v0, "63763"
+    const-string/jumbo v0, "63764"
+    const-string/jumbo v0, "63765"
+    const-string/jumbo v0, "63766"
+    const-string/jumbo v0, "63767"
+    const-string/jumbo v0, "63768"
+    const-string/jumbo v0, "63769"
+    const-string/jumbo v0, "63770"
+    const-string/jumbo v0, "63771"
+    const-string/jumbo v0, "63772"
+    const-string/jumbo v0, "63773"
+    const-string/jumbo v0, "63774"
+    const-string/jumbo v0, "63775"
+    const-string/jumbo v0, "63776"
+    const-string/jumbo v0, "63777"
+    const-string/jumbo v0, "63778"
+    const-string/jumbo v0, "63779"
+    const-string/jumbo v0, "63780"
+    const-string/jumbo v0, "63781"
+    const-string/jumbo v0, "63782"
+    const-string/jumbo v0, "63783"
+    const-string/jumbo v0, "63784"
+    const-string/jumbo v0, "63785"
+    const-string/jumbo v0, "63786"
+    const-string/jumbo v0, "63787"
+    const-string/jumbo v0, "63788"
+    const-string/jumbo v0, "63789"
+    const-string/jumbo v0, "63790"
+    const-string/jumbo v0, "63791"
+    const-string/jumbo v0, "63792"
+    const-string/jumbo v0, "63793"
+    const-string/jumbo v0, "63794"
+    const-string/jumbo v0, "63795"
+    const-string/jumbo v0, "63796"
+    const-string/jumbo v0, "63797"
+    const-string/jumbo v0, "63798"
+    const-string/jumbo v0, "63799"
+    const-string/jumbo v0, "63800"
+    const-string/jumbo v0, "63801"
+    const-string/jumbo v0, "63802"
+    const-string/jumbo v0, "63803"
+    const-string/jumbo v0, "63804"
+    const-string/jumbo v0, "63805"
+    const-string/jumbo v0, "63806"
+    const-string/jumbo v0, "63807"
+    const-string/jumbo v0, "63808"
+    const-string/jumbo v0, "63809"
+    const-string/jumbo v0, "63810"
+    const-string/jumbo v0, "63811"
+    const-string/jumbo v0, "63812"
+    const-string/jumbo v0, "63813"
+    const-string/jumbo v0, "63814"
+    const-string/jumbo v0, "63815"
+    const-string/jumbo v0, "63816"
+    const-string/jumbo v0, "63817"
+    const-string/jumbo v0, "63818"
+    const-string/jumbo v0, "63819"
+    const-string/jumbo v0, "63820"
+    const-string/jumbo v0, "63821"
+    const-string/jumbo v0, "63822"
+    const-string/jumbo v0, "63823"
+    const-string/jumbo v0, "63824"
+    const-string/jumbo v0, "63825"
+    const-string/jumbo v0, "63826"
+    const-string/jumbo v0, "63827"
+    const-string/jumbo v0, "63828"
+    const-string/jumbo v0, "63829"
+    const-string/jumbo v0, "63830"
+    const-string/jumbo v0, "63831"
+    const-string/jumbo v0, "63832"
+    const-string/jumbo v0, "63833"
+    const-string/jumbo v0, "63834"
+    const-string/jumbo v0, "63835"
+    const-string/jumbo v0, "63836"
+    const-string/jumbo v0, "63837"
+    const-string/jumbo v0, "63838"
+    const-string/jumbo v0, "63839"
+    const-string/jumbo v0, "63840"
+    const-string/jumbo v0, "63841"
+    const-string/jumbo v0, "63842"
+    const-string/jumbo v0, "63843"
+    const-string/jumbo v0, "63844"
+    const-string/jumbo v0, "63845"
+    const-string/jumbo v0, "63846"
+    const-string/jumbo v0, "63847"
+    const-string/jumbo v0, "63848"
+    const-string/jumbo v0, "63849"
+    const-string/jumbo v0, "63850"
+    const-string/jumbo v0, "63851"
+    const-string/jumbo v0, "63852"
+    const-string/jumbo v0, "63853"
+    const-string/jumbo v0, "63854"
+    const-string/jumbo v0, "63855"
+    const-string/jumbo v0, "63856"
+    const-string/jumbo v0, "63857"
+    const-string/jumbo v0, "63858"
+    const-string/jumbo v0, "63859"
+    const-string/jumbo v0, "63860"
+    const-string/jumbo v0, "63861"
+    const-string/jumbo v0, "63862"
+    const-string/jumbo v0, "63863"
+    const-string/jumbo v0, "63864"
+    const-string/jumbo v0, "63865"
+    const-string/jumbo v0, "63866"
+    const-string/jumbo v0, "63867"
+    const-string/jumbo v0, "63868"
+    const-string/jumbo v0, "63869"
+    const-string/jumbo v0, "63870"
+    const-string/jumbo v0, "63871"
+    const-string/jumbo v0, "63872"
+    const-string/jumbo v0, "63873"
+    const-string/jumbo v0, "63874"
+    const-string/jumbo v0, "63875"
+    const-string/jumbo v0, "63876"
+    const-string/jumbo v0, "63877"
+    const-string/jumbo v0, "63878"
+    const-string/jumbo v0, "63879"
+    const-string/jumbo v0, "63880"
+    const-string/jumbo v0, "63881"
+    const-string/jumbo v0, "63882"
+    const-string/jumbo v0, "63883"
+    const-string/jumbo v0, "63884"
+    const-string/jumbo v0, "63885"
+    const-string/jumbo v0, "63886"
+    const-string/jumbo v0, "63887"
+    const-string/jumbo v0, "63888"
+    const-string/jumbo v0, "63889"
+    const-string/jumbo v0, "63890"
+    const-string/jumbo v0, "63891"
+    const-string/jumbo v0, "63892"
+    const-string/jumbo v0, "63893"
+    const-string/jumbo v0, "63894"
+    const-string/jumbo v0, "63895"
+    const-string/jumbo v0, "63896"
+    const-string/jumbo v0, "63897"
+    const-string/jumbo v0, "63898"
+    const-string/jumbo v0, "63899"
+    const-string/jumbo v0, "63900"
+    const-string/jumbo v0, "63901"
+    const-string/jumbo v0, "63902"
+    const-string/jumbo v0, "63903"
+    const-string/jumbo v0, "63904"
+    const-string/jumbo v0, "63905"
+    const-string/jumbo v0, "63906"
+    const-string/jumbo v0, "63907"
+    const-string/jumbo v0, "63908"
+    const-string/jumbo v0, "63909"
+    const-string/jumbo v0, "63910"
+    const-string/jumbo v0, "63911"
+    const-string/jumbo v0, "63912"
+    const-string/jumbo v0, "63913"
+    const-string/jumbo v0, "63914"
+    const-string/jumbo v0, "63915"
+    const-string/jumbo v0, "63916"
+    const-string/jumbo v0, "63917"
+    const-string/jumbo v0, "63918"
+    const-string/jumbo v0, "63919"
+    const-string/jumbo v0, "63920"
+    const-string/jumbo v0, "63921"
+    const-string/jumbo v0, "63922"
+    const-string/jumbo v0, "63923"
+    const-string/jumbo v0, "63924"
+    const-string/jumbo v0, "63925"
+    const-string/jumbo v0, "63926"
+    const-string/jumbo v0, "63927"
+    const-string/jumbo v0, "63928"
+    const-string/jumbo v0, "63929"
+    const-string/jumbo v0, "63930"
+    const-string/jumbo v0, "63931"
+    const-string/jumbo v0, "63932"
+    const-string/jumbo v0, "63933"
+    const-string/jumbo v0, "63934"
+    const-string/jumbo v0, "63935"
+    const-string/jumbo v0, "63936"
+    const-string/jumbo v0, "63937"
+    const-string/jumbo v0, "63938"
+    const-string/jumbo v0, "63939"
+    const-string/jumbo v0, "63940"
+    const-string/jumbo v0, "63941"
+    const-string/jumbo v0, "63942"
+    const-string/jumbo v0, "63943"
+    const-string/jumbo v0, "63944"
+    const-string/jumbo v0, "63945"
+    const-string/jumbo v0, "63946"
+    const-string/jumbo v0, "63947"
+    const-string/jumbo v0, "63948"
+    const-string/jumbo v0, "63949"
+    const-string/jumbo v0, "63950"
+    const-string/jumbo v0, "63951"
+    const-string/jumbo v0, "63952"
+    const-string/jumbo v0, "63953"
+    const-string/jumbo v0, "63954"
+    const-string/jumbo v0, "63955"
+    const-string/jumbo v0, "63956"
+    const-string/jumbo v0, "63957"
+    const-string/jumbo v0, "63958"
+    const-string/jumbo v0, "63959"
+    const-string/jumbo v0, "63960"
+    const-string/jumbo v0, "63961"
+    const-string/jumbo v0, "63962"
+    const-string/jumbo v0, "63963"
+    const-string/jumbo v0, "63964"
+    const-string/jumbo v0, "63965"
+    const-string/jumbo v0, "63966"
+    const-string/jumbo v0, "63967"
+    const-string/jumbo v0, "63968"
+    const-string/jumbo v0, "63969"
+    const-string/jumbo v0, "63970"
+    const-string/jumbo v0, "63971"
+    const-string/jumbo v0, "63972"
+    const-string/jumbo v0, "63973"
+    const-string/jumbo v0, "63974"
+    const-string/jumbo v0, "63975"
+    const-string/jumbo v0, "63976"
+    const-string/jumbo v0, "63977"
+    const-string/jumbo v0, "63978"
+    const-string/jumbo v0, "63979"
+    const-string/jumbo v0, "63980"
+    const-string/jumbo v0, "63981"
+    const-string/jumbo v0, "63982"
+    const-string/jumbo v0, "63983"
+    const-string/jumbo v0, "63984"
+    const-string/jumbo v0, "63985"
+    const-string/jumbo v0, "63986"
+    const-string/jumbo v0, "63987"
+    const-string/jumbo v0, "63988"
+    const-string/jumbo v0, "63989"
+    const-string/jumbo v0, "63990"
+    const-string/jumbo v0, "63991"
+    const-string/jumbo v0, "63992"
+    const-string/jumbo v0, "63993"
+    const-string/jumbo v0, "63994"
+    const-string/jumbo v0, "63995"
+    const-string/jumbo v0, "63996"
+    const-string/jumbo v0, "63997"
+    const-string/jumbo v0, "63998"
+    const-string/jumbo v0, "63999"
+    const-string/jumbo v0, "64000"
+    const-string/jumbo v0, "64001"
+    const-string/jumbo v0, "64002"
+    const-string/jumbo v0, "64003"
+    const-string/jumbo v0, "64004"
+    const-string/jumbo v0, "64005"
+    const-string/jumbo v0, "64006"
+    const-string/jumbo v0, "64007"
+    const-string/jumbo v0, "64008"
+    const-string/jumbo v0, "64009"
+    const-string/jumbo v0, "64010"
+    const-string/jumbo v0, "64011"
+    const-string/jumbo v0, "64012"
+    const-string/jumbo v0, "64013"
+    const-string/jumbo v0, "64014"
+    const-string/jumbo v0, "64015"
+    const-string/jumbo v0, "64016"
+    const-string/jumbo v0, "64017"
+    const-string/jumbo v0, "64018"
+    const-string/jumbo v0, "64019"
+    const-string/jumbo v0, "64020"
+    const-string/jumbo v0, "64021"
+    const-string/jumbo v0, "64022"
+    const-string/jumbo v0, "64023"
+    const-string/jumbo v0, "64024"
+    const-string/jumbo v0, "64025"
+    const-string/jumbo v0, "64026"
+    const-string/jumbo v0, "64027"
+    const-string/jumbo v0, "64028"
+    const-string/jumbo v0, "64029"
+    const-string/jumbo v0, "64030"
+    const-string/jumbo v0, "64031"
+    const-string/jumbo v0, "64032"
+    const-string/jumbo v0, "64033"
+    const-string/jumbo v0, "64034"
+    const-string/jumbo v0, "64035"
+    const-string/jumbo v0, "64036"
+    const-string/jumbo v0, "64037"
+    const-string/jumbo v0, "64038"
+    const-string/jumbo v0, "64039"
+    const-string/jumbo v0, "64040"
+    const-string/jumbo v0, "64041"
+    const-string/jumbo v0, "64042"
+    const-string/jumbo v0, "64043"
+    const-string/jumbo v0, "64044"
+    const-string/jumbo v0, "64045"
+    const-string/jumbo v0, "64046"
+    const-string/jumbo v0, "64047"
+    const-string/jumbo v0, "64048"
+    const-string/jumbo v0, "64049"
+    const-string/jumbo v0, "64050"
+    const-string/jumbo v0, "64051"
+    const-string/jumbo v0, "64052"
+    const-string/jumbo v0, "64053"
+    const-string/jumbo v0, "64054"
+    const-string/jumbo v0, "64055"
+    const-string/jumbo v0, "64056"
+    const-string/jumbo v0, "64057"
+    const-string/jumbo v0, "64058"
+    const-string/jumbo v0, "64059"
+    const-string/jumbo v0, "64060"
+    const-string/jumbo v0, "64061"
+    const-string/jumbo v0, "64062"
+    const-string/jumbo v0, "64063"
+    const-string/jumbo v0, "64064"
+    const-string/jumbo v0, "64065"
+    const-string/jumbo v0, "64066"
+    const-string/jumbo v0, "64067"
+    const-string/jumbo v0, "64068"
+    const-string/jumbo v0, "64069"
+    const-string/jumbo v0, "64070"
+    const-string/jumbo v0, "64071"
+    const-string/jumbo v0, "64072"
+    const-string/jumbo v0, "64073"
+    const-string/jumbo v0, "64074"
+    const-string/jumbo v0, "64075"
+    const-string/jumbo v0, "64076"
+    const-string/jumbo v0, "64077"
+    const-string/jumbo v0, "64078"
+    const-string/jumbo v0, "64079"
+    const-string/jumbo v0, "64080"
+    const-string/jumbo v0, "64081"
+    const-string/jumbo v0, "64082"
+    const-string/jumbo v0, "64083"
+    const-string/jumbo v0, "64084"
+    const-string/jumbo v0, "64085"
+    const-string/jumbo v0, "64086"
+    const-string/jumbo v0, "64087"
+    const-string/jumbo v0, "64088"
+    const-string/jumbo v0, "64089"
+    const-string/jumbo v0, "64090"
+    const-string/jumbo v0, "64091"
+    const-string/jumbo v0, "64092"
+    const-string/jumbo v0, "64093"
+    const-string/jumbo v0, "64094"
+    const-string/jumbo v0, "64095"
+    const-string/jumbo v0, "64096"
+    const-string/jumbo v0, "64097"
+    const-string/jumbo v0, "64098"
+    const-string/jumbo v0, "64099"
+    const-string/jumbo v0, "64100"
+    const-string/jumbo v0, "64101"
+    const-string/jumbo v0, "64102"
+    const-string/jumbo v0, "64103"
+    const-string/jumbo v0, "64104"
+    const-string/jumbo v0, "64105"
+    const-string/jumbo v0, "64106"
+    const-string/jumbo v0, "64107"
+    const-string/jumbo v0, "64108"
+    const-string/jumbo v0, "64109"
+    const-string/jumbo v0, "64110"
+    const-string/jumbo v0, "64111"
+    const-string/jumbo v0, "64112"
+    const-string/jumbo v0, "64113"
+    const-string/jumbo v0, "64114"
+    const-string/jumbo v0, "64115"
+    const-string/jumbo v0, "64116"
+    const-string/jumbo v0, "64117"
+    const-string/jumbo v0, "64118"
+    const-string/jumbo v0, "64119"
+    const-string/jumbo v0, "64120"
+    const-string/jumbo v0, "64121"
+    const-string/jumbo v0, "64122"
+    const-string/jumbo v0, "64123"
+    const-string/jumbo v0, "64124"
+    const-string/jumbo v0, "64125"
+    const-string/jumbo v0, "64126"
+    const-string/jumbo v0, "64127"
+    const-string/jumbo v0, "64128"
+    const-string/jumbo v0, "64129"
+    const-string/jumbo v0, "64130"
+    const-string/jumbo v0, "64131"
+    const-string/jumbo v0, "64132"
+    const-string/jumbo v0, "64133"
+    const-string/jumbo v0, "64134"
+    const-string/jumbo v0, "64135"
+    const-string/jumbo v0, "64136"
+    const-string/jumbo v0, "64137"
+    const-string/jumbo v0, "64138"
+    const-string/jumbo v0, "64139"
+    const-string/jumbo v0, "64140"
+    const-string/jumbo v0, "64141"
+    const-string/jumbo v0, "64142"
+    const-string/jumbo v0, "64143"
+    const-string/jumbo v0, "64144"
+    const-string/jumbo v0, "64145"
+    const-string/jumbo v0, "64146"
+    const-string/jumbo v0, "64147"
+    const-string/jumbo v0, "64148"
+    const-string/jumbo v0, "64149"
+    const-string/jumbo v0, "64150"
+    const-string/jumbo v0, "64151"
+    const-string/jumbo v0, "64152"
+    const-string/jumbo v0, "64153"
+    const-string/jumbo v0, "64154"
+    const-string/jumbo v0, "64155"
+    const-string/jumbo v0, "64156"
+    const-string/jumbo v0, "64157"
+    const-string/jumbo v0, "64158"
+    const-string/jumbo v0, "64159"
+    const-string/jumbo v0, "64160"
+    const-string/jumbo v0, "64161"
+    const-string/jumbo v0, "64162"
+    const-string/jumbo v0, "64163"
+    const-string/jumbo v0, "64164"
+    const-string/jumbo v0, "64165"
+    const-string/jumbo v0, "64166"
+    const-string/jumbo v0, "64167"
+    const-string/jumbo v0, "64168"
+    const-string/jumbo v0, "64169"
+    const-string/jumbo v0, "64170"
+    const-string/jumbo v0, "64171"
+    const-string/jumbo v0, "64172"
+    const-string/jumbo v0, "64173"
+    const-string/jumbo v0, "64174"
+    const-string/jumbo v0, "64175"
+    const-string/jumbo v0, "64176"
+    const-string/jumbo v0, "64177"
+    const-string/jumbo v0, "64178"
+    const-string/jumbo v0, "64179"
+    const-string/jumbo v0, "64180"
+    const-string/jumbo v0, "64181"
+    const-string/jumbo v0, "64182"
+    const-string/jumbo v0, "64183"
+    const-string/jumbo v0, "64184"
+    const-string/jumbo v0, "64185"
+    const-string/jumbo v0, "64186"
+    const-string/jumbo v0, "64187"
+    const-string/jumbo v0, "64188"
+    const-string/jumbo v0, "64189"
+    const-string/jumbo v0, "64190"
+    const-string/jumbo v0, "64191"
+    const-string/jumbo v0, "64192"
+    const-string/jumbo v0, "64193"
+    const-string/jumbo v0, "64194"
+    const-string/jumbo v0, "64195"
+    const-string/jumbo v0, "64196"
+    const-string/jumbo v0, "64197"
+    const-string/jumbo v0, "64198"
+    const-string/jumbo v0, "64199"
+    const-string/jumbo v0, "64200"
+    const-string/jumbo v0, "64201"
+    const-string/jumbo v0, "64202"
+    const-string/jumbo v0, "64203"
+    const-string/jumbo v0, "64204"
+    const-string/jumbo v0, "64205"
+    const-string/jumbo v0, "64206"
+    const-string/jumbo v0, "64207"
+    const-string/jumbo v0, "64208"
+    const-string/jumbo v0, "64209"
+    const-string/jumbo v0, "64210"
+    const-string/jumbo v0, "64211"
+    const-string/jumbo v0, "64212"
+    const-string/jumbo v0, "64213"
+    const-string/jumbo v0, "64214"
+    const-string/jumbo v0, "64215"
+    const-string/jumbo v0, "64216"
+    const-string/jumbo v0, "64217"
+    const-string/jumbo v0, "64218"
+    const-string/jumbo v0, "64219"
+    const-string/jumbo v0, "64220"
+    const-string/jumbo v0, "64221"
+    const-string/jumbo v0, "64222"
+    const-string/jumbo v0, "64223"
+    const-string/jumbo v0, "64224"
+    const-string/jumbo v0, "64225"
+    const-string/jumbo v0, "64226"
+    const-string/jumbo v0, "64227"
+    const-string/jumbo v0, "64228"
+    const-string/jumbo v0, "64229"
+    const-string/jumbo v0, "64230"
+    const-string/jumbo v0, "64231"
+    const-string/jumbo v0, "64232"
+    const-string/jumbo v0, "64233"
+    const-string/jumbo v0, "64234"
+    const-string/jumbo v0, "64235"
+    const-string/jumbo v0, "64236"
+    const-string/jumbo v0, "64237"
+    const-string/jumbo v0, "64238"
+    const-string/jumbo v0, "64239"
+    const-string/jumbo v0, "64240"
+    const-string/jumbo v0, "64241"
+    const-string/jumbo v0, "64242"
+    const-string/jumbo v0, "64243"
+    const-string/jumbo v0, "64244"
+    const-string/jumbo v0, "64245"
+    const-string/jumbo v0, "64246"
+    const-string/jumbo v0, "64247"
+    const-string/jumbo v0, "64248"
+    const-string/jumbo v0, "64249"
+    const-string/jumbo v0, "64250"
+    const-string/jumbo v0, "64251"
+    const-string/jumbo v0, "64252"
+    const-string/jumbo v0, "64253"
+    const-string/jumbo v0, "64254"
+    const-string/jumbo v0, "64255"
+    const-string/jumbo v0, "64256"
+    const-string/jumbo v0, "64257"
+    const-string/jumbo v0, "64258"
+    const-string/jumbo v0, "64259"
+    const-string/jumbo v0, "64260"
+    const-string/jumbo v0, "64261"
+    const-string/jumbo v0, "64262"
+    const-string/jumbo v0, "64263"
+    const-string/jumbo v0, "64264"
+    const-string/jumbo v0, "64265"
+    const-string/jumbo v0, "64266"
+    const-string/jumbo v0, "64267"
+    const-string/jumbo v0, "64268"
+    const-string/jumbo v0, "64269"
+    const-string/jumbo v0, "64270"
+    const-string/jumbo v0, "64271"
+    const-string/jumbo v0, "64272"
+    const-string/jumbo v0, "64273"
+    const-string/jumbo v0, "64274"
+    const-string/jumbo v0, "64275"
+    const-string/jumbo v0, "64276"
+    const-string/jumbo v0, "64277"
+    const-string/jumbo v0, "64278"
+    const-string/jumbo v0, "64279"
+    const-string/jumbo v0, "64280"
+    const-string/jumbo v0, "64281"
+    const-string/jumbo v0, "64282"
+    const-string/jumbo v0, "64283"
+    const-string/jumbo v0, "64284"
+    const-string/jumbo v0, "64285"
+    const-string/jumbo v0, "64286"
+    const-string/jumbo v0, "64287"
+    const-string/jumbo v0, "64288"
+    const-string/jumbo v0, "64289"
+    const-string/jumbo v0, "64290"
+    const-string/jumbo v0, "64291"
+    const-string/jumbo v0, "64292"
+    const-string/jumbo v0, "64293"
+    const-string/jumbo v0, "64294"
+    const-string/jumbo v0, "64295"
+    const-string/jumbo v0, "64296"
+    const-string/jumbo v0, "64297"
+    const-string/jumbo v0, "64298"
+    const-string/jumbo v0, "64299"
+    const-string/jumbo v0, "64300"
+    const-string/jumbo v0, "64301"
+    const-string/jumbo v0, "64302"
+    const-string/jumbo v0, "64303"
+    const-string/jumbo v0, "64304"
+    const-string/jumbo v0, "64305"
+    const-string/jumbo v0, "64306"
+    const-string/jumbo v0, "64307"
+    const-string/jumbo v0, "64308"
+    const-string/jumbo v0, "64309"
+    const-string/jumbo v0, "64310"
+    const-string/jumbo v0, "64311"
+    const-string/jumbo v0, "64312"
+    const-string/jumbo v0, "64313"
+    const-string/jumbo v0, "64314"
+    const-string/jumbo v0, "64315"
+    const-string/jumbo v0, "64316"
+    const-string/jumbo v0, "64317"
+    const-string/jumbo v0, "64318"
+    const-string/jumbo v0, "64319"
+    const-string/jumbo v0, "64320"
+    const-string/jumbo v0, "64321"
+    const-string/jumbo v0, "64322"
+    const-string/jumbo v0, "64323"
+    const-string/jumbo v0, "64324"
+    const-string/jumbo v0, "64325"
+    const-string/jumbo v0, "64326"
+    const-string/jumbo v0, "64327"
+    const-string/jumbo v0, "64328"
+    const-string/jumbo v0, "64329"
+    const-string/jumbo v0, "64330"
+    const-string/jumbo v0, "64331"
+    const-string/jumbo v0, "64332"
+    const-string/jumbo v0, "64333"
+    const-string/jumbo v0, "64334"
+    const-string/jumbo v0, "64335"
+    const-string/jumbo v0, "64336"
+    const-string/jumbo v0, "64337"
+    const-string/jumbo v0, "64338"
+    const-string/jumbo v0, "64339"
+    const-string/jumbo v0, "64340"
+    const-string/jumbo v0, "64341"
+    const-string/jumbo v0, "64342"
+    const-string/jumbo v0, "64343"
+    const-string/jumbo v0, "64344"
+    const-string/jumbo v0, "64345"
+    const-string/jumbo v0, "64346"
+    const-string/jumbo v0, "64347"
+    const-string/jumbo v0, "64348"
+    const-string/jumbo v0, "64349"
+    const-string/jumbo v0, "64350"
+    const-string/jumbo v0, "64351"
+    const-string/jumbo v0, "64352"
+    const-string/jumbo v0, "64353"
+    const-string/jumbo v0, "64354"
+    const-string/jumbo v0, "64355"
+    const-string/jumbo v0, "64356"
+    const-string/jumbo v0, "64357"
+    const-string/jumbo v0, "64358"
+    const-string/jumbo v0, "64359"
+    const-string/jumbo v0, "64360"
+    const-string/jumbo v0, "64361"
+    const-string/jumbo v0, "64362"
+    const-string/jumbo v0, "64363"
+    const-string/jumbo v0, "64364"
+    const-string/jumbo v0, "64365"
+    const-string/jumbo v0, "64366"
+    const-string/jumbo v0, "64367"
+    const-string/jumbo v0, "64368"
+    const-string/jumbo v0, "64369"
+    const-string/jumbo v0, "64370"
+    const-string/jumbo v0, "64371"
+    const-string/jumbo v0, "64372"
+    const-string/jumbo v0, "64373"
+    const-string/jumbo v0, "64374"
+    const-string/jumbo v0, "64375"
+    const-string/jumbo v0, "64376"
+    const-string/jumbo v0, "64377"
+    const-string/jumbo v0, "64378"
+    const-string/jumbo v0, "64379"
+    const-string/jumbo v0, "64380"
+    const-string/jumbo v0, "64381"
+    const-string/jumbo v0, "64382"
+    const-string/jumbo v0, "64383"
+    const-string/jumbo v0, "64384"
+    const-string/jumbo v0, "64385"
+    const-string/jumbo v0, "64386"
+    const-string/jumbo v0, "64387"
+    const-string/jumbo v0, "64388"
+    const-string/jumbo v0, "64389"
+    const-string/jumbo v0, "64390"
+    const-string/jumbo v0, "64391"
+    const-string/jumbo v0, "64392"
+    const-string/jumbo v0, "64393"
+    const-string/jumbo v0, "64394"
+    const-string/jumbo v0, "64395"
+    const-string/jumbo v0, "64396"
+    const-string/jumbo v0, "64397"
+    const-string/jumbo v0, "64398"
+    const-string/jumbo v0, "64399"
+    const-string/jumbo v0, "64400"
+    const-string/jumbo v0, "64401"
+    const-string/jumbo v0, "64402"
+    const-string/jumbo v0, "64403"
+    const-string/jumbo v0, "64404"
+    const-string/jumbo v0, "64405"
+    const-string/jumbo v0, "64406"
+    const-string/jumbo v0, "64407"
+    const-string/jumbo v0, "64408"
+    const-string/jumbo v0, "64409"
+    const-string/jumbo v0, "64410"
+    const-string/jumbo v0, "64411"
+    const-string/jumbo v0, "64412"
+    const-string/jumbo v0, "64413"
+    const-string/jumbo v0, "64414"
+    const-string/jumbo v0, "64415"
+    const-string/jumbo v0, "64416"
+    const-string/jumbo v0, "64417"
+    const-string/jumbo v0, "64418"
+    const-string/jumbo v0, "64419"
+    const-string/jumbo v0, "64420"
+    const-string/jumbo v0, "64421"
+    const-string/jumbo v0, "64422"
+    const-string/jumbo v0, "64423"
+    const-string/jumbo v0, "64424"
+    const-string/jumbo v0, "64425"
+    const-string/jumbo v0, "64426"
+    const-string/jumbo v0, "64427"
+    const-string/jumbo v0, "64428"
+    const-string/jumbo v0, "64429"
+    const-string/jumbo v0, "64430"
+    const-string/jumbo v0, "64431"
+    const-string/jumbo v0, "64432"
+    const-string/jumbo v0, "64433"
+    const-string/jumbo v0, "64434"
+    const-string/jumbo v0, "64435"
+    const-string/jumbo v0, "64436"
+    const-string/jumbo v0, "64437"
+    const-string/jumbo v0, "64438"
+    const-string/jumbo v0, "64439"
+    const-string/jumbo v0, "64440"
+    const-string/jumbo v0, "64441"
+    const-string/jumbo v0, "64442"
+    const-string/jumbo v0, "64443"
+    const-string/jumbo v0, "64444"
+    const-string/jumbo v0, "64445"
+    const-string/jumbo v0, "64446"
+    const-string/jumbo v0, "64447"
+    const-string/jumbo v0, "64448"
+    const-string/jumbo v0, "64449"
+    const-string/jumbo v0, "64450"
+    const-string/jumbo v0, "64451"
+    const-string/jumbo v0, "64452"
+    const-string/jumbo v0, "64453"
+    const-string/jumbo v0, "64454"
+    const-string/jumbo v0, "64455"
+    const-string/jumbo v0, "64456"
+    const-string/jumbo v0, "64457"
+    const-string/jumbo v0, "64458"
+    const-string/jumbo v0, "64459"
+    const-string/jumbo v0, "64460"
+    const-string/jumbo v0, "64461"
+    const-string/jumbo v0, "64462"
+    const-string/jumbo v0, "64463"
+    const-string/jumbo v0, "64464"
+    const-string/jumbo v0, "64465"
+    const-string/jumbo v0, "64466"
+    const-string/jumbo v0, "64467"
+    const-string/jumbo v0, "64468"
+    const-string/jumbo v0, "64469"
+    const-string/jumbo v0, "64470"
+    const-string/jumbo v0, "64471"
+    const-string/jumbo v0, "64472"
+    const-string/jumbo v0, "64473"
+    const-string/jumbo v0, "64474"
+    const-string/jumbo v0, "64475"
+    const-string/jumbo v0, "64476"
+    const-string/jumbo v0, "64477"
+    const-string/jumbo v0, "64478"
+    const-string/jumbo v0, "64479"
+    const-string/jumbo v0, "64480"
+    const-string/jumbo v0, "64481"
+    const-string/jumbo v0, "64482"
+    const-string/jumbo v0, "64483"
+    const-string/jumbo v0, "64484"
+    const-string/jumbo v0, "64485"
+    const-string/jumbo v0, "64486"
+    const-string/jumbo v0, "64487"
+    const-string/jumbo v0, "64488"
+    const-string/jumbo v0, "64489"
+    const-string/jumbo v0, "64490"
+    const-string/jumbo v0, "64491"
+    const-string/jumbo v0, "64492"
+    const-string/jumbo v0, "64493"
+    const-string/jumbo v0, "64494"
+    const-string/jumbo v0, "64495"
+    const-string/jumbo v0, "64496"
+    const-string/jumbo v0, "64497"
+    const-string/jumbo v0, "64498"
+    const-string/jumbo v0, "64499"
+    const-string/jumbo v0, "64500"
+    const-string/jumbo v0, "64501"
+    const-string/jumbo v0, "64502"
+    const-string/jumbo v0, "64503"
+    const-string/jumbo v0, "64504"
+    const-string/jumbo v0, "64505"
+    const-string/jumbo v0, "64506"
+    const-string/jumbo v0, "64507"
+    const-string/jumbo v0, "64508"
+    const-string/jumbo v0, "64509"
+    const-string/jumbo v0, "64510"
+    const-string/jumbo v0, "64511"
+    const-string/jumbo v0, "64512"
+    const-string/jumbo v0, "64513"
+    const-string/jumbo v0, "64514"
+    const-string/jumbo v0, "64515"
+    const-string/jumbo v0, "64516"
+    const-string/jumbo v0, "64517"
+    const-string/jumbo v0, "64518"
+    const-string/jumbo v0, "64519"
+    const-string/jumbo v0, "64520"
+    const-string/jumbo v0, "64521"
+    const-string/jumbo v0, "64522"
+    const-string/jumbo v0, "64523"
+    const-string/jumbo v0, "64524"
+    const-string/jumbo v0, "64525"
+    const-string/jumbo v0, "64526"
+    const-string/jumbo v0, "64527"
+    const-string/jumbo v0, "64528"
+    const-string/jumbo v0, "64529"
+    const-string/jumbo v0, "64530"
+    const-string/jumbo v0, "64531"
+    const-string/jumbo v0, "64532"
+    const-string/jumbo v0, "64533"
+    const-string/jumbo v0, "64534"
+    const-string/jumbo v0, "64535"
+    const-string/jumbo v0, "64536"
+    const-string/jumbo v0, "64537"
+    const-string/jumbo v0, "64538"
+    const-string/jumbo v0, "64539"
+    const-string/jumbo v0, "64540"
+    const-string/jumbo v0, "64541"
+    const-string/jumbo v0, "64542"
+    const-string/jumbo v0, "64543"
+    const-string/jumbo v0, "64544"
+    const-string/jumbo v0, "64545"
+    const-string/jumbo v0, "64546"
+    const-string/jumbo v0, "64547"
+    const-string/jumbo v0, "64548"
+    const-string/jumbo v0, "64549"
+    const-string/jumbo v0, "64550"
+    const-string/jumbo v0, "64551"
+    const-string/jumbo v0, "64552"
+    const-string/jumbo v0, "64553"
+    const-string/jumbo v0, "64554"
+    const-string/jumbo v0, "64555"
+    const-string/jumbo v0, "64556"
+    const-string/jumbo v0, "64557"
+    const-string/jumbo v0, "64558"
+    const-string/jumbo v0, "64559"
+    const-string/jumbo v0, "64560"
+    const-string/jumbo v0, "64561"
+    const-string/jumbo v0, "64562"
+    const-string/jumbo v0, "64563"
+    const-string/jumbo v0, "64564"
+    const-string/jumbo v0, "64565"
+    const-string/jumbo v0, "64566"
+    const-string/jumbo v0, "64567"
+    const-string/jumbo v0, "64568"
+    const-string/jumbo v0, "64569"
+    const-string/jumbo v0, "64570"
+    const-string/jumbo v0, "64571"
+    const-string/jumbo v0, "64572"
+    const-string/jumbo v0, "64573"
+    const-string/jumbo v0, "64574"
+    const-string/jumbo v0, "64575"
+    const-string/jumbo v0, "64576"
+    const-string/jumbo v0, "64577"
+    const-string/jumbo v0, "64578"
+    const-string/jumbo v0, "64579"
+    const-string/jumbo v0, "64580"
+    const-string/jumbo v0, "64581"
+    const-string/jumbo v0, "64582"
+    const-string/jumbo v0, "64583"
+    const-string/jumbo v0, "64584"
+    const-string/jumbo v0, "64585"
+    const-string/jumbo v0, "64586"
+    const-string/jumbo v0, "64587"
+    const-string/jumbo v0, "64588"
+    const-string/jumbo v0, "64589"
+    const-string/jumbo v0, "64590"
+    const-string/jumbo v0, "64591"
+    const-string/jumbo v0, "64592"
+    const-string/jumbo v0, "64593"
+    const-string/jumbo v0, "64594"
+    const-string/jumbo v0, "64595"
+    const-string/jumbo v0, "64596"
+    const-string/jumbo v0, "64597"
+    const-string/jumbo v0, "64598"
+    const-string/jumbo v0, "64599"
+    const-string/jumbo v0, "64600"
+    const-string/jumbo v0, "64601"
+    const-string/jumbo v0, "64602"
+    const-string/jumbo v0, "64603"
+    const-string/jumbo v0, "64604"
+    const-string/jumbo v0, "64605"
+    const-string/jumbo v0, "64606"
+    const-string/jumbo v0, "64607"
+    const-string/jumbo v0, "64608"
+    const-string/jumbo v0, "64609"
+    const-string/jumbo v0, "64610"
+    const-string/jumbo v0, "64611"
+    const-string/jumbo v0, "64612"
+    const-string/jumbo v0, "64613"
+    const-string/jumbo v0, "64614"
+    const-string/jumbo v0, "64615"
+    const-string/jumbo v0, "64616"
+    const-string/jumbo v0, "64617"
+    const-string/jumbo v0, "64618"
+    const-string/jumbo v0, "64619"
+    const-string/jumbo v0, "64620"
+    const-string/jumbo v0, "64621"
+    const-string/jumbo v0, "64622"
+    const-string/jumbo v0, "64623"
+    const-string/jumbo v0, "64624"
+    const-string/jumbo v0, "64625"
+    const-string/jumbo v0, "64626"
+    const-string/jumbo v0, "64627"
+    const-string/jumbo v0, "64628"
+    const-string/jumbo v0, "64629"
+    const-string/jumbo v0, "64630"
+    const-string/jumbo v0, "64631"
+    const-string/jumbo v0, "64632"
+    const-string/jumbo v0, "64633"
+    const-string/jumbo v0, "64634"
+    const-string/jumbo v0, "64635"
+    const-string/jumbo v0, "64636"
+    const-string/jumbo v0, "64637"
+    const-string/jumbo v0, "64638"
+    const-string/jumbo v0, "64639"
+    const-string/jumbo v0, "64640"
+    const-string/jumbo v0, "64641"
+    const-string/jumbo v0, "64642"
+    const-string/jumbo v0, "64643"
+    const-string/jumbo v0, "64644"
+    const-string/jumbo v0, "64645"
+    const-string/jumbo v0, "64646"
+    const-string/jumbo v0, "64647"
+    const-string/jumbo v0, "64648"
+    const-string/jumbo v0, "64649"
+    const-string/jumbo v0, "64650"
+    const-string/jumbo v0, "64651"
+    const-string/jumbo v0, "64652"
+    const-string/jumbo v0, "64653"
+    const-string/jumbo v0, "64654"
+    const-string/jumbo v0, "64655"
+    const-string/jumbo v0, "64656"
+    const-string/jumbo v0, "64657"
+    const-string/jumbo v0, "64658"
+    const-string/jumbo v0, "64659"
+    const-string/jumbo v0, "64660"
+    const-string/jumbo v0, "64661"
+    const-string/jumbo v0, "64662"
+    const-string/jumbo v0, "64663"
+    const-string/jumbo v0, "64664"
+    const-string/jumbo v0, "64665"
+    const-string/jumbo v0, "64666"
+    const-string/jumbo v0, "64667"
+    const-string/jumbo v0, "64668"
+    const-string/jumbo v0, "64669"
+    const-string/jumbo v0, "64670"
+    const-string/jumbo v0, "64671"
+    const-string/jumbo v0, "64672"
+    const-string/jumbo v0, "64673"
+    const-string/jumbo v0, "64674"
+    const-string/jumbo v0, "64675"
+    const-string/jumbo v0, "64676"
+    const-string/jumbo v0, "64677"
+    const-string/jumbo v0, "64678"
+    const-string/jumbo v0, "64679"
+    const-string/jumbo v0, "64680"
+    const-string/jumbo v0, "64681"
+    const-string/jumbo v0, "64682"
+    const-string/jumbo v0, "64683"
+    const-string/jumbo v0, "64684"
+    const-string/jumbo v0, "64685"
+    const-string/jumbo v0, "64686"
+    const-string/jumbo v0, "64687"
+    const-string/jumbo v0, "64688"
+    const-string/jumbo v0, "64689"
+    const-string/jumbo v0, "64690"
+    const-string/jumbo v0, "64691"
+    const-string/jumbo v0, "64692"
+    const-string/jumbo v0, "64693"
+    const-string/jumbo v0, "64694"
+    const-string/jumbo v0, "64695"
+    const-string/jumbo v0, "64696"
+    const-string/jumbo v0, "64697"
+    const-string/jumbo v0, "64698"
+    const-string/jumbo v0, "64699"
+    const-string/jumbo v0, "64700"
+    const-string/jumbo v0, "64701"
+    const-string/jumbo v0, "64702"
+    const-string/jumbo v0, "64703"
+    const-string/jumbo v0, "64704"
+    const-string/jumbo v0, "64705"
+    const-string/jumbo v0, "64706"
+    const-string/jumbo v0, "64707"
+    const-string/jumbo v0, "64708"
+    const-string/jumbo v0, "64709"
+    const-string/jumbo v0, "64710"
+    const-string/jumbo v0, "64711"
+    const-string/jumbo v0, "64712"
+    const-string/jumbo v0, "64713"
+    const-string/jumbo v0, "64714"
+    const-string/jumbo v0, "64715"
+    const-string/jumbo v0, "64716"
+    const-string/jumbo v0, "64717"
+    const-string/jumbo v0, "64718"
+    const-string/jumbo v0, "64719"
+    const-string/jumbo v0, "64720"
+    const-string/jumbo v0, "64721"
+    const-string/jumbo v0, "64722"
+    const-string/jumbo v0, "64723"
+    const-string/jumbo v0, "64724"
+    const-string/jumbo v0, "64725"
+    const-string/jumbo v0, "64726"
+    const-string/jumbo v0, "64727"
+    const-string/jumbo v0, "64728"
+    const-string/jumbo v0, "64729"
+    const-string/jumbo v0, "64730"
+    const-string/jumbo v0, "64731"
+    const-string/jumbo v0, "64732"
+    const-string/jumbo v0, "64733"
+    const-string/jumbo v0, "64734"
+    const-string/jumbo v0, "64735"
+    const-string/jumbo v0, "64736"
+    const-string/jumbo v0, "64737"
+    const-string/jumbo v0, "64738"
+    const-string/jumbo v0, "64739"
+    const-string/jumbo v0, "64740"
+    const-string/jumbo v0, "64741"
+    const-string/jumbo v0, "64742"
+    const-string/jumbo v0, "64743"
+    const-string/jumbo v0, "64744"
+    const-string/jumbo v0, "64745"
+    const-string/jumbo v0, "64746"
+    const-string/jumbo v0, "64747"
+    const-string/jumbo v0, "64748"
+    const-string/jumbo v0, "64749"
+    const-string/jumbo v0, "64750"
+    const-string/jumbo v0, "64751"
+    const-string/jumbo v0, "64752"
+    const-string/jumbo v0, "64753"
+    const-string/jumbo v0, "64754"
+    const-string/jumbo v0, "64755"
+    const-string/jumbo v0, "64756"
+    const-string/jumbo v0, "64757"
+    const-string/jumbo v0, "64758"
+    const-string/jumbo v0, "64759"
+    const-string/jumbo v0, "64760"
+    const-string/jumbo v0, "64761"
+    const-string/jumbo v0, "64762"
+    const-string/jumbo v0, "64763"
+    const-string/jumbo v0, "64764"
+    const-string/jumbo v0, "64765"
+    const-string/jumbo v0, "64766"
+    const-string/jumbo v0, "64767"
+    const-string/jumbo v0, "64768"
+    const-string/jumbo v0, "64769"
+    const-string/jumbo v0, "64770"
+    const-string/jumbo v0, "64771"
+    const-string/jumbo v0, "64772"
+    const-string/jumbo v0, "64773"
+    const-string/jumbo v0, "64774"
+    const-string/jumbo v0, "64775"
+    const-string/jumbo v0, "64776"
+    const-string/jumbo v0, "64777"
+    const-string/jumbo v0, "64778"
+    const-string/jumbo v0, "64779"
+    const-string/jumbo v0, "64780"
+    const-string/jumbo v0, "64781"
+    const-string/jumbo v0, "64782"
+    const-string/jumbo v0, "64783"
+    const-string/jumbo v0, "64784"
+    const-string/jumbo v0, "64785"
+    const-string/jumbo v0, "64786"
+    const-string/jumbo v0, "64787"
+    const-string/jumbo v0, "64788"
+    const-string/jumbo v0, "64789"
+    const-string/jumbo v0, "64790"
+    const-string/jumbo v0, "64791"
+    const-string/jumbo v0, "64792"
+    const-string/jumbo v0, "64793"
+    const-string/jumbo v0, "64794"
+    const-string/jumbo v0, "64795"
+    const-string/jumbo v0, "64796"
+    const-string/jumbo v0, "64797"
+    const-string/jumbo v0, "64798"
+    const-string/jumbo v0, "64799"
+    const-string/jumbo v0, "64800"
+    const-string/jumbo v0, "64801"
+    const-string/jumbo v0, "64802"
+    const-string/jumbo v0, "64803"
+    const-string/jumbo v0, "64804"
+    const-string/jumbo v0, "64805"
+    const-string/jumbo v0, "64806"
+    const-string/jumbo v0, "64807"
+    const-string/jumbo v0, "64808"
+    const-string/jumbo v0, "64809"
+    const-string/jumbo v0, "64810"
+    const-string/jumbo v0, "64811"
+    const-string/jumbo v0, "64812"
+    const-string/jumbo v0, "64813"
+    const-string/jumbo v0, "64814"
+    const-string/jumbo v0, "64815"
+    const-string/jumbo v0, "64816"
+    const-string/jumbo v0, "64817"
+    const-string/jumbo v0, "64818"
+    const-string/jumbo v0, "64819"
+    const-string/jumbo v0, "64820"
+    const-string/jumbo v0, "64821"
+    const-string/jumbo v0, "64822"
+    const-string/jumbo v0, "64823"
+    const-string/jumbo v0, "64824"
+    const-string/jumbo v0, "64825"
+    const-string/jumbo v0, "64826"
+    const-string/jumbo v0, "64827"
+    const-string/jumbo v0, "64828"
+    const-string/jumbo v0, "64829"
+    const-string/jumbo v0, "64830"
+    const-string/jumbo v0, "64831"
+    const-string/jumbo v0, "64832"
+    const-string/jumbo v0, "64833"
+    const-string/jumbo v0, "64834"
+    const-string/jumbo v0, "64835"
+    const-string/jumbo v0, "64836"
+    const-string/jumbo v0, "64837"
+    const-string/jumbo v0, "64838"
+    const-string/jumbo v0, "64839"
+    const-string/jumbo v0, "64840"
+    const-string/jumbo v0, "64841"
+    const-string/jumbo v0, "64842"
+    const-string/jumbo v0, "64843"
+    const-string/jumbo v0, "64844"
+    const-string/jumbo v0, "64845"
+    const-string/jumbo v0, "64846"
+    const-string/jumbo v0, "64847"
+    const-string/jumbo v0, "64848"
+    const-string/jumbo v0, "64849"
+    const-string/jumbo v0, "64850"
+    const-string/jumbo v0, "64851"
+    const-string/jumbo v0, "64852"
+    const-string/jumbo v0, "64853"
+    const-string/jumbo v0, "64854"
+    const-string/jumbo v0, "64855"
+    const-string/jumbo v0, "64856"
+    const-string/jumbo v0, "64857"
+    const-string/jumbo v0, "64858"
+    const-string/jumbo v0, "64859"
+    const-string/jumbo v0, "64860"
+    const-string/jumbo v0, "64861"
+    const-string/jumbo v0, "64862"
+    const-string/jumbo v0, "64863"
+    const-string/jumbo v0, "64864"
+    const-string/jumbo v0, "64865"
+    const-string/jumbo v0, "64866"
+    const-string/jumbo v0, "64867"
+    const-string/jumbo v0, "64868"
+    const-string/jumbo v0, "64869"
+    const-string/jumbo v0, "64870"
+    const-string/jumbo v0, "64871"
+    const-string/jumbo v0, "64872"
+    const-string/jumbo v0, "64873"
+    const-string/jumbo v0, "64874"
+    const-string/jumbo v0, "64875"
+    const-string/jumbo v0, "64876"
+    const-string/jumbo v0, "64877"
+    const-string/jumbo v0, "64878"
+    const-string/jumbo v0, "64879"
+    const-string/jumbo v0, "64880"
+    const-string/jumbo v0, "64881"
+    const-string/jumbo v0, "64882"
+    const-string/jumbo v0, "64883"
+    const-string/jumbo v0, "64884"
+    const-string/jumbo v0, "64885"
+    const-string/jumbo v0, "64886"
+    const-string/jumbo v0, "64887"
+    const-string/jumbo v0, "64888"
+    const-string/jumbo v0, "64889"
+    const-string/jumbo v0, "64890"
+    const-string/jumbo v0, "64891"
+    const-string/jumbo v0, "64892"
+    const-string/jumbo v0, "64893"
+    const-string/jumbo v0, "64894"
+    const-string/jumbo v0, "64895"
+    const-string/jumbo v0, "64896"
+    const-string/jumbo v0, "64897"
+    const-string/jumbo v0, "64898"
+    const-string/jumbo v0, "64899"
+    const-string/jumbo v0, "64900"
+    const-string/jumbo v0, "64901"
+    const-string/jumbo v0, "64902"
+    const-string/jumbo v0, "64903"
+    const-string/jumbo v0, "64904"
+    const-string/jumbo v0, "64905"
+    const-string/jumbo v0, "64906"
+    const-string/jumbo v0, "64907"
+    const-string/jumbo v0, "64908"
+    const-string/jumbo v0, "64909"
+    const-string/jumbo v0, "64910"
+    const-string/jumbo v0, "64911"
+    const-string/jumbo v0, "64912"
+    const-string/jumbo v0, "64913"
+    const-string/jumbo v0, "64914"
+    const-string/jumbo v0, "64915"
+    const-string/jumbo v0, "64916"
+    const-string/jumbo v0, "64917"
+    const-string/jumbo v0, "64918"
+    const-string/jumbo v0, "64919"
+    const-string/jumbo v0, "64920"
+    const-string/jumbo v0, "64921"
+    const-string/jumbo v0, "64922"
+    const-string/jumbo v0, "64923"
+    const-string/jumbo v0, "64924"
+    const-string/jumbo v0, "64925"
+    const-string/jumbo v0, "64926"
+    const-string/jumbo v0, "64927"
+    const-string/jumbo v0, "64928"
+    const-string/jumbo v0, "64929"
+    const-string/jumbo v0, "64930"
+    const-string/jumbo v0, "64931"
+    const-string/jumbo v0, "64932"
+    const-string/jumbo v0, "64933"
+    const-string/jumbo v0, "64934"
+    const-string/jumbo v0, "64935"
+    const-string/jumbo v0, "64936"
+    const-string/jumbo v0, "64937"
+    const-string/jumbo v0, "64938"
+    const-string/jumbo v0, "64939"
+    const-string/jumbo v0, "64940"
+    const-string/jumbo v0, "64941"
+    const-string/jumbo v0, "64942"
+    const-string/jumbo v0, "64943"
+    const-string/jumbo v0, "64944"
+    const-string/jumbo v0, "64945"
+    const-string/jumbo v0, "64946"
+    const-string/jumbo v0, "64947"
+    const-string/jumbo v0, "64948"
+    const-string/jumbo v0, "64949"
+    const-string/jumbo v0, "64950"
+    const-string/jumbo v0, "64951"
+    const-string/jumbo v0, "64952"
+    const-string/jumbo v0, "64953"
+    const-string/jumbo v0, "64954"
+    const-string/jumbo v0, "64955"
+    const-string/jumbo v0, "64956"
+    const-string/jumbo v0, "64957"
+    const-string/jumbo v0, "64958"
+    const-string/jumbo v0, "64959"
+    const-string/jumbo v0, "64960"
+    const-string/jumbo v0, "64961"
+    const-string/jumbo v0, "64962"
+    const-string/jumbo v0, "64963"
+    const-string/jumbo v0, "64964"
+    const-string/jumbo v0, "64965"
+    const-string/jumbo v0, "64966"
+    const-string/jumbo v0, "64967"
+    const-string/jumbo v0, "64968"
+    const-string/jumbo v0, "64969"
+    const-string/jumbo v0, "64970"
+    const-string/jumbo v0, "64971"
+    const-string/jumbo v0, "64972"
+    const-string/jumbo v0, "64973"
+    const-string/jumbo v0, "64974"
+    const-string/jumbo v0, "64975"
+    const-string/jumbo v0, "64976"
+    const-string/jumbo v0, "64977"
+    const-string/jumbo v0, "64978"
+    const-string/jumbo v0, "64979"
+    const-string/jumbo v0, "64980"
+    const-string/jumbo v0, "64981"
+    const-string/jumbo v0, "64982"
+    const-string/jumbo v0, "64983"
+    const-string/jumbo v0, "64984"
+    const-string/jumbo v0, "64985"
+    const-string/jumbo v0, "64986"
+    const-string/jumbo v0, "64987"
+    const-string/jumbo v0, "64988"
+    const-string/jumbo v0, "64989"
+    const-string/jumbo v0, "64990"
+    const-string/jumbo v0, "64991"
+    const-string/jumbo v0, "64992"
+    const-string/jumbo v0, "64993"
+    const-string/jumbo v0, "64994"
+    const-string/jumbo v0, "64995"
+    const-string/jumbo v0, "64996"
+    const-string/jumbo v0, "64997"
+    const-string/jumbo v0, "64998"
+    const-string/jumbo v0, "64999"
+    const-string/jumbo v0, "65000"
+    const-string/jumbo v0, "65001"
+    const-string/jumbo v0, "65002"
+    const-string/jumbo v0, "65003"
+    const-string/jumbo v0, "65004"
+    const-string/jumbo v0, "65005"
+    const-string/jumbo v0, "65006"
+    const-string/jumbo v0, "65007"
+    const-string/jumbo v0, "65008"
+    const-string/jumbo v0, "65009"
+    const-string/jumbo v0, "65010"
+    const-string/jumbo v0, "65011"
+    const-string/jumbo v0, "65012"
+    const-string/jumbo v0, "65013"
+    const-string/jumbo v0, "65014"
+    const-string/jumbo v0, "65015"
+    const-string/jumbo v0, "65016"
+    const-string/jumbo v0, "65017"
+    const-string/jumbo v0, "65018"
+    const-string/jumbo v0, "65019"
+    const-string/jumbo v0, "65020"
+    const-string/jumbo v0, "65021"
+    const-string/jumbo v0, "65022"
+    const-string/jumbo v0, "65023"
+    const-string/jumbo v0, "65024"
+    const-string/jumbo v0, "65025"
+    const-string/jumbo v0, "65026"
+    const-string/jumbo v0, "65027"
+    const-string/jumbo v0, "65028"
+    const-string/jumbo v0, "65029"
+    const-string/jumbo v0, "65030"
+    const-string/jumbo v0, "65031"
+    const-string/jumbo v0, "65032"
+    const-string/jumbo v0, "65033"
+    const-string/jumbo v0, "65034"
+    const-string/jumbo v0, "65035"
+    const-string/jumbo v0, "65036"
+    const-string/jumbo v0, "65037"
+    const-string/jumbo v0, "65038"
+    const-string/jumbo v0, "65039"
+    const-string/jumbo v0, "65040"
+    const-string/jumbo v0, "65041"
+    const-string/jumbo v0, "65042"
+    const-string/jumbo v0, "65043"
+    const-string/jumbo v0, "65044"
+    const-string/jumbo v0, "65045"
+    const-string/jumbo v0, "65046"
+    const-string/jumbo v0, "65047"
+    const-string/jumbo v0, "65048"
+    const-string/jumbo v0, "65049"
+    const-string/jumbo v0, "65050"
+    const-string/jumbo v0, "65051"
+    const-string/jumbo v0, "65052"
+    const-string/jumbo v0, "65053"
+    const-string/jumbo v0, "65054"
+    const-string/jumbo v0, "65055"
+    const-string/jumbo v0, "65056"
+    const-string/jumbo v0, "65057"
+    const-string/jumbo v0, "65058"
+    const-string/jumbo v0, "65059"
+    const-string/jumbo v0, "65060"
+    const-string/jumbo v0, "65061"
+    const-string/jumbo v0, "65062"
+    const-string/jumbo v0, "65063"
+    const-string/jumbo v0, "65064"
+    const-string/jumbo v0, "65065"
+    const-string/jumbo v0, "65066"
+    const-string/jumbo v0, "65067"
+    const-string/jumbo v0, "65068"
+    const-string/jumbo v0, "65069"
+    const-string/jumbo v0, "65070"
+    const-string/jumbo v0, "65071"
+    const-string/jumbo v0, "65072"
+    const-string/jumbo v0, "65073"
+    const-string/jumbo v0, "65074"
+    const-string/jumbo v0, "65075"
+    const-string/jumbo v0, "65076"
+    const-string/jumbo v0, "65077"
+    const-string/jumbo v0, "65078"
+    const-string/jumbo v0, "65079"
+    const-string/jumbo v0, "65080"
+    const-string/jumbo v0, "65081"
+    const-string/jumbo v0, "65082"
+    const-string/jumbo v0, "65083"
+    const-string/jumbo v0, "65084"
+    const-string/jumbo v0, "65085"
+    const-string/jumbo v0, "65086"
+    const-string/jumbo v0, "65087"
+    const-string/jumbo v0, "65088"
+    const-string/jumbo v0, "65089"
+    const-string/jumbo v0, "65090"
+    const-string/jumbo v0, "65091"
+    const-string/jumbo v0, "65092"
+    const-string/jumbo v0, "65093"
+    const-string/jumbo v0, "65094"
+    const-string/jumbo v0, "65095"
+    const-string/jumbo v0, "65096"
+    const-string/jumbo v0, "65097"
+    const-string/jumbo v0, "65098"
+    const-string/jumbo v0, "65099"
+    const-string/jumbo v0, "65100"
+    const-string/jumbo v0, "65101"
+    const-string/jumbo v0, "65102"
+    const-string/jumbo v0, "65103"
+    const-string/jumbo v0, "65104"
+    const-string/jumbo v0, "65105"
+    const-string/jumbo v0, "65106"
+    const-string/jumbo v0, "65107"
+    const-string/jumbo v0, "65108"
+    const-string/jumbo v0, "65109"
+    const-string/jumbo v0, "65110"
+    const-string/jumbo v0, "65111"
+    const-string/jumbo v0, "65112"
+    const-string/jumbo v0, "65113"
+    const-string/jumbo v0, "65114"
+    const-string/jumbo v0, "65115"
+    const-string/jumbo v0, "65116"
+    const-string/jumbo v0, "65117"
+    const-string/jumbo v0, "65118"
+    const-string/jumbo v0, "65119"
+    const-string/jumbo v0, "65120"
+    const-string/jumbo v0, "65121"
+    const-string/jumbo v0, "65122"
+    const-string/jumbo v0, "65123"
+    const-string/jumbo v0, "65124"
+    const-string/jumbo v0, "65125"
+    const-string/jumbo v0, "65126"
+    const-string/jumbo v0, "65127"
+    const-string/jumbo v0, "65128"
+    const-string/jumbo v0, "65129"
+    const-string/jumbo v0, "65130"
+    const-string/jumbo v0, "65131"
+    const-string/jumbo v0, "65132"
+    const-string/jumbo v0, "65133"
+    const-string/jumbo v0, "65134"
+    const-string/jumbo v0, "65135"
+    const-string/jumbo v0, "65136"
+    const-string/jumbo v0, "65137"
+    const-string/jumbo v0, "65138"
+    const-string/jumbo v0, "65139"
+    const-string/jumbo v0, "65140"
+    const-string/jumbo v0, "65141"
+    const-string/jumbo v0, "65142"
+    const-string/jumbo v0, "65143"
+    const-string/jumbo v0, "65144"
+    const-string/jumbo v0, "65145"
+    const-string/jumbo v0, "65146"
+    const-string/jumbo v0, "65147"
+    const-string/jumbo v0, "65148"
+    const-string/jumbo v0, "65149"
+    const-string/jumbo v0, "65150"
+    const-string/jumbo v0, "65151"
+    const-string/jumbo v0, "65152"
+    const-string/jumbo v0, "65153"
+    const-string/jumbo v0, "65154"
+    const-string/jumbo v0, "65155"
+    const-string/jumbo v0, "65156"
+    const-string/jumbo v0, "65157"
+    const-string/jumbo v0, "65158"
+    const-string/jumbo v0, "65159"
+    const-string/jumbo v0, "65160"
+    const-string/jumbo v0, "65161"
+    const-string/jumbo v0, "65162"
+    const-string/jumbo v0, "65163"
+    const-string/jumbo v0, "65164"
+    const-string/jumbo v0, "65165"
+    const-string/jumbo v0, "65166"
+    const-string/jumbo v0, "65167"
+    const-string/jumbo v0, "65168"
+    const-string/jumbo v0, "65169"
+    const-string/jumbo v0, "65170"
+    const-string/jumbo v0, "65171"
+    const-string/jumbo v0, "65172"
+    const-string/jumbo v0, "65173"
+    const-string/jumbo v0, "65174"
+    const-string/jumbo v0, "65175"
+    const-string/jumbo v0, "65176"
+    const-string/jumbo v0, "65177"
+    const-string/jumbo v0, "65178"
+    const-string/jumbo v0, "65179"
+    const-string/jumbo v0, "65180"
+    const-string/jumbo v0, "65181"
+    const-string/jumbo v0, "65182"
+    const-string/jumbo v0, "65183"
+    const-string/jumbo v0, "65184"
+    const-string/jumbo v0, "65185"
+    const-string/jumbo v0, "65186"
+    const-string/jumbo v0, "65187"
+    const-string/jumbo v0, "65188"
+    const-string/jumbo v0, "65189"
+    const-string/jumbo v0, "65190"
+    const-string/jumbo v0, "65191"
+    const-string/jumbo v0, "65192"
+    const-string/jumbo v0, "65193"
+    const-string/jumbo v0, "65194"
+    const-string/jumbo v0, "65195"
+    const-string/jumbo v0, "65196"
+    const-string/jumbo v0, "65197"
+    const-string/jumbo v0, "65198"
+    const-string/jumbo v0, "65199"
+    const-string/jumbo v0, "65200"
+    const-string/jumbo v0, "65201"
+    const-string/jumbo v0, "65202"
+    const-string/jumbo v0, "65203"
+    const-string/jumbo v0, "65204"
+    const-string/jumbo v0, "65205"
+    const-string/jumbo v0, "65206"
+    const-string/jumbo v0, "65207"
+    const-string/jumbo v0, "65208"
+    const-string/jumbo v0, "65209"
+    const-string/jumbo v0, "65210"
+    const-string/jumbo v0, "65211"
+    const-string/jumbo v0, "65212"
+    const-string/jumbo v0, "65213"
+    const-string/jumbo v0, "65214"
+    const-string/jumbo v0, "65215"
+    const-string/jumbo v0, "65216"
+    const-string/jumbo v0, "65217"
+    const-string/jumbo v0, "65218"
+    const-string/jumbo v0, "65219"
+    const-string/jumbo v0, "65220"
+    const-string/jumbo v0, "65221"
+    const-string/jumbo v0, "65222"
+    const-string/jumbo v0, "65223"
+    const-string/jumbo v0, "65224"
+    const-string/jumbo v0, "65225"
+    const-string/jumbo v0, "65226"
+    const-string/jumbo v0, "65227"
+    const-string/jumbo v0, "65228"
+    const-string/jumbo v0, "65229"
+    const-string/jumbo v0, "65230"
+    const-string/jumbo v0, "65231"
+    const-string/jumbo v0, "65232"
+    const-string/jumbo v0, "65233"
+    const-string/jumbo v0, "65234"
+    const-string/jumbo v0, "65235"
+    const-string/jumbo v0, "65236"
+    const-string/jumbo v0, "65237"
+    const-string/jumbo v0, "65238"
+    const-string/jumbo v0, "65239"
+    const-string/jumbo v0, "65240"
+    const-string/jumbo v0, "65241"
+    const-string/jumbo v0, "65242"
+    const-string/jumbo v0, "65243"
+    const-string/jumbo v0, "65244"
+    const-string/jumbo v0, "65245"
+    const-string/jumbo v0, "65246"
+    const-string/jumbo v0, "65247"
+    const-string/jumbo v0, "65248"
+    const-string/jumbo v0, "65249"
+    const-string/jumbo v0, "65250"
+    const-string/jumbo v0, "65251"
+    const-string/jumbo v0, "65252"
+    const-string/jumbo v0, "65253"
+    const-string/jumbo v0, "65254"
+    const-string/jumbo v0, "65255"
+    const-string/jumbo v0, "65256"
+    const-string/jumbo v0, "65257"
+    const-string/jumbo v0, "65258"
+    const-string/jumbo v0, "65259"
+    const-string/jumbo v0, "65260"
+    const-string/jumbo v0, "65261"
+    const-string/jumbo v0, "65262"
+    const-string/jumbo v0, "65263"
+    const-string/jumbo v0, "65264"
+    const-string/jumbo v0, "65265"
+    const-string/jumbo v0, "65266"
+    const-string/jumbo v0, "65267"
+    const-string/jumbo v0, "65268"
+    const-string/jumbo v0, "65269"
+    const-string/jumbo v0, "65270"
+    const-string/jumbo v0, "65271"
+    const-string/jumbo v0, "65272"
+    const-string/jumbo v0, "65273"
+    const-string/jumbo v0, "65274"
+    const-string/jumbo v0, "65275"
+    const-string/jumbo v0, "65276"
+    const-string/jumbo v0, "65277"
+    const-string/jumbo v0, "65278"
+    const-string/jumbo v0, "65279"
+    const-string/jumbo v0, "65280"
+    const-string/jumbo v0, "65281"
+    const-string/jumbo v0, "65282"
+    const-string/jumbo v0, "65283"
+    const-string/jumbo v0, "65284"
+    const-string/jumbo v0, "65285"
+    const-string/jumbo v0, "65286"
+    const-string/jumbo v0, "65287"
+    const-string/jumbo v0, "65288"
+    const-string/jumbo v0, "65289"
+    const-string/jumbo v0, "65290"
+    const-string/jumbo v0, "65291"
+    const-string/jumbo v0, "65292"
+    const-string/jumbo v0, "65293"
+    const-string/jumbo v0, "65294"
+    const-string/jumbo v0, "65295"
+    const-string/jumbo v0, "65296"
+    const-string/jumbo v0, "65297"
+    const-string/jumbo v0, "65298"
+    const-string/jumbo v0, "65299"
+    const-string/jumbo v0, "65300"
+    const-string/jumbo v0, "65301"
+    const-string/jumbo v0, "65302"
+    const-string/jumbo v0, "65303"
+    const-string/jumbo v0, "65304"
+    const-string/jumbo v0, "65305"
+    const-string/jumbo v0, "65306"
+    const-string/jumbo v0, "65307"
+    const-string/jumbo v0, "65308"
+    const-string/jumbo v0, "65309"
+    const-string/jumbo v0, "65310"
+    const-string/jumbo v0, "65311"
+    const-string/jumbo v0, "65312"
+    const-string/jumbo v0, "65313"
+    const-string/jumbo v0, "65314"
+    const-string/jumbo v0, "65315"
+    const-string/jumbo v0, "65316"
+    const-string/jumbo v0, "65317"
+    const-string/jumbo v0, "65318"
+    const-string/jumbo v0, "65319"
+    const-string/jumbo v0, "65320"
+    const-string/jumbo v0, "65321"
+    const-string/jumbo v0, "65322"
+    const-string/jumbo v0, "65323"
+    const-string/jumbo v0, "65324"
+    const-string/jumbo v0, "65325"
+    const-string/jumbo v0, "65326"
+    const-string/jumbo v0, "65327"
+    const-string/jumbo v0, "65328"
+    const-string/jumbo v0, "65329"
+    const-string/jumbo v0, "65330"
+    const-string/jumbo v0, "65331"
+    const-string/jumbo v0, "65332"
+    const-string/jumbo v0, "65333"
+    const-string/jumbo v0, "65334"
+    const-string/jumbo v0, "65335"
+    const-string/jumbo v0, "65336"
+    const-string/jumbo v0, "65337"
+    const-string/jumbo v0, "65338"
+    const-string/jumbo v0, "65339"
+    const-string/jumbo v0, "65340"
+    const-string/jumbo v0, "65341"
+    const-string/jumbo v0, "65342"
+    const-string/jumbo v0, "65343"
+    const-string/jumbo v0, "65344"
+    const-string/jumbo v0, "65345"
+    const-string/jumbo v0, "65346"
+    const-string/jumbo v0, "65347"
+    const-string/jumbo v0, "65348"
+    const-string/jumbo v0, "65349"
+    const-string/jumbo v0, "65350"
+    const-string/jumbo v0, "65351"
+    const-string/jumbo v0, "65352"
+    const-string/jumbo v0, "65353"
+    const-string/jumbo v0, "65354"
+    const-string/jumbo v0, "65355"
+    const-string/jumbo v0, "65356"
+    const-string/jumbo v0, "65357"
+    const-string/jumbo v0, "65358"
+    const-string/jumbo v0, "65359"
+    const-string/jumbo v0, "65360"
+    const-string/jumbo v0, "65361"
+    const-string/jumbo v0, "65362"
+    const-string/jumbo v0, "65363"
+    const-string/jumbo v0, "65364"
+    const-string/jumbo v0, "65365"
+    const-string/jumbo v0, "65366"
+    const-string/jumbo v0, "65367"
+    const-string/jumbo v0, "65368"
+    const-string/jumbo v0, "65369"
+    const-string/jumbo v0, "65370"
+    const-string/jumbo v0, "65371"
+    const-string/jumbo v0, "65372"
+    const-string/jumbo v0, "65373"
+    const-string/jumbo v0, "65374"
+    const-string/jumbo v0, "65375"
+    const-string/jumbo v0, "65376"
+    const-string/jumbo v0, "65377"
+    const-string/jumbo v0, "65378"
+    const-string/jumbo v0, "65379"
+    const-string/jumbo v0, "65380"
+    const-string/jumbo v0, "65381"
+    const-string/jumbo v0, "65382"
+    const-string/jumbo v0, "65383"
+    const-string/jumbo v0, "65384"
+    const-string/jumbo v0, "65385"
+    const-string/jumbo v0, "65386"
+    const-string/jumbo v0, "65387"
+    const-string/jumbo v0, "65388"
+    const-string/jumbo v0, "65389"
+    const-string/jumbo v0, "65390"
+    const-string/jumbo v0, "65391"
+    const-string/jumbo v0, "65392"
+    const-string/jumbo v0, "65393"
+    const-string/jumbo v0, "65394"
+    const-string/jumbo v0, "65395"
+    const-string/jumbo v0, "65396"
+    const-string/jumbo v0, "65397"
+    const-string/jumbo v0, "65398"
+    const-string/jumbo v0, "65399"
+    const-string/jumbo v0, "65400"
+    const-string/jumbo v0, "65401"
+    const-string/jumbo v0, "65402"
+    const-string/jumbo v0, "65403"
+    const-string/jumbo v0, "65404"
+    const-string/jumbo v0, "65405"
+    const-string/jumbo v0, "65406"
+    const-string/jumbo v0, "65407"
+    const-string/jumbo v0, "65408"
+    const-string/jumbo v0, "65409"
+    const-string/jumbo v0, "65410"
+    const-string/jumbo v0, "65411"
+    const-string/jumbo v0, "65412"
+    const-string/jumbo v0, "65413"
+    const-string/jumbo v0, "65414"
+    const-string/jumbo v0, "65415"
+    const-string/jumbo v0, "65416"
+    const-string/jumbo v0, "65417"
+    const-string/jumbo v0, "65418"
+    const-string/jumbo v0, "65419"
+    const-string/jumbo v0, "65420"
+    const-string/jumbo v0, "65421"
+    const-string/jumbo v0, "65422"
+    const-string/jumbo v0, "65423"
+    const-string/jumbo v0, "65424"
+    const-string/jumbo v0, "65425"
+    const-string/jumbo v0, "65426"
+    const-string/jumbo v0, "65427"
+    const-string/jumbo v0, "65428"
+    const-string/jumbo v0, "65429"
+    const-string/jumbo v0, "65430"
+    const-string/jumbo v0, "65431"
+    const-string/jumbo v0, "65432"
+    const-string/jumbo v0, "65433"
+    const-string/jumbo v0, "65434"
+    const-string/jumbo v0, "65435"
+    const-string/jumbo v0, "65436"
+    const-string/jumbo v0, "65437"
+    const-string/jumbo v0, "65438"
+    const-string/jumbo v0, "65439"
+    const-string/jumbo v0, "65440"
+    const-string/jumbo v0, "65441"
+    const-string/jumbo v0, "65442"
+    const-string/jumbo v0, "65443"
+    const-string/jumbo v0, "65444"
+    const-string/jumbo v0, "65445"
+    const-string/jumbo v0, "65446"
+    const-string/jumbo v0, "65447"
+    const-string/jumbo v0, "65448"
+    const-string/jumbo v0, "65449"
+    const-string/jumbo v0, "65450"
+    const-string/jumbo v0, "65451"
+    const-string/jumbo v0, "65452"
+    const-string/jumbo v0, "65453"
+    const-string/jumbo v0, "65454"
+    const-string/jumbo v0, "65455"
+    const-string/jumbo v0, "65456"
+    const-string/jumbo v0, "65457"
+    const-string/jumbo v0, "65458"
+    const-string/jumbo v0, "65459"
+    const-string/jumbo v0, "65460"
+    const-string/jumbo v0, "65461"
+    const-string/jumbo v0, "65462"
+    const-string/jumbo v0, "65463"
+    const-string/jumbo v0, "65464"
+    const-string/jumbo v0, "65465"
+    const-string/jumbo v0, "65466"
+    const-string/jumbo v0, "65467"
+    const-string/jumbo v0, "65468"
+    const-string/jumbo v0, "65469"
+    const-string/jumbo v0, "65470"
+    const-string/jumbo v0, "65471"
+    const-string/jumbo v0, "65472"
+    const-string/jumbo v0, "65473"
+    const-string/jumbo v0, "65474"
+    const-string/jumbo v0, "65475"
+    const-string/jumbo v0, "65476"
+    const-string/jumbo v0, "65477"
+    const-string/jumbo v0, "65478"
+    const-string/jumbo v0, "65479"
+    const-string/jumbo v0, "65480"
+    const-string/jumbo v0, "65481"
+    const-string/jumbo v0, "65482"
+    const-string/jumbo v0, "65483"
+    const-string/jumbo v0, "65484"
+    const-string/jumbo v0, "65485"
+    const-string/jumbo v0, "65486"
+    const-string/jumbo v0, "65487"
+    const-string/jumbo v0, "65488"
+    const-string/jumbo v0, "65489"
+    const-string/jumbo v0, "65490"
+    const-string/jumbo v0, "65491"
+    const-string/jumbo v0, "65492"
+    const-string/jumbo v0, "65493"
+    const-string/jumbo v0, "65494"
+    const-string/jumbo v0, "65495"
+    const-string/jumbo v0, "65496"
+    const-string/jumbo v0, "65497"
+    const-string/jumbo v0, "65498"
+    const-string/jumbo v0, "65499"
+    const-string/jumbo v0, "65500"
+    const-string/jumbo v0, "65501"
+    const-string/jumbo v0, "65502"
+    const-string/jumbo v0, "65503"
+    const-string/jumbo v0, "65504"
+    const-string/jumbo v0, "65505"
+    const-string/jumbo v0, "65506"
+    const-string/jumbo v0, "65507"
+    const-string/jumbo v0, "65508"
+    const-string/jumbo v0, "65509"
+    const-string/jumbo v0, "65510"
+    const-string/jumbo v0, "65511"
+    const-string/jumbo v0, "65512"
+    const-string/jumbo v0, "65513"
+    const-string/jumbo v0, "65514"
+    const-string/jumbo v0, "65515"
+    const-string/jumbo v0, "65516"
+    const-string/jumbo v0, "65517"
+    const-string/jumbo v0, "65518"
+    const-string/jumbo v0, "65519"
+    const-string/jumbo v0, "65520"
+    const-string/jumbo v0, "65521"
+    const-string/jumbo v0, "65522"
+    const-string/jumbo v0, "65523"
+    const-string/jumbo v0, "65524"
+    const-string/jumbo v0, "65525"
+    const-string/jumbo v0, "65526"
+    const-string/jumbo v0, "65527"
+    const-string/jumbo v0, "65528"
+    const-string/jumbo v0, "65529"
+    const-string/jumbo v0, "65530"
+    const-string/jumbo v0, "65531"
+    const-string/jumbo v0, "65532"
+    const-string/jumbo v0, "65533"
+    const-string/jumbo v0, "65534"
+    const-string/jumbo v0, "65535"
+    const-string/jumbo v0, "65536"
+    
+    return-void
+.end method
diff --git a/smali-integration-tests/src/test/smali/jumbo-string-tests/TestSuite.smali b/smali-integration-tests/src/test/smali/jumbo-string-tests/TestSuite.smali
new file mode 100644
index 0000000..782b782
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/jumbo-string-tests/TestSuite.smali
@@ -0,0 +1,10 @@
+.class public LAllTests;
+.super Ljava/lang/Object;
+
+.annotation runtime Lorg/junit/runner/RunWith;
+    value = Lorg/junit/runners/Suite;
+.end annotation
+
+.annotation runtime Lorg/junit/runners/Suite$SuiteClasses;
+    value = {   LFormat31c; }
+.end annotation
diff --git a/smali-integration-tests/src/test/smali/junit-tests/AnnotationTests/AnnotationTests.smali b/smali-integration-tests/src/test/smali/junit-tests/AnnotationTests/AnnotationTests.smali
new file mode 100644
index 0000000..80e6643
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/AnnotationTests/AnnotationTests.smali
@@ -0,0 +1,162 @@
+.class public LAnnotationTests;
+.super Ljava/lang/Object;
+.source "AnnotationTests.smali"
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.annotation runtime LTestAnnotationClass;
+    stringValue = "Class Annotation Test"
+.end annotation
+
+
+.field public testField:I
+    .annotation runtime LTestAnnotationClass;
+        stringValue = "Field Annotation Test"
+    .end annotation
+.end field
+
+.method public testClassAnnotation()V
+    .registers 2
+
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-class v0, LAnnotationTests;
+    const-class v1, LTestAnnotationClass;
+
+    invoke-virtual {v0, v1}, Ljava/lang/Class;->getAnnotation(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;
+    move-result-object v0
+
+    check-cast v0, LTestAnnotationClass;
+
+    invoke-interface {v0}, LTestAnnotationClass;->stringValue()Ljava/lang/String;
+    move-result-object v0
+
+    const-string v1, "Class Annotation Test"
+
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+
+    return-void
+.end method
+
+.method public testFieldAnnotation()V
+    .registers 4
+
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-class v0, LAnnotationTests;
+    const-class v1, LTestAnnotationClass;
+    const-string v2, "testField"
+
+    invoke-virtual {v0, v2}, Ljava/lang/Class;->getField(Ljava/lang/String;)Ljava/lang/reflect/Field;
+    move-result-object v3
+
+    invoke-virtual {v3, v1}, Ljava/lang/reflect/Field;->getAnnotation(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;
+    move-result-object v0
+
+    check-cast v0, LTestAnnotationClass;
+
+    invoke-interface {v0}, LTestAnnotationClass;->stringValue()Ljava/lang/String;
+    move-result-object v0
+
+    const-string v1, "Field Annotation Test"
+
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+
+    return-void
+.end method
+
+.method public testMethodAnnotation()V
+    .registers 4
+
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    .annotation runtime LTestAnnotationClass;
+        stringValue = "Method Annotation Test"
+    .end annotation
+
+
+    const-class v0, LAnnotationTests;
+    const-class v1, LTestAnnotationClass;
+    const-string v2, "testMethodAnnotation"
+
+    const v3, 0
+    new-array v3, v3, [Ljava/lang/Class;
+
+    invoke-virtual {v0, v2, v3}, Ljava/lang/Class;->getMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
+    move-result-object v3
+
+    invoke-virtual {v3, v1}, Ljava/lang/reflect/Method;->getAnnotation(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;
+    move-result-object v0
+
+    check-cast v0, LTestAnnotationClass;
+
+    invoke-interface {v0}, LTestAnnotationClass;->stringValue()Ljava/lang/String;
+    move-result-object v0
+
+    const-string v1, "Method Annotation Test"
+
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+
+    return-void
+.end method
+
+.method public testMethodWithParameterAnnotation(Ljava/lang/String;)V
+    .registers 2
+
+    .parameter "test"
+        .annotation runtime LTestAnnotationClass;
+            stringValue = "Parameter Annotation Test"
+        .end annotation
+    .end parameter
+
+    return-void
+.end method
+
+.method public testParameterAnnotation()V
+    .registers 6
+
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-class v0, LAnnotationTests;
+    const-class v1, LTestAnnotationClass;
+    const-string v2, "testMethodWithParameterAnnotation"
+
+    const v3, 1
+    new-array v3, v3, [Ljava/lang/Class;
+
+    const v4, 0
+
+    const-class v5, Ljava/lang/String;
+
+    aput-object v5, v3, v4
+
+    invoke-virtual {v0, v2, v3}, Ljava/lang/Class;->getMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
+    move-result-object v3
+
+    invoke-virtual {v3}, Ljava/lang/reflect/Method;->getParameterAnnotations()[[Ljava/lang/annotation/Annotation;
+    move-result-object v0
+
+    const v1, 0
+
+    aget-object v2, v0, v1
+    aget-object v0, v2, v1
+
+    check-cast v0, LTestAnnotationClass;
+
+    invoke-interface {v0}, LTestAnnotationClass;->stringValue()Ljava/lang/String;
+    move-result-object v0
+
+    const-string v1, "Parameter Annotation Test"
+
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+
+    return-void
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/AnnotationTests/TestAnnotationClass.smali b/smali-integration-tests/src/test/smali/junit-tests/AnnotationTests/TestAnnotationClass.smali
new file mode 100644
index 0000000..eb2b245
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/AnnotationTests/TestAnnotationClass.smali
@@ -0,0 +1,12 @@
+.class public abstract interface annotation LTestAnnotationClass;
+.super Ljava/lang/Object;
+.implements Ljava/lang/annotation/Annotation;
+
+.method public abstract stringValue()Ljava/lang/String;
+.end method
+
+.annotation system Ldalvik/annotation/AnnotationDefault;
+    value = .subannotation LAnnotationWithValues;
+                stringValue = "Test Annotation String Value"
+            .end subannotation
+.end annotation
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/AutofixTests/GotoTest.smali b/smali-integration-tests/src/test/smali/junit-tests/AutofixTests/GotoTest.smali
new file mode 100644
index 0000000..002442b
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/AutofixTests/GotoTest.smali
@@ -0,0 +1,2025 @@
+.class public LGotoTest;
+.super Ljava/lang/Object;
+.source "GotoTest.smali"
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public testGoto()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 5
+
+    goto :label
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+
+    :label2
+
+    const v1, 6
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+
+    :label
+    const v0, 6
+    goto :label2
+
+
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+    return-void
+.end method
+
+.method public testPackedSwitch()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 5
+
+    goto :label3
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+
+    :label1
+
+    const v1, 6
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+
+
+    :label2
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+    goto :label1
+
+
+    :label3
+    const v0, 6
+    const v2, 0
+    #this should jump to :Label1
+    packed-switch v2, :PackedSwitch
+
+
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+    return-void
+
+
+:PackedSwitch
+    .packed-switch 0
+        :label1
+        :label2
+        :label3
+    .end packed-switch
+.end method
+
+
+
+.method public testSparseSwitch()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 5
+
+    goto :label3
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+
+    :label1
+
+    const v1, 6
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+
+
+    :label2
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+    goto :label1
+
+
+    :label3
+    const v0, 6
+    const v2, 0
+    #this should jump to :Label1
+    sparse-switch v2, :SparseSwitch
+
+
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+    return-void
+
+
+:SparseSwitch
+    .sparse-switch
+        0 -> :label1
+        1 -> :label2
+        2 -> :label3
+    .end sparse-switch
+.end method
+
+
+
+
+.method public testDebugInfo()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    :label3
+    const v0, 5
+
+    .line 1
+    goto :label
+    .local v0, var1:I
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    .line 2
+    nop
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+    .line 3
+
+
+    :label2
+
+    .local v0, var2:I
+    const v1, 6
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+    .line 4
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    .line 5
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    goto :label3
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    .line 6
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    .line 7
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+
+
+
+    :label
+    const v0, 6
+
+    goto :label2
+
+
+
+
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+    .line 8
+    return-void
+.end method
+
+
+.method public testExceptions()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 5
+
+    :try_start1
+    goto :label1
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    :try_start2
+    nop
+    nop
+    :try_end2
+    .catch Ljava/lang/RuntimeException; {:try_start2 .. :try_end2} :handler2
+    .catchall {:try_start2 .. :try_end2} :handler3
+    nop
+    nop
+    nop
+    nop
+    new-instance v0, Ljava/lang/Exception;
+    const-string v1, "This is an error message"
+    invoke-direct {v0, v1}, Ljava/lang/Exception;-><init>(Ljava/lang/String;)V
+    throw v0
+    :try_end1
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    .catch Ljava/lang/Exception; {:try_start1 .. :try_end1} :handler1
+    :handler1
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    :handler2
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    :handler3
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+
+    :label2
+
+    const v1, 6
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+
+    :label1
+    const v0, 6
+    goto :label2
+
+
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+    return-void
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/ExceptionTest/ExceptionTest.smali b/smali-integration-tests/src/test/smali/junit-tests/ExceptionTest/ExceptionTest.smali
new file mode 100644
index 0000000..aede411
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/ExceptionTest/ExceptionTest.smali
@@ -0,0 +1,80 @@
+.class public LExceptionTest;
+.super Ljava/lang/Object;
+.source "ExceptionTest.smali"
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public singleCatchTest()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    :try_start
+    new-instance v0, Ljava/lang/Exception;
+    const-string v1, "This is an error message"
+    invoke-direct {v0, v1}, Ljava/lang/Exception;-><init>(Ljava/lang/String;)V
+    throw v0
+    :try_end
+    .catch Ljava/lang/Exception; {:try_start .. :try_end} :handler
+
+    :handler
+    #no need to test anything. If it didn't catch the exception, the test would fail
+	return-void
+.end method
+
+
+.method public nestedCatchTest()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    :try_start_outer
+    nop
+    nop
+
+    :try_start_inner
+    new-instance v0, Ljava/lang/RuntimeException;
+    const-string v1, "This is an error message"
+    invoke-direct {v0, v1}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V
+    throw v0
+    :try_end_inner
+    .catch Ljava/lang/RuntimeException; {:try_start_inner .. :try_end_outer} :handler_inner
+
+    nop
+    nop
+    :try_end_outer
+
+    .catch Ljava/lang/Exception; {:try_start_outer .. :try_end_outer} :handler_outer
+
+    :handler_outer
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+    :handler_inner
+
+
+	return-void
+.end method
+
+
+
+.method public catchAllTest()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    :try_start
+    new-instance v0, Ljava/lang/Exception;
+    const-string v1, "This is an error message"
+    invoke-direct {v0, v1}, Ljava/lang/Exception;-><init>(Ljava/lang/String;)V
+    throw v0
+    :try_end
+    .catchall {:try_start .. :try_end} :handler
+
+    :handler
+    #no need to test anything. If it didn't catch the exception, the test would fail
+	return-void
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/FieldTest/FieldTest.smali b/smali-integration-tests/src/test/smali/junit-tests/FieldTest/FieldTest.smali
new file mode 100644
index 0000000..81df7bd
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/FieldTest/FieldTest.smali
@@ -0,0 +1,113 @@
+.class public LFieldTest;
+.super Ljava/lang/Object;
+.source "FieldTest.smali"
+
+#this class tests that fields of various types are working
+
+.method public constructor <init>()V
+    .registers 4
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+
+    const-string v0, "publicStringFieldValue"
+    iput-object v0, p0, LFieldTest;->publicStringField:Ljava/lang/String;
+
+    const v0, 23
+    iput v0, p0, LFieldTest;->publicIntegerField:I
+
+    const-string v0, "publicObjectFieldValue"
+    iput-object v0, p0, LFieldTest;->publicObjectField:Ljava/lang/Object;
+
+    const/4 v0, 3
+    new-array v0, v0, [Ljava/lang/String;
+
+    const-string v1, "publicStringArrayFieldValue1"
+    const/4 v2, 0
+    aput-object v1, v0, v2
+
+    const-string v1, "publicStringArrayFieldValue2"
+    const/4 v2, 1
+    aput-object v1, v0, v2
+
+    const-string v1, "pubicStringArrayFieldValue3"
+    const/4 v2, 2
+    aput-object v1, v0, v2
+
+    iput-object v0, p0, LFieldTest;->publicStringArrayField:[Ljava/lang/String;
+
+    const-string v0, "privateStringFieldValue"
+    iput-object v0, p0, LFieldTest;->privateStringField:Ljava/lang/String;
+
+    const-string v0, "publicStaticStringFieldValue"
+    sput-object v0, LFieldTest;->publicStaticStringField:Ljava/lang/String;
+
+    const-string v0, "privateStaticStringFieldValue"
+    sput-object v0, LFieldTest;->privateStaticStringField:Ljava/lang/String;
+
+    return-void
+.end method
+
+.field public publicStringField:Ljava/lang/String;
+.field public publicIntegerField:I
+.field public publicObjectField:Ljava/lang/Object;
+.field public publicStringArrayField:[Ljava/lang/String;
+.field private privateStringField:Ljava/lang/String;
+.field public static publicStaticStringField:Ljava/lang/String;
+.field private static privateStaticStringField:Ljava/lang/String;
+
+
+.method public test()V
+    .registers 5
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    .line 1
+    iget-object v0, p0, LFieldTest;->publicStringField:Ljava/lang/String;
+    const-string v1, "publicStringFieldValue"
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+
+    .line 2
+    iget v0, v4, LFieldTest;->publicIntegerField:I
+    const/16 v1, 23
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+
+    .line 3
+    iget-object v0, p0, LFieldTest;->publicObjectField:Ljava/lang/Object;
+    const-string v1, "publicObjectFieldValue"
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+
+    .line 4
+    const/4 v0, 3
+    new-array v0, v0, [Ljava/lang/String;
+
+    const-string v1, "publicStringArrayFieldValue1"
+    const/4 v2, 0
+    aput-object v1, v0, v2
+
+    const-string v1, "publicStringArrayFieldValue2"
+    const/4 v2, 1
+    aput-object v1, v0, v2
+
+    const-string v1, "pubicStringArrayFieldValue3"
+    const/4 v2, 2
+    aput-object v1, v0, v2
+
+    iget-object v1, p0, LFieldTest;->publicStringArrayField:[Ljava/lang/String;
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals([Ljava/lang/Object;[Ljava/lang/Object;)V
+
+    .line 5
+    iget-object v0, p0, LFieldTest;->privateStringField:Ljava/lang/String;
+    const-string v1, "privateStringFieldValue"
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+
+    .line 6
+    sget-object v0, LFieldTest;->publicStaticStringField:Ljava/lang/String;
+    const-string v1, "publicStaticStringFieldValue"
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+
+    .line 7
+    sget-object v0, LFieldTest;->privateStaticStringField:Ljava/lang/String;
+    const-string v1, "privateStaticStringFieldValue"
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+
+	return-void
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format10t/Format10t.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format10t/Format10t.smali
new file mode 100644
index 0000000..4872c4f
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format10t/Format10t.smali
@@ -0,0 +1,37 @@
+.class public LFormat10t;
+.super Ljava/lang/Object;
+.source "Format10t.smali"
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public test_goto()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+
+    const v0, 5
+
+    goto :label
+
+    :label2
+
+
+    const v1, 6
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+
+
+
+    :label
+    const v0, 6
+    goto :label2
+
+
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+    return-void
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format10x/Format10x.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format10x/Format10x.smali
new file mode 100644
index 0000000..147cb3f
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format10x/Format10x.smali
@@ -0,0 +1,32 @@
+.class public LFormat10x;
+.super Ljava/lang/Object;
+.source "Format10x.smali"
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public test_nop()V
+    .registers 1
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    #yep, it's a nop. not much to test, other than that it runs
+    nop
+
+    return-void
+.end method
+
+.method public test_return-void()V
+    .registers 1
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+    
+    return-void
+
+    #if we get here, the return-void didn't work
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+.end method
+
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format11n/Format11n.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format11n/Format11n.smali
new file mode 100644
index 0000000..80414dd
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format11n/Format11n.smali
@@ -0,0 +1,21 @@
+.class public LFormat11n;
+.super Ljava/lang/Object;
+.source "Format11n.smali"
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public test_const-4()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const/4 v0, 6
+
+    const v1, 6
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format11x/Format11x.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format11x/Format11x.smali
new file mode 100644
index 0000000..5f44c87
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format11x/Format11x.smali
@@ -0,0 +1,114 @@
+.class public LFormat11x;
+.super Ljava/lang/Object;
+.source "Format11x.smali"
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public testMethodI()I
+    .registers 1
+
+    const v0, 23
+    return v0
+.end method
+
+.method public testMethodJ()J
+    .registers 2
+
+    const-wide v0, 0x200000000L
+    return-wide v0
+.end method
+
+.method public testMethodStr()Ljava/lang/String;
+    .registers 1
+
+    const-string v0, "in testMethodStr()"
+    return-object v0
+.end method
+
+
+.method public test_move-result__return()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    invoke-virtual {p0}, LFormat11x;->testMethodI()I
+    move-result v0
+
+    const v1, 23
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_move-result-wide__return-wide()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    invoke-virtual {p0}, LFormat11x;->testMethodJ()J
+    move-result-wide v0
+
+    const-wide v2, 0x200000000L
+    invoke-static {v0, v1, v2, v3}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_move-result-object__return-object()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    invoke-virtual {p0}, LFormat11x;->testMethodStr()Ljava/lang/String;
+    move-result-object v0
+
+    const-string v1, "in testMethodStr()"
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+    return-void
+.end method
+
+.method public test_move-exception__throw()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    :startTry
+    const-string v0, "This is an exception message"
+    new-instance v1, Ljava/lang/Exception;
+    invoke-direct {v1, v0}, Ljava/lang/Exception;-><init>(Ljava/lang/String;)V
+    throw v1
+    :endTry
+
+    .catch Ljava/lang/Exception; {:startTry .. :endTry} :handler
+
+    :handler
+    move-exception v0
+    invoke-virtual {v0}, Ljava/lang/Exception;->getMessage()Ljava/lang/String;
+    move-result-object v1
+
+    const-string v0, "This is an exception message"
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+    return-void
+.end method
+
+
+.method public test_monitor-enter__monitor_leave()V
+    .registers 1
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-string v0, "this is a string"
+
+    monitor-enter v0
+
+    nop
+    nop
+    nop
+
+    monitor-exit v0
+
+    #TODO: need to write a multi-threaded test to test monitor-enter and monitor-exit
+    return-void    
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format12x/Format12x.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format12x/Format12x.smali
new file mode 100644
index 0000000..71f5245
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format12x/Format12x.smali
@@ -0,0 +1,824 @@
+.class public LFormat12x;
+.super Ljava/lang/Object;
+.source "Format12x.smali"
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public test_move()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const/4 v0, 6
+    move v1, v0
+
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+
+    return-void
+.end method
+
+.method public test_move-wide()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 0x200000000L
+
+    move-wide v2, v0
+
+    invoke-static {v0, v1, v2, v3}, Lorg/junit/Assert;->assertEquals(JJ)V
+
+    return-void
+.end method
+
+.method public test_move-object()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-string v0, "random string value"
+
+    move-object v1, v0
+
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+
+    return-void
+.end method
+
+.method public test_array-length()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const/4 v0, 3
+    new-array v1, v0, [I
+
+    array-length v2, v1
+
+    invoke-static {v0, v2}, LAssert;->assertEquals(II)V
+
+    return-void
+.end method
+
+.method public test_neg-int()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const/16 v0, 23
+    neg-int v1, v0
+
+    const/16 v2, -23
+    invoke-static {v1, v2}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+ .method public test_not-int()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const/16 v0, 23
+    not-int v1, v0
+
+    const/16 v2, -24
+    invoke-static {v1, v2}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_neg-long()V
+    .registers 6
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 0x200000000L
+    neg-long v2, v0
+
+    const-wide v4, -0x200000000L
+    invoke-static {v2, v3, v4, v5}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_not-long()V
+    .registers 6
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 0x200000000L
+    not-long v2, v0
+
+    const-wide v4, -0x200000001L
+    invoke-static {v2, v3, v4, v5}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_neg-float()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 3.14159f
+    neg-float v1, v0
+
+    const v2, -3.14159f
+    invoke-static {v1, v2}, LAssert;->assertEquals(FF)V
+    return-void
+.end method
+
+.method public test_neg-double()V
+    .registers 6
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 3.14159
+    neg-double v2, v0
+
+    const-wide v4, -3.14159
+    invoke-static {v2, v3, v4, v5}, LAssert;->assertEquals(DD)V
+    return-void
+.end method
+
+.method public test_int-to-long()V
+    .registers 5
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 23
+    int-to-long v1, v0
+
+    const-wide v3, 23L
+    invoke-static {v1, v2, v3, v4}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_int-to-float()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 23
+    int-to-float v1, v0
+
+    const v2, 23f
+    invoke-static {v1, v2}, LAssert;->assertEquals(FF)V
+    return-void
+.end method
+
+.method public test_int-to-double()V
+    .registers 5
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 23
+    int-to-double v1, v0
+
+    const-wide v3, 23.0
+    invoke-static {v1, v2, v3, v4}, LAssert;->assertEquals(DD)V
+    return-void
+.end method
+
+.method public test_long-to-int()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 23L
+    long-to-int v2, v0
+
+    const v3, 23
+    invoke-static {v2, v3}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+
+.method public test_long-to-float()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 0x200000000L
+    long-to-float v2, v0
+
+    const v3, 8.589934592e9f
+    invoke-static {v2, v3}, LAssert;->assertEquals(FF)V
+    return-void
+.end method
+
+.method public test_long-to-double()V
+    .registers 6
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 0x200000000L
+    long-to-double v2, v0
+
+    const-wide v4, 8.589934592e9
+    invoke-static {v2, v3, v4, v5}, LAssert;->assertEquals(DD)V
+    return-void
+.end method
+
+.method public test_float-to-int()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 3.14159f
+    float-to-int v1, v0
+
+    const v2, 3
+    invoke-static {v1, v2}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_float-to-long()V
+    .registers 5
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 3.14159f
+    float-to-long v1, v0
+
+    const-wide v3, 3L
+    invoke-static {v1, v2, v3, v4}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_float-to-double()V
+    .registers 5
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 3.14159f
+    float-to-double v1, v0
+
+    const-wide v3, 3.14159
+    invoke-static {v1, v2, v3, v4}, LAssert;->assertEquals(DD)V
+    return-void
+.end method
+
+.method public test_double-to-int()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 3.1415926535897932384626433832795028841971
+    double-to-int v2, v0
+
+    const v3, 3
+    invoke-static {v2, v3}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+
+.method public test_double-to-long()V
+    .registers 6
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 3.14159265358e11
+    double-to-long v2, v0
+
+    const-wide v4, 314159265358L
+    invoke-static {v2, v3, v4, v5}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_double-to-float()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 3.1415926535897932384626433832795028841971
+    double-to-float v2, v0
+
+    const v3, 3.141592653589f
+    invoke-static {v2, v3}, LAssert;->assertEquals(FF)V
+    return-void
+.end method
+
+.method public test_int-to-byte()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 0x10010
+
+    int-to-byte v1, v0
+
+    const/16 v2, 0x10
+    invoke-static {v1,v2}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+
+.method public test_int-to-char()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 0x11234
+
+    int-to-char v1, v0
+
+    const/16 v2, '\u1234'
+    invoke-static {v1,v2}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_int-to-short()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 0x11234
+
+    int-to-short v1, v0
+
+    const/16 v2, 0x1234
+    invoke-static {v1,v2}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_add-int-2addr()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const/4 v0,5
+    const/16 v1, 23
+
+    add-int/2addr v0, v1
+
+    const/16 v1, 28
+    invoke-static {v0,v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_sub-int-2addr()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const/4 v0,5
+    const/16 v1, 23
+
+    sub-int/2addr v0, v1
+
+    const/16 v1, -18
+    invoke-static {v0,v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_mul-int-2addr()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const/4 v0,5
+    const/16 v1, 23
+
+    mul-int/2addr v0, v1
+
+    const/16 v1, 115
+    invoke-static {v0,v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_div-int-2addr()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const/4 v0,5
+    const/16 v1, 23
+
+    div-int/2addr v1, v0
+
+    const/16 v0, 4
+    invoke-static {v0,v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_rem-int-2addr()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const/4 v0,5
+    const/16 v1, 23
+
+    rem-int/2addr v1, v0
+
+    const/16 v0, 3
+    invoke-static {v0,v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_and-int-2addr()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const/4 v0,5
+    const/16 v1, 23
+
+    and-int/2addr v0, v1
+
+    const/16 v1, 5
+    invoke-static {v0,v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_or-int-2addr()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const/4 v0,5
+    const/16 v1, 23
+
+    or-int/2addr v0, v1
+
+    const/16 v1, 23
+    invoke-static {v0,v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_xor-int-2addr()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const/4 v0,5
+    const/16 v1, 23
+
+    xor-int/2addr v0, v1
+
+    const/16 v1, 18
+    invoke-static {v0,v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_shl-int-2addr()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const/16 v0,23
+    const/4 v1, 5
+
+    shl-int/2addr v0, v1
+
+    const/16 v1, 736
+    invoke-static {v0,v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_shr-int-2addr()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const/16 v0, -736
+    const/4 v1, 5
+
+    shr-int/2addr v0, v1
+
+    const/16 v1, -23
+    invoke-static {v0,v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_ushr-int-2addr()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const/16 v0, -736
+    const/4 v1, 5
+
+    ushr-int/2addr v0, v1
+
+    const v1, 134217705
+    invoke-static {v0,v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_add-long-2addr()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 5L
+    const-wide v2, 23L
+
+    add-long/2addr v0, v2
+
+    const-wide v2, 28
+    invoke-static {v0, v1, v2, v3}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_sub-long-2addr()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0,5
+    const-wide v2, 23
+
+    sub-long/2addr v0, v2
+
+    const-wide v2, -18
+    invoke-static {v0, v1, v2, v3}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_mul-long-2addr()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0,5
+    const-wide v2, 23
+
+    mul-long/2addr v0, v2
+
+    const-wide v2, 115
+    invoke-static {v0, v1, v2, v3}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_div-long-2addr()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0,5
+    const-wide v2, 23
+
+    div-long/2addr v2, v0
+
+    const-wide v0, 4
+    invoke-static {v0, v1, v2, v3}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_rem-long-2addr()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0,5
+    const-wide v2, 23
+
+    rem-long/2addr v2, v0
+
+    const-wide v0, 3
+    invoke-static {v0, v1, v2, v3}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_and-long-2addr()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0,5
+    const-wide v2, 23
+
+    and-long/2addr v0, v2
+
+    const-wide v2, 5
+    invoke-static {v0, v1, v2, v3}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_or-long-2addr()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0,5
+    const-wide v2, 23
+
+    or-long/2addr v0, v2
+
+    const-wide v2, 23
+    invoke-static {v0, v1, v2, v3}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_xor-long-2addr()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0,5
+    const-wide v2, 23
+
+    xor-long/2addr v0, v2
+
+    const-wide v2, 18
+    invoke-static {v0, v1, v2, v3}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_shl-long-2addr()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 23
+    const v2, 5
+
+    shl-long/2addr v0, v2
+
+    const-wide v2, 736
+    invoke-static {v0, v1, v2, v3}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_shr-long-2addr()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, -736
+    const v2, 5
+
+    shr-long/2addr v0, v2
+
+    const-wide v2, -23
+    invoke-static {v0, v1, v2, v3}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_ushr-long-2addr()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, -736
+    const v2, 5
+
+    ushr-long/2addr v0, v2
+
+    const-wide v2, 576460752303423465L
+    invoke-static {v0, v1, v2, v3}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_add-float-2addr()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 3.14159f
+    const v1, .11f
+
+    add-float/2addr v0, v1
+
+    const v1, 3.25159f
+    invoke-static {v0, v1}, LAssert;->assertEquals(FF)V
+    return-void
+.end method
+
+.method public test_sub-float-2addr()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 3.14159f
+    const v1, .11f
+
+    sub-float/2addr v0, v1
+
+    const v1, 3.03159f
+    invoke-static {v0, v1}, LAssert;->assertEquals(FF)V
+    return-void
+.end method
+
+.method public test_mul-float-2addr()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 3.14159f
+    const v1, .11f
+
+    mul-float/2addr v0, v1
+
+    const v1, .3455749f
+    invoke-static {v0, v1}, LAssert;->assertEquals(FF)V
+    return-void
+.end method
+
+.method public test_div-float-2addr()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 3.14159f
+    const v1, .11f
+
+    div-float/2addr v0, v1
+
+    const v1, 28.55990909f
+    invoke-static {v0, v1}, LAssert;->assertEquals(FF)V
+    return-void
+.end method
+
+.method public test_rem-float-2addr()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 3.14159f
+    const v1, .11f
+
+    rem-float/2addr v0, v1
+
+    const v1, .06159999f
+    invoke-static {v0, v1}, LAssert;->assertEquals(FF)V
+    return-void
+.end method
+
+.method public test_add-double-2addr()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 3.14159
+    const-wide v2, .11
+
+    add-double/2addr v0, v2
+
+    const-wide v2, 3.25159
+    invoke-static {v0, v1, v2, v3}, LAssert;->assertEquals(DD)V
+    return-void
+.end method
+
+.method public test_sub-double-2addr()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 3.14159
+    const-wide v2, .11
+
+    sub-double/2addr v0, v2
+
+    const-wide v2, 3.03159
+    invoke-static {v0, v1, v2, v3}, LAssert;->assertEquals(DD)V
+    return-void
+.end method
+
+.method public test_mul-double-2addr()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 3.14159
+    const-wide v2, .11
+
+    mul-double/2addr v0, v2
+
+    const-wide v2, .3455749
+    invoke-static {v0, v1, v2, v3}, LAssert;->assertEquals(DD)V
+    return-void
+.end method
+
+.method public test_div-double-2addr()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 3.14159
+    const-wide v2, .11
+
+    div-double/2addr v0, v2
+
+    const-wide v2, 28.55990909
+    invoke-static {v0, v1, v2, v3}, LAssert;->assertEquals(DD)V
+    return-void
+.end method
+
+.method public test_rem-double-2addr()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 3.14159
+    const-wide v2, .11
+
+    rem-double/2addr v0, v2
+
+    const-wide v2, .06159999
+    invoke-static {v0, v1, v2, v3}, LAssert;->assertEquals(DD)V
+    return-void
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format20t/Format20t.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format20t/Format20t.smali
new file mode 100644
index 0000000..d193cb5
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format20t/Format20t.smali
@@ -0,0 +1,1079 @@
+.class public LFormat20t;
+.super Ljava/lang/Object;
+.source "Format20t.smali"
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public test_goto-16()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+
+    const v0, 5
+
+    goto/16 :label
+
+    :label2
+
+
+    const v1, 6
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+
+    #enough nops to force the offset to be more than would fit in 1 byte
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+
+
+
+    :label
+    const v0, 6
+    goto/16 :label2
+
+
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+    return-void
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format21c/Format21c.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format21c/Format21c.smali
new file mode 100644
index 0000000..dcd91c4
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format21c/Format21c.smali
@@ -0,0 +1,210 @@
+.class public LFormat21c;
+.super Ljava/lang/Object;
+.source "Format21c.smali"
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public test_const-string()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-string v0, "test"
+
+    const-string v1, "test"
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+    return-void
+.end method
+
+.method public test_const-class()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-class v0, Ljava/io/PrintStream;
+
+    invoke-virtual {v0}, Ljava/lang/Class;->toString()Ljava/lang/String;
+    move-result-object v1
+
+    const-string v0, "class java.io.PrintStream"
+
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+
+    return-void
+.end method
+
+.method public test_check-cast-fail()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    :tryStart
+    const-string v0, "test"
+
+    check-cast v0, Ljava/io/PrintStream;
+    :tryEnd
+    .catch Ljava/lang/ClassCastException; {:tryStart .. :tryEnd} :handler
+
+    #the check-cast didn't throw an exception as expected
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+    :handler
+
+    return-void
+.end method
+
+.method public test_check-cast-success()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    :tryStart
+    const-string v0, "test"
+
+    check-cast v0, Ljava/lang/Object;
+    :tryEnd
+    .catch Ljava/lang/ClassCastException; {:tryStart .. :tryEnd} :handler
+
+    return-void
+
+    :handler
+
+    #the check-cast incorrectlly threw an exception as expected    
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+    return-void
+.end method
+
+.method public test_new-instance()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-string v0, "test"
+
+    new-instance v1, LStringWrapper;
+    invoke-direct {v1, v0}, LStringWrapper;-><init>(Ljava/lang/String;)V
+
+    invoke-virtual {v1}, LStringWrapper;->getValue()Ljava/lang/String;
+    move-result-object v2
+
+    invoke-static {v0, v2}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+
+    return-void
+.end method
+
+
+.method public test-sput__sget()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 23
+    sput v0, LStaticFields;->staticField:I
+
+    sget v1, LStaticFields;->staticField:I
+
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test-sput-object__sget-object()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-string v0, "a string"
+    sput-object v0, LStaticFields;->staticObjectField:Ljava/lang/String;
+
+    sget-object v1, LStaticFields;->staticObjectField:Ljava/lang/String;
+
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+    return-void
+.end method
+
+.method public test-sput-wide__sget-wide()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 0x200000000L
+    sput-wide v0, LStaticFields;->staticWideField:J
+
+    sget-wide v2, LStaticFields;->staticWideField:J
+
+    invoke-static {v0, v1, v2, v3}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test-sput-boolean__sget-boolean_true()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 1
+    sput-boolean v0, LStaticFields;->staticBooleanField:Z
+
+    sget-boolean v1, LStaticFields;->staticBooleanField:Z
+
+    invoke-static {v1}, Lorg/junit/Assert;->assertTrue(Z)V
+    return-void
+.end method
+
+.method public test-sput-boolean__sget-boolean_false()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 0
+    sput-boolean v0, LStaticFields;->staticBooleanField:Z
+
+    sget-boolean v1, LStaticFields;->staticBooleanField:Z
+
+    invoke-static {v1}, Lorg/junit/Assert;->assertFalse(Z)V
+    return-void
+.end method
+
+.method public test-sput-byte__sget-byte()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 120T
+    sput-byte v0, LStaticFields;->staticByteField:B
+
+    sget-byte v1, LStaticFields;->staticByteField:B
+
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test-sput-char__sget-char()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 'a'
+    sput-char v0, LStaticFields;->staticCharField:C
+
+    sget-char v1, LStaticFields;->staticCharField:C
+
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test-sput-short__sget-short()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 1234S
+    sput-short v0, LStaticFields;->staticShortField:S
+
+    sget-short v1, LStaticFields;->staticShortField:S
+
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format21c/StaticFields.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format21c/StaticFields.smali
new file mode 100644
index 0000000..80594c5
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format21c/StaticFields.smali
@@ -0,0 +1,10 @@
+.class public LStaticFields;
+.super Ljava/lang/Object;
+
+.field public static staticField:I
+.field public static staticWideField:J
+.field public static staticObjectField:Ljava/lang/String;
+.field public static staticBooleanField:Z
+.field public static staticByteField:B
+.field public static staticCharField:C
+.field public static staticShortField:S
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format21c/StringWrapper.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format21c/StringWrapper.smali
new file mode 100644
index 0000000..621e6c1
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format21c/StringWrapper.smali
@@ -0,0 +1,21 @@
+.class public LStringWrapper;
+.super Ljava/lang/Object;
+
+.field private stringValue:Ljava/lang/String;
+
+.method public constructor <init>(Ljava/lang/String;)V
+    .registers 2
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+
+    iput-object p1, p0, LStringWrapper;->stringValue:Ljava/lang/String; 
+
+    return-void
+.end method
+
+.method public getValue()Ljava/lang/String;
+    .registers 2
+
+    iget-object v0, p0, LStringWrapper;->stringValue:Ljava/lang/String;
+
+    return-object v0
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format21h/Format21h.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format21h/Format21h.smali
new file mode 100644
index 0000000..7eb6321
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format21h/Format21h.smali
@@ -0,0 +1,33 @@
+.class public LFormat21h;
+.super Ljava/lang/Object;
+.source "Format21h.smali"
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public test_const-high16()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const/high16 v0, 0x3000
+
+    const v1, 0x30000000
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_const-wide-high16()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide/high16 v0, 0x3000
+
+    const-wide v2, 0x3000000000000000L
+    invoke-static {v0, v1, v2, v3}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format21s/Format21s.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format21s/Format21s.smali
new file mode 100644
index 0000000..8337807
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format21s/Format21s.smali
@@ -0,0 +1,33 @@
+.class public LFormat21s;
+.super Ljava/lang/Object;
+.source "Format21s.smali"
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public test_const-16()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const/16 v0, 15000
+
+    const v1, 15000
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_const-wide-16()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide/16 v0, 15000
+
+    const-wide v2, 15000
+    invoke-static {v0, v1, v2, v3}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format21t/Format21t.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format21t/Format21t.smali
new file mode 100644
index 0000000..b1664a3
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format21t/Format21t.smali
@@ -0,0 +1,149 @@
+.class public LFormat21t;
+.super Ljava/lang/Object;
+.source "Format21t.smali"
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public test_if-eqz()V
+    .registers 1
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const/4 v0, 0
+           
+    if-eqz v0, :label1
+
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+    :label1
+    const/4 v0, 1
+
+    if-eqz v0, :label2
+    return-void
+
+    :label2
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+    return-void
+.end method
+
+
+.method public test_if-nez()V
+    .registers 1
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const/4 v0, 1
+
+    if-nez v0, :label1
+
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+    :label1
+    const/4 v0, 0
+
+    if-nez v0, :label2
+    return-void
+
+    :label2
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+    return-void
+.end method
+
+.method public test_if-ltz()V
+    .registers 1
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const/4 v0, -1
+
+    if-ltz v0, :label1
+
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+    :label1
+    const/4 v0, 0
+
+    if-ltz v0, :label2
+    return-void
+
+    :label2
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+    return-void
+.end method
+
+.method public test_if-gez()V
+    .registers 1
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const/4 v0, 0
+
+    if-gez v0, :label1
+
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+    :label1
+    const/4 v0, -1
+
+    if-gez v0, :label2
+    return-void
+
+    :label2
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+    return-void
+.end method
+
+.method public test_if-gtz()V
+    .registers 1
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const/4 v0, 1
+
+    if-gtz v0, :label1
+
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+    :label1
+    const/4 v0, 0
+
+    if-gtz v0, :label2
+    return-void
+
+    :label2
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+    return-void
+.end method
+
+
+.method public test_if-lez()V
+    .registers 1
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const/4 v0, 0
+
+    if-lez v0, :label1
+
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+    :label1
+    const/4 v0, 1
+
+    if-lez v0, :label2
+    return-void
+
+    :label2
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+    return-void
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format22b/Format22b.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format22b/Format22b.smali
new file mode 100644
index 0000000..b5d2621
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format22b/Format22b.smali
@@ -0,0 +1,163 @@
+.class public LFormat22b;
+.super Ljava/lang/Object;
+.source "Format22b.smali"
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public test_add-int-lit8()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 5
+
+    add-int/lit8 v1, v0, 23
+
+    const v0, 28
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_add-sub-lit8()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 23
+
+    rsub-int/lit8 v1, v0, 5
+
+    const v0, -18
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_mul-int-lit8()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 5
+
+    mul-int/lit8 v1, v0, 23
+
+    const v0, 115
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_div-int-lit8()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 23
+
+    div-int/lit8 v1, v0, 5
+
+    const v0, 4
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_rem-int-lit8()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 23
+
+    rem-int/lit8 v1, v0, 5
+
+    const v0, 3
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_and-int-lit8()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 5
+
+    and-int/lit8 v1, v0, 23
+
+    const v0, 5
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_or-int-lit8()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 5
+
+    or-int/lit8 v1, v0, 23
+
+    const v0, 23
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_xor-int-lit8()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 5
+
+    xor-int/lit8 v1, v0, 23
+
+    const v0, 18
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_shl-int-lit8()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 23
+
+    shl-int/lit8 v1, v0, 5
+
+    const v0, 736
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_shr-int-lit8()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, -736
+
+    shr-int/lit8 v1, v0, 5
+
+    const v0, -23
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_ushr-int-lit8()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, -736
+
+    ushr-int/lit8 v1, v0, 5
+
+    const v0, 134217705
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format22c/Format22c.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format22c/Format22c.smali
new file mode 100644
index 0000000..f890695
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format22c/Format22c.smali
@@ -0,0 +1,145 @@
+.class public LFormat22c;
+.super Ljava/lang/Object;
+.source "Format22c.smali"
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public test-iput__iget()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    new-instance v2, LInstanceFields;
+    invoke-direct {v2}, LInstanceFields;-><init>()V
+
+    const v0, 23
+    iput v0, v2, LInstanceFields;->instanceField:I
+
+    iget v1, v2, LInstanceFields;->instanceField:I
+
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test-iput-object__iget-object()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    new-instance v2, LInstanceFields;
+    invoke-direct {v2}, LInstanceFields;-><init>()V
+
+    const-string v0, "a string"
+    iput-object v0, v2, LInstanceFields;->instanceObjectField:Ljava/lang/String;
+
+    iget-object v1, v2, LInstanceFields;->instanceObjectField:Ljava/lang/String;
+
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+    return-void
+.end method
+
+.method public test-iput-wide__iget-wide()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    new-instance v2, LInstanceFields;
+    invoke-direct {v2}, LInstanceFields;-><init>()V
+
+    const-wide v0, 0x200000000L
+    iput-wide v0, v2, LInstanceFields;->instanceWideField:J
+
+    iget-wide v2, v2, LInstanceFields;->instanceWideField:J
+
+    invoke-static {v0, v1, v2, v3}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test-iput-boolean__iget-boolean_true()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    new-instance v2, LInstanceFields;
+    invoke-direct {v2}, LInstanceFields;-><init>()V
+
+    const v0, 1
+    iput-boolean v0, v2, LInstanceFields;->instanceBooleanField:Z
+
+    iget-boolean v1, v2, LInstanceFields;->instanceBooleanField:Z
+
+    invoke-static {v1}, Lorg/junit/Assert;->assertTrue(Z)V
+    return-void
+.end method
+
+.method public test-iput-boolean__iget-boolean_false()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    new-instance v2, LInstanceFields;
+    invoke-direct {v2}, LInstanceFields;-><init>()V
+
+    const v0, 0
+    iput-boolean v0, v2, LInstanceFields;->instanceBooleanField:Z
+
+    iget-boolean v1, v2, LInstanceFields;->instanceBooleanField:Z
+
+    invoke-static {v1}, Lorg/junit/Assert;->assertFalse(Z)V
+    return-void
+.end method
+
+.method public test-iput-byte__iget-byte()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    new-instance v2, LInstanceFields;
+    invoke-direct {v2}, LInstanceFields;-><init>()V
+
+    const v0, 120T
+    iput-byte v0, v2, LInstanceFields;->instanceByteField:B
+
+    iget-byte v1, v2, LInstanceFields;->instanceByteField:B
+
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test-iput-char__iget-char()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    new-instance v2, LInstanceFields;
+    invoke-direct {v2}, LInstanceFields;-><init>()V
+
+    const v0, 'a'
+    iput-char v0, v2, LInstanceFields;->instanceCharField:C
+
+    iget-char v1, v2, LInstanceFields;->instanceCharField:C
+
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test-iput-short__iget-short()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    new-instance v2, LInstanceFields;
+    invoke-direct {v2}, LInstanceFields;-><init>()V
+
+    const v0, 1234S
+    iput-short v0, v2, LInstanceFields;->instanceShortField:S
+
+    iget-short v1, v2, LInstanceFields;->instanceShortField:S
+
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method            
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format22c/InstanceFields.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format22c/InstanceFields.smali
new file mode 100644
index 0000000..2800fe1
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format22c/InstanceFields.smali
@@ -0,0 +1,16 @@
+.class public LInstanceFields;
+.super Ljava/lang/Object;
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {v0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.field public instanceField:I
+.field public instanceWideField:J
+.field public instanceObjectField:Ljava/lang/String;
+.field public instanceBooleanField:Z
+.field public instanceByteField:B
+.field public instanceCharField:C
+.field public instanceShortField:S
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format22s/Format22s.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format22s/Format22s.smali
new file mode 100644
index 0000000..5d36ce5
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format22s/Format22s.smali
@@ -0,0 +1,121 @@
+.class public LFormat22s;
+.super Ljava/lang/Object;
+.source "Format22s.smali"
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public test_add-int-lit8()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 5
+
+    add-int/lit16 v1, v0, 500
+
+    const v0, 505
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_add-sub-lit16()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 23
+
+    rsub-int v1, v0, 500
+
+    const v0, 477
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_mul-int-lit16()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 23
+
+    mul-int/lit16 v1, v0, 500
+
+    const v0, 11500
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_div-int-lit16()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 11503
+
+    div-int/lit16 v1, v0, 500
+
+    const v0, 23
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_rem-int-lit16()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 11503
+
+    rem-int/lit16 v1, v0, 500
+
+    const v0, 3
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_and-int-lit16()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 23
+
+    and-int/lit16 v1, v0, 500
+
+    const v0, 20
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_or-int-lit16()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 23
+
+    or-int/lit16 v1, v0, 500
+
+    const v0, 503
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_xor-int-lit16()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 23
+
+    xor-int/lit16 v1, v0, 500
+
+    const v0, 483
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format22t/Format22t.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format22t/Format22t.smali
new file mode 100644
index 0000000..a7b0d7c
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format22t/Format22t.smali
@@ -0,0 +1,154 @@
+.class public LFormat22t;
+.super Ljava/lang/Object;
+.source "Format22t.smali"
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+
+.method public test_if-eq()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 23
+    const v1, 23
+
+    if-eq v0, v1, :label1
+
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+    :label1
+    const v1, 24
+
+    if-eq v0, v1, :label2
+    return-void
+
+    :label2
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+    return-void
+.end method
+
+.method public test_if-ne()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 23
+    const v1, 24
+
+    if-ne v0, v1, :label1
+
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+    :label1
+    const v1, 23
+
+    if-ne v0, v1, :label2
+    return-void
+
+    :label2
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+    return-void
+.end method
+
+.method public test_if-lt()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 23
+    const v1, 24
+
+    if-lt v0, v1, :label1
+
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+    :label1
+    const v1, 23
+
+    if-lt v0, v1, :label2
+    return-void
+
+    :label2
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+    return-void
+.end method
+
+.method public test_if-ge()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 23
+    const v1, 23
+
+    if-ge v0, v1, :label1
+
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+    :label1
+    const v1, 24
+
+    if-ge v0, v1, :label2
+    return-void
+
+    :label2
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+    return-void
+.end method
+
+.method public test_if-gt()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 23
+    const v1, 22
+
+    if-gt v0, v1, :label1
+
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+    :label1
+    const v1, 23
+
+    if-gt v0, v1, :label2
+    return-void
+
+    :label2
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+    return-void
+.end method
+
+.method public test_if-le()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 23
+    const v1, 23
+
+    if-le v0, v1, :label1
+
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+    :label1
+    const v1, 22
+
+    if-le v0, v1, :label2
+    return-void
+
+    :label2
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+
+    return-void
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format22x/Format22x.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format22x/Format22x.smali
new file mode 100644
index 0000000..abcfaf7
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format22x/Format22x.smali
@@ -0,0 +1,51 @@
+.class public LFormat22x;
+.super Ljava/lang/Object;
+.source "Format22x.smali"
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public test_move-from16()V
+    .registers 276
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 6
+    move/16 v275, v0
+
+    move/from16 v1, v275
+
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_move-wide-from16()V
+    .registers 276
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 0x200000000L
+    move-wide/16 v274, v0
+
+    move-wide/from16 v2, v274
+
+    invoke-static {v0, v1, v2, v3}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_move-object-from16()V
+    .registers 276
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-string v0, "6"
+    move-object/16 v275, v0
+
+    move-object/from16 v1, v275
+
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+    return-void
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format23x/Format23x.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format23x/Format23x.smali
new file mode 100644
index 0000000..bccc637
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format23x/Format23x.smali
@@ -0,0 +1,891 @@
+.class public LFormat23x;
+.super Ljava/lang/Object;
+.source "Format23x.smali"
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public test_cmpl-float()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 123.4f
+    const v1, 234.5f
+
+    cmpl-float v0, v0, v1
+
+    const v1, -1
+
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_cmpl-float-NaN()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    sget v0, Ljava/lang/Float;->NaN:F
+    const v1, 234.5f
+
+    cmpl-float v0, v0, v1
+
+    const v1, -1
+
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_cmpg-float()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 123.4f
+    const v1, 234.5f
+
+    cmpg-float v0, v0, v1
+
+    const v1, -1
+
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_cmpg-float-NaN()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    sget v0, Ljava/lang/Float;->NaN:F
+    const v1, 234.5f
+
+    cmpg-float v0, v0, v1
+
+    const v1, 1
+
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+
+.method public test_cmpl-double()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 123.4
+    const-wide v2, 234.5
+
+    cmpl-double v0, v0, v2
+
+    const v1, -1
+
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_cmpl-double-NaN()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    sget-wide v0, Ljava/lang/Double;->NaN:D
+    const-wide v2, 234.5
+
+    cmpl-double v0, v0, v2
+
+    const v1, -1
+
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_cmpg-double()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 123.4
+    const-wide v2, 234.5
+
+    cmpg-double v0, v0, v2
+
+    const v1, -1
+
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_cmpg-double-NaN()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    sget-wide v0, Ljava/lang/Double;->NaN:D
+    const-wide v2, 234.5
+
+    cmpg-double v0, v0, v2
+
+    const v1, 1
+
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_cmp-long()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 0x100000000L
+    const-wide v2, 0x200000000L
+
+    cmp-long v0, v0, v2
+
+    const v1, -1
+
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void    
+.end method
+
+
+.method public test_aget__aput()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 3
+    new-array v0, v0, [I
+
+    const v1, 1
+    const v2, 0
+    aput v1, v0, v2
+
+    const v1, 2
+    const v2, 1
+    aput v1, v0, v2
+
+    const v1, 3
+    const v2, 2
+    aput v1, v0, v2
+
+
+    const v2, 0
+    aget v1, v0, v2
+    const v2, 1
+    invoke-static {v1, v2}, LAssert;->assertEquals(II)V
+
+    const v2, 1
+    aget v1, v0, v2
+    const v2, 2
+    invoke-static {v1, v2}, LAssert;->assertEquals(II)V
+
+    const v2, 2
+    aget v1, v0, v2
+    const v2, 3
+    invoke-static {v1, v2}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_aget-wide__aput-wide()V
+    .registers 5
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 3
+    new-array v0, v0, [J
+
+    const-wide v1, 0x100000000L
+    const v3, 0
+    aput-wide v1, v0, v3
+
+    const-wide v1, 0x100000001L
+    const v3, 1
+    aput-wide v1, v0, v3
+
+    const-wide v1, 0x100000002L
+    const v3, 2
+    aput-wide v1, v0, v3
+
+
+    const v3, 0
+    aget-wide v1, v0, v3
+    const-wide v3, 0x100000000L
+    invoke-static {v1, v2, v3, v4}, Lorg/junit/Assert;->assertEquals(JJ)V
+
+    const v3, 1
+    aget-wide v1, v0, v3
+    const-wide v3, 0x100000001L
+    invoke-static {v1, v2, v3, v4}, Lorg/junit/Assert;->assertEquals(JJ)V
+
+
+    const v3, 2
+    aget-wide v1, v0, v3
+    const-wide v3, 0x100000002L
+    invoke-static {v1, v2, v3, v4}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_aget-object__aput-object()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 3
+    new-array v0, v0, [Ljava/lang/String;
+
+    const-string v1, "1"
+    const v2, 0
+    aput-object v1, v0, v2
+
+    const-string v1, "2"
+    const v2, 1
+    aput-object v1, v0, v2
+
+    const-string v1, "3"
+    const v2, 2
+    aput-object v1, v0, v2
+
+
+    const v2, 0
+    aget-object v1, v0, v2
+    const-string v2, "1"
+    invoke-static {v1, v2}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+
+    const v2, 1
+    aget-object v1, v0, v2
+    const-string v2, "2"
+    invoke-static {v1, v2}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+
+    const v2, 2
+    aget-object v1, v0, v2
+    const-string v2, "3"
+    invoke-static {v1, v2}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+    return-void
+.end method
+
+.method public test_aget-boolean__aput-boolean()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 2
+    new-array v0, v0, [Z
+
+    const v1, 0
+    const v2, 0
+    aput-boolean v1, v0, v2
+
+    const v1, 1
+    const v2, 1
+    aput-boolean v1, v0, v2
+
+
+    const v2, 0
+    aget-boolean v1, v0, v2
+    invoke-static {v1}, Lorg/junit/Assert;->assertFalse(Z)V
+
+    const v2, 1
+    aget-boolean v1, v0, v2
+    invoke-static {v1}, Lorg/junit/Assert;->assertTrue(Z)V
+    return-void
+.end method
+
+.method public test_aget-byte__aput-byte()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 3
+    new-array v0, v0, [B
+
+    const v1, 1T
+    const v2, 0
+    aput-byte v1, v0, v2
+
+    const v1, 2T
+    const v2, 1
+    aput-byte v1, v0, v2
+
+    const v1, 3T
+    const v2, 2
+    aput-byte v1, v0, v2
+
+
+    const v2, 0
+    aget-byte v1, v0, v2
+    const v2, 1T
+    invoke-static {v1, v2}, LAssert;->assertEquals(II)V
+
+    const v2, 1
+    aget-byte v1, v0, v2
+    const v2, 2T
+    invoke-static {v1, v2}, LAssert;->assertEquals(II)V
+
+    const v2, 2
+    aget-byte v1, v0, v2
+    const v2, 3T
+    invoke-static {v1, v2}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_aget-char__aput-char()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 3
+    new-array v0, v0, [C
+
+    const v1, '1'
+    const v2, 0
+    aput-char v1, v0, v2
+
+    const v1, '2'
+    const v2, 1
+    aput-char v1, v0, v2
+
+    const v1, '3'
+    const v2, 2
+    aput-char v1, v0, v2
+
+
+    const v2, 0
+    aget-char v1, v0, v2
+    const v2, '1'
+    invoke-static {v1, v2}, LAssert;->assertEquals(II)V
+
+    const v2, 1
+    aget-char v1, v0, v2
+    const v2, '2'
+    invoke-static {v1, v2}, LAssert;->assertEquals(II)V
+
+    const v2, 2
+    aget-char v1, v0, v2
+    const v2, '3'
+    invoke-static {v1, v2}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_aget-short__aput-short()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 3
+    new-array v0, v0, [S
+
+    const v1, 1S
+    const v2, 0
+    aput-short v1, v0, v2
+
+    const v1, 2S
+    const v2, 1
+    aput-short v1, v0, v2
+
+    const v1, 3S
+    const v2, 2
+    aput-short v1, v0, v2
+
+
+    const v2, 0
+    aget-short v1, v0, v2
+    const v2, 1S
+    invoke-static {v1, v2}, LAssert;->assertEquals(II)V
+
+    const v2, 1
+    aget-short v1, v0, v2
+    const v2, 2S
+    invoke-static {v1, v2}, LAssert;->assertEquals(II)V
+
+    const v2, 2
+    aget-short v1, v0, v2
+    const v2, 3S
+    invoke-static {v1, v2}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_add-int()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 5
+    const v1, 23
+
+    add-int v2, v0, v1
+
+    const/16 v1, 28
+    invoke-static {v1,v2}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_sub-int()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 5
+    const v1, 23
+
+    sub-int v2, v0, v1
+
+    const/16 v1, -18
+    invoke-static {v1,v2}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_mul-int()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 5
+    const v1, 23
+
+    mul-int v2, v0, v1
+
+    const/16 v1, 115
+    invoke-static {v1,v2}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_div-int()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 5
+    const v1, 23
+
+    div-int v2, v1, v0
+
+    const/16 v1, 4
+    invoke-static {v1,v2}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_rem-int()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 5
+    const v1, 23
+
+    rem-int v2, v1, v0
+
+    const/16 v1, 3
+    invoke-static {v1,v2}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_and-int()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 5
+    const v1, 23
+
+    and-int v2, v0, v1
+
+    const/16 v1, 5
+    invoke-static {v1,v2}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_or-int()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 5
+    const v1, 23
+
+    or-int v2, v0, v1
+
+    const/16 v1, 23
+    invoke-static {v1,v2}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_xor-int()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 5
+    const v1, 23
+
+    xor-int v2, v0, v1
+
+    const/16 v1, 18
+    invoke-static {v1,v2}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_shl-int()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 23
+    const v1, 5
+
+    shl-int v2, v0, v1
+
+    const/16 v1, 736
+    invoke-static {v1,v2}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_shr-int()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, -736
+    const v1, 5
+
+    shr-int v2, v0, v1
+
+    const/16 v1, -23
+    invoke-static {v1,v2}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_ushr-int()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, -736
+    const v1, 5
+
+    ushr-int v2, v0, v1
+
+    const v1, 134217705
+    invoke-static {v1,v2}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_add-long()V
+    .registers 6
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 5L
+    const-wide v2, 23L
+
+    add-long v4, v0, v2
+
+    const-wide v2, 28
+    invoke-static {v2, v3, v4, v5}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_sub-long()V
+    .registers 6
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 5L
+    const-wide v2, 23L
+
+    sub-long v4, v0, v2
+
+    const-wide v2, -18
+    invoke-static {v2, v3, v4, v5}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_mul-long()V
+    .registers 6
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 5L
+    const-wide v2, 23L
+
+    mul-long v4, v0, v2
+
+    const-wide v2, 115
+    invoke-static {v2, v3, v4, v5}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_div-long()V
+    .registers 6
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 5L
+    const-wide v2, 23L
+
+    div-long v4, v2, v0
+
+    const-wide v2, 4
+    invoke-static {v2, v3, v4, v5}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_rem-long()V
+    .registers 6
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 5L
+    const-wide v2, 23L
+
+    rem-long v4, v2, v0
+
+    const-wide v2, 3
+    invoke-static {v2, v3, v4, v5}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_and-long()V
+    .registers 6
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 5L
+    const-wide v2, 23L
+
+    and-long v4, v0, v2
+
+    const-wide v2, 5
+    invoke-static {v2, v3, v4, v5}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_or-long()V
+    .registers 6
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 5L
+    const-wide v2, 23L
+
+    or-long v4, v0, v2
+
+    const-wide v2, 23
+    invoke-static {v2, v3, v4, v5}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_xor-long()V
+    .registers 6
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 5L
+    const-wide v2, 23L
+
+    xor-long v4, v0, v2
+
+    const-wide v2, 18
+    invoke-static {v2, v3, v4, v5}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_shl-long()V
+    .registers 6
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 23L
+    const v2, 5
+
+    shl-long v4, v0, v2
+
+    const-wide v2, 736
+    invoke-static {v2, v3, v4, v5}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_shr-long()V
+    .registers 6
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, -736L
+    const v2, 5
+
+    shr-long v4, v0, v2
+
+    const-wide v2, -23
+    invoke-static {v2, v3, v4, v5}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_ushr-long()V
+    .registers 6
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, -736L
+    const v2, 5
+
+    ushr-long v4, v0, v2
+
+    const-wide v2, 576460752303423465L
+    invoke-static {v2, v3, v4, v5}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_add-float()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 3.14159f
+    const v1, .11f
+
+    add-float v2, v0, v1
+
+    const v1, 3.25159f
+    invoke-static {v1, v2}, LAssert;->assertEquals(FF)V
+    return-void
+.end method
+
+.method public test_sub-float()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 3.14159f
+    const v1, .11f
+
+    sub-float v2, v0, v1
+
+    const v1, 3.03159f
+    invoke-static {v1, v2}, LAssert;->assertEquals(FF)V
+    return-void
+.end method
+
+.method public test_mul-float()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 3.14159f
+    const v1, .11f
+
+    mul-float v2, v0, v1
+
+    const v1, .3455749f
+    invoke-static {v1, v2}, LAssert;->assertEquals(FF)V
+    return-void
+.end method
+
+.method public test_div-float()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 3.14159f
+    const v1, .11f
+
+    div-float v2, v0, v1
+
+    const v1, 28.55990909f
+    invoke-static {v1, v2}, LAssert;->assertEquals(FF)V
+    return-void
+.end method
+
+.method public test_rem-float()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 3.14159f
+    const v1, .11f
+
+    rem-float v2, v0, v1
+
+    const v1, .06159999f
+    invoke-static {v1, v2}, LAssert;->assertEquals(FF)V
+    return-void
+.end method
+
+.method public test_add-double()V
+    .registers 6
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 3.14159
+    const-wide v2, .11
+
+    add-double v4, v0, v2
+
+    const-wide v2, 3.25159
+    invoke-static {v2, v3, v4, v5}, LAssert;->assertEquals(DD)V
+    return-void
+.end method
+
+.method public test_sub-double()V
+    .registers 6
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 3.14159
+    const-wide v2, .11
+
+    sub-double v4, v0, v2
+
+    const-wide v2, 3.03159
+    invoke-static {v2, v3, v4, v5}, LAssert;->assertEquals(DD)V
+    return-void
+.end method
+
+.method public test_mul-double()V
+    .registers 6
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 3.14159
+    const-wide v2, .11
+
+    mul-double v4, v0, v2
+
+    const-wide v2, .3455749
+    invoke-static {v2, v3, v4, v5}, LAssert;->assertEquals(DD)V
+    return-void
+.end method
+
+.method public test_div-double()V
+    .registers 6
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 3.14159
+    const-wide v2, .11
+
+    div-double v4, v0, v2
+
+    const-wide v2, 28.55990909
+    invoke-static {v2, v3, v4, v5}, LAssert;->assertEquals(DD)V
+    return-void
+.end method
+
+.method public test_rem-double()V
+    .registers 6
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 3.14159
+    const-wide v2, .11
+
+    rem-double v4, v0, v2
+
+    const-wide v2, .06159999
+    invoke-static {v2, v3, v4, v5}, LAssert;->assertEquals(DD)V
+    return-void
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format30t/Format30t.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format30t/Format30t.smali
new file mode 100644
index 0000000..fa87e55
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format30t/Format30t.smali
@@ -0,0 +1,70758 @@
+.class public LFormat30t;
+.super Ljava/lang/Object;
+.source "Format30t.smali"
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public test_goto-32()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+
+
+    const v0, 5
+
+    goto/32 :label
+
+    :label2
+
+    const v1, 6
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+
+    #enough nops to force the offset to be more than what would fit in 2 bytes
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+    nop
+
+
+    :label
+    const v0, 6
+    goto/32 :label2
+
+
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+    return-void
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format31i/Format31i.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format31i/Format31i.smali
new file mode 100644
index 0000000..7d4eed0
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format31i/Format31i.smali
@@ -0,0 +1,41 @@
+.class public LFormat31i;
+.super Ljava/lang/Object;
+.source "Format31i.smali"
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public test_const()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 0x10000000
+
+    invoke-static {v0}, Ljava/lang/Integer;->toString(I)Ljava/lang/String;
+    move-result-object v1
+
+    const-string v0, "268435456"
+
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+    return-void
+.end method
+
+.method public test_const-wide-32()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide/32 v0, 0x10000000
+
+    invoke-static {v0, v1}, Ljava/lang/Long;->toString(J)Ljava/lang/String;
+    move-result-object v1
+
+    const-string v0, "268435456"
+
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+    return-void
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format31t/Format31t.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format31t/Format31t.smali
new file mode 100644
index 0000000..424f8ae
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format31t/Format31t.smali
@@ -0,0 +1,131 @@
+.class public LFormat31t;
+.super Ljava/lang/Object;
+.source "Format31t.smali"
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public test_fill-array-data()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 6
+    new-array v0, v0, [I
+    fill-array-data v0, :ArrayData
+
+    const v1, 0
+    aget v2, v0, v1
+    const v1, 1
+    invoke-static {v1, v2}, LAssert;->assertEquals(II)V
+
+    const v1, 1
+    aget v2, v0, v1
+    const v1, 2
+    invoke-static {v1, v2}, LAssert;->assertEquals(II)V
+
+    const v1, 2
+    aget v2, v0, v1
+    const v1, 3
+    invoke-static {v1, v2}, LAssert;->assertEquals(II)V
+
+    const v1, 3
+    aget v2, v0, v1
+    const v1, 4
+    invoke-static {v1, v2}, LAssert;->assertEquals(II)V
+
+    const v1, 4
+    aget v2, v0, v1
+    const v1, 5
+    invoke-static {v1, v2}, LAssert;->assertEquals(II)V
+
+    const v1, 5
+    aget v2, v0, v1
+    const v1, 6
+    invoke-static {v1, v2}, LAssert;->assertEquals(II)V
+
+    return-void
+
+:ArrayData
+    .array-data 4
+        1 2 3 4 5 6
+    .end array-data
+.end method
+
+.method public test_packed-switch()V
+    .registers 1
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 12
+
+:switch
+    packed-switch v0, :PackedSwitch
+
+:Label10
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+    return-void
+
+:Label11
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+    return-void
+
+:Label12
+    return-void
+
+:Label13
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+    return-void
+
+:PackedSwitch
+    .packed-switch 10
+        :Label10
+        :Label11
+        :Label12
+        :Label13
+    .end packed-switch
+.end method
+
+
+.method public test_sparse-switch()V
+    .registers 1
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 13
+
+:switch
+    sparse-switch v0, :SparseSwitch
+
+:Label10
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+    return-void
+
+:Label20
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+    return-void
+
+:Label15
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+    return-void
+
+:Label13
+    return-void
+
+:Label99
+    invoke-static {}, Lorg/junit/Assert;->fail()V
+    return-void
+
+:SparseSwitch
+    .sparse-switch
+        10 -> :Label10
+        13 -> :Label13
+        15 -> :Label15
+        20 -> :Label20
+        99 -> :Label99
+    .end sparse-switch
+.end method
+
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format32x/Format32x.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format32x/Format32x.smali
new file mode 100644
index 0000000..40a8264
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format32x/Format32x.smali
@@ -0,0 +1,51 @@
+.class public LFormat32x;
+.super Ljava/lang/Object;
+.source "Format32x.smali"
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public test_move-16()V
+    .registers 500
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 123
+    move/16 v323, v0
+    move/16 v400, v323
+    move/16 v1, v400
+
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_move-wide-16()V
+    .registers 500
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 0x200000000L
+    move-wide/16 v400, v0
+    move-wide/16 v402, v400
+    move-wide/16 v2, v402
+
+    invoke-static {v0, v1, v2, v3}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+.method public test_move-object-16()V
+    .registers 500
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-string v0, "123"
+    move-object/16 v323, v0
+    move-object/16 v400, v323
+    move-object/16 v1, v400
+
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+    return-void
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format35c/Format35c.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format35c/Format35c.smali
new file mode 100644
index 0000000..fdd70f1
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format35c/Format35c.smali
@@ -0,0 +1,124 @@
+.class public LFormat35c;
+.super LMethodsSuper;
+.source "Format35c.smali"
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, LMethodsSuper;-><init>()V
+    return-void
+.end method
+
+.method public superMethodTest()I
+    .registers 1
+    const v0, 123
+    return v0
+.end method
+
+.method private directMethodTest()I
+    .registers 1
+    const v0, 23
+    return v0
+.end method
+
+
+.method public test_invoke-virtual()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    new-instance v0, LMethods;
+    invoke-direct {v0}, LMethods;-><init>()V
+
+    invoke-virtual {v0}, LMethods;->virtualMethodTest()I
+    move-result v0
+
+    const v1, 23
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_invoke-super()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    invoke-super {p0}, LFormat35c;->superMethodTest()I
+    move-result v0
+
+    const v1, 23
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_invoke-direct()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    invoke-direct {p0}, LFormat35c;->directMethodTest()I
+    move-result v0
+
+    const v1, 23
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_invoke-static()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    invoke-static {}, LMethods;->staticMethodTest()I
+    move-result v0
+
+    const v1, 23
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_invoke-interface()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    new-instance v0, LMethods;
+    invoke-direct {v0}, LMethods;-><init>()V
+
+    invoke-interface {v0}, LMethodsInterface;->interfaceMethodTest()I
+    move-result v0
+
+    const v1, 23
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_filled-new-array()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 10
+    const v1, 20
+    const v2, 30
+
+    filled-new-array {v0, v1, v2}, [I
+    move-result-object v0
+
+    const v1, 0
+    aget v2, v0, v1
+    const v1, 10
+    invoke-static {v1, v2}, LAssert;->assertEquals(II)V
+
+    const v1, 1
+    aget v2, v0, v1
+    const v1, 20
+    invoke-static {v1, v2}, LAssert;->assertEquals(II)V
+
+    const v1, 2
+    aget v2, v0, v1
+    const v1, 30
+    invoke-static {v1, v2}, LAssert;->assertEquals(II)V
+
+    return-void
+.end method
+
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format35c/Methods.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format35c/Methods.smali
new file mode 100644
index 0000000..2ed9066
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format35c/Methods.smali
@@ -0,0 +1,27 @@
+.class public LMethods;
+.super LMethodsSuper;
+.implements LMethodsInterface;
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, LMethodsSuper;-><init>()V
+    return-void
+.end method
+
+.method public virtualMethodTest()I
+    .registers 1
+    const v0, 23
+    return v0
+.end method
+
+.method public static staticMethodTest()I
+    .registers 1
+    const v0, 23
+    return v0
+.end method
+
+.method public interfaceMethodTest()I
+    .registers 1
+    const v0, 23
+    return v0
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format35c/MethodsInterface.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format35c/MethodsInterface.smali
new file mode 100644
index 0000000..f891eee
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format35c/MethodsInterface.smali
@@ -0,0 +1,5 @@
+.class public abstract interface LMethodsInterface;
+.super Ljava/lang/Object;
+
+.method public abstract interfaceMethodTest()I
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format35c/MethodsSuper.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format35c/MethodsSuper.smali
new file mode 100644
index 0000000..27a60aa
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format35c/MethodsSuper.smali
@@ -0,0 +1,20 @@
+.class public LMethodsSuper;
+.super Ljava/lang/Object;
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public superMethodTest()I
+    .registers 1
+    const v0, 23
+    return v0
+.end method
+
+.method public virtualMethodTest()I
+    .registers 1
+    const v0, 123
+    return v0
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format3rc/Format3rc.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format3rc/Format3rc.smali
new file mode 100644
index 0000000..f8462a3
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format3rc/Format3rc.smali
@@ -0,0 +1,197 @@
+.class public LFormat3rc;
+.super LRangeMethodsSuper;
+.source "Format3rc.smali"
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, LRangeMethodsSuper;-><init>()V
+    return-void
+.end method
+
+.method public superMethodTest(IIIIII)I
+    .registers 7
+
+    add-int v0, v1, v2
+    add-int v0, v0, v3
+    add-int v0, v0, v4
+    add-int v0, v0, v5
+    add-int v0, v0, v6
+
+    #add something extra, to make the test fail if this method is called instead of the super's method
+    const v1, 1
+    add-int v0, v0, v1
+
+    return v0
+.end method
+
+.method private directMethodTest(IIIIII)I
+    .registers 7
+
+    add-int v0, v1, v2
+    add-int v0, v0, v3
+    add-int v0, v0, v4
+    add-int v0, v0, v5
+    add-int v0, v0, v6
+
+    return v0
+.end method
+
+
+.method public test_invoke-virtual-range()V
+    .registers 7
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    new-instance v0, LRangeMethods;
+    invoke-direct {v0}, LRangeMethods;-><init>()V
+
+    const v1, 1
+    const v2, 2
+    const v3, 3
+    const v4, 4
+    const v5, 5
+    const v6, 6
+
+    invoke-virtual/range {v0 .. v6}, LRangeMethods;->virtualMethodTest(IIIIII)I
+    move-result v0
+
+    const v1, 21
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_invoke-super-range()V
+    .registers 7
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    move-object v0, p0
+    const v1, 1
+    const v2, 2
+    const v3, 3
+    const v4, 4
+    const v5, 5
+    const v6, 6
+
+    invoke-super/range {v0 .. v6}, LFormat3rc;->superMethodTest(IIIIII)I
+    move-result v0
+
+    const v1, 21
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_invoke-direct-range()V
+    .registers 7
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    move-object v0, p0
+    const v1, 1
+    const v2, 2
+    const v3, 3
+    const v4, 4
+    const v5, 5
+    const v6, 6
+
+    invoke-direct/range {v0 .. v6}, LFormat3rc;->directMethodTest(IIIIII)I
+    move-result v0
+
+    const v1, 21
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_invoke-static-range()V
+    .registers 7
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v1, 1
+    const v2, 2
+    const v3, 3
+    const v4, 4
+    const v5, 5
+    const v6, 6
+
+    invoke-static/range {v1 .. v6}, LRangeMethods;->staticMethodTest(IIIIII)I
+    move-result v0
+
+    const v1, 21
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_invoke-interface-range()V
+    .registers 7
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    move-object v0, p0
+    const v1, 1
+    const v2, 2
+    const v3, 3
+    const v4, 4
+    const v5, 5
+    const v6, 6
+
+    new-instance v0, LRangeMethods;
+    invoke-direct {v0}, LRangeMethods;-><init>()V
+
+    invoke-interface/range {v0 .. v6}, LRangeMethodsInterface;->interfaceMethodTest(IIIIII)I
+    move-result v0
+
+    const v1, 21
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+    return-void
+.end method
+
+.method public test_filled-new-array-range()V
+    .registers 6
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 1
+    const v1, 2
+    const v2, 3
+    const v3, 4
+    const v4, 5
+    const v5, 6
+
+
+    filled-new-array/range {v0 .. v5}, [I
+    move-result-object v0
+
+    const v1, 0
+    aget v2, v0, v1
+    const v1, 1
+    invoke-static {v1, v2}, LAssert;->assertEquals(II)V
+
+    const v1, 1
+    aget v2, v0, v1
+    const v1, 2
+    invoke-static {v1, v2}, LAssert;->assertEquals(II)V
+
+    const v1, 2
+    aget v2, v0, v1
+    const v1, 3
+    invoke-static {v1, v2}, LAssert;->assertEquals(II)V
+
+    const v1, 3
+    aget v2, v0, v1
+    const v1, 4
+    invoke-static {v1, v2}, LAssert;->assertEquals(II)V
+
+    const v1, 4
+    aget v2, v0, v1
+    const v1, 5
+    invoke-static {v1, v2}, LAssert;->assertEquals(II)V
+
+    const v1, 5
+    aget v2, v0, v1
+    const v1, 6
+    invoke-static {v1, v2}, LAssert;->assertEquals(II)V
+
+    return-void
+.end method
+
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format3rc/RangeMethods.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format3rc/RangeMethods.smali
new file mode 100644
index 0000000..7787147
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format3rc/RangeMethods.smali
@@ -0,0 +1,45 @@
+.class public LRangeMethods;
+.super LRangeMethodsSuper;
+.implements LRangeMethodsInterface;
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, LRangeMethodsSuper;-><init>()V
+    return-void
+.end method
+
+.method public virtualMethodTest(IIIIII)I
+    .registers 7
+
+    add-int v0, v1, v2
+    add-int v0, v0, v3
+    add-int v0, v0, v4
+    add-int v0, v0, v5
+    add-int v0, v0, v6
+
+    return v0
+.end method
+
+.method public static staticMethodTest(IIIIII)I
+    .registers 7
+
+    add-int v0, v1, v2
+    add-int v0, v0, v3
+    add-int v0, v0, v4
+    add-int v0, v0, v5
+    add-int v0, v0, v6
+
+    return v0
+.end method
+
+.method public interfaceMethodTest(IIIIII)I
+    .registers 7
+
+    add-int v0, v1, v2
+    add-int v0, v0, v3
+    add-int v0, v0, v4
+    add-int v0, v0, v5
+    add-int v0, v0, v6
+
+    return v0
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format3rc/RangeMethodsInterface.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format3rc/RangeMethodsInterface.smali
new file mode 100644
index 0000000..558376f
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format3rc/RangeMethodsInterface.smali
@@ -0,0 +1,5 @@
+.class public abstract interface LRangeMethodsInterface;
+.super Ljava/lang/Object;
+
+.method public abstract interfaceMethodTest(IIIIII)I
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format3rc/RangeMethodsSuper.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format3rc/RangeMethodsSuper.smali
new file mode 100644
index 0000000..a7f0a97
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format3rc/RangeMethodsSuper.smali
@@ -0,0 +1,36 @@
+.class public LRangeMethodsSuper;
+.super Ljava/lang/Object;
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public superMethodTest(IIIIII)I
+    .registers 7
+
+    add-int v0, v1, v2
+    add-int v0, v0, v3
+    add-int v0, v0, v4
+    add-int v0, v0, v5
+    add-int v0, v0, v6
+
+    return v0
+.end method
+
+.method public virtualMethodTest(IIIIII)I
+    .registers 7
+
+    add-int v0, v1, v2
+    add-int v0, v0, v3
+    add-int v0, v0, v4
+    add-int v0, v0, v5
+    add-int v0, v0, v6
+
+    #add something extra, to make the test fail if this method is called instead of the subclasses's method
+    const v1, 1
+    add-int v0, v0, v1
+
+    return v0
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format51l/Format51l.smali b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format51l/Format51l.smali
new file mode 100644
index 0000000..243774e
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/InstructionTests/Format51l/Format51l.smali
@@ -0,0 +1,22 @@
+.class public LFormat51l;
+.super Ljava/lang/Object;
+.source "Format51l.smali"
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public test_const-wide()V
+    .registers 4
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const-wide v0, 6
+
+    const-wide/16 v2, 6
+
+    invoke-static {v0, v1, v2, v3}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/LineTest/LineTest.smali b/smali-integration-tests/src/test/smali/junit-tests/LineTest/LineTest.smali
new file mode 100644
index 0000000..1a16dc5
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/LineTest/LineTest.smali
@@ -0,0 +1,44 @@
+.class public LLineTest;
+.super Ljava/lang/Object;
+.source "LineTest.smali"
+
+#this class tests line debug info
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public largerThanSignedShort()V
+    .registers 1
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    #a line number that just barely doesn't fit in a signed short
+    .line 0x8000
+
+	return-void
+.end method
+
+.method public largerThanUnsignedShort()V
+    .registers 1
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    #a line number that is way bigger than a signed short
+    .line 0x10000
+
+	return-void
+.end method
+
+.method public largerThanSignedInt()V
+    .registers 1
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    #a line number that just barely doesn't fit in a signed int
+    .line 0x80000000
+
+	return-void
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/SpecialInstructionPaddingTest/SpecialInstructionPaddingTest.smali b/smali-integration-tests/src/test/smali/junit-tests/SpecialInstructionPaddingTest/SpecialInstructionPaddingTest.smali
new file mode 100644
index 0000000..7e17dce
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/SpecialInstructionPaddingTest/SpecialInstructionPaddingTest.smali
@@ -0,0 +1,141 @@
+.class public LSpecialInstructionPaddingTest;
+.super Ljava/lang/Object;
+.source "InstructionPaddingTest.smali"
+
+.method public constructor <init>()V
+    .registers 1
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public test()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 0
+    invoke-static {}, LSpecialInstructionPaddingTest;->paddingTest()I
+    move-result v0
+
+
+
+    const/16 v1, 12
+
+    #the real test is that dalvik loaded and verified this class. This is
+    #mostly just to make sure that the method was actually called
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+
+    return-void
+.end method
+
+.method public static paddingTest()I
+    .registers  2
+
+    const v0, 12
+
+    packed-switch v0, :PackedSwitch
+
+:Label10
+    const v1, 10
+    return v1
+
+:Label11
+    const v1, 11
+    return v1
+
+:Label12
+    const v1, 12
+    return v1
+
+:Label13
+    const v1, 13
+    return v1
+
+    #this nop de-aligns the following packed-switch data
+    #smali should generate another nop before the packed-switch
+    #data to force alignment
+    nop
+
+:PackedSwitch
+    .packed-switch 10
+        :Label10
+        :Label11
+        :Label12
+        :Label13
+    .end packed-switch
+.end method
+
+
+
+.method public test2()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    const v0, 0
+    invoke-static {}, LSpecialInstructionPaddingTest;->paddingTest()I
+    move-result v0
+
+
+
+    const/16 v1, 12
+
+    #the real test is that dalvik loaded and verified this class. This is
+    #mostly just to make sure that the method was actually called
+    invoke-static {v0, v1}, LAssert;->assertEquals(II)V
+
+    return-void
+.end method
+
+.method public static paddingTest()I
+    .registers  2
+
+    const v0, 12
+
+    packed-switch v0, :PackedSwitch
+
+    packed-switch v0, :PackedSwitch2
+
+:Label10
+    const v1, 10
+    return v1
+
+:Label11
+    const v1, 11
+    return v1
+
+:Label12
+    const v1, 12
+    return v1
+
+:Label13
+    const v1, 13
+    return v1
+
+:PackedSwitch
+    .packed-switch 10
+        :Label10
+        :Label11
+        :Label12
+        :Label13
+    .end packed-switch
+
+    #this tests out an issue that occurred where the prior packed switch data starts at a byte offset
+    #that is 4 byte aligned but isn't 8 byte aligned, which caused the code to report the size of the
+    #instruction to be 2 bytes more than it should be.
+    #
+    #Normally, if things are working correctly, this nop will cause the following packed-switch data
+    #to be unaligned. But with the above issue, the logic will *think* that the packed switch data
+    #is aligned, and won't output the extra nop to align it, thus causing a verification error.
+    nop
+
+:PackedSwitch2
+    .packed-switch 10
+        :Label10
+        :Label11
+        :Label12
+        :Label13
+    .end packed-switch
+
+
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/StaticFieldInitializerTest/StaticFieldInitializerTest.smali b/smali-integration-tests/src/test/smali/junit-tests/StaticFieldInitializerTest/StaticFieldInitializerTest.smali
new file mode 100644
index 0000000..a07edf7
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/StaticFieldInitializerTest/StaticFieldInitializerTest.smali
@@ -0,0 +1,309 @@
+.class public LStaticFieldInitializerTest;
+.super Ljava/lang/Object;
+
+
+.field public static longStaticField:J = 0x300000000L
+.field public static longNegStaticField:J = -0x300000000L
+
+.field public static intStaticField:I = 0x70000000
+.field public static intNegStaticField:I = -500
+
+.field public static shortStaticField:S = 500s
+.field public static shortNegStaticField:S = -500s
+
+.field public static byteStaticField:B = 123t
+.field public static byteNegStaticField:B = 0xAAt
+
+.field public static floatStaticField:F = 3.1415926f
+
+.field public static doubleStaticField:D = 3.141592653589793
+
+.field public static charStaticField:C = 'a'
+.field public static charEscapedStaticField:C = '\n'
+
+.field public static boolTrueStaticField:Z = true
+.field public static boolFalseStaticField:Z = false
+
+.field public static typeStaticField:Ljava/lang/Class; = LStaticFieldInitializerTest;
+
+.field public static aStaticFieldWithoutAnInitializer:I
+
+
+.method public constructor <init>()V
+    .registers 1
+
+    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    return-void
+.end method
+
+.method public testLongStaticField()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    sget-wide v0, LStaticFieldInitializerTest;->longStaticField:J
+
+    const-string v2, "12884901888"
+
+    invoke-static {v0, v1}, Ljava/lang/Long;->toString(J)Ljava/lang/String;
+    move-result-object v0
+
+    invoke-static {v0, v2}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+
+    return-void
+.end method
+
+.method public testLongNegStaticField()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    sget-wide v0, LStaticFieldInitializerTest;->longNegStaticField:J
+
+    const-string v2, "-12884901888"
+
+    invoke-static {v0, v1}, Ljava/lang/Long;->toString(J)Ljava/lang/String;
+    move-result-object v0
+
+    invoke-static {v0, v2}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+
+    return-void
+.end method
+
+.method public testIntStaticField()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    sget v0, LStaticFieldInitializerTest;->intStaticField:I
+
+    const-string v1, "1879048192"
+
+    invoke-static {v0}, Ljava/lang/Integer;->toString(I)Ljava/lang/String;
+    move-result-object v0
+
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+
+    return-void
+.end method
+
+.method public testIntNegStaticField()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    sget v0, LStaticFieldInitializerTest;->intNegStaticField:I
+
+    const-string v1, "-500"
+
+    invoke-static {v0}, Ljava/lang/Integer;->toString(I)Ljava/lang/String;
+    move-result-object v0
+
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+
+    return-void
+.end method
+
+.method public testShortStaticField()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    sget-short v0, LStaticFieldInitializerTest;->shortStaticField:S
+
+    const-string v1, "500"
+
+    invoke-static {v0}, Ljava/lang/Integer;->toString(I)Ljava/lang/String;
+    move-result-object v0
+
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+
+    return-void
+.end method
+
+.method public testShortNegStaticField()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    sget-short v0, LStaticFieldInitializerTest;->shortNegStaticField:S
+
+    const-string v1, "-500"
+
+    invoke-static {v0}, Ljava/lang/Integer;->toString(I)Ljava/lang/String;
+    move-result-object v0
+
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+
+    return-void
+.end method
+
+.method public testByteStaticField()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    sget-byte v0, LStaticFieldInitializerTest;->byteStaticField:B
+
+    const-string v1, "123"
+
+    invoke-static {v0}, Ljava/lang/Integer;->toString(I)Ljava/lang/String;
+    move-result-object v0
+
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+
+    return-void
+.end method
+
+.method public testByteNegStaticField()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    sget-byte v0, LStaticFieldInitializerTest;->byteNegStaticField:B
+
+    const-string v1, "-86"
+
+    invoke-static {v0}, Ljava/lang/Integer;->toString(I)Ljava/lang/String;
+    move-result-object v0
+
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+
+    return-void
+.end method
+
+.method public testFloatStaticField()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    sget v0, LStaticFieldInitializerTest;->floatStaticField:F
+
+    const-string v1, "3.1415925"
+
+    invoke-static {v0}, Ljava/lang/Float;->toString(F)Ljava/lang/String;
+    move-result-object v0
+
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+
+    return-void
+.end method
+
+.method public testDoubleStaticField()V
+    .registers 3
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    sget-wide v0, LStaticFieldInitializerTest;->doubleStaticField:D
+
+    const-string v2, "3.141592653589793"
+
+    invoke-static {v0, v1}, Ljava/lang/Double;->toString(D)Ljava/lang/String;
+    move-result-object v0
+
+    invoke-static {v0, v2}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+
+    return-void
+.end method
+
+.method public testCharStaticField()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    sget-char v0, LStaticFieldInitializerTest;->charStaticField:C
+
+    const-string v1, "a"
+
+    invoke-static {v0}, Ljava/lang/Character;->toString(C)Ljava/lang/String;
+    move-result-object v0
+
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+
+    return-void
+.end method
+
+.method public testCharEscapedStaticField()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    sget-char v0, LStaticFieldInitializerTest;->charEscapedStaticField:C
+
+    const-string v1, "\n"
+
+    invoke-static {v0}, Ljava/lang/Character;->toString(C)Ljava/lang/String;
+    move-result-object v0
+
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+
+    return-void
+.end method
+
+.method public testBoolTrueStaticField()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    sget-boolean v0, LStaticFieldInitializerTest;->boolTrueStaticField:Z
+
+    const-string v1, "true"
+
+    invoke-static {v0}, Ljava/lang/Boolean;->toString(Z)Ljava/lang/String;
+    move-result-object v0
+
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+
+    return-void
+.end method
+
+.method public testBoolFalseStaticField()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    sget-boolean v0, LStaticFieldInitializerTest;->boolFalseStaticField:Z
+
+    const-string v1, "false"
+
+    invoke-static {v0}, Ljava/lang/Boolean;->toString(Z)Ljava/lang/String;
+    move-result-object v0
+
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+
+    return-void
+.end method
+
+.method public testTypeStaticField()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    sget-object v0, LStaticFieldInitializerTest;->typeStaticField:Ljava/lang/Class;
+
+    const-string v1, "class StaticFieldInitializerTest"
+
+    invoke-virtual {v0}, Ljava/lang/Class;->toString()Ljava/lang/String;
+    move-result-object v0
+
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+
+    return-void
+.end method
+
+.method public testAStaticFieldWithoutAnInitializer()V
+    .registers 2
+    .annotation runtime Lorg/junit/Test;
+    .end annotation
+
+    sget v0, LStaticFieldInitializerTest;->aStaticFieldWithoutAnInitializer:I
+
+    const-string v1, "0"
+
+    invoke-static {v0}, Ljava/lang/Integer;->toString(I)Ljava/lang/String;
+    move-result-object v0
+
+    invoke-static {v0, v1}, Lorg/junit/Assert;->assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V
+
+    return-void
+.end method
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/TestSuite.smali b/smali-integration-tests/src/test/smali/junit-tests/TestSuite.smali
new file mode 100644
index 0000000..b1ad578
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/TestSuite.smali
@@ -0,0 +1,54 @@
+.class public LAllTests;
+.super Ljava/lang/Object;
+
+#This class is a wrapper for all the classes in the junit-tests directory
+#
+#To run the tests, you need to use dx on the junit jar and push that to the
+#device/emulator, and then zip up the classes.dex containing this class
+#and all of the tests and push that to the device/emulator.
+#
+#dx --dex --output=classes.dex junit-4.6.jar
+#zip junit-4.6.zip classes.dex
+#adb push junit-4.6.zip /data/local
+#java -jar smali.jar --dex --output=classes.dex .
+#zip smali-junit-tests.zip classes.dex
+#adb push smali-junit-tests.zip /data/local
+#adb shell dalvikvm -cp /data/local/junit-4.6.zip:/data/local/smali-junit-tests.zip org.junit.runner.JUnitCore AllTests
+
+.annotation runtime Lorg/junit/runner/RunWith;
+    value = Lorg/junit/runners/Suite;
+.end annotation
+
+.annotation runtime Lorg/junit/runners/Suite$SuiteClasses;
+    value = {   LExceptionTest;,
+                LFieldTest;,
+                LSpecialInstructionPaddingTest;,
+                LStaticFieldInitializerTest;,
+                LLineTest;,
+                LFormat10x;,
+                LFormat10t;,
+                LFormat11n;,
+                LFormat11x;,
+                LFormat12x;,
+                LFormat20t;,
+                LFormat21c;,
+                LFormat21h;,
+                LFormat21s;,
+                LFormat21t;,
+                LFormat22b;,
+                LFormat22c;,
+                LFormat22s;,
+                LFormat22t;,
+                LFormat22x;,
+                LFormat23x;,
+                LFormat30t;,
+                LFormat31i;,
+                LFormat31t;,
+                LFormat32x;,
+                LFormat35c;,
+                LFormat3rc;,
+                LFormat51l;,
+                LGotoTest;,
+                LAnnotationTests;
+            }
+.end annotation
\ No newline at end of file
diff --git a/smali-integration-tests/src/test/smali/junit-tests/Util/Assert.smali b/smali-integration-tests/src/test/smali/junit-tests/Util/Assert.smali
new file mode 100644
index 0000000..9d2ae5e
--- /dev/null
+++ b/smali-integration-tests/src/test/smali/junit-tests/Util/Assert.smali
@@ -0,0 +1,41 @@
+.class public LAssert;
+.super Ljava/lang/Object;
+.source "Assert.smali"
+
+#junit's Assert doesn't have an AssertEquals method for ints, only longs
+.method public static assertEquals(II)V
+    .registers 4
+
+    int-to-long v0, p1
+    int-to-long p0, p0
+
+    invoke-static {v0, v1, p0, p1}, Lorg/junit/Assert;->assertEquals(JJ)V
+    return-void
+.end method
+
+#junit's Assert doesn't have an AssertEquals method for floats, only doubles
+.method public static assertEquals(FF)V
+    .registers 6
+
+    float-to-double v0, p0
+    float-to-double v2, p1
+
+    const-wide v4, .00001
+
+    invoke-static/range {v0..v5}, Lorg/junit/Assert;->assertEquals(DDD)V
+    return-void
+.end method
+
+#convenience method that supplies a default "Delta" argument
+.method public static assertEquals(DD)V
+    .registers 6
+
+    move-wide v0, p0
+    move-wide v2, p2
+
+    const-wide v4, .00001
+
+    invoke-static/range {v0..v5}, Lorg/junit/Assert;->assertEquals(DDD)V
+
+    return-void
+.end method
\ No newline at end of file
diff --git a/smali/build.gradle b/smali/build.gradle
new file mode 100644
index 0000000..6472f21
--- /dev/null
+++ b/smali/build.gradle
@@ -0,0 +1,152 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+apply plugin: 'antlr'
+apply plugin: 'org.xbib.gradle.plugin.jflex'
+
+buildscript {
+    repositories {
+        mavenCentral()
+    }
+    dependencies {
+        classpath depends.jflex_plugin
+        classpath depends.proguard_gradle
+    }
+}
+
+configurations {
+    // Remove the full antlr library that's added by the antlr plugin. We manually
+    // add the smaller antlr_runtime library instead
+    compile.exclude group: 'org.antlr', module: 'antlr'
+}
+
+sourceSets {
+    main {
+        resources {
+            // This adds the generated .tokens files to the jar
+            srcDir 'build/generated-src/antlr/main'
+        }
+    }
+}
+
+idea {
+    module {
+        excludeDirs -= buildDir
+        if (buildDir.exists()) {
+            excludeDirs.addAll(buildDir.listFiles())
+        }
+        for (sourceDir in (sourceDirs + testSourceDirs)) {
+            excludeDirs.remove(sourceDir);
+            while ((sourceDir = sourceDir.getParentFile()) != null) {
+                excludeDirs.remove(sourceDir);
+            }
+        }
+    }
+}
+
+dependencies {
+    compile project(':util')
+    compile project(':dexlib2')
+    compile depends.antlr_runtime
+    compile depends.jcommander
+    compile depends.stringtemplate
+
+    testCompile depends.junit
+
+    antlr depends.antlr
+}
+
+processResources.inputs.property('version', version)
+processResources.expand('version': version)
+
+// Build a separate jar that contains all dependencies
+task fatJar(type: Jar, dependsOn: jar) {
+    from sourceSets.main.output
+    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
+
+    classifier = 'fat'
+
+    manifest {
+        attributes('Main-Class': 'org.jf.smali.Main')
+    }
+
+    doLast {
+        if (!System.getProperty('os.name').toLowerCase().contains('windows')) {
+            ant.symlink(link: file("${destinationDir}/smali.jar"), resource: archivePath, overwrite: true)
+        }
+    }
+}
+tasks.getByPath('build').dependsOn(fatJar)
+
+generateTestGrammarSource {
+    outputDirectory = new File(outputDirectory, 'org/jf/smali')
+}
+
+generateGrammarSource {
+    outputDirectory = new File(outputDirectory, 'org/jf/smali')
+}
+
+jflex {
+    generateDir = new File(generateDir, 'org/jf/smali')
+}
+
+uploadArchives {
+    repositories.mavenDeployer {
+        pom.project {
+            description 'smali is an assembler for dalvik bytecode'
+            scm {
+                url 'https://github.com/JesusFreke/smali/tree/master/smali'
+            }
+        }
+    }
+}
+
+task proguard(type: proguard.gradle.ProGuardTask, dependsOn: fatJar) {
+    def outFile = fatJar.destinationDir.getPath() + '/' + fatJar.baseName + '-' +
+            fatJar.version + '-small' + '.' + fatJar.extension
+
+    injars fatJar.archivePath
+    outjars outFile
+
+    libraryjars "${System.properties['java.home']}/lib/rt.jar"
+
+    dontobfuscate
+    dontoptimize
+
+    keep 'public class org.jf.smali.Main { public static void main(java.lang.String[]); }'
+    keep 'class com.beust.jcommander.** { *; }'
+    keepclassmembers 'enum * { public static **[] values(); public static ** valueOf(java.lang.String); }'
+
+    dontwarn 'com.google.common.**'
+    dontnote 'com.google.common.**'
+}
+
+tasks.getByPath(':release').dependsOn(proguard)
diff --git a/smali/src/main/antlr/smaliParser.g b/smali/src/main/antlr/smaliParser.g
new file mode 100644
index 0000000..eb13df4
--- /dev/null
+++ b/smali/src/main/antlr/smaliParser.g
@@ -0,0 +1,1200 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+parser grammar smaliParser;
+
+options {
+  output=AST;
+  ASTLabelType=CommonTree;
+}
+
+tokens {
+  //Lexer tokens
+  ACCESS_SPEC;
+  ANNOTATION_DIRECTIVE;
+  ANNOTATION_VISIBILITY;
+  ARRAY_DATA_DIRECTIVE;
+  ARRAY_TYPE_PREFIX;
+  ARROW;
+  AT;
+  BOOL_LITERAL;
+  BYTE_LITERAL;
+  CATCH_DIRECTIVE;
+  CATCHALL_DIRECTIVE;
+  CHAR_LITERAL;
+  CLASS_DESCRIPTOR;
+  CLASS_DIRECTIVE;
+  CLOSE_BRACE;
+  CLOSE_PAREN;
+  COLON;
+  COMMA;
+  DOTDOT;
+  DOUBLE_LITERAL;
+  DOUBLE_LITERAL_OR_ID;
+  END_ANNOTATION_DIRECTIVE;
+  END_ARRAY_DATA_DIRECTIVE;
+  END_FIELD_DIRECTIVE;
+  END_LOCAL_DIRECTIVE;
+  END_METHOD_DIRECTIVE;
+  END_PACKED_SWITCH_DIRECTIVE;
+  END_PARAMETER_DIRECTIVE;
+  END_SPARSE_SWITCH_DIRECTIVE;
+  END_SUBANNOTATION_DIRECTIVE;
+  ENUM_DIRECTIVE;
+  EPILOGUE_DIRECTIVE;
+  EQUAL;
+  FIELD_DIRECTIVE;
+  FIELD_OFFSET;
+  FLOAT_LITERAL;
+  FLOAT_LITERAL_OR_ID;
+  HIDDENAPI_RESTRICTION;
+  IMPLEMENTS_DIRECTIVE;
+  INLINE_INDEX;
+  INSTRUCTION_FORMAT10t;
+  INSTRUCTION_FORMAT10x;
+  INSTRUCTION_FORMAT10x_ODEX;
+  INSTRUCTION_FORMAT11n;
+  INSTRUCTION_FORMAT11x;
+  INSTRUCTION_FORMAT12x;
+  INSTRUCTION_FORMAT12x_OR_ID;
+  INSTRUCTION_FORMAT20bc;
+  INSTRUCTION_FORMAT20t;
+  INSTRUCTION_FORMAT21c_FIELD;
+  INSTRUCTION_FORMAT21c_FIELD_ODEX;
+  INSTRUCTION_FORMAT21c_STRING;
+  INSTRUCTION_FORMAT21c_TYPE;
+  INSTRUCTION_FORMAT21ih;
+  INSTRUCTION_FORMAT21lh;
+  INSTRUCTION_FORMAT21s;
+  INSTRUCTION_FORMAT21t;
+  INSTRUCTION_FORMAT22b;
+  INSTRUCTION_FORMAT22c_FIELD;
+  INSTRUCTION_FORMAT22c_FIELD_ODEX;
+  INSTRUCTION_FORMAT22c_TYPE;
+  INSTRUCTION_FORMAT22cs_FIELD;
+  INSTRUCTION_FORMAT22s;
+  INSTRUCTION_FORMAT22s_OR_ID;
+  INSTRUCTION_FORMAT22t;
+  INSTRUCTION_FORMAT22x;
+  INSTRUCTION_FORMAT23x;
+  INSTRUCTION_FORMAT30t;
+  INSTRUCTION_FORMAT31c;
+  INSTRUCTION_FORMAT31i;
+  INSTRUCTION_FORMAT31i_OR_ID;
+  INSTRUCTION_FORMAT31t;
+  INSTRUCTION_FORMAT32x;
+  INSTRUCTION_FORMAT35c_CALL_SITE;
+  INSTRUCTION_FORMAT35c_METHOD;
+  INSTRUCTION_FORMAT35c_METHOD_ODEX;
+  INSTRUCTION_FORMAT35c_METHOD_OR_METHOD_HANDLE_TYPE;
+  INSTRUCTION_FORMAT35c_TYPE;
+  INSTRUCTION_FORMAT35mi_METHOD;
+  INSTRUCTION_FORMAT35ms_METHOD;
+  INSTRUCTION_FORMAT3rc_CALL_SITE;
+  INSTRUCTION_FORMAT3rc_METHOD;
+  INSTRUCTION_FORMAT3rc_METHOD_ODEX;
+  INSTRUCTION_FORMAT3rc_TYPE;
+  INSTRUCTION_FORMAT3rmi_METHOD;
+  INSTRUCTION_FORMAT3rms_METHOD;
+  INSTRUCTION_FORMAT45cc_METHOD;
+  INSTRUCTION_FORMAT4rcc_METHOD;
+  INSTRUCTION_FORMAT51l;
+  LINE_COMMENT;
+  LINE_DIRECTIVE;
+  LOCAL_DIRECTIVE;
+  LOCALS_DIRECTIVE;
+  LONG_LITERAL;
+  METHOD_DIRECTIVE;
+  METHOD_HANDLE_TYPE_FIELD;
+  METHOD_HANDLE_TYPE_METHOD;
+  MEMBER_NAME;
+  NEGATIVE_INTEGER_LITERAL;
+  NULL_LITERAL;
+  OPEN_BRACE;
+  OPEN_PAREN;
+  PACKED_SWITCH_DIRECTIVE;
+  PARAM_LIST_OR_ID_PRIMITIVE_TYPE;
+  PARAMETER_DIRECTIVE;
+  POSITIVE_INTEGER_LITERAL;
+  PRIMITIVE_TYPE;
+  PROLOGUE_DIRECTIVE;
+  REGISTER;
+  REGISTERS_DIRECTIVE;
+  RESTART_LOCAL_DIRECTIVE;
+  SHORT_LITERAL;
+  SIMPLE_NAME;
+  SOURCE_DIRECTIVE;
+  SPARSE_SWITCH_DIRECTIVE;
+  STRING_LITERAL;
+  SUBANNOTATION_DIRECTIVE;
+  SUPER_DIRECTIVE;
+  VERIFICATION_ERROR_TYPE;
+  VOID_TYPE;
+  VTABLE_INDEX;
+  WHITE_SPACE;
+
+  // misc non-lexer tokens
+  INTEGER_LITERAL;
+  INVALID_TOKEN;
+
+  //I_* tokens are imaginary tokens used as parent AST nodes
+  I_CLASS_DEF;
+  I_SUPER;
+  I_IMPLEMENTS;
+  I_SOURCE;
+  I_ACCESS_LIST;
+  I_ACCESS_OR_RESTRICTION_LIST;
+  I_METHODS;
+  I_FIELDS;
+  I_FIELD;
+  I_FIELD_TYPE;
+  I_FIELD_INITIAL_VALUE;
+  I_METHOD;
+  I_METHOD_PROTOTYPE;
+  I_METHOD_RETURN_TYPE;
+  I_REGISTERS;
+  I_LOCALS;
+  I_LABEL;
+  I_ANNOTATIONS;
+  I_ANNOTATION;
+  I_ANNOTATION_ELEMENT;
+  I_SUBANNOTATION;
+  I_ENCODED_METHOD_HANDLE;
+  I_ENCODED_FIELD;
+  I_ENCODED_METHOD;
+  I_ENCODED_ENUM;
+  I_ENCODED_ARRAY;
+  I_ARRAY_ELEMENT_SIZE;
+  I_ARRAY_ELEMENTS;
+  I_PACKED_SWITCH_START_KEY;
+  I_PACKED_SWITCH_ELEMENTS;
+  I_SPARSE_SWITCH_ELEMENTS;
+  I_CATCH;
+  I_CATCHALL;
+  I_CATCHES;
+  I_PARAMETER;
+  I_PARAMETERS;
+  I_PARAMETER_NOT_SPECIFIED;
+  I_LINE;
+  I_LOCAL;
+  I_END_LOCAL;
+  I_RESTART_LOCAL;
+  I_PROLOGUE;
+  I_EPILOGUE;
+  I_ORDERED_METHOD_ITEMS;
+  I_STATEMENT_FORMAT10t;
+  I_STATEMENT_FORMAT10x;
+  I_STATEMENT_FORMAT11n;
+  I_STATEMENT_FORMAT11x;
+  I_STATEMENT_FORMAT12x;
+  I_STATEMENT_FORMAT20bc;
+  I_STATEMENT_FORMAT20t;
+  I_STATEMENT_FORMAT21c_TYPE;
+  I_STATEMENT_FORMAT21c_FIELD;
+  I_STATEMENT_FORMAT21c_STRING;
+  I_STATEMENT_FORMAT21c_METHOD_HANDLE;
+  I_STATEMENT_FORMAT21c_METHOD_TYPE;
+  I_STATEMENT_FORMAT21ih;
+  I_STATEMENT_FORMAT21lh;
+  I_STATEMENT_FORMAT21s;
+  I_STATEMENT_FORMAT21t;
+  I_STATEMENT_FORMAT22b;
+  I_STATEMENT_FORMAT22c_FIELD;
+  I_STATEMENT_FORMAT22c_TYPE;
+  I_STATEMENT_FORMAT22s;
+  I_STATEMENT_FORMAT22t;
+  I_STATEMENT_FORMAT22x;
+  I_STATEMENT_FORMAT23x;
+  I_STATEMENT_FORMAT30t;
+  I_STATEMENT_FORMAT31c;
+  I_STATEMENT_FORMAT31i;
+  I_STATEMENT_FORMAT31t;
+  I_STATEMENT_FORMAT32x;
+  I_STATEMENT_FORMAT35c_CALL_SITE;
+  I_STATEMENT_FORMAT35c_METHOD;
+  I_STATEMENT_FORMAT35c_TYPE;
+  I_STATEMENT_FORMAT3rc_CALL_SITE;
+  I_STATEMENT_FORMAT3rc_METHOD;
+  I_STATEMENT_FORMAT3rc_TYPE;
+  I_STATEMENT_FORMAT45cc_METHOD;
+  I_STATEMENT_FORMAT4rcc_METHOD;
+  I_STATEMENT_FORMAT51l;
+  I_STATEMENT_ARRAY_DATA;
+  I_STATEMENT_PACKED_SWITCH;
+  I_STATEMENT_SPARSE_SWITCH;
+  I_REGISTER_RANGE;
+  I_REGISTER_LIST;
+  I_CALL_SITE_EXTRA_ARGUMENTS;
+  I_CALL_SITE_REFERENCE;
+}
+
+@header {
+package org.jf.smali;
+
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.Opcodes;
+}
+
+
+@members {
+  public static final int ERROR_CHANNEL = 100;
+
+  private boolean verboseErrors = false;
+  private boolean allowOdex = false;
+  private int apiLevel = 15;
+  private Opcodes opcodes = Opcodes.forApi(apiLevel);
+
+  public void setVerboseErrors(boolean verboseErrors) {
+    this.verboseErrors = verboseErrors;
+  }
+
+  public void setAllowOdex(boolean allowOdex) {
+      this.allowOdex = allowOdex;
+  }
+
+  public void setApiLevel(int apiLevel) {
+      this.opcodes = Opcodes.forApi(apiLevel);
+      this.apiLevel = apiLevel;
+  }
+
+  public String getErrorMessage(RecognitionException e,
+    String[] tokenNames) {
+
+    if (verboseErrors) {
+      List stack = getRuleInvocationStack(e, this.getClass().getName());
+      String msg = null;
+
+      if (e instanceof NoViableAltException) {
+        NoViableAltException nvae = (NoViableAltException)e;
+        msg = " no viable alt; token="+getTokenErrorDisplay(e.token)+
+        " (decision="+nvae.decisionNumber+
+        " state "+nvae.stateNumber+")"+
+        " decision=<<"+nvae.grammarDecisionDescription+">>";
+      } else {
+        msg = super.getErrorMessage(e, tokenNames);
+      }
+
+      return stack + " " + msg;
+    } else {
+      return super.getErrorMessage(e, tokenNames);
+    }
+  }
+
+  public String getTokenErrorDisplay(Token t) {
+    if (!verboseErrors) {
+      String s = t.getText();
+      if ( s==null ) {
+        if ( t.getType()==Token.EOF ) {
+          s = "<EOF>";
+        }
+        else {
+          s = "<"+tokenNames[t.getType()]+">";
+        }
+      }
+      s = s.replaceAll("\n","\\\\n");
+      s = s.replaceAll("\r","\\\\r");
+      s = s.replaceAll("\t","\\\\t");
+      return "'"+s+"'";
+    }
+
+    CommonToken ct = (CommonToken)t;
+
+    String channelStr = "";
+    if (t.getChannel()>0) {
+      channelStr=",channel="+t.getChannel();
+    }
+    String txt = t.getText();
+    if ( txt!=null ) {
+      txt = txt.replaceAll("\n","\\\\n");
+      txt = txt.replaceAll("\r","\\\\r");
+      txt = txt.replaceAll("\t","\\\\t");
+    }
+    else {
+      txt = "<no text>";
+    }
+    return "[@"+t.getTokenIndex()+","+ct.getStartIndex()+":"+ct.getStopIndex()+"='"+txt+"',<"+tokenNames[t.getType()]+">"+channelStr+","+t.getLine()+":"+t.getCharPositionInLine()+"]";
+  }
+
+  public String getErrorHeader(RecognitionException e) {
+    return getSourceName()+"["+ e.line+","+e.charPositionInLine+"]";
+  }
+
+  private CommonTree buildTree(int type, String text, List<CommonTree> children) {
+    CommonTree root = new CommonTree(new CommonToken(type, text));
+    for (CommonTree child: children) {
+      root.addChild(child);
+    }
+    return root;
+  }
+
+  private CommonToken getParamListSubToken(CommonToken baseToken, String str, int typeStartIndex) {
+    CommonToken token = new CommonToken(baseToken);
+    token.setStartIndex(baseToken.getStartIndex() + typeStartIndex);
+
+    switch (str.charAt(typeStartIndex)) {
+      case 'Z':
+      case 'B':
+      case 'S':
+      case 'C':
+      case 'I':
+      case 'J':
+      case 'F':
+      case 'D':
+      {
+        token.setType(PRIMITIVE_TYPE);
+        token.setText(str.substring(typeStartIndex, typeStartIndex+1));
+        token.setStopIndex(baseToken.getStartIndex() + typeStartIndex);
+        break;
+      }
+      case 'L':
+      {
+        int i = typeStartIndex;
+        while (str.charAt(++i) != ';');
+
+        token.setType(CLASS_DESCRIPTOR);
+        token.setText(str.substring(typeStartIndex, i + 1));
+        token.setStopIndex(baseToken.getStartIndex() + i);
+        break;
+      }
+      case '[':
+      {
+        int i = typeStartIndex;
+        while (str.charAt(++i) == '[');
+
+        token.setType(ARRAY_TYPE_PREFIX);
+        token.setText(str.substring(typeStartIndex, i));
+        token.setStopIndex(baseToken.getStartIndex() + i - 1);
+        break;
+      }
+      default:
+        throw new RuntimeException(String.format("Invalid character '\%c' in param list \"\%s\" at position \%d", str.charAt(typeStartIndex), str, typeStartIndex));
+    }
+
+    return token;
+  }
+
+  private CommonTree parseParamList(CommonToken paramListToken) {
+    String paramList = paramListToken.getText();
+    CommonTree root = new CommonTree();
+
+    int startIndex = paramListToken.getStartIndex();
+
+    int i=0;
+    while (i<paramList.length()) {
+      CommonToken token = getParamListSubToken(paramListToken, paramList, i);
+      root.addChild(new CommonTree(token));
+      i += token.getText().length();
+    }
+
+    if (root.getChildCount() == 0) {
+      return null;
+    }
+    return root;
+  }
+
+  private void throwOdexedInstructionException(IntStream input, String odexedInstruction)
+      throws OdexedInstructionException {
+    /*this has to be done in a separate method, otherwise java will complain about the
+    auto-generated code in the rule after the throw not being reachable*/
+    throw new OdexedInstructionException(input, odexedInstruction);
+  }
+}
+
+
+smali_file
+  scope
+  {
+    boolean hasClassSpec;
+    boolean hasSuperSpec;
+    boolean hasSourceSpec;
+    List<CommonTree> classAnnotations;
+  }
+  @init
+  { $smali_file::hasClassSpec = $smali_file::hasSuperSpec = $smali_file::hasSourceSpec = false;
+    $smali_file::classAnnotations = new ArrayList<CommonTree>();
+  }
+  :
+  ( {!$smali_file::hasClassSpec}?=> class_spec {$smali_file::hasClassSpec = true;}
+  | {!$smali_file::hasSuperSpec}?=> super_spec {$smali_file::hasSuperSpec = true;}
+  | implements_spec
+  | {!$smali_file::hasSourceSpec}?=> source_spec {$smali_file::hasSourceSpec = true;}
+  | method
+  | field
+  | annotation {$smali_file::classAnnotations.add($annotation.tree);}
+  )+
+  EOF
+  {
+    if (!$smali_file::hasClassSpec) {
+      throw new SemanticException(input, "The file must contain a .class directive");
+    }
+
+    if (!$smali_file::hasSuperSpec) {
+      if (!$class_spec.className.equals("Ljava/lang/Object;")) {
+        throw new SemanticException(input, "The file must contain a .super directive");
+      }
+    }
+  }
+  -> ^(I_CLASS_DEF
+       class_spec
+       super_spec?
+       implements_spec*
+       source_spec?
+       ^(I_METHODS method*) ^(I_FIELDS field*) {buildTree(I_ANNOTATIONS, "I_ANNOTATIONS", $smali_file::classAnnotations)});
+
+class_spec returns[String className]
+  : CLASS_DIRECTIVE access_list CLASS_DESCRIPTOR {$className = $CLASS_DESCRIPTOR.text;} -> CLASS_DESCRIPTOR access_list;
+
+super_spec
+  : SUPER_DIRECTIVE CLASS_DESCRIPTOR -> ^(I_SUPER[$start, "I_SUPER"] CLASS_DESCRIPTOR);
+
+implements_spec
+  : IMPLEMENTS_DIRECTIVE CLASS_DESCRIPTOR -> ^(I_IMPLEMENTS[$start, "I_IMPLEMENTS"] CLASS_DESCRIPTOR);
+
+source_spec
+  : SOURCE_DIRECTIVE STRING_LITERAL -> ^(I_SOURCE[$start, "I_SOURCE"] STRING_LITERAL);
+
+access_list
+  : ACCESS_SPEC* -> ^(I_ACCESS_LIST[$start,"I_ACCESS_LIST"] ACCESS_SPEC*);
+
+access_or_restriction
+  : ACCESS_SPEC | HIDDENAPI_RESTRICTION;
+
+access_or_restriction_list
+  : access_or_restriction*
+  -> ^(I_ACCESS_OR_RESTRICTION_LIST[$start,"I_ACCESS_AND_RESTRICTION_LIST"] access_or_restriction*);
+
+
+/*When there are annotations immediately after a field definition, we don't know whether they are field annotations
+or class annotations until we determine if there is an .end field directive. In either case, we still "consume" and parse
+the annotations. If it turns out that they are field annotations, we include them in the I_FIELD AST. Otherwise, we
+add them to the $smali_file::classAnnotations list*/
+field
+  @init {List<CommonTree> annotations = new ArrayList<CommonTree>();}
+  : FIELD_DIRECTIVE access_or_restriction_list member_name COLON nonvoid_type_descriptor (EQUAL literal)?
+    ( ({input.LA(1) == ANNOTATION_DIRECTIVE}? annotation {annotations.add($annotation.tree);})*
+      ( END_FIELD_DIRECTIVE
+        -> ^(I_FIELD[$start, "I_FIELD"] member_name access_or_restriction_list ^(I_FIELD_TYPE nonvoid_type_descriptor) ^(I_FIELD_INITIAL_VALUE literal)? ^(I_ANNOTATIONS annotation*))
+      | /*epsilon*/ {$smali_file::classAnnotations.addAll(annotations);}
+        -> ^(I_FIELD[$start, "I_FIELD"] member_name access_or_restriction_list ^(I_FIELD_TYPE nonvoid_type_descriptor) ^(I_FIELD_INITIAL_VALUE literal)? ^(I_ANNOTATIONS))
+      )
+    );
+
+method
+  : METHOD_DIRECTIVE access_or_restriction_list member_name method_prototype statements_and_directives
+    END_METHOD_DIRECTIVE
+    -> ^(I_METHOD[$start, "I_METHOD"] member_name method_prototype access_or_restriction_list statements_and_directives);
+
+statements_and_directives
+  scope
+  {
+    boolean hasRegistersDirective;
+    List<CommonTree> methodAnnotations;
+  }
+  : {
+      $statements_and_directives::hasRegistersDirective = false;
+      $statements_and_directives::methodAnnotations = new ArrayList<CommonTree>();
+    }
+    ( ordered_method_item
+    | registers_directive
+    | catch_directive
+    | catchall_directive
+    | parameter_directive
+    | annotation  {$statements_and_directives::methodAnnotations.add($annotation.tree);}
+    )*
+    -> registers_directive?
+       ^(I_ORDERED_METHOD_ITEMS ordered_method_item*)
+       ^(I_CATCHES catch_directive* catchall_directive*)
+       ^(I_PARAMETERS parameter_directive*)
+       {buildTree(I_ANNOTATIONS, "I_ANNOTATIONS", $statements_and_directives::methodAnnotations)};
+
+/* Method items whose order/location is important */
+ordered_method_item
+  : label
+  | instruction
+  | debug_directive;
+
+registers_directive
+  : (
+      directive=REGISTERS_DIRECTIVE regCount=integral_literal -> ^(I_REGISTERS[$REGISTERS_DIRECTIVE, "I_REGISTERS"] $regCount)
+    | directive=LOCALS_DIRECTIVE regCount2=integral_literal -> ^(I_LOCALS[$LOCALS_DIRECTIVE, "I_LOCALS"] $regCount2)
+    )
+    {
+      if ($statements_and_directives::hasRegistersDirective) {
+        throw new SemanticException(input, $directive, "There can only be a single .registers or .locals directive in a method");
+      }
+      $statements_and_directives::hasRegistersDirective=true;
+    };
+
+param_list_or_id
+  : PARAM_LIST_OR_ID_PRIMITIVE_TYPE+;
+
+/*identifiers are much more general than most languages. Any of the below can either be
+the indicated type OR an identifier, depending on the context*/
+simple_name
+  : SIMPLE_NAME
+  | ACCESS_SPEC -> SIMPLE_NAME[$ACCESS_SPEC]
+  | HIDDENAPI_RESTRICTION -> SIMPLE_NAME[$HIDDENAPI_RESTRICTION]
+  | VERIFICATION_ERROR_TYPE -> SIMPLE_NAME[$VERIFICATION_ERROR_TYPE]
+  | POSITIVE_INTEGER_LITERAL -> SIMPLE_NAME[$POSITIVE_INTEGER_LITERAL]
+  | NEGATIVE_INTEGER_LITERAL -> SIMPLE_NAME[$NEGATIVE_INTEGER_LITERAL]
+  | FLOAT_LITERAL_OR_ID -> SIMPLE_NAME[$FLOAT_LITERAL_OR_ID]
+  | DOUBLE_LITERAL_OR_ID -> SIMPLE_NAME[$DOUBLE_LITERAL_OR_ID]
+  | BOOL_LITERAL -> SIMPLE_NAME[$BOOL_LITERAL]
+  | NULL_LITERAL -> SIMPLE_NAME[$NULL_LITERAL]
+  | REGISTER -> SIMPLE_NAME[$REGISTER]
+  | param_list_or_id -> { adaptor.create(SIMPLE_NAME, $param_list_or_id.text) }
+  | PRIMITIVE_TYPE -> SIMPLE_NAME[$PRIMITIVE_TYPE]
+  | VOID_TYPE -> SIMPLE_NAME[$VOID_TYPE]
+  | ANNOTATION_VISIBILITY -> SIMPLE_NAME[$ANNOTATION_VISIBILITY]
+  | METHOD_HANDLE_TYPE_FIELD
+  | METHOD_HANDLE_TYPE_METHOD
+  | INSTRUCTION_FORMAT10t -> SIMPLE_NAME[$INSTRUCTION_FORMAT10t]
+  | INSTRUCTION_FORMAT10x -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x]
+  | INSTRUCTION_FORMAT10x_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x_ODEX]
+  | INSTRUCTION_FORMAT11x -> SIMPLE_NAME[$INSTRUCTION_FORMAT11x]
+  | INSTRUCTION_FORMAT12x_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT12x_OR_ID]
+  | INSTRUCTION_FORMAT21c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD]
+  | INSTRUCTION_FORMAT21c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD_ODEX]
+  | INSTRUCTION_FORMAT21c_METHOD_HANDLE -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_METHOD_HANDLE]
+  | INSTRUCTION_FORMAT21c_METHOD_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_METHOD_TYPE]
+  | INSTRUCTION_FORMAT21c_STRING -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_STRING]
+  | INSTRUCTION_FORMAT21c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_TYPE]
+  | INSTRUCTION_FORMAT21t -> SIMPLE_NAME[$INSTRUCTION_FORMAT21t]
+  | INSTRUCTION_FORMAT22c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD]
+  | INSTRUCTION_FORMAT22c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD_ODEX]
+  | INSTRUCTION_FORMAT22c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_TYPE]
+  | INSTRUCTION_FORMAT22cs_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22cs_FIELD]
+  | INSTRUCTION_FORMAT22s_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT22s_OR_ID]
+  | INSTRUCTION_FORMAT22t -> SIMPLE_NAME[$INSTRUCTION_FORMAT22t]
+  | INSTRUCTION_FORMAT23x -> SIMPLE_NAME[$INSTRUCTION_FORMAT23x]
+  | INSTRUCTION_FORMAT31i_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT31i_OR_ID]
+  | INSTRUCTION_FORMAT31t -> SIMPLE_NAME[$INSTRUCTION_FORMAT31t]
+  | INSTRUCTION_FORMAT35c_CALL_SITE -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_CALL_SITE]
+  | INSTRUCTION_FORMAT35c_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD]
+  | INSTRUCTION_FORMAT35c_METHOD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD_ODEX]
+  | INSTRUCTION_FORMAT35c_METHOD_OR_METHOD_HANDLE_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD_OR_METHOD_HANDLE_TYPE]
+  | INSTRUCTION_FORMAT35c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_TYPE]
+  | INSTRUCTION_FORMAT35mi_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35mi_METHOD]
+  | INSTRUCTION_FORMAT35ms_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35ms_METHOD]
+  | INSTRUCTION_FORMAT45cc_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT45cc_METHOD]
+  | INSTRUCTION_FORMAT4rcc_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT4rcc_METHOD]
+  | INSTRUCTION_FORMAT51l -> SIMPLE_NAME[$INSTRUCTION_FORMAT51l];
+
+member_name
+  : simple_name
+  | MEMBER_NAME -> SIMPLE_NAME[$MEMBER_NAME];
+
+method_prototype
+  : OPEN_PAREN param_list CLOSE_PAREN type_descriptor
+    -> ^(I_METHOD_PROTOTYPE[$start, "I_METHOD_PROTOTYPE"] ^(I_METHOD_RETURN_TYPE type_descriptor) param_list?);
+
+param_list_or_id_primitive_type
+  : PARAM_LIST_OR_ID_PRIMITIVE_TYPE -> PRIMITIVE_TYPE[$PARAM_LIST_OR_ID_PRIMITIVE_TYPE];
+
+param_list
+  : param_list_or_id_primitive_type+
+  | nonvoid_type_descriptor*;
+
+array_descriptor
+  : ARRAY_TYPE_PREFIX (PRIMITIVE_TYPE | CLASS_DESCRIPTOR);
+
+type_descriptor
+  : VOID_TYPE
+  | PRIMITIVE_TYPE
+  | CLASS_DESCRIPTOR
+  | array_descriptor;
+
+nonvoid_type_descriptor
+  : PRIMITIVE_TYPE
+  | CLASS_DESCRIPTOR
+  | array_descriptor;
+
+reference_type_descriptor
+  : CLASS_DESCRIPTOR
+  | array_descriptor;
+
+integer_literal
+  : POSITIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$POSITIVE_INTEGER_LITERAL]
+  | NEGATIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$NEGATIVE_INTEGER_LITERAL];
+
+float_literal
+  : FLOAT_LITERAL_OR_ID -> FLOAT_LITERAL[$FLOAT_LITERAL_OR_ID]
+  | FLOAT_LITERAL;
+
+double_literal
+  : DOUBLE_LITERAL_OR_ID -> DOUBLE_LITERAL[$DOUBLE_LITERAL_OR_ID]
+  | DOUBLE_LITERAL;
+
+literal
+  : LONG_LITERAL
+  | integer_literal
+  | SHORT_LITERAL
+  | BYTE_LITERAL
+  | float_literal
+  | double_literal
+  | CHAR_LITERAL
+  | STRING_LITERAL
+  | BOOL_LITERAL
+  | NULL_LITERAL
+  | array_literal
+  | subannotation
+  | type_field_method_literal
+  | enum_literal
+  | method_handle_literal
+  | method_prototype;
+
+parsed_integer_literal returns[int value]
+  : integer_literal { $value = LiteralTools.parseInt($integer_literal.text); };
+
+integral_literal
+  : LONG_LITERAL
+  | integer_literal
+  | SHORT_LITERAL
+  | CHAR_LITERAL
+  | BYTE_LITERAL;
+
+fixed_32bit_literal
+  : LONG_LITERAL
+  | integer_literal
+  | SHORT_LITERAL
+  | BYTE_LITERAL
+  | float_literal
+  | CHAR_LITERAL
+  | BOOL_LITERAL;
+
+fixed_literal
+  : integer_literal
+  | LONG_LITERAL
+  | SHORT_LITERAL
+  | BYTE_LITERAL
+  | float_literal
+  | double_literal
+  | CHAR_LITERAL
+  | BOOL_LITERAL;
+
+array_literal
+  : OPEN_BRACE (literal (COMMA literal)* | ) CLOSE_BRACE
+    -> ^(I_ENCODED_ARRAY[$start, "I_ENCODED_ARRAY"] literal*);
+
+annotation_element
+  : simple_name EQUAL literal
+    -> ^(I_ANNOTATION_ELEMENT[$start, "I_ANNOTATION_ELEMENT"] simple_name literal);
+
+annotation
+  : ANNOTATION_DIRECTIVE ANNOTATION_VISIBILITY CLASS_DESCRIPTOR
+    annotation_element* END_ANNOTATION_DIRECTIVE
+    -> ^(I_ANNOTATION[$start, "I_ANNOTATION"] ANNOTATION_VISIBILITY ^(I_SUBANNOTATION[$start, "I_SUBANNOTATION"] CLASS_DESCRIPTOR annotation_element*));
+
+subannotation
+  : SUBANNOTATION_DIRECTIVE CLASS_DESCRIPTOR annotation_element* END_SUBANNOTATION_DIRECTIVE
+    -> ^(I_SUBANNOTATION[$start, "I_SUBANNOTATION"] CLASS_DESCRIPTOR annotation_element*);
+
+// TODO: how does dalvik handle a primitive or array type, or a non-enum type?
+enum_literal
+  : ENUM_DIRECTIVE field_reference
+  -> ^(I_ENCODED_ENUM field_reference);
+
+type_field_method_literal
+  : reference_type_descriptor
+  | ( (reference_type_descriptor ARROW)?
+      ( member_name COLON nonvoid_type_descriptor -> ^(I_ENCODED_FIELD reference_type_descriptor? member_name nonvoid_type_descriptor)
+      | member_name method_prototype -> ^(I_ENCODED_METHOD reference_type_descriptor? member_name method_prototype)
+      )
+    )
+  | PRIMITIVE_TYPE
+  | VOID_TYPE;
+
+call_site_reference
+  : simple_name OPEN_PAREN STRING_LITERAL COMMA method_prototype (COMMA literal)* CLOSE_PAREN AT method_reference
+    -> ^(I_CALL_SITE_REFERENCE simple_name STRING_LITERAL method_prototype ^(I_CALL_SITE_EXTRA_ARGUMENTS literal*)
+         method_reference);
+
+method_handle_reference
+  : METHOD_HANDLE_TYPE_FIELD AT field_reference -> METHOD_HANDLE_TYPE_FIELD field_reference
+  | METHOD_HANDLE_TYPE_METHOD AT method_reference -> METHOD_HANDLE_TYPE_METHOD method_reference
+  | INSTRUCTION_FORMAT35c_METHOD_OR_METHOD_HANDLE_TYPE AT method_reference -> INSTRUCTION_FORMAT35c_METHOD_OR_METHOD_HANDLE_TYPE method_reference;
+
+method_handle_literal
+  : method_handle_reference
+  -> ^(I_ENCODED_METHOD_HANDLE method_handle_reference);
+
+method_reference
+  : (reference_type_descriptor ARROW)? member_name method_prototype
+  -> reference_type_descriptor? member_name method_prototype;
+
+field_reference
+  : (reference_type_descriptor ARROW)? member_name COLON nonvoid_type_descriptor
+  -> reference_type_descriptor? member_name nonvoid_type_descriptor;
+
+label
+  : COLON simple_name -> ^(I_LABEL[$COLON, "I_LABEL"] simple_name);
+
+label_ref
+  : COLON simple_name -> simple_name;
+
+register_list
+  : REGISTER (COMMA REGISTER)* -> ^(I_REGISTER_LIST[$start, "I_REGISTER_LIST"] REGISTER*)
+  | ->^(I_REGISTER_LIST[$start, "I_REGISTER_LIST"]);
+
+register_range
+  : (startreg=REGISTER (DOTDOT endreg=REGISTER)?)? -> ^(I_REGISTER_RANGE[$start, "I_REGISTER_RANGE"] $startreg? $endreg?);
+
+verification_error_reference
+  : CLASS_DESCRIPTOR | field_reference | method_reference;
+
+catch_directive
+  : CATCH_DIRECTIVE nonvoid_type_descriptor OPEN_BRACE from=label_ref DOTDOT to=label_ref CLOSE_BRACE using=label_ref
+    -> ^(I_CATCH[$start, "I_CATCH"] nonvoid_type_descriptor $from $to $using);
+
+catchall_directive
+  : CATCHALL_DIRECTIVE OPEN_BRACE from=label_ref DOTDOT to=label_ref CLOSE_BRACE using=label_ref
+    -> ^(I_CATCHALL[$start, "I_CATCHALL"] $from $to $using);
+
+/*When there are annotations immediately after a parameter definition, we don't know whether they are parameter annotations
+or method annotations until we determine if there is an .end parameter directive. In either case, we still "consume" and parse
+the annotations. If it turns out that they are parameter annotations, we include them in the I_PARAMETER AST. Otherwise, we
+add them to the $statements_and_directives::methodAnnotations list*/
+parameter_directive
+  @init {List<CommonTree> annotations = new ArrayList<CommonTree>();}
+  : PARAMETER_DIRECTIVE REGISTER (COMMA STRING_LITERAL)?
+    ({input.LA(1) == ANNOTATION_DIRECTIVE}? annotation {annotations.add($annotation.tree);})*
+
+    ( END_PARAMETER_DIRECTIVE
+      -> ^(I_PARAMETER[$start, "I_PARAMETER"] REGISTER STRING_LITERAL? ^(I_ANNOTATIONS annotation*))
+    | /*epsilon*/ {$statements_and_directives::methodAnnotations.addAll(annotations);}
+      -> ^(I_PARAMETER[$start, "I_PARAMETER"] REGISTER STRING_LITERAL? ^(I_ANNOTATIONS))
+    );
+
+debug_directive
+  : line_directive
+  | local_directive
+  | end_local_directive
+  | restart_local_directive
+  | prologue_directive
+  | epilogue_directive
+  | source_directive;
+
+line_directive
+  : LINE_DIRECTIVE integral_literal
+    -> ^(I_LINE[$start, "I_LINE"] integral_literal);
+
+local_directive
+  : LOCAL_DIRECTIVE REGISTER (COMMA (NULL_LITERAL | name=STRING_LITERAL) COLON (VOID_TYPE | nonvoid_type_descriptor)
+                              (COMMA signature=STRING_LITERAL)? )?
+    -> ^(I_LOCAL[$start, "I_LOCAL"] REGISTER NULL_LITERAL? $name? nonvoid_type_descriptor? $signature?);
+
+end_local_directive
+  : END_LOCAL_DIRECTIVE REGISTER
+    -> ^(I_END_LOCAL[$start, "I_END_LOCAL"] REGISTER);
+
+restart_local_directive
+  : RESTART_LOCAL_DIRECTIVE REGISTER
+    -> ^(I_RESTART_LOCAL[$start, "I_RESTART_LOCAL"] REGISTER);
+
+prologue_directive
+  : PROLOGUE_DIRECTIVE
+    -> ^(I_PROLOGUE[$start, "I_PROLOGUE"]);
+
+epilogue_directive
+  : EPILOGUE_DIRECTIVE
+    -> ^(I_EPILOGUE[$start, "I_EPILOGUE"]);
+
+source_directive
+  : SOURCE_DIRECTIVE STRING_LITERAL?
+    -> ^(I_SOURCE[$start, "I_SOURCE"] STRING_LITERAL?);
+
+instruction_format12x
+  : INSTRUCTION_FORMAT12x
+  | INSTRUCTION_FORMAT12x_OR_ID -> INSTRUCTION_FORMAT12x[$INSTRUCTION_FORMAT12x_OR_ID];
+
+instruction_format22s
+  : INSTRUCTION_FORMAT22s
+  | INSTRUCTION_FORMAT22s_OR_ID -> INSTRUCTION_FORMAT22s[$INSTRUCTION_FORMAT22s_OR_ID];
+
+instruction_format31i
+  : INSTRUCTION_FORMAT31i
+  | INSTRUCTION_FORMAT31i_OR_ID -> INSTRUCTION_FORMAT31i[$INSTRUCTION_FORMAT31i_OR_ID];
+  
+instruction_format35c_method
+  : INSTRUCTION_FORMAT35c_METHOD
+  | INSTRUCTION_FORMAT35c_METHOD_OR_METHOD_HANDLE_TYPE -> INSTRUCTION_FORMAT35c_METHOD[$INSTRUCTION_FORMAT35c_METHOD_OR_METHOD_HANDLE_TYPE];
+
+instruction
+  : insn_format10t
+  | insn_format10x
+  | insn_format10x_odex
+  | insn_format11n
+  | insn_format11x
+  | insn_format12x
+  | insn_format20bc
+  | insn_format20t
+  | insn_format21c_field
+  | insn_format21c_field_odex
+  | insn_format21c_method_handle
+  | insn_format21c_method_type
+  | insn_format21c_string
+  | insn_format21c_type
+  | insn_format21ih
+  | insn_format21lh
+  | insn_format21s
+  | insn_format21t
+  | insn_format22b
+  | insn_format22c_field
+  | insn_format22c_field_odex
+  | insn_format22c_type
+  | insn_format22cs_field
+  | insn_format22s
+  | insn_format22t
+  | insn_format22x
+  | insn_format23x
+  | insn_format30t
+  | insn_format31c
+  | insn_format31i
+  | insn_format31t
+  | insn_format32x
+  | insn_format35c_call_site
+  | insn_format35c_method
+  | insn_format35c_type
+  | insn_format35c_method_odex
+  | insn_format35mi_method
+  | insn_format35ms_method
+  | insn_format3rc_call_site
+  | insn_format3rc_method
+  | insn_format3rc_method_odex
+  | insn_format3rc_type
+  | insn_format3rmi_method
+  | insn_format3rms_method
+  | insn_format45cc_method
+  | insn_format4rcc_method
+  | insn_format51l
+  | insn_array_data_directive
+  | insn_packed_switch_directive
+  | insn_sparse_switch_directive;
+
+insn_format10t
+  : //e.g. goto endloop:
+    //e.g. goto +3
+    INSTRUCTION_FORMAT10t label_ref
+    -> ^(I_STATEMENT_FORMAT10t[$start, "I_STATEMENT_FORMAT10t"] INSTRUCTION_FORMAT10t label_ref);
+
+insn_format10x
+  : //e.g. return-void
+    INSTRUCTION_FORMAT10x
+    -> ^(I_STATEMENT_FORMAT10x[$start, "I_STATEMENT_FORMAT10x"] INSTRUCTION_FORMAT10x);
+
+insn_format10x_odex
+  : //e.g. return-void-barrier
+    INSTRUCTION_FORMAT10x_ODEX
+    {
+      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT10x_ODEX.text);
+    };
+
+insn_format11n
+  : //e.g. const/4 v0, 5
+    INSTRUCTION_FORMAT11n REGISTER COMMA integral_literal
+    -> ^(I_STATEMENT_FORMAT11n[$start, "I_STATEMENT_FORMAT11n"] INSTRUCTION_FORMAT11n REGISTER integral_literal);
+
+insn_format11x
+  : //e.g. move-result-object v1
+    INSTRUCTION_FORMAT11x REGISTER
+    -> ^(I_STATEMENT_FORMAT11x[$start, "I_STATEMENT_FORMAT11x"] INSTRUCTION_FORMAT11x REGISTER);
+
+insn_format12x
+  : //e.g. move v1 v2
+    instruction_format12x REGISTER COMMA REGISTER
+    -> ^(I_STATEMENT_FORMAT12x[$start, "I_STATEMENT_FORMAT12x"] instruction_format12x REGISTER REGISTER);
+
+insn_format20bc
+  : //e.g. throw-verification-error generic-error, Lsome/class;
+    INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE COMMA verification_error_reference
+    {
+      if (!allowOdex || opcodes.getOpcodeByName($INSTRUCTION_FORMAT20bc.text) == null || apiLevel >= 14) {
+        throwOdexedInstructionException(input, $INSTRUCTION_FORMAT20bc.text);
+      }
+    }
+    -> ^(I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE verification_error_reference);
+
+insn_format20t
+  : //e.g. goto/16 endloop:
+    INSTRUCTION_FORMAT20t label_ref
+    -> ^(I_STATEMENT_FORMAT20t[$start, "I_STATEMENT_FORMAT20t"] INSTRUCTION_FORMAT20t label_ref);
+
+insn_format21c_field
+  : //e.g. sget-object v0, java/lang/System/out LJava/io/PrintStream;
+    INSTRUCTION_FORMAT21c_FIELD REGISTER COMMA field_reference
+    -> ^(I_STATEMENT_FORMAT21c_FIELD[$start, "I_STATEMENT_FORMAT21c_FIELD"] INSTRUCTION_FORMAT21c_FIELD REGISTER field_reference);
+
+insn_format21c_field_odex
+  : //e.g. sget-object-volatile v0, java/lang/System/out LJava/io/PrintStream;
+    INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER COMMA field_reference
+    {
+      if (!allowOdex || opcodes.getOpcodeByName($INSTRUCTION_FORMAT21c_FIELD_ODEX.text) == null || apiLevel >= 14) {
+        throwOdexedInstructionException(input, $INSTRUCTION_FORMAT21c_FIELD_ODEX.text);
+      }
+    }
+    -> ^(I_STATEMENT_FORMAT21c_FIELD[$start, "I_STATEMENT_FORMAT21c_FIELD"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER field_reference);
+
+insn_format21c_method_handle
+  : //e.g. const-method-handle v0, invoke-static@Ljava/lang/Integer;->toString(I)Ljava/lang/String;
+    INSTRUCTION_FORMAT21c_METHOD_HANDLE REGISTER COMMA method_handle_reference
+    -> ^(I_STATEMENT_FORMAT21c_METHOD_HANDLE[$start, "I_STATEMENT_FORMAT21c_METHOD_HANDLE"]
+            INSTRUCTION_FORMAT21c_METHOD_HANDLE REGISTER method_handle_reference);
+
+insn_format21c_method_type
+    : //e.g. const-method-type v0, (ILjava/lang/String;)Ljava/lang/String;
+    INSTRUCTION_FORMAT21c_METHOD_TYPE REGISTER COMMA method_prototype
+    -> ^(I_STATEMENT_FORMAT21c_METHOD_TYPE[$start, "I_STATEMENT_FORMAT21c_METHOD_TYPE"]
+            INSTRUCTION_FORMAT21c_METHOD_TYPE REGISTER method_prototype);
+
+insn_format21c_string
+  : //e.g. const-string v1, "Hello World!"
+    INSTRUCTION_FORMAT21c_STRING REGISTER COMMA STRING_LITERAL
+    -> ^(I_STATEMENT_FORMAT21c_STRING[$start, "I_STATEMENT_FORMAT21c_STRING"] INSTRUCTION_FORMAT21c_STRING REGISTER STRING_LITERAL);
+
+insn_format21c_type
+  : //e.g. const-class v2, Lorg/jf/HelloWorld2/HelloWorld2;
+    INSTRUCTION_FORMAT21c_TYPE REGISTER COMMA nonvoid_type_descriptor
+    -> ^(I_STATEMENT_FORMAT21c_TYPE[$start, "I_STATEMENT_FORMAT21c"] INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor);
+
+insn_format21ih
+  : //e.g. const/high16 v1, 1234
+    INSTRUCTION_FORMAT21ih REGISTER COMMA fixed_32bit_literal
+    -> ^(I_STATEMENT_FORMAT21ih[$start, "I_STATEMENT_FORMAT21ih"] INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal);
+
+insn_format21lh
+  : //e.g. const-wide/high16 v1, 1234
+    INSTRUCTION_FORMAT21lh REGISTER COMMA fixed_32bit_literal
+    -> ^(I_STATEMENT_FORMAT21lh[$start, "I_STATEMENT_FORMAT21lh"] INSTRUCTION_FORMAT21lh REGISTER fixed_32bit_literal);
+
+insn_format21s
+  : //e.g. const/16 v1, 1234
+    INSTRUCTION_FORMAT21s REGISTER COMMA integral_literal
+    -> ^(I_STATEMENT_FORMAT21s[$start, "I_STATEMENT_FORMAT21s"] INSTRUCTION_FORMAT21s REGISTER integral_literal);
+
+insn_format21t
+  : //e.g. if-eqz v0, endloop:
+    INSTRUCTION_FORMAT21t REGISTER COMMA label_ref
+    -> ^(I_STATEMENT_FORMAT21t[$start, "I_STATEMENT_FORMAT21t"] INSTRUCTION_FORMAT21t REGISTER label_ref);
+
+insn_format22b
+  : //e.g. add-int v0, v1, 123
+    INSTRUCTION_FORMAT22b REGISTER COMMA REGISTER COMMA integral_literal
+    -> ^(I_STATEMENT_FORMAT22b[$start, "I_STATEMENT_FORMAT22b"] INSTRUCTION_FORMAT22b REGISTER REGISTER integral_literal);
+
+insn_format22c_field
+  : //e.g. iput-object v1, v0 org/jf/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String;
+    INSTRUCTION_FORMAT22c_FIELD REGISTER COMMA REGISTER COMMA field_reference
+    -> ^(I_STATEMENT_FORMAT22c_FIELD[$start, "I_STATEMENT_FORMAT22c_FIELD"] INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER field_reference);
+
+insn_format22c_field_odex
+  : //e.g. iput-object-volatile v1, v0 org/jf/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String;
+    INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER COMMA REGISTER COMMA field_reference
+    {
+      if (!allowOdex || opcodes.getOpcodeByName($INSTRUCTION_FORMAT22c_FIELD_ODEX.text) == null || apiLevel >= 14) {
+        throwOdexedInstructionException(input, $INSTRUCTION_FORMAT22c_FIELD_ODEX.text);
+      }
+    }
+    -> ^(I_STATEMENT_FORMAT22c_FIELD[$start, "I_STATEMENT_FORMAT22c_FIELD"] INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER REGISTER field_reference);
+
+insn_format22c_type
+  : //e.g. instance-of v0, v1, Ljava/lang/String;
+    INSTRUCTION_FORMAT22c_TYPE REGISTER COMMA REGISTER COMMA nonvoid_type_descriptor
+    -> ^(I_STATEMENT_FORMAT22c_TYPE[$start, "I_STATEMENT_FORMAT22c_TYPE"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER nonvoid_type_descriptor);
+
+insn_format22cs_field
+  : //e.g. iget-quick v0, v1, field@0xc
+    INSTRUCTION_FORMAT22cs_FIELD REGISTER COMMA REGISTER COMMA FIELD_OFFSET
+    {
+      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT22cs_FIELD.text);
+    };
+
+insn_format22s
+  : //e.g. add-int/lit16 v0, v1, 12345
+    instruction_format22s REGISTER COMMA REGISTER COMMA integral_literal
+    -> ^(I_STATEMENT_FORMAT22s[$start, "I_STATEMENT_FORMAT22s"] instruction_format22s REGISTER REGISTER integral_literal);
+
+insn_format22t
+  : //e.g. if-eq v0, v1, endloop:
+    INSTRUCTION_FORMAT22t REGISTER COMMA REGISTER COMMA label_ref
+    -> ^(I_STATEMENT_FORMAT22t[$start, "I_STATEMENT_FFORMAT22t"] INSTRUCTION_FORMAT22t REGISTER REGISTER label_ref);
+
+insn_format22x
+  : //e.g. move/from16 v1, v1234
+    INSTRUCTION_FORMAT22x REGISTER COMMA REGISTER
+    -> ^(I_STATEMENT_FORMAT22x[$start, "I_STATEMENT_FORMAT22x"] INSTRUCTION_FORMAT22x REGISTER REGISTER);
+
+insn_format23x
+  : //e.g. add-int v1, v2, v3
+    INSTRUCTION_FORMAT23x REGISTER COMMA REGISTER COMMA REGISTER
+    -> ^(I_STATEMENT_FORMAT23x[$start, "I_STATEMENT_FORMAT23x"] INSTRUCTION_FORMAT23x REGISTER REGISTER REGISTER);
+
+insn_format30t
+  : //e.g. goto/32 endloop:
+    INSTRUCTION_FORMAT30t label_ref
+    -> ^(I_STATEMENT_FORMAT30t[$start, "I_STATEMENT_FORMAT30t"] INSTRUCTION_FORMAT30t label_ref);
+
+insn_format31c
+  : //e.g. const-string/jumbo v1 "Hello World!"
+    INSTRUCTION_FORMAT31c REGISTER COMMA STRING_LITERAL
+    ->^(I_STATEMENT_FORMAT31c[$start, "I_STATEMENT_FORMAT31c"] INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL);
+
+insn_format31i
+  : //e.g. const v0, 123456
+    instruction_format31i REGISTER COMMA fixed_32bit_literal
+    -> ^(I_STATEMENT_FORMAT31i[$start, "I_STATEMENT_FORMAT31i"] instruction_format31i REGISTER fixed_32bit_literal);
+
+insn_format31t
+  : //e.g. fill-array-data v0, ArrayData:
+    INSTRUCTION_FORMAT31t REGISTER COMMA label_ref
+    -> ^(I_STATEMENT_FORMAT31t[$start, "I_STATEMENT_FORMAT31t"] INSTRUCTION_FORMAT31t REGISTER label_ref);
+
+insn_format32x
+  : //e.g. move/16 v4567, v1234
+    INSTRUCTION_FORMAT32x REGISTER COMMA REGISTER
+    -> ^(I_STATEMENT_FORMAT32x[$start, "I_STATEMENT_FORMAT32x"] INSTRUCTION_FORMAT32x REGISTER REGISTER);
+
+insn_format35c_call_site
+  : //e.g. invoke-custom {v0, v1}, call_site_name
+    // OR invoke-custom {v0, v1}, {"doSomething", (LCustom;Ljava/lang/String;)Ljava/lang/String;, "just testing"}, BootstrapLinker;->normalLink(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
+    INSTRUCTION_FORMAT35c_CALL_SITE OPEN_BRACE register_list CLOSE_BRACE COMMA call_site_reference
+    -> ^(I_STATEMENT_FORMAT35c_CALL_SITE[$start, "I_STATEMENT_FORMAT35c_CALL_SITE"] INSTRUCTION_FORMAT35c_CALL_SITE register_list call_site_reference);
+
+insn_format35c_method
+  : //e.g. invoke-virtual {v0,v1} java/io/PrintStream/print(Ljava/lang/Stream;)V
+    instruction_format35c_method OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference
+    -> ^(I_STATEMENT_FORMAT35c_METHOD[$start, "I_STATEMENT_FORMAT35c_METHOD"] instruction_format35c_method register_list method_reference);
+
+insn_format35c_type
+  : //e.g. filled-new-array {v0,v1}, I
+    INSTRUCTION_FORMAT35c_TYPE OPEN_BRACE register_list CLOSE_BRACE COMMA nonvoid_type_descriptor
+    -> ^(I_STATEMENT_FORMAT35c_TYPE[$start, "I_STATEMENT_FORMAT35c_TYPE"] INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor);
+
+insn_format35c_method_odex
+  : //e.g. invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+    INSTRUCTION_FORMAT35c_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference
+    {
+      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT35c_METHOD_ODEX.text);
+    };
+
+insn_format35mi_method
+  : //e.g. execute-inline {v0, v1}, inline@0x4
+    INSTRUCTION_FORMAT35mi_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA INLINE_INDEX
+    {
+      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT35mi_METHOD.text);
+    };
+
+insn_format35ms_method
+  : //e.g. invoke-virtual-quick {v0, v1}, vtable@0x4
+    INSTRUCTION_FORMAT35ms_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA VTABLE_INDEX
+    {
+      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT35ms_METHOD.text);
+    };
+
+insn_format3rc_call_site
+  : //e.g. invoke-custom/range {v0 .. v1}, call_site_name
+    // OR invoke-custom/range {v0 .. v1}, {"doSomething", (LCustom;Ljava/lang/String;)Ljava/lang/String;, "just testing"}, BootstrapLinker;->normalLink(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
+    INSTRUCTION_FORMAT3rc_CALL_SITE OPEN_BRACE register_range CLOSE_BRACE COMMA call_site_reference
+    -> ^(I_STATEMENT_FORMAT3rc_CALL_SITE[$start, "I_STATEMENT_FORMAT3rc_CALL_SITE"] INSTRUCTION_FORMAT3rc_CALL_SITE register_range call_site_reference);
+
+insn_format3rc_method
+  : //e.g. invoke-virtual/range {v25..v26}, java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+    INSTRUCTION_FORMAT3rc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference
+    -> ^(I_STATEMENT_FORMAT3rc_METHOD[$start, "I_STATEMENT_FORMAT3rc_METHOD"] INSTRUCTION_FORMAT3rc_METHOD register_range method_reference);
+
+insn_format3rc_method_odex
+  : //e.g. invoke-object-init/range {p0}, Ljava/lang/Object;-><init>()V
+    INSTRUCTION_FORMAT3rc_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference
+    {
+      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rc_METHOD_ODEX.text);
+    };
+
+insn_format3rc_type
+  : //e.g. filled-new-array/range {v0..v6}, I
+    INSTRUCTION_FORMAT3rc_TYPE OPEN_BRACE register_range CLOSE_BRACE COMMA nonvoid_type_descriptor
+    -> ^(I_STATEMENT_FORMAT3rc_TYPE[$start, "I_STATEMENT_FORMAT3rc_TYPE"] INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor);
+
+insn_format3rmi_method
+  : //e.g. execute-inline/range {v0 .. v10}, inline@0x14
+    INSTRUCTION_FORMAT3rmi_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA INLINE_INDEX
+    {
+      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rmi_METHOD.text);
+    };
+
+insn_format3rms_method
+  : //e.g. invoke-virtual-quick/range {v0 .. v10}, vtable@0x14
+    INSTRUCTION_FORMAT3rms_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA VTABLE_INDEX
+    {
+      throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rms_METHOD.text);
+    };
+
+insn_format45cc_method
+  : //e.g. invoke-polymorphic {v0..v1}, java/lang/invoke/MethodHandle;->invoke([Ljava/lang/Object;)Ljava/lang/Object;, (I)J
+    INSTRUCTION_FORMAT45cc_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference COMMA method_prototype
+    -> ^(I_STATEMENT_FORMAT45cc_METHOD[$start, "I_STATEMENT_FORMAT45cc_METHOD"] INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype);
+
+insn_format4rcc_method
+  : //e.g. invoke-polymorphic/range {v0,v1}, java/lang/invoke/MethodHandle;->invoke([Ljava/lang/Object;)Ljava/lang/Object;, (I)J
+    INSTRUCTION_FORMAT4rcc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference COMMA method_prototype
+    -> ^(I_STATEMENT_FORMAT4rcc_METHOD[$start, "I_STATEMENT_FORMAT4rcc_METHOD"] INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype);
+
+insn_format51l
+  : //e.g. const-wide v0, 5000000000L
+    INSTRUCTION_FORMAT51l REGISTER COMMA fixed_literal
+    -> ^(I_STATEMENT_FORMAT51l[$start, "I_STATEMENT_FORMAT51l"] INSTRUCTION_FORMAT51l REGISTER fixed_literal);
+
+insn_array_data_directive
+  : ARRAY_DATA_DIRECTIVE
+    parsed_integer_literal
+    {
+        int elementWidth = $parsed_integer_literal.value;
+        if (elementWidth != 4 && elementWidth != 8 && elementWidth != 1 && elementWidth != 2) {
+            throw new SemanticException(input, $start, "Invalid element width: \%d. Must be 1, 2, 4 or 8", elementWidth);
+        }
+    }
+    fixed_literal* END_ARRAY_DATA_DIRECTIVE
+
+    -> ^(I_STATEMENT_ARRAY_DATA[$start, "I_STATEMENT_ARRAY_DATA"] ^(I_ARRAY_ELEMENT_SIZE parsed_integer_literal)
+       ^(I_ARRAY_ELEMENTS fixed_literal*));
+
+insn_packed_switch_directive
+    :   PACKED_SWITCH_DIRECTIVE
+    fixed_32bit_literal
+    label_ref*
+    END_PACKED_SWITCH_DIRECTIVE
+    -> ^(I_STATEMENT_PACKED_SWITCH[$start, "I_STATEMENT_PACKED_SWITCH"]
+         ^(I_PACKED_SWITCH_START_KEY[$start, "I_PACKED_SWITCH_START_KEY"] fixed_32bit_literal)
+         ^(I_PACKED_SWITCH_ELEMENTS[$start, "I_PACKED_SWITCH_ELEMENTS"]
+          label_ref*)
+       );
+
+insn_sparse_switch_directive
+  :   SPARSE_SWITCH_DIRECTIVE
+    (fixed_32bit_literal ARROW label_ref)*
+    END_SPARSE_SWITCH_DIRECTIVE
+    -> ^(I_STATEMENT_SPARSE_SWITCH[$start, "I_STATEMENT_SPARSE_SWITCH"]
+       ^(I_SPARSE_SWITCH_ELEMENTS[$start, "I_SPARSE_SWITCH_ELEMENTS"] (fixed_32bit_literal label_ref)*));
diff --git a/smali/src/main/antlr/smaliTreeWalker.g b/smali/src/main/antlr/smaliTreeWalker.g
new file mode 100644
index 0000000..270f831
--- /dev/null
+++ b/smali/src/main/antlr/smaliTreeWalker.g
@@ -0,0 +1,1481 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+tree grammar smaliTreeWalker;
+
+options {
+  tokenVocab=smaliParser;
+  ASTLabelType=CommonTree;
+}
+
+@header {
+package org.jf.smali;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import org.antlr.runtime.BitSet;
+import org.antlr.runtime.*;
+import org.antlr.runtime.tree.CommonTree;
+import org.antlr.runtime.tree.TreeNodeStream;
+import org.antlr.runtime.tree.TreeParser;
+import org.antlr.runtime.tree.TreeRuleReturnScope;
+import org.jf.dexlib2.*;
+import org.jf.dexlib2.builder.Label;
+import org.jf.dexlib2.builder.MethodImplementationBuilder;
+import org.jf.dexlib2.builder.SwitchLabelElement;
+import org.jf.dexlib2.builder.instruction.*;
+import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.iface.AnnotationElement;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.MethodImplementation;
+import org.jf.dexlib2.iface.reference.FieldReference;
+import org.jf.dexlib2.iface.reference.MethodReference;
+import org.jf.dexlib2.iface.value.EncodedValue;
+import org.jf.dexlib2.immutable.ImmutableAnnotation;
+import org.jf.dexlib2.immutable.ImmutableAnnotationElement;
+import org.jf.dexlib2.immutable.reference.ImmutableCallSiteReference;
+import org.jf.dexlib2.immutable.reference.ImmutableFieldReference;
+import org.jf.dexlib2.immutable.reference.ImmutableMethodHandleReference;
+import org.jf.dexlib2.immutable.reference.ImmutableMethodReference;
+import org.jf.dexlib2.immutable.reference.ImmutableMethodProtoReference;
+import org.jf.dexlib2.immutable.reference.ImmutableReference;
+import org.jf.dexlib2.immutable.reference.ImmutableTypeReference;
+import org.jf.dexlib2.immutable.value.*;
+import org.jf.dexlib2.util.MethodUtil;
+import org.jf.dexlib2.writer.InstructionFactory;
+import org.jf.dexlib2.writer.builder.*;
+import org.jf.util.LinearSearch;
+
+import java.util.*;
+}
+
+@members {
+  public String classType;
+  private boolean verboseErrors = false;
+  private int apiLevel = 15;
+  private Opcodes opcodes = Opcodes.forApi(apiLevel);
+  private DexBuilder dexBuilder;
+  private int callSiteNameIndex = 0;
+
+  public void setDexBuilder(DexBuilder dexBuilder) {
+      this.dexBuilder = dexBuilder;
+  }
+
+  public void setApiLevel(int apiLevel) {
+      this.opcodes = Opcodes.forApi(apiLevel);
+      this.apiLevel = apiLevel;
+  }
+
+  public void setVerboseErrors(boolean verboseErrors) {
+    this.verboseErrors = verboseErrors;
+  }
+
+  private byte parseRegister_nibble(String register)
+      throws SemanticException {
+    int totalMethodRegisters = method_stack.peek().totalMethodRegisters;
+    int methodParameterRegisters = method_stack.peek().methodParameterRegisters;
+
+    //register should be in the format "v12"
+    int val = Byte.parseByte(register.substring(1));
+    if (register.charAt(0) == 'p') {
+      val = totalMethodRegisters - methodParameterRegisters + val;
+    }
+    if (val >= 2<<4) {
+      throw new SemanticException(input, "The maximum allowed register in this context is list of registers is v15");
+    }
+    //the parser wouldn't have accepted a negative register, i.e. v-1, so we don't have to check for val<0;
+    return (byte)val;
+  }
+
+  //return a short, because java's byte is signed
+  private short parseRegister_byte(String register)
+      throws SemanticException {
+    int totalMethodRegisters = method_stack.peek().totalMethodRegisters;
+    int methodParameterRegisters = method_stack.peek().methodParameterRegisters;
+    //register should be in the format "v123"
+    int val = Short.parseShort(register.substring(1));
+    if (register.charAt(0) == 'p') {
+      val = totalMethodRegisters - methodParameterRegisters + val;
+    }
+    if (val >= 2<<8) {
+      throw new SemanticException(input, "The maximum allowed register in this context is v255");
+    }
+    return (short)val;
+  }
+
+  //return an int because java's short is signed
+  private int parseRegister_short(String register)
+      throws SemanticException {
+    int totalMethodRegisters = method_stack.peek().totalMethodRegisters;
+    int methodParameterRegisters = method_stack.peek().methodParameterRegisters;
+    //register should be in the format "v12345"
+    int val = Integer.parseInt(register.substring(1));
+    if (register.charAt(0) == 'p') {
+      val = totalMethodRegisters - methodParameterRegisters + val;
+    }
+    if (val >= 2<<16) {
+      throw new SemanticException(input, "The maximum allowed register in this context is v65535");
+    }
+    //the parser wouldn't accept a negative register, i.e. v-1, so we don't have to check for val<0;
+    return val;
+  }
+
+  public String getErrorMessage(RecognitionException e, String[] tokenNames) {
+    if ( e instanceof SemanticException ) {
+      return e.getMessage();
+    } else {
+      return super.getErrorMessage(e, tokenNames);
+    }
+  }
+
+  public String getErrorHeader(RecognitionException e) {
+    return getSourceName()+"["+ e.line+","+e.charPositionInLine+"]";
+  }
+}
+
+smali_file returns[ClassDef classDef]
+  : ^(I_CLASS_DEF header methods fields annotations)
+  {
+    $classDef = dexBuilder.internClassDef($header.classType, $header.accessFlags, $header.superType,
+            $header.implementsList, $header.sourceSpec, $annotations.annotations, $fields.fields, $methods.methods);
+  };
+  catch [Exception ex] {
+    if (verboseErrors) {
+      ex.printStackTrace(System.err);
+    }
+    reportError(new SemanticException(input, ex));
+  }
+
+
+header returns[String classType, int accessFlags, String superType, List<String> implementsList, String sourceSpec]
+: class_spec super_spec? implements_list source_spec
+  {
+    classType = $class_spec.type;
+    $classType = classType;
+    $accessFlags = $class_spec.accessFlags;
+    $superType = $super_spec.type;
+    $implementsList = $implements_list.implementsList;
+    $sourceSpec = $source_spec.source;
+  };
+
+
+class_spec returns[String type, int accessFlags]
+  : CLASS_DESCRIPTOR access_list
+  {
+    $type = $CLASS_DESCRIPTOR.text;
+    $accessFlags = $access_list.value;
+  };
+
+super_spec returns[String type]
+  : ^(I_SUPER CLASS_DESCRIPTOR)
+  {
+    $type = $CLASS_DESCRIPTOR.text;
+  };
+
+
+implements_spec returns[String type]
+  : ^(I_IMPLEMENTS CLASS_DESCRIPTOR)
+  {
+    $type = $CLASS_DESCRIPTOR.text;
+  };
+
+implements_list returns[List<String> implementsList]
+@init { List<String> typeList; }
+  : {typeList = Lists.newArrayList();}
+    (implements_spec {typeList.add($implements_spec.type);} )*
+  {
+    if (typeList.size() > 0) {
+      $implementsList = typeList;
+    } else {
+      $implementsList = null;
+    }
+  };
+
+source_spec returns[String source]
+  : {$source = null;}
+    ^(I_SOURCE string_literal {$source = $string_literal.value;})
+  | /*epsilon*/;
+
+access_list returns[int value]
+  @init
+  {
+    $value = 0;
+  }
+  : ^(I_ACCESS_LIST
+      (
+        ACCESS_SPEC
+        {
+          $value |= AccessFlags.getAccessFlag($ACCESS_SPEC.getText()).getValue();
+        }
+      )*);
+
+access_or_restriction_list returns[int value, Set<HiddenApiRestriction> hiddenApiRestrictions]
+  @init
+  {
+    $value = 0;
+    HiddenApiRestriction hiddenApiRestriction = null;
+    HiddenApiRestriction domainSpecificApiRestriction = null;
+  }
+  : ^(I_ACCESS_OR_RESTRICTION_LIST
+      (
+        ACCESS_SPEC
+        {
+          $value |= AccessFlags.getAccessFlag($ACCESS_SPEC.getText()).getValue();
+        }
+        |
+        HIDDENAPI_RESTRICTION
+        {
+          if (opcodes.api < 29) {
+              throw new SemanticException(input, $HIDDENAPI_RESTRICTION, "Hidden API restrictions are only supported on api 29 and above.");
+          }
+
+          HiddenApiRestriction restriction = HiddenApiRestriction.forName($HIDDENAPI_RESTRICTION.getText());
+          if (restriction.isDomainSpecificApiFlag()) {
+             if (domainSpecificApiRestriction != null) {
+                throw new SemanticException(input, $HIDDENAPI_RESTRICTION, "Only one domain-specific api restriction may be specified.");
+             }
+             domainSpecificApiRestriction = restriction;
+          } else {
+            if (hiddenApiRestriction != null) {
+              throw new SemanticException(input, $HIDDENAPI_RESTRICTION, "Only one hidden api restriction may be specified.");
+            }
+            hiddenApiRestriction = restriction;
+          }
+        }
+      )*)
+      {
+        List<HiddenApiRestriction> restrictions = new ArrayList<>(2);
+        if (hiddenApiRestriction != null) {
+          restrictions.add(hiddenApiRestriction);
+        }
+        if (domainSpecificApiRestriction != null) {
+          restrictions.add(domainSpecificApiRestriction);
+        }
+        $hiddenApiRestrictions = ImmutableSet.copyOf(restrictions);
+      };
+
+
+fields returns[List<BuilderField> fields]
+  @init {$fields = Lists.newArrayList();}
+  : ^(I_FIELDS
+      (field
+      {
+        $fields.add($field.field);
+      })*);
+
+methods returns[List<BuilderMethod> methods]
+  @init {$methods = Lists.newArrayList();}
+  : ^(I_METHODS
+      (method
+      {
+        $methods.add($method.ret);
+      })*);
+
+field returns [BuilderField field]
+  :^(I_FIELD SIMPLE_NAME access_or_restriction_list ^(I_FIELD_TYPE nonvoid_type_descriptor) field_initial_value annotations?)
+  {
+    int accessFlags = $access_or_restriction_list.value;
+    Set<HiddenApiRestriction> hiddenApiRestrictions = $access_or_restriction_list.hiddenApiRestrictions;
+
+    if (!AccessFlags.STATIC.isSet(accessFlags) && $field_initial_value.encodedValue != null) {
+        throw new SemanticException(input, "Initial field values can only be specified for static fields.");
+    }
+
+    $field = dexBuilder.internField(classType, $SIMPLE_NAME.text, $nonvoid_type_descriptor.type, accessFlags,
+            $field_initial_value.encodedValue, $annotations.annotations, hiddenApiRestrictions);
+  };
+
+
+field_initial_value returns[EncodedValue encodedValue]
+  : ^(I_FIELD_INITIAL_VALUE literal) {$encodedValue = $literal.encodedValue;}
+  | /*epsilon*/;
+
+literal returns[ImmutableEncodedValue encodedValue]
+  : integer_literal { $encodedValue = new ImmutableIntEncodedValue($integer_literal.value); }
+  | long_literal { $encodedValue = new ImmutableLongEncodedValue($long_literal.value); }
+  | short_literal { $encodedValue = new ImmutableShortEncodedValue($short_literal.value); }
+  | byte_literal { $encodedValue = new ImmutableByteEncodedValue($byte_literal.value); }
+  | float_literal { $encodedValue = new ImmutableFloatEncodedValue($float_literal.value); }
+  | double_literal { $encodedValue = new ImmutableDoubleEncodedValue($double_literal.value); }
+  | char_literal { $encodedValue = new ImmutableCharEncodedValue($char_literal.value); }
+  | string_literal { $encodedValue = new ImmutableStringEncodedValue($string_literal.value); }
+  | bool_literal { $encodedValue = ImmutableBooleanEncodedValue.forBoolean($bool_literal.value); }
+  | NULL_LITERAL { $encodedValue = ImmutableNullEncodedValue.INSTANCE; }
+  | type_descriptor { $encodedValue = new ImmutableTypeEncodedValue($type_descriptor.type); }
+  | array_literal { $encodedValue = new ImmutableArrayEncodedValue($array_literal.elements); }
+  | subannotation { $encodedValue = new ImmutableAnnotationEncodedValue($subannotation.annotationType, $subannotation.elements); }
+  | field_literal { $encodedValue = new ImmutableFieldEncodedValue($field_literal.value); }
+  | method_literal { $encodedValue = new ImmutableMethodEncodedValue($method_literal.value); }
+  | enum_literal { $encodedValue = new ImmutableEnumEncodedValue($enum_literal.value); }
+  | method_handle_literal { $encodedValue = new ImmutableMethodHandleEncodedValue($method_handle_literal.value); }
+  | method_prototype { $encodedValue = new ImmutableMethodTypeEncodedValue($method_prototype.proto); };
+
+//everything but string
+fixed_64bit_literal_number returns[Number value]
+  : integer_literal { $value = $integer_literal.value; }
+  | long_literal { $value = $long_literal.value; }
+  | short_literal { $value = $short_literal.value; }
+  | byte_literal { $value = $byte_literal.value; }
+  | float_literal { $value = Float.floatToRawIntBits($float_literal.value); }
+  | double_literal { $value = Double.doubleToRawLongBits($double_literal.value); }
+  | char_literal { $value = (int)$char_literal.value; }
+  | bool_literal { $value = $bool_literal.value?1:0; };
+
+fixed_64bit_literal returns[long value]
+  : integer_literal { $value = $integer_literal.value; }
+  | long_literal { $value = $long_literal.value; }
+  | short_literal { $value = $short_literal.value; }
+  | byte_literal { $value = $byte_literal.value; }
+  | float_literal { $value = Float.floatToRawIntBits($float_literal.value); }
+  | double_literal { $value = Double.doubleToRawLongBits($double_literal.value); }
+  | char_literal { $value = $char_literal.value; }
+  | bool_literal { $value = $bool_literal.value?1:0; };
+
+//everything but string and double
+//long is allowed, but it must fit into an int
+fixed_32bit_literal returns[int value]
+  : integer_literal { $value = $integer_literal.value; }
+  | long_literal { LiteralTools.checkInt($long_literal.value); $value = (int)$long_literal.value; }
+  | short_literal { $value = $short_literal.value; }
+  | byte_literal { $value = $byte_literal.value; }
+  | float_literal { $value = Float.floatToRawIntBits($float_literal.value); }
+  | char_literal { $value = $char_literal.value; }
+  | bool_literal { $value = $bool_literal.value?1:0; };
+
+array_elements returns[List<Number> elements]
+  : {$elements = Lists.newArrayList();}
+    ^(I_ARRAY_ELEMENTS
+      (fixed_64bit_literal_number
+      {
+        $elements.add($fixed_64bit_literal_number.value);
+      })*);
+
+packed_switch_elements returns[List<Label> elements]
+  @init {$elements = Lists.newArrayList();}
+  :
+    ^(I_PACKED_SWITCH_ELEMENTS
+      (label_ref { $elements.add($label_ref.label); })*
+    );
+
+sparse_switch_elements returns[List<SwitchLabelElement> elements]
+  @init {$elements = Lists.newArrayList();}
+  :
+    ^(I_SPARSE_SWITCH_ELEMENTS
+       (fixed_32bit_literal label_ref
+       {
+         $elements.add(new SwitchLabelElement($fixed_32bit_literal.value, $label_ref.label));
+       })*
+    );
+
+method returns[BuilderMethod ret]
+  scope
+  {
+    boolean isStatic;
+    int totalMethodRegisters;
+    int methodParameterRegisters;
+    MethodImplementationBuilder methodBuilder;
+  }
+  @init
+  {
+    $method::totalMethodRegisters = 0;
+    $method::methodParameterRegisters = 0;
+    int accessFlags = 0;
+    $method::isStatic = false;
+    Set<HiddenApiRestriction> hiddenApiRestrictions = null;
+  }
+  :
+    ^(I_METHOD
+      method_name_and_prototype
+      access_or_restriction_list
+      {
+        accessFlags = $access_or_restriction_list.value;
+        hiddenApiRestrictions = $access_or_restriction_list.hiddenApiRestrictions;
+        $method::isStatic = AccessFlags.STATIC.isSet(accessFlags);
+        $method::methodParameterRegisters =
+                MethodUtil.getParameterRegisterCount($method_name_and_prototype.parameters, $method::isStatic);
+      }
+      (
+        (registers_directive
+        {
+          if ($registers_directive.isLocalsDirective) {
+            $method::totalMethodRegisters = $registers_directive.registers + $method::methodParameterRegisters;
+          } else {
+            $method::totalMethodRegisters = $registers_directive.registers;
+          }
+
+          $method::methodBuilder = new MethodImplementationBuilder($method::totalMethodRegisters);
+
+        })
+        |
+        /* epsilon */
+        {
+          $method::methodBuilder = new MethodImplementationBuilder(0);
+        }
+      )
+      ordered_method_items
+      catches
+      parameters[$method_name_and_prototype.parameters]
+      annotations
+    )
+  {
+    MethodImplementation methodImplementation = null;
+    List<BuilderTryBlock> tryBlocks = $catches.tryBlocks;
+
+    boolean isAbstract = false;
+    boolean isNative = false;
+
+    if ((accessFlags & AccessFlags.ABSTRACT.getValue()) != 0) {
+      isAbstract = true;
+    } else if ((accessFlags & AccessFlags.NATIVE.getValue()) != 0) {
+      isNative = true;
+    }
+
+    methodImplementation = $method::methodBuilder.getMethodImplementation();
+
+    if (Iterables.isEmpty(methodImplementation.getInstructions())) {
+      if (!isAbstract && !isNative) {
+        throw new SemanticException(input, $I_METHOD, "A non-abstract/non-native method must have at least 1 instruction");
+      }
+
+      String methodType;
+      if (isAbstract) {
+        methodType = "an abstract";
+      } else {
+        methodType = "a native";
+      }
+
+      if ($registers_directive.start != null) {
+        if ($registers_directive.isLocalsDirective) {
+          throw new SemanticException(input, $registers_directive.start, "A .locals directive is not valid in \%s method", methodType);
+        } else {
+          throw new SemanticException(input, $registers_directive.start, "A .registers directive is not valid in \%s method", methodType);
+        }
+      }
+
+      if (methodImplementation.getTryBlocks().size() > 0) {
+        throw new SemanticException(input, $I_METHOD, "try/catch blocks cannot be present in \%s method", methodType);
+      }
+
+      if (!Iterables.isEmpty(methodImplementation.getDebugItems())) {
+        throw new SemanticException(input, $I_METHOD, "debug directives cannot be present in \%s method", methodType);
+      }
+
+      methodImplementation = null;
+    } else {
+      if (isAbstract) {
+        throw new SemanticException(input, $I_METHOD, "An abstract method cannot have any instructions");
+      }
+      if (isNative) {
+        throw new SemanticException(input, $I_METHOD, "A native method cannot have any instructions");
+      }
+
+      if ($registers_directive.start == null) {
+        throw new SemanticException(input, $I_METHOD, "A .registers or .locals directive must be present for a non-abstract/non-final method");
+      }
+
+      if ($method::totalMethodRegisters < $method::methodParameterRegisters) {
+        throw new SemanticException(input, $registers_directive.start, "This method requires at least " +
+                Integer.toString($method::methodParameterRegisters) +
+                " registers, for the method parameters");
+      }
+    }
+
+    $ret = dexBuilder.internMethod(
+            classType,
+            $method_name_and_prototype.name,
+            $method_name_and_prototype.parameters,
+            $method_name_and_prototype.returnType,
+            accessFlags,
+            $annotations.annotations,
+            hiddenApiRestrictions,
+            methodImplementation);
+  };
+
+method_prototype returns[ImmutableMethodProtoReference proto]
+  : ^(I_METHOD_PROTOTYPE ^(I_METHOD_RETURN_TYPE type_descriptor) method_type_list)
+  {
+    String returnType = $type_descriptor.type;
+    List<String> parameters = $method_type_list.types;
+    $proto = new ImmutableMethodProtoReference(parameters, returnType);
+  };
+
+method_name_and_prototype returns[String name, List<SmaliMethodParameter> parameters, String returnType]
+  : SIMPLE_NAME method_prototype
+  {
+    $name = $SIMPLE_NAME.text;
+    $parameters = Lists.newArrayList();
+
+    int paramRegister = 0;
+    for (CharSequence type: $method_prototype.proto.getParameterTypes()) {
+        $parameters.add(new SmaliMethodParameter(paramRegister++, type.toString()));
+        char c = type.charAt(0);
+        if (c == 'D' || c == 'J') {
+            paramRegister++;
+        }
+    }
+    $returnType = $method_prototype.proto.getReturnType();
+  };
+
+method_type_list returns[List<String> types]
+  @init
+  {
+    $types = Lists.newArrayList();
+  }
+  : (
+      nonvoid_type_descriptor
+      {
+        $types.add($nonvoid_type_descriptor.type);
+      }
+    )*;
+
+call_site_reference returns[ImmutableCallSiteReference callSiteReference]
+  :
+  ^(I_CALL_SITE_REFERENCE call_site_name=SIMPLE_NAME method_name=string_literal method_prototype
+        call_site_extra_arguments method_reference)
+    {
+        String callSiteName = $call_site_name.text;
+        ImmutableMethodHandleReference methodHandleReference =
+            new ImmutableMethodHandleReference(MethodHandleType.INVOKE_STATIC,
+                $method_reference.methodReference);
+        $callSiteReference = new ImmutableCallSiteReference(
+            callSiteName, methodHandleReference, $method_name.value, $method_prototype.proto,
+            $call_site_extra_arguments.extraArguments);
+    };
+
+method_handle_type returns[int methodHandleType]
+  : (METHOD_HANDLE_TYPE_FIELD | METHOD_HANDLE_TYPE_METHOD | INSTRUCTION_FORMAT35c_METHOD_OR_METHOD_HANDLE_TYPE) {
+    $methodHandleType = MethodHandleType.getMethodHandleType($text);
+  };
+
+method_handle_reference returns[ImmutableMethodHandleReference methodHandle]
+  : method_handle_type (field_reference | method_reference) {
+    ImmutableReference reference;
+    if ($field_reference.text != null) {
+        reference = $field_reference.fieldReference;
+    } else {
+        reference = $method_reference.methodReference;
+    }
+    $methodHandle = new ImmutableMethodHandleReference($method_handle_type.methodHandleType, reference);
+  };
+
+method_handle_literal returns[ImmutableMethodHandleReference value]
+  : ^(I_ENCODED_METHOD_HANDLE method_handle_reference) {
+    $value = $method_handle_reference.methodHandle;
+  };
+
+method_reference returns[ImmutableMethodReference methodReference]
+  : reference_type_descriptor? SIMPLE_NAME method_prototype
+  {
+    String type;
+    if ($reference_type_descriptor.type == null) {
+        type = classType;
+    } else {
+        type = $reference_type_descriptor.type;
+    }
+    $methodReference = new ImmutableMethodReference(type, $SIMPLE_NAME.text,
+             $method_prototype.proto.getParameterTypes(), $method_prototype.proto.getReturnType());
+  };
+
+field_reference returns[ImmutableFieldReference fieldReference]
+  : reference_type_descriptor? SIMPLE_NAME nonvoid_type_descriptor
+  {
+    String type;
+    if ($reference_type_descriptor.type == null) {
+        type = classType;
+    } else {
+        type = $reference_type_descriptor.type;
+    }
+    $fieldReference = new ImmutableFieldReference(type, $SIMPLE_NAME.text,
+            $nonvoid_type_descriptor.type);
+  };
+
+registers_directive returns[boolean isLocalsDirective, int registers]
+  : {$registers = 0;}
+    ^(( I_REGISTERS {$isLocalsDirective = false;}
+      | I_LOCALS {$isLocalsDirective = true;}
+      )
+      short_integral_literal {$registers = $short_integral_literal.value & 0xFFFF;}
+     );
+
+label_def
+  : ^(I_LABEL SIMPLE_NAME)
+  {
+    $method::methodBuilder.addLabel($SIMPLE_NAME.text);
+  };
+
+catches returns[List<BuilderTryBlock> tryBlocks]
+  @init {tryBlocks = Lists.newArrayList();}
+  : ^(I_CATCHES catch_directive* catchall_directive*);
+
+catch_directive
+  : ^(I_CATCH nonvoid_type_descriptor from=label_ref to=label_ref using=label_ref)
+  {
+    $method::methodBuilder.addCatch(dexBuilder.internTypeReference($nonvoid_type_descriptor.type),
+        $from.label, $to.label, $using.label);
+  };
+
+catchall_directive
+  : ^(I_CATCHALL from=label_ref to=label_ref using=label_ref)
+  {
+    $method::methodBuilder.addCatch($from.label, $to.label, $using.label);
+  };
+
+parameters[List<SmaliMethodParameter> parameters]
+  : ^(I_PARAMETERS (parameter[parameters])*);
+
+parameter[List<SmaliMethodParameter> parameters]
+  : ^(I_PARAMETER REGISTER string_literal? annotations)
+    {
+        final int registerNumber = parseRegister_short($REGISTER.text);
+        int totalMethodRegisters = $method::totalMethodRegisters;
+        int methodParameterRegisters = $method::methodParameterRegisters;
+
+        if (registerNumber >= totalMethodRegisters) {
+            throw new SemanticException(input, $I_PARAMETER, "Register \%s is larger than the maximum register v\%d " +
+                    "for this method", $REGISTER.text, totalMethodRegisters-1);
+        }
+        final int indexGuess = registerNumber - (totalMethodRegisters - methodParameterRegisters) - ($method::isStatic?0:1);
+
+        if (indexGuess < 0) {
+            throw new SemanticException(input, $I_PARAMETER, "Register \%s is not a parameter register.",
+                    $REGISTER.text);
+        }
+
+        int parameterIndex = LinearSearch.linearSearch(parameters, SmaliMethodParameter.COMPARATOR,
+            new WithRegister() { public int getRegister() { return indexGuess; } },
+                indexGuess);
+
+        if (parameterIndex < 0) {
+            throw new SemanticException(input, $I_PARAMETER, "Register \%s is the second half of a wide parameter.",
+                                $REGISTER.text);
+        }
+
+        SmaliMethodParameter methodParameter = parameters.get(parameterIndex);
+        methodParameter.name = $string_literal.value;
+        if ($annotations.annotations != null && $annotations.annotations.size() > 0) {
+            methodParameter.annotations = $annotations.annotations;
+        }
+    };
+
+debug_directive
+  : line
+  | local
+  | end_local
+  | restart_local
+  | prologue
+  | epilogue
+  | source;
+
+line
+  : ^(I_LINE integral_literal)
+    {
+        $method::methodBuilder.addLineNumber($integral_literal.value);
+    };
+
+local
+  : ^(I_LOCAL REGISTER ((NULL_LITERAL | name=string_literal) nonvoid_type_descriptor? signature=string_literal?)?)
+    {
+      int registerNumber = parseRegister_short($REGISTER.text);
+      $method::methodBuilder.addStartLocal(registerNumber,
+              dexBuilder.internNullableStringReference($name.value),
+              dexBuilder.internNullableTypeReference($nonvoid_type_descriptor.type),
+              dexBuilder.internNullableStringReference($signature.value));
+    };
+
+end_local
+  : ^(I_END_LOCAL REGISTER)
+    {
+      int registerNumber = parseRegister_short($REGISTER.text);
+      $method::methodBuilder.addEndLocal(registerNumber);
+    };
+
+restart_local
+  : ^(I_RESTART_LOCAL REGISTER)
+    {
+      int registerNumber = parseRegister_short($REGISTER.text);
+      $method::methodBuilder.addRestartLocal(registerNumber);
+    };
+
+prologue
+  : I_PROLOGUE
+    {
+      $method::methodBuilder.addPrologue();
+    };
+
+epilogue
+  : I_EPILOGUE
+    {
+      $method::methodBuilder.addEpilogue();
+    };
+
+source
+  : ^(I_SOURCE string_literal?)
+    {
+      $method::methodBuilder.addSetSourceFile(dexBuilder.internNullableStringReference($string_literal.value));
+    };
+
+call_site_extra_arguments returns[List<ImmutableEncodedValue> extraArguments]
+  : { $extraArguments = Lists.newArrayList(); }
+  ^(I_CALL_SITE_EXTRA_ARGUMENTS (literal { $extraArguments.add($literal.encodedValue); })*);
+
+ordered_method_items
+  : ^(I_ORDERED_METHOD_ITEMS (label_def | instruction | debug_directive)*);
+
+label_ref returns[Label label]
+  : SIMPLE_NAME { $label = $method::methodBuilder.getLabel($SIMPLE_NAME.text); };
+
+register_list returns[byte[\] registers, byte registerCount]
+  @init
+  {
+    $registers = new byte[5];
+    $registerCount = 0;
+  }
+  : ^(I_REGISTER_LIST
+      (REGISTER
+      {
+        if ($registerCount == 5) {
+          throw new SemanticException(input, $I_REGISTER_LIST, "A list of registers can only have a maximum of 5 " +
+                  "registers. Use the <op>/range alternate opcode instead.");
+        }
+        $registers[$registerCount++] = parseRegister_nibble($REGISTER.text);
+      })*);
+
+register_range returns[int startRegister, int endRegister]
+  : ^(I_REGISTER_RANGE (startReg=REGISTER endReg=REGISTER?)?)
+    {
+        if ($startReg == null) {
+            $startRegister = 0;
+            $endRegister = -1;
+        } else {
+                $startRegister  = parseRegister_short($startReg.text);
+                if ($endReg == null) {
+                    $endRegister = $startRegister;
+                } else {
+                    $endRegister = parseRegister_short($endReg.text);
+                }
+
+                int registerCount = $endRegister-$startRegister+1;
+                if (registerCount < 1) {
+                    throw new SemanticException(input, $I_REGISTER_RANGE, "A register range must have the lower register listed first");
+                }
+            }
+    };
+
+verification_error_reference returns[ImmutableReference reference]
+  : CLASS_DESCRIPTOR
+  {
+    $reference = new ImmutableTypeReference($CLASS_DESCRIPTOR.text);
+  }
+  | field_reference
+  {
+    $reference = $field_reference.fieldReference;
+  }
+  | method_reference
+  {
+    $reference = $method_reference.methodReference;
+  };
+
+verification_error_type returns[int verificationError]
+  : VERIFICATION_ERROR_TYPE
+  {
+    $verificationError = VerificationError.getVerificationError($VERIFICATION_ERROR_TYPE.text);
+  };
+
+instruction
+  : insn_format10t
+  | insn_format10x
+  | insn_format11n
+  | insn_format11x
+  | insn_format12x
+  | insn_format20bc
+  | insn_format20t
+  | insn_format21c_field
+  | insn_format21c_method_handle
+  | insn_format21c_method_type
+  | insn_format21c_string
+  | insn_format21c_type
+  | insn_format21ih
+  | insn_format21lh
+  | insn_format21s
+  | insn_format21t
+  | insn_format22b
+  | insn_format22c_field
+  | insn_format22c_type
+  | insn_format22s
+  | insn_format22t
+  | insn_format22x
+  | insn_format23x
+  | insn_format30t
+  | insn_format31c
+  | insn_format31i
+  | insn_format31t
+  | insn_format32x
+  | insn_format35c_call_site
+  | insn_format35c_method
+  | insn_format35c_type
+  | insn_format3rc_call_site
+  | insn_format3rc_method
+  | insn_format3rc_type
+  | insn_format45cc_method
+  | insn_format4rcc_method
+  | insn_format51l_type
+  | insn_array_data_directive
+  | insn_packed_switch_directive
+  | insn_sparse_switch_directive;
+  catch [Exception ex] {
+    reportError(new SemanticException(input, $start, ex.getMessage()));
+    recover(input, null);
+  }
+
+insn_format10t
+  : //e.g. goto endloop:
+    ^(I_STATEMENT_FORMAT10t INSTRUCTION_FORMAT10t label_ref)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT10t.text);
+      $method::methodBuilder.addInstruction(new BuilderInstruction10t(opcode, $label_ref.label));
+    };
+
+insn_format10x
+  : //e.g. return
+    ^(I_STATEMENT_FORMAT10x INSTRUCTION_FORMAT10x)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT10x.text);
+      $method::methodBuilder.addInstruction(new BuilderInstruction10x(opcode));
+    };
+
+insn_format11n
+  : //e.g. const/4 v0, 5
+    ^(I_STATEMENT_FORMAT11n INSTRUCTION_FORMAT11n REGISTER short_integral_literal)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT11n.text);
+      byte regA = parseRegister_nibble($REGISTER.text);
+
+      short litB = $short_integral_literal.value;
+      LiteralTools.checkNibble(litB);
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction11n(opcode, regA, litB));
+    };
+
+insn_format11x
+  : //e.g. move-result-object v1
+    ^(I_STATEMENT_FORMAT11x INSTRUCTION_FORMAT11x REGISTER)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT11x.text);
+      short regA = parseRegister_byte($REGISTER.text);
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction11x(opcode, regA));
+    };
+
+insn_format12x
+  : //e.g. move v1 v2
+    ^(I_STATEMENT_FORMAT12x INSTRUCTION_FORMAT12x registerA=REGISTER registerB=REGISTER)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT12x.text);
+      byte regA = parseRegister_nibble($registerA.text);
+      byte regB = parseRegister_nibble($registerB.text);
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction12x(opcode, regA, regB));
+    };
+
+insn_format20bc
+  : //e.g. throw-verification-error generic-error, Lsome/class;
+    ^(I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc verification_error_type verification_error_reference)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT20bc.text);
+
+      int verificationError = $verification_error_type.verificationError;
+      ImmutableReference referencedItem = $verification_error_reference.reference;
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction20bc(opcode, verificationError,
+              dexBuilder.internReference(referencedItem)));
+    };
+
+insn_format20t
+  : //e.g. goto/16 endloop:
+    ^(I_STATEMENT_FORMAT20t INSTRUCTION_FORMAT20t label_ref)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT20t.text);
+      $method::methodBuilder.addInstruction(new BuilderInstruction20t(opcode, $label_ref.label));
+    };
+
+insn_format21c_field
+  : //e.g. sget_object v0, java/lang/System/out LJava/io/PrintStream;
+    ^(I_STATEMENT_FORMAT21c_FIELD inst=(INSTRUCTION_FORMAT21c_FIELD | INSTRUCTION_FORMAT21c_FIELD_ODEX) REGISTER field_reference)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($inst.text);
+      short regA = parseRegister_byte($REGISTER.text);
+
+      ImmutableFieldReference fieldReference = $field_reference.fieldReference;
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction21c(opcode, regA,
+              dexBuilder.internFieldReference(fieldReference)));
+    };
+
+insn_format21c_method_handle
+  : //e.g. const-method-handle v0, invoke-static@Ljava/lang/Integer;->toString(I)Ljava/lang/String;
+    ^(I_STATEMENT_FORMAT21c_METHOD_HANDLE inst=(INSTRUCTION_FORMAT21c_METHOD_HANDLE) REGISTER method_handle_reference)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($inst.text);
+      short regA = parseRegister_byte($REGISTER.text);
+
+      ImmutableMethodHandleReference methodHandleReference = $method_handle_reference.methodHandle;
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction21c(opcode, regA,
+              dexBuilder.internMethodHandle(methodHandleReference)));
+    };
+
+insn_format21c_method_type
+  : //e.g. const-method-type v0, (ILjava/lang/String;)Ljava/lang/String;
+    ^(I_STATEMENT_FORMAT21c_METHOD_TYPE inst=(INSTRUCTION_FORMAT21c_METHOD_TYPE) REGISTER method_prototype)
+    {
+        Opcode opcode = opcodes.getOpcodeByName($inst.text);
+        short regA = parseRegister_byte($REGISTER.text);
+
+        ImmutableMethodProtoReference methodProtoReference = $method_prototype.proto;
+
+        $method::methodBuilder.addInstruction(new BuilderInstruction21c(opcode, regA,
+                dexBuilder.internMethodProtoReference(methodProtoReference)));
+    };
+
+insn_format21c_string
+  : //e.g. const-string v1, "Hello World!"
+    ^(I_STATEMENT_FORMAT21c_STRING INSTRUCTION_FORMAT21c_STRING REGISTER string_literal)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT21c_STRING.text);
+      short regA = parseRegister_byte($REGISTER.text);
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction21c(opcode, regA,
+              dexBuilder.internStringReference($string_literal.value)));
+    };
+
+insn_format21c_type
+  : //e.g. const-class v2, org/jf/HelloWorld2/HelloWorld2
+    ^(I_STATEMENT_FORMAT21c_TYPE INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT21c_TYPE.text);
+      short regA = parseRegister_byte($REGISTER.text);
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction21c(opcode, regA,
+              dexBuilder.internTypeReference($nonvoid_type_descriptor.type)));
+    };
+
+insn_format21ih
+  : //e.g. const/high16 v1, 1234
+    ^(I_STATEMENT_FORMAT21ih INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT21ih.text);
+      short regA = parseRegister_byte($REGISTER.text);
+
+      int litB = $fixed_32bit_literal.value;
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction21ih(opcode, regA, litB));
+    };
+
+insn_format21lh
+  : //e.g. const-wide/high16 v1, 1234
+    ^(I_STATEMENT_FORMAT21lh INSTRUCTION_FORMAT21lh REGISTER fixed_64bit_literal)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT21lh.text);
+      short regA = parseRegister_byte($REGISTER.text);
+
+      long litB = $fixed_64bit_literal.value;
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction21lh(opcode, regA, litB));
+    };
+
+insn_format21s
+  : //e.g. const/16 v1, 1234
+    ^(I_STATEMENT_FORMAT21s INSTRUCTION_FORMAT21s REGISTER short_integral_literal)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT21s.text);
+      short regA = parseRegister_byte($REGISTER.text);
+
+      short litB = $short_integral_literal.value;
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction21s(opcode, regA, litB));
+    };
+
+insn_format21t
+  : //e.g. if-eqz v0, endloop:
+    ^(I_STATEMENT_FORMAT21t INSTRUCTION_FORMAT21t REGISTER label_ref)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT21t.text);
+      short regA = parseRegister_byte($REGISTER.text);
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction21t(opcode, regA, $label_ref.label));
+    };
+
+insn_format22b
+  : //e.g. add-int v0, v1, 123
+    ^(I_STATEMENT_FORMAT22b INSTRUCTION_FORMAT22b registerA=REGISTER registerB=REGISTER short_integral_literal)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT22b.text);
+      short regA = parseRegister_byte($registerA.text);
+      short regB = parseRegister_byte($registerB.text);
+
+      short litC = $short_integral_literal.value;
+      LiteralTools.checkByte(litC);
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction22b(opcode, regA, regB, litC));
+    };
+
+insn_format22c_field
+  : //e.g. iput-object v1, v0, org/jf/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String;
+    ^(I_STATEMENT_FORMAT22c_FIELD inst=(INSTRUCTION_FORMAT22c_FIELD | INSTRUCTION_FORMAT22c_FIELD_ODEX) registerA=REGISTER registerB=REGISTER field_reference)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($inst.text);
+      byte regA = parseRegister_nibble($registerA.text);
+      byte regB = parseRegister_nibble($registerB.text);
+
+      ImmutableFieldReference fieldReference = $field_reference.fieldReference;
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction22c(opcode, regA, regB,
+              dexBuilder.internFieldReference(fieldReference)));
+    };
+
+insn_format22c_type
+  : //e.g. instance-of v0, v1, Ljava/lang/String;
+    ^(I_STATEMENT_FORMAT22c_TYPE INSTRUCTION_FORMAT22c_TYPE registerA=REGISTER registerB=REGISTER nonvoid_type_descriptor)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT22c_TYPE.text);
+      byte regA = parseRegister_nibble($registerA.text);
+      byte regB = parseRegister_nibble($registerB.text);
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction22c(opcode, regA, regB,
+              dexBuilder.internTypeReference($nonvoid_type_descriptor.type)));
+    };
+
+insn_format22s
+  : //e.g. add-int/lit16 v0, v1, 12345
+    ^(I_STATEMENT_FORMAT22s INSTRUCTION_FORMAT22s registerA=REGISTER registerB=REGISTER short_integral_literal)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT22s.text);
+      byte regA = parseRegister_nibble($registerA.text);
+      byte regB = parseRegister_nibble($registerB.text);
+
+      short litC = $short_integral_literal.value;
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction22s(opcode, regA, regB, litC));
+    };
+
+insn_format22t
+  : //e.g. if-eq v0, v1, endloop:
+    ^(I_STATEMENT_FORMAT22t INSTRUCTION_FORMAT22t registerA=REGISTER registerB=REGISTER label_ref)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT22t.text);
+      byte regA = parseRegister_nibble($registerA.text);
+      byte regB = parseRegister_nibble($registerB.text);
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction22t(opcode, regA, regB, $label_ref.label));
+    };
+
+insn_format22x
+  : //e.g. move/from16 v1, v1234
+    ^(I_STATEMENT_FORMAT22x INSTRUCTION_FORMAT22x registerA=REGISTER registerB=REGISTER)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT22x.text);
+      short regA = parseRegister_byte($registerA.text);
+      int regB = parseRegister_short($registerB.text);
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction22x(opcode, regA, regB));
+    };
+
+insn_format23x
+  : //e.g. add-int v1, v2, v3
+    ^(I_STATEMENT_FORMAT23x INSTRUCTION_FORMAT23x registerA=REGISTER registerB=REGISTER registerC=REGISTER)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT23x.text);
+      short regA = parseRegister_byte($registerA.text);
+      short regB = parseRegister_byte($registerB.text);
+      short regC = parseRegister_byte($registerC.text);
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction23x(opcode, regA, regB, regC));
+    };
+
+insn_format30t
+  : //e.g. goto/32 endloop:
+    ^(I_STATEMENT_FORMAT30t INSTRUCTION_FORMAT30t label_ref)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT30t.text);
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction30t(opcode, $label_ref.label));
+    };
+
+insn_format31c
+  : //e.g. const-string/jumbo v1 "Hello World!"
+    ^(I_STATEMENT_FORMAT31c INSTRUCTION_FORMAT31c REGISTER string_literal)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT31c.text);
+      short regA = parseRegister_byte($REGISTER.text);
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction31c(opcode, regA,
+              dexBuilder.internStringReference($string_literal.value)));
+    };
+
+insn_format31i
+  : //e.g. const v0, 123456
+    ^(I_STATEMENT_FORMAT31i INSTRUCTION_FORMAT31i REGISTER fixed_32bit_literal)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT31i.text);
+      short regA = parseRegister_byte($REGISTER.text);
+
+      int litB = $fixed_32bit_literal.value;
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction31i(opcode, regA, litB));
+    };
+
+insn_format31t
+  : //e.g. fill-array-data v0, ArrayData:
+    ^(I_STATEMENT_FORMAT31t INSTRUCTION_FORMAT31t REGISTER label_ref)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT31t.text);
+
+      short regA = parseRegister_byte($REGISTER.text);
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction31t(opcode, regA, $label_ref.label));
+    };
+
+insn_format32x
+  : //e.g. move/16 v5678, v1234
+    ^(I_STATEMENT_FORMAT32x INSTRUCTION_FORMAT32x registerA=REGISTER registerB=REGISTER)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT32x.text);
+      int regA = parseRegister_short($registerA.text);
+      int regB = parseRegister_short($registerB.text);
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction32x(opcode, regA, regB));
+    };
+
+insn_format35c_call_site
+  : //e.g. invoke-custom {v0, v1}, call_site_name
+    // OR invoke-custom {v0, v1}, {"doSomething", (LCustom;Ljava/lang/String;)Ljava/lang/String;, "just testing"}, BootstrapLinker;->normalLink(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
+    ^(I_STATEMENT_FORMAT35c_CALL_SITE INSTRUCTION_FORMAT35c_CALL_SITE register_list call_site_reference)
+    {
+        Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT35c_CALL_SITE.text);
+
+        //this depends on the fact that register_list returns a byte[5]
+        byte[] registers = $register_list.registers;
+        byte registerCount = $register_list.registerCount;
+
+        ImmutableCallSiteReference callSiteReference = $call_site_reference.callSiteReference;
+
+        $method::methodBuilder.addInstruction(new BuilderInstruction35c(opcode, registerCount, registers[0],
+                registers[1], registers[2], registers[3], registers[4], dexBuilder.internCallSite(callSiteReference)));
+    };
+
+insn_format35c_method
+  : //e.g. invoke-virtual {v0,v1} java/io/PrintStream/print(Ljava/lang/Stream;)V
+    ^(I_STATEMENT_FORMAT35c_METHOD INSTRUCTION_FORMAT35c_METHOD register_list method_reference)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT35c_METHOD.text);
+
+      //this depends on the fact that register_list returns a byte[5]
+      byte[] registers = $register_list.registers;
+      byte registerCount = $register_list.registerCount;
+
+      ImmutableMethodReference methodReference = $method_reference.methodReference;
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction35c(opcode, registerCount, registers[0], registers[1],
+              registers[2], registers[3], registers[4], dexBuilder.internMethodReference(methodReference)));
+    };
+
+insn_format35c_type
+  : //e.g. filled-new-array {v0,v1}, I
+    ^(I_STATEMENT_FORMAT35c_TYPE INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT35c_TYPE.text);
+
+      //this depends on the fact that register_list returns a byte[5]
+      byte[] registers = $register_list.registers;
+      byte registerCount = $register_list.registerCount;
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction35c(opcode, registerCount, registers[0], registers[1],
+              registers[2], registers[3], registers[4], dexBuilder.internTypeReference($nonvoid_type_descriptor.type)));
+    };
+
+insn_format3rc_call_site
+  : //e.g. invoke-custom/range {v0 .. v1}, call_site_name
+    // OR invoke-custom/range {v0 .. v1}, {"doSomething", (LCustom;Ljava/lang/String;)Ljava/lang/String;, "just testing"}, BootstrapLinker;->normalLink(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
+    ^(I_STATEMENT_FORMAT3rc_CALL_SITE INSTRUCTION_FORMAT3rc_CALL_SITE register_range call_site_reference)
+    {
+        Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT3rc_CALL_SITE.text);
+        int startRegister = $register_range.startRegister;
+        int endRegister = $register_range.endRegister;
+
+        int registerCount = endRegister - startRegister + 1;
+
+        ImmutableCallSiteReference callSiteReference = $call_site_reference.callSiteReference;
+
+        $method::methodBuilder.addInstruction(new BuilderInstruction3rc(opcode, startRegister, registerCount,
+                dexBuilder.internCallSite(callSiteReference)));
+    };
+
+insn_format3rc_method
+  : //e.g. invoke-virtual/range {v25..v26} java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+    ^(I_STATEMENT_FORMAT3rc_METHOD INSTRUCTION_FORMAT3rc_METHOD register_range method_reference)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT3rc_METHOD.text);
+      int startRegister = $register_range.startRegister;
+      int endRegister = $register_range.endRegister;
+
+      int registerCount = endRegister-startRegister+1;
+
+      ImmutableMethodReference methodReference = $method_reference.methodReference;
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction3rc(opcode, startRegister, registerCount,
+              dexBuilder.internMethodReference(methodReference)));
+    };
+
+insn_format3rc_type
+  : //e.g. filled-new-array/range {v0..v6} I
+    ^(I_STATEMENT_FORMAT3rc_TYPE INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT3rc_TYPE.text);
+      int startRegister = $register_range.startRegister;
+      int endRegister = $register_range.endRegister;
+
+      int registerCount = endRegister-startRegister+1;
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction3rc(opcode, startRegister, registerCount,
+              dexBuilder.internTypeReference($nonvoid_type_descriptor.type)));
+    };
+
+insn_format45cc_method
+  : //e.g. invoke-polymorphic {v0, v1}, java/lang/invoke/MethodHandle;->invoke([Ljava/lang/Object;)Ljava/lang/Object;, (I)J
+    ^(I_STATEMENT_FORMAT45cc_METHOD INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT45cc_METHOD.text);
+
+      //this depends on the fact that register_list returns a byte[5]
+      byte[] registers = $register_list.registers;
+      byte registerCount = $register_list.registerCount;
+
+      ImmutableMethodReference methodReference = $method_reference.methodReference;
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction45cc(opcode, registerCount, registers[0], registers[1],
+              registers[2], registers[3], registers[4],
+              dexBuilder.internMethodReference(methodReference),
+              dexBuilder.internMethodProtoReference($method_prototype.proto)));
+    };
+
+insn_format4rcc_method
+  : //e.g. invoke-polymorphic {v0..v1}, java/lang/invoke/MethodHandle;->invoke([Ljava/lang/Object;)Ljava/lang/Object;, (I)J
+    ^(I_STATEMENT_FORMAT4rcc_METHOD INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT4rcc_METHOD.text);
+      int startRegister = $register_range.startRegister;
+      int endRegister = $register_range.endRegister;
+
+      int registerCount = endRegister-startRegister+1;
+
+      ImmutableMethodReference methodReference = $method_reference.methodReference;
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction4rcc(opcode, startRegister, registerCount,
+              dexBuilder.internMethodReference(methodReference),
+              dexBuilder.internMethodProtoReference($method_prototype.proto)));
+    };
+
+insn_format51l_type
+  : //e.g. const-wide v0, 5000000000L
+    ^(I_STATEMENT_FORMAT51l INSTRUCTION_FORMAT51l REGISTER fixed_64bit_literal)
+    {
+      Opcode opcode = opcodes.getOpcodeByName($INSTRUCTION_FORMAT51l.text);
+      short regA = parseRegister_byte($REGISTER.text);
+
+      long litB = $fixed_64bit_literal.value;
+
+      $method::methodBuilder.addInstruction(new BuilderInstruction51l(opcode, regA, litB));
+    };
+
+insn_array_data_directive
+  : //e.g. .array-data 4 1000000 .end array-data
+    ^(I_STATEMENT_ARRAY_DATA ^(I_ARRAY_ELEMENT_SIZE short_integral_literal) array_elements)
+    {
+      int elementWidth = $short_integral_literal.value;
+      List<Number> elements = $array_elements.elements;
+
+      $method::methodBuilder.addInstruction(new BuilderArrayPayload(elementWidth, $array_elements.elements));
+    };
+
+insn_packed_switch_directive
+  :
+    ^(I_STATEMENT_PACKED_SWITCH ^(I_PACKED_SWITCH_START_KEY fixed_32bit_literal) packed_switch_elements)
+      {
+        int startKey = $fixed_32bit_literal.value;
+        $method::methodBuilder.addInstruction(new BuilderPackedSwitchPayload(startKey,
+            $packed_switch_elements.elements));
+      };
+
+insn_sparse_switch_directive
+  :
+    ^(I_STATEMENT_SPARSE_SWITCH sparse_switch_elements)
+    {
+      $method::methodBuilder.addInstruction(new BuilderSparseSwitchPayload($sparse_switch_elements.elements));
+    };
+
+array_descriptor returns [String type]
+  : ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE { $type = $ARRAY_TYPE_PREFIX.text + $PRIMITIVE_TYPE.text; }
+                      | CLASS_DESCRIPTOR { $type = $ARRAY_TYPE_PREFIX.text + $CLASS_DESCRIPTOR.text; });
+
+nonvoid_type_descriptor returns [String type]
+  : (PRIMITIVE_TYPE { $type = $text; }
+  | CLASS_DESCRIPTOR { $type = $text; }
+  | array_descriptor { $type = $array_descriptor.type; })
+  ;
+
+reference_type_descriptor returns [String type]
+  : (CLASS_DESCRIPTOR { $type = $text; }
+  | array_descriptor { $type = $array_descriptor.type; })
+  ;
+
+type_descriptor returns [String type]
+  : VOID_TYPE {$type = "V";}
+  | nonvoid_type_descriptor {$type = $nonvoid_type_descriptor.type;}
+  ;
+
+short_integral_literal returns[short value]
+  : long_literal
+    {
+      LiteralTools.checkShort($long_literal.value);
+      $value = (short)$long_literal.value;
+    }
+  | integer_literal
+    {
+      LiteralTools.checkShort($integer_literal.value);
+      $value = (short)$integer_literal.value;
+    }
+  | short_literal {$value = $short_literal.value;}
+  | char_literal {$value = (short)$char_literal.value;}
+  | byte_literal {$value = $byte_literal.value;};
+
+integral_literal returns[int value]
+  : long_literal
+    {
+      LiteralTools.checkInt($long_literal.value);
+      $value = (int)$long_literal.value;
+    }
+  | integer_literal {$value = $integer_literal.value;}
+  | short_literal {$value = $short_literal.value;}
+  | byte_literal {$value = $byte_literal.value;};
+
+
+integer_literal returns[int value]
+  : INTEGER_LITERAL { $value = LiteralTools.parseInt($INTEGER_LITERAL.text); };
+
+long_literal returns[long value]
+  : LONG_LITERAL { $value = LiteralTools.parseLong($LONG_LITERAL.text); };
+
+short_literal returns[short value]
+  : SHORT_LITERAL { $value = LiteralTools.parseShort($SHORT_LITERAL.text); };
+
+byte_literal returns[byte value]
+  : BYTE_LITERAL { $value = LiteralTools.parseByte($BYTE_LITERAL.text); };
+
+float_literal returns[float value]
+  : FLOAT_LITERAL { $value = LiteralTools.parseFloat($FLOAT_LITERAL.text); };
+
+double_literal returns[double value]
+  : DOUBLE_LITERAL { $value = LiteralTools.parseDouble($DOUBLE_LITERAL.text); };
+
+char_literal returns[char value]
+  : CHAR_LITERAL { $value = $CHAR_LITERAL.text.charAt(1); };
+
+string_literal returns[String value]
+  : STRING_LITERAL
+    {
+      $value = $STRING_LITERAL.text;
+      $value = $value.substring(1,$value.length()-1);
+    };
+
+bool_literal returns[boolean value]
+  : BOOL_LITERAL { $value = Boolean.parseBoolean($BOOL_LITERAL.text); };
+
+array_literal returns[List<EncodedValue> elements]
+  : {$elements = Lists.newArrayList();}
+    ^(I_ENCODED_ARRAY (literal {$elements.add($literal.encodedValue);})*);
+
+annotations returns[Set<Annotation> annotations]
+  : {HashMap<String, Annotation> annotationMap = Maps.newHashMap();}
+    ^(I_ANNOTATIONS (annotation
+    {
+        Annotation anno = $annotation.annotation;
+        Annotation old = annotationMap.put(anno.getType(), anno);
+        if (old != null) {
+            throw new SemanticException(input, "Multiple annotations of type \%s", anno.getType());
+        }
+    })*)
+    {
+        $annotations = ImmutableSet.copyOf(annotationMap.values());
+    };
+
+annotation returns[Annotation annotation]
+  : ^(I_ANNOTATION ANNOTATION_VISIBILITY subannotation)
+    {
+      int visibility = AnnotationVisibility.getVisibility($ANNOTATION_VISIBILITY.text);
+      $annotation = new ImmutableAnnotation(visibility, $subannotation.annotationType, $subannotation.elements);
+    };
+
+annotation_element returns[AnnotationElement element]
+  : ^(I_ANNOTATION_ELEMENT SIMPLE_NAME literal)
+    {
+      $element = new ImmutableAnnotationElement($SIMPLE_NAME.text, $literal.encodedValue);
+    };
+
+subannotation returns[String annotationType, List<AnnotationElement> elements]
+  : {ArrayList<AnnotationElement> elements = Lists.newArrayList();}
+    ^(I_SUBANNOTATION
+        CLASS_DESCRIPTOR
+        (annotation_element
+        {
+           elements.add($annotation_element.element);
+        })*
+     )
+    {
+      $annotationType = $CLASS_DESCRIPTOR.text;
+      $elements = elements;
+    };
+
+field_literal returns[ImmutableFieldReference value]
+  : ^(I_ENCODED_FIELD field_reference)
+    {
+      $value = $field_reference.fieldReference;
+    };
+
+method_literal returns[ImmutableMethodReference value]
+  : ^(I_ENCODED_METHOD method_reference)
+    {
+      $value = $method_reference.methodReference;
+    };
+
+enum_literal returns[ImmutableFieldReference value]
+  : ^(I_ENCODED_ENUM field_reference)
+    {
+      $value = $field_reference.fieldReference;
+    };
diff --git a/smali/src/main/java/org/jf/smali/AssembleCommand.java b/smali/src/main/java/org/jf/smali/AssembleCommand.java
new file mode 100644
index 0000000..efde182
--- /dev/null
+++ b/smali/src/main/java/org/jf/smali/AssembleCommand.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.smali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+import com.beust.jcommander.validators.PositiveInteger;
+import org.jf.util.jcommander.Command;
+import org.jf.util.jcommander.ExtendedParameter;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.util.List;
+
+@Parameters(commandDescription = "Assembles smali files into a dex file.")
+@ExtendedParameters(
+        commandName = "assemble",
+        commandAliases = { "ass", "as", "a" })
+public class AssembleCommand extends Command {
+
+    @Parameter(names = {"-h", "-?", "--help"}, help = true,
+            description = "Show usage information for this command.")
+    private boolean help;
+
+    @Parameter(names = {"-j", "--jobs"},
+            description = "The number of threads to use. Defaults to the number of cores available.",
+            validateWith = PositiveInteger.class)
+    @ExtendedParameter(argumentNames = "n")
+    private int jobs = Runtime.getRuntime().availableProcessors();
+
+    @Parameter(names = {"-a", "--api"},
+            description = "The numeric api level to use while assembling.")
+    @ExtendedParameter(argumentNames = "api")
+    private int apiLevel = 15;
+
+    @Parameter(names = {"-o", "--output"},
+            description = "The name/path of the dex file to write.")
+    @ExtendedParameter(argumentNames = "file")
+    private String output = "out.dex";
+
+    @Parameter(names = "--verbose",
+            description = "Generate verbose error messages.")
+    private boolean verbose = false;
+
+    @Parameter(names = {"--allow-odex-opcodes", "--allow-odex", "--ao"},
+            description = "Allows the odex opcodes that dalvik doesn't reject to be assembled.")
+    private boolean allowOdexOpcodes;
+
+    @Parameter(description = "Assembles the given files. If a directory is specified, it will be " +
+            "recursively searched for any files with a .smali prefix")
+    @ExtendedParameter(argumentNames = "[<file>|<dir>]+")
+    private List<String> input;
+
+    public AssembleCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors);
+    }
+
+    @Override public void run() {
+        if (help || input == null || input.isEmpty()) {
+            usage();
+            return;
+        }
+
+        try {
+            Smali.assemble(getOptions(), input);
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    protected SmaliOptions getOptions() {
+        SmaliOptions options = new SmaliOptions();
+
+        options.jobs = jobs;
+        options.apiLevel = apiLevel;
+        options.outputDexFile = output;
+        options.allowOdexOpcodes = allowOdexOpcodes;
+        options.verboseErrors = verbose;
+
+        return options;
+    }
+}
diff --git a/smali/src/main/java/org/jf/smali/HelpCommand.java b/smali/src/main/java/org/jf/smali/HelpCommand.java
new file mode 100644
index 0000000..429a7df
--- /dev/null
+++ b/smali/src/main/java/org/jf/smali/HelpCommand.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.smali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+import org.jf.util.ConsoleUtil;
+import org.jf.util.jcommander.*;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+@Parameters(commandDescription = "Shows usage information")
+@ExtendedParameters(
+        commandName = "help",
+        commandAliases = "h")
+public class HelpCommand extends Command {
+
+    @Parameter(description = "If specified, show the detailed usage information for the given commands")
+    @ExtendedParameter(argumentNames = "commands")
+    private List<String> commands;
+
+    public HelpCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors);
+    }
+
+    public void run() {
+        JCommander parentJc = commandAncestors.get(commandAncestors.size() - 1);
+
+        if (commands == null || commands.isEmpty()) {
+            System.out.println(new HelpFormatter()
+                    .width(ConsoleUtil.getConsoleWidth())
+                    .format(commandAncestors));
+        } else {
+            boolean printedHelp = false;
+            for (String cmd : commands) {
+                JCommander command = ExtendedCommands.getSubcommand(parentJc, cmd);
+                if (command == null) {
+                    System.err.println("No such command: " + cmd);
+                } else {
+                    printedHelp = true;
+                    System.out.println(new HelpFormatter()
+                            .width(ConsoleUtil.getConsoleWidth())
+                            .format(((Command)command.getObjects().get(0)).getCommandHierarchy()));
+                }
+            }
+            if (!printedHelp) {
+                System.out.println(new HelpFormatter()
+                        .width(ConsoleUtil.getConsoleWidth())
+                        .format(commandAncestors));
+            }
+        }
+    }
+
+    @Parameters(hidden =  true)
+    @ExtendedParameters(commandName = "hlep")
+    public static class HlepCommand extends HelpCommand {
+        public HlepCommand(@Nonnull List<JCommander> commandAncestors) {
+            super(commandAncestors);
+        }
+    }
+}
diff --git a/smali/src/main/java/org/jf/smali/InvalidToken.java b/smali/src/main/java/org/jf/smali/InvalidToken.java
new file mode 100644
index 0000000..edeb785
--- /dev/null
+++ b/smali/src/main/java/org/jf/smali/InvalidToken.java
@@ -0,0 +1,51 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.smali;
+
+import org.antlr.runtime.CommonToken;
+
+public class InvalidToken extends CommonToken {
+    private final String message;
+
+    public InvalidToken(String message) {
+        super(smaliParser.INVALID_TOKEN);
+        this.message = message;
+        this.channel = smaliParser.ERROR_CHANNEL;
+    }
+
+    public InvalidToken(String message, String text) {
+        super(smaliParser.INVALID_TOKEN, text);
+        this.message = message;
+        this.channel = smaliParser.ERROR_CHANNEL;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+}
diff --git a/smali/src/main/java/org/jf/smali/LexerErrorInterface.java b/smali/src/main/java/org/jf/smali/LexerErrorInterface.java
new file mode 100644
index 0000000..001279e
--- /dev/null
+++ b/smali/src/main/java/org/jf/smali/LexerErrorInterface.java
@@ -0,0 +1,48 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.smali;
+
+import org.antlr.runtime.CharStream;
+import org.antlr.runtime.Lexer;
+import org.antlr.runtime.RecognizerSharedState;
+
+public interface LexerErrorInterface {
+    public int getNumberOfSyntaxErrors();
+
+    //ANTLR doesn't provide any way to add interfaces to the lexer class directly, so this is an intermediate
+    //class that implements LexerErrorInterface that we can have the ANTLR parser extend 
+    public abstract static class ANTLRLexerWithErrorInterface extends Lexer implements LexerErrorInterface {
+        public ANTLRLexerWithErrorInterface() {
+        }
+
+        public ANTLRLexerWithErrorInterface(CharStream input, RecognizerSharedState state) {
+            super(input, state);
+        }
+    }
+}
diff --git a/smali/src/main/java/org/jf/smali/LiteralTools.java b/smali/src/main/java/org/jf/smali/LiteralTools.java
new file mode 100644
index 0000000..e2262c1
--- /dev/null
+++ b/smali/src/main/java/org/jf/smali/LiteralTools.java
@@ -0,0 +1,417 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.smali;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class LiteralTools
+{
+    public static byte parseByte(String byteLiteral)
+            throws NumberFormatException {
+        if (byteLiteral == null) {
+            throw new NumberFormatException("string is null");
+        }
+        if (byteLiteral.length() == 0) {
+            throw new NumberFormatException("string is blank");
+        }
+
+        char[] byteChars;
+        if (byteLiteral.toUpperCase().endsWith("T")) {
+            byteChars = byteLiteral.substring(0, byteLiteral.length()-1).toCharArray();
+        } else {
+            byteChars = byteLiteral.toCharArray();
+        }
+
+        int position = 0;
+        int radix = 10;
+        boolean negative = false;
+        if (byteChars[position] == '-') {
+            position++;
+            negative = true;
+        }
+
+        if (byteChars[position] == '0') {
+            position++;
+            if (position == byteChars.length) {
+                return 0;
+            } else if (byteChars[position] == 'x' || byteChars[position] == 'X') {
+                radix = 16;
+                position++;
+            } else if (Character.digit(byteChars[position], 8) >= 0) {
+                radix = 8;
+            }
+        }
+
+        byte result = 0;
+        byte shiftedResult;
+        int digit;
+        byte maxValue = (byte)(Byte.MAX_VALUE / (radix / 2));
+
+        while (position < byteChars.length) {
+            digit = Character.digit(byteChars[position], radix);
+            if (digit < 0) {
+                throw new NumberFormatException("The string contains invalid an digit - '" + byteChars[position] + "'");
+            }
+            shiftedResult = (byte)(result * radix);
+            if (result > maxValue) {
+                throw new NumberFormatException(byteLiteral + " cannot fit into a byte");
+            }
+            if (shiftedResult < 0 && shiftedResult >= -digit) {
+                throw new NumberFormatException(byteLiteral + " cannot fit into a byte");
+            }
+            result = (byte)(shiftedResult + digit);
+            position++;
+        }
+
+        if (negative) {
+            //allow -0x80, which is = 0x80
+            if (result == Byte.MIN_VALUE) {
+                return result;
+            } else if (result < 0) {
+                throw new NumberFormatException(byteLiteral + " cannot fit into a byte");
+            }
+            return (byte)(result * -1);
+        } else {
+            return result;
+        }
+    }
+
+    public static short parseShort(String shortLiteral)
+            throws NumberFormatException {
+        if (shortLiteral == null) {
+            throw new NumberFormatException("string is null");
+        }
+        if (shortLiteral.length() == 0) {
+            throw new NumberFormatException("string is blank");
+        }
+
+        char[] shortChars;
+        if (shortLiteral.toUpperCase().endsWith("S")) {
+            shortChars = shortLiteral.substring(0, shortLiteral.length()-1).toCharArray();
+        } else {
+            shortChars = shortLiteral.toCharArray();
+        }
+
+        int position = 0;
+        int radix = 10;
+        boolean negative = false;
+        if (shortChars[position] == '-') {
+            position++;
+            negative = true;
+        }
+
+        if (shortChars[position] == '0') {
+            position++;
+            if (position == shortChars.length) {
+                return 0;
+            } else if (shortChars[position] == 'x' || shortChars[position] == 'X') {
+                radix = 16;
+                position++;
+            } else if (Character.digit(shortChars[position], 8) >= 0) {
+                radix = 8;
+            }
+        }
+
+        short result = 0;
+        short shiftedResult;
+        int digit;
+        short maxValue = (short)(Short.MAX_VALUE / (radix / 2));
+
+        while (position < shortChars.length) {
+            digit = Character.digit(shortChars[position], radix);
+            if (digit < 0) {
+                throw new NumberFormatException("The string contains invalid an digit - '" + shortChars[position] + "'");
+            }
+            shiftedResult = (short)(result * radix);
+            if (result > maxValue) {
+                throw new NumberFormatException(shortLiteral + " cannot fit into a short");
+            }
+            if (shiftedResult < 0 && shiftedResult >= -digit) {
+                throw new NumberFormatException(shortLiteral + " cannot fit into a short");
+            }
+            result = (short)(shiftedResult + digit);
+            position++;
+        }
+
+        if (negative) {
+            //allow -0x8000, which is = 0x8000
+            if (result == Short.MIN_VALUE) {
+                return result;
+            } else if (result < 0) {
+                throw new NumberFormatException(shortLiteral + " cannot fit into a short");
+            }
+            return (short)(result * -1);
+        } else {
+            return result;
+        }
+    }
+
+    public static int parseInt(String intLiteral)
+            throws NumberFormatException {
+        if (intLiteral == null) {
+            throw new NumberFormatException("string is null");
+        }
+        if (intLiteral.length() == 0) {
+            throw new NumberFormatException("string is blank");
+        }
+
+        char[] intChars = intLiteral.toCharArray();
+        int position = 0;
+        int radix = 10;
+        boolean negative = false;
+        if (intChars[position] == '-') {
+            position++;
+            negative = true;
+        }
+
+        if (intChars[position] == '0') {
+            position++;
+            if (position == intChars.length) {
+                return 0;
+            } else if (intChars[position] == 'x' || intChars[position] == 'X') {
+                radix = 16;
+                position++;
+            } else if (Character.digit(intChars[position], 8) >= 0) {
+                radix = 8;
+            }
+        }
+
+        int result = 0;
+        int shiftedResult;
+        int digit;
+        int maxValue = Integer.MAX_VALUE / (radix / 2);
+
+        while (position < intChars.length) {
+            digit = Character.digit(intChars[position], radix);
+            if (digit < 0) {
+                throw new NumberFormatException("The string contains an invalid digit - '" + intChars[position] + "'");
+            }
+            shiftedResult = result * radix;
+            if (result > maxValue) {
+                throw new NumberFormatException(intLiteral + " cannot fit into an int");
+            }
+            if (shiftedResult < 0 && shiftedResult >= -digit) {
+                throw new NumberFormatException(intLiteral + " cannot fit into an int");
+            }
+            result = shiftedResult + digit;
+            position++;
+        }
+
+        if (negative) {
+            //allow -0x80000000, which is = 0x80000000
+            if (result == Integer.MIN_VALUE) {
+                return result;
+            } else if (result < 0) {
+                throw new NumberFormatException(intLiteral + " cannot fit into an int");
+            }
+            return result * -1;
+        } else {
+            return result;
+        }
+    }
+
+    public static long parseLong(String longLiteral)
+            throws NumberFormatException {
+        if (longLiteral == null) {
+            throw new NumberFormatException("string is null");
+        }
+        if (longLiteral.length() == 0) {
+            throw new NumberFormatException("string is blank");
+        }
+
+        char[] longChars;
+        if (longLiteral.toUpperCase().endsWith("L")) {
+            longChars = longLiteral.substring(0, longLiteral.length()-1).toCharArray();
+        } else {
+            longChars = longLiteral.toCharArray();
+        }
+
+        int position = 0;
+        int radix = 10;
+        boolean negative = false;
+        if (longChars[position] == '-') {
+            position++;
+            negative = true;
+        }
+
+        if (longChars[position] == '0') {
+            position++;
+            if (position == longChars.length) {
+                return 0;
+            } else if (longChars[position] == 'x' || longChars[position] == 'X') {
+                radix = 16;
+                position++;
+            } else if (Character.digit(longChars[position], 8) >= 0) {
+                radix = 8;
+            }
+        }
+
+        long result = 0;
+        long shiftedResult;
+        int digit;
+        long maxValue = Long.MAX_VALUE / (radix / 2);
+
+        while (position < longChars.length) {
+            digit = Character.digit(longChars[position], radix);
+            if (digit < 0) {
+                throw new NumberFormatException("The string contains an invalid digit - '" + longChars[position] + "'");
+            }
+            shiftedResult = result * radix;
+            if (result > maxValue) {
+                throw new NumberFormatException(longLiteral + " cannot fit into a long");
+            }
+            if (shiftedResult < 0 && shiftedResult >= -digit) {
+                throw new NumberFormatException(longLiteral + " cannot fit into a long");
+            }
+            result = shiftedResult + digit;
+            position++;
+        }
+
+        if (negative) {
+            //allow -0x8000000000000000, which is = 0x8000000000000000
+            if (result == Long.MIN_VALUE) {
+                return result;
+            } else if (result < 0) {
+                throw new NumberFormatException(longLiteral + " cannot fit into a long");
+            }
+            return result * -1;
+        } else {
+            return result;
+        }
+    }
+
+    private static Pattern specialFloatRegex = Pattern.compile("((-)?infinityf)|(nanf)", Pattern.CASE_INSENSITIVE);
+    public static float parseFloat(String floatString) {
+        Matcher m = specialFloatRegex.matcher(floatString);
+        if (m.matches()) {
+            //got an infinity
+            if (m.start(1) != -1) {
+                if (m.start(2) != -1) {
+                    return Float.NEGATIVE_INFINITY;
+                } else {
+                    return Float.POSITIVE_INFINITY;
+                }
+            } else {
+                return Float.NaN;
+            }
+        }
+        return Float.parseFloat(floatString);
+    }
+
+    private static Pattern specialDoubleRegex = Pattern.compile("((-)?infinityd?)|(nand?)", Pattern.CASE_INSENSITIVE);
+    public static double parseDouble(String doubleString) {
+        Matcher m = specialDoubleRegex.matcher(doubleString);
+        if (m.matches()) {
+            //got an infinity
+            if (m.start(1) != -1) {
+                if (m.start(2) != -1) {
+                    return Double.NEGATIVE_INFINITY;
+                } else {
+                    return Double.POSITIVE_INFINITY;
+                }
+            } else {
+                return Double.NaN;
+            }
+        }
+        return Double.parseDouble(doubleString);
+    }
+
+    public static byte[] longToBytes(long value) {
+        byte[] bytes = new byte[8];
+
+        for (int i=0; value != 0; i++) {
+            bytes[i] = (byte)value;
+            value = value >>> 8;
+        }
+        return bytes;
+    }
+
+    public static byte[] intToBytes(int value) {
+        byte[] bytes = new byte[4];
+
+        for (int i=0; value != 0; i++) {
+            bytes[i] = (byte)value;
+            value = value >>> 8;
+        }
+        return bytes;
+    }
+
+    public static byte[] shortToBytes(short value) {
+        byte[] bytes = new byte[2];
+
+        bytes[0] = (byte)value;
+        bytes[1] = (byte)(value >>> 8);
+        return bytes;
+    }
+
+    public static byte[] floatToBytes(float value) {
+        return intToBytes(Float.floatToRawIntBits(value));
+    }
+
+    public static byte[] doubleToBytes(double value) {
+        return longToBytes(Double.doubleToRawLongBits(value));
+    }
+
+    public static byte[] charToBytes(char value) {
+        return shortToBytes((short)value);
+    }
+
+    public static byte[] boolToBytes(boolean value) {
+        if (value) {
+            return new byte[] { 0x01 };
+        } else {
+            return new byte[] { 0x00 };
+        }
+    }
+
+    public static void checkInt(long value) {
+        if (value > 0xFFFFFFFF || value < -0x80000000) {
+            throw new NumberFormatException(Long.toString(value) + " cannot fit into an int");
+        }
+    }
+
+    public static void checkShort(long value) {
+        if (value > 0xFFFF | value < -0x8000) {
+            throw new NumberFormatException(Long.toString(value) + " cannot fit into a short");
+        }
+    }
+
+    public static void checkByte(long value) {
+        if (value > 0xFF | value < -0x80) {
+            throw new NumberFormatException(Long.toString(value) + " cannot fit into a byte");
+        }
+    }
+
+    public static void checkNibble(long value) {
+        if (value > 0x0F | value < -0x08) {
+            throw new NumberFormatException(Long.toString(value) + " cannot fit into a nibble");
+        }
+    }
+}
diff --git a/smali/src/main/java/org/jf/smali/Main.java b/smali/src/main/java/org/jf/smali/Main.java
new file mode 100644
index 0000000..429adc3
--- /dev/null
+++ b/smali/src/main/java/org/jf/smali/Main.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.smali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.google.common.collect.Lists;
+import org.jf.smali.HelpCommand.HlepCommand;
+import org.jf.util.jcommander.Command;
+import org.jf.util.jcommander.ExtendedCommands;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Properties;
+
+@ExtendedParameters(
+        includeParametersInUsage = true,
+        commandName = "smali",
+        postfixDescription = "See smali help <command> for more information about a specific command")
+public class Main extends Command {
+    public static final String VERSION = loadVersion();
+
+    @Parameter(names = {"-h", "-?", "--help"}, help = true,
+            description = "Show usage information")
+    private boolean help;
+
+    @Parameter(names = {"-v", "--version"}, help = true,
+            description = "Print the version of baksmali and then exit")
+    public boolean version;
+
+    private JCommander jc;
+
+    @Override public void run() {
+    }
+
+    @Override protected JCommander getJCommander() {
+        return jc;
+    }
+
+    public Main() {
+        super(Lists.<JCommander>newArrayList());
+    }
+
+    public static void main(String[] args) {
+        Main main = new Main();
+
+        JCommander jc = new JCommander(main);
+        main.jc = jc;
+        jc.setProgramName("smali");
+        List<JCommander> commandHierarchy = main.getCommandHierarchy();
+
+        ExtendedCommands.addExtendedCommand(jc, new AssembleCommand(commandHierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new PrintTokensCommand(commandHierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new HelpCommand(commandHierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new HlepCommand(commandHierarchy));
+
+        jc.parse(args);
+
+        if (main.version) {
+            version();
+        }
+
+        if (jc.getParsedCommand() == null || main.help) {
+            main.usage();
+            return;
+        }
+
+        Command command = (Command)jc.getCommands().get(jc.getParsedCommand()).getObjects().get(0);
+        command.run();
+    }
+
+    protected static void version() {
+        System.out.println("smali " + VERSION + " (http://smali.org)");
+        System.out.println("Copyright (C) 2010 Ben Gruver (JesusFreke@JesusFreke.com)");
+        System.out.println("BSD license (http://www.opensource.org/licenses/bsd-license.php)");
+        System.exit(0);
+    }
+
+    private static String loadVersion() {
+        InputStream propertiesStream = Main.class.getClassLoader().getResourceAsStream("smali.properties");
+        String version = "[unknown version]";
+        if (propertiesStream != null) {
+            Properties properties = new Properties();
+            try {
+                properties.load(propertiesStream);
+                version = properties.getProperty("application.version");
+            } catch (IOException ex) {
+                // ignore
+            }
+        }
+        return version;
+    }
+}
diff --git a/smali/src/main/java/org/jf/smali/OdexedInstructionException.java b/smali/src/main/java/org/jf/smali/OdexedInstructionException.java
new file mode 100644
index 0000000..3565c2f
--- /dev/null
+++ b/smali/src/main/java/org/jf/smali/OdexedInstructionException.java
@@ -0,0 +1,46 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.smali;
+
+import org.antlr.runtime.IntStream;
+import org.antlr.runtime.RecognitionException;
+
+public class OdexedInstructionException extends RecognitionException {
+    private String odexedInstruction;
+
+    OdexedInstructionException(IntStream input, String odexedInstruction) {
+        super(input);
+        this.odexedInstruction = odexedInstruction;
+    }
+
+    public String getMessage() {
+        return odexedInstruction + " is an odexed instruction. You cannot reassemble a disassembled odex file " +
+                "unless it has been deodexed.";
+    }
+}
diff --git a/smali/src/main/java/org/jf/smali/PrintTokensCommand.java b/smali/src/main/java/org/jf/smali/PrintTokensCommand.java
new file mode 100644
index 0000000..6bdf5df
--- /dev/null
+++ b/smali/src/main/java/org/jf/smali/PrintTokensCommand.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2019, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.smali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+import org.jf.util.jcommander.Command;
+import org.jf.util.jcommander.ExtendedParameter;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.util.List;
+
+@Parameters(
+        commandDescription = "Lexes the given smali file(s) and prints the tokens.",
+        hidden = true)
+@ExtendedParameters(
+        commandName = "tokens")
+public class PrintTokensCommand extends Command {
+
+    @Parameter(names = {"-h", "-?", "--help"}, help = true,
+            description = "Show usage information for this command.")
+    private boolean help;
+
+    @Parameter(names = {"-a", "--api"},
+            description = "The numeric api level to use while assembling.")
+    @ExtendedParameter(argumentNames = "api")
+    private int apiLevel = 15;
+
+    @Parameter(description = "Assembles the given files. If a directory is specified, it will be " +
+            "recursively searched for any files with a .smali prefix")
+    @ExtendedParameter(argumentNames = "[<file>|<dir>]+")
+    private List<String> input;
+
+    public PrintTokensCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors);
+    }
+
+    @Override public void run() {
+        if (help || input == null || input.isEmpty()) {
+            usage();
+            return;
+        }
+
+        try {
+            Smali.printTokens(getOptions(), input);
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    protected SmaliOptions getOptions() {
+        SmaliOptions options = new SmaliOptions();
+
+        options.apiLevel = apiLevel;
+
+        return options;
+    }
+}
diff --git a/smali/src/main/java/org/jf/smali/SemanticException.java b/smali/src/main/java/org/jf/smali/SemanticException.java
new file mode 100644
index 0000000..73e4c9d
--- /dev/null
+++ b/smali/src/main/java/org/jf/smali/SemanticException.java
@@ -0,0 +1,74 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver (JesusFreke)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.smali;
+
+import org.antlr.runtime.CommonToken;
+import org.antlr.runtime.IntStream;
+import org.antlr.runtime.RecognitionException;
+import org.antlr.runtime.Token;
+import org.antlr.runtime.tree.CommonTree;
+
+public class SemanticException extends RecognitionException {
+    private String errorMessage;
+
+
+    SemanticException(IntStream input, String errorMessage, Object... messageArguments) {
+        super(input);
+        this.errorMessage = String.format(errorMessage, messageArguments);
+    }
+
+    SemanticException(IntStream input, Exception ex) {
+        super(input);
+        this.errorMessage = ex.getMessage();
+    }
+
+    SemanticException(IntStream input, CommonTree tree, String errorMessage, Object... messageArguments) {
+        super();
+        this.input = input;
+        this.token = tree.getToken();
+        this.index = tree.getTokenStartIndex();
+        this.line = token.getLine();
+	    this.charPositionInLine = token.getCharPositionInLine();
+        this.errorMessage = String.format(errorMessage, messageArguments);
+    }
+
+    SemanticException(IntStream input, Token token, String errorMessage, Object... messageArguments) {
+        super();
+        this.input = input;
+        this.token = token;
+        this.index = ((CommonToken)token).getStartIndex();
+        this.line = token.getLine();
+	    this.charPositionInLine = token.getCharPositionInLine();
+        this.errorMessage = String.format(errorMessage, messageArguments);
+    }
+
+    public String getMessage() {
+        return errorMessage;
+    }
+}
diff --git a/smali/src/main/java/org/jf/smali/Smali.java b/smali/src/main/java/org/jf/smali/Smali.java
new file mode 100644
index 0000000..fbeefde
--- /dev/null
+++ b/smali/src/main/java/org/jf/smali/Smali.java
@@ -0,0 +1,292 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.smali;
+
+import com.google.common.collect.Lists;
+import org.antlr.runtime.CommonTokenStream;
+import org.antlr.runtime.Token;
+import org.antlr.runtime.TokenSource;
+import org.antlr.runtime.tree.CommonTree;
+import org.antlr.runtime.tree.CommonTreeNodeStream;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.writer.builder.DexBuilder;
+import org.jf.dexlib2.writer.io.FileDataStore;
+import org.jf.util.StringUtils;
+
+import javax.annotation.Nonnull;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.concurrent.*;
+
+public class Smali {
+
+    /**
+     * Assemble the specified files, using the given options
+     *
+     * @param options a SmaliOptions object with the options to run smali with
+     * @param input The files/directories to process
+     * @return true if assembly completed with no errors, or false if errors were encountered
+     */
+    public static boolean assemble(final SmaliOptions options, String... input) throws IOException {
+        return assemble(options, Arrays.asList(input));
+    }
+
+    /**
+     * Assemble the specified files, using the given options
+     *
+     * @param options a SmaliOptions object with the options to run smali with
+     * @param input The files/directories to process
+     * @return true if assembly completed with no errors, or false if errors were encountered
+     */
+    public static boolean assemble(final SmaliOptions options, List<String> input) throws IOException {
+        TreeSet<File> filesToProcessSet = new TreeSet<File>();
+
+        for (String fileToProcess: input) {
+            File argFile = new File(fileToProcess);
+
+            if (!argFile.exists()) {
+                throw new IllegalArgumentException("Cannot find file or directory \"" + fileToProcess + "\"");
+            }
+
+            if (argFile.isDirectory()) {
+                getSmaliFilesInDir(argFile, filesToProcessSet);
+            } else if (argFile.isFile()) {
+                filesToProcessSet.add(argFile);
+            }
+        }
+
+        boolean errors = false;
+
+        final DexBuilder dexBuilder = new DexBuilder(Opcodes.forApi(options.apiLevel));
+
+        ExecutorService executor = Executors.newFixedThreadPool(options.jobs);
+        List<Future<Boolean>> tasks = Lists.newArrayList();
+
+        for (final File file: filesToProcessSet) {
+            tasks.add(executor.submit(new Callable<Boolean>() {
+                @Override public Boolean call() throws Exception {
+                    return assembleSmaliFile(file, dexBuilder, options);
+                }
+            }));
+        }
+
+        for (Future<Boolean> task: tasks) {
+            while(true) {
+                try {
+                    try {
+                        if (!task.get()) {
+                            errors = true;
+                        }
+                    } catch (ExecutionException ex) {
+                        throw new RuntimeException(ex);
+                    }
+                } catch (InterruptedException ex) {
+                    continue;
+                }
+                break;
+            }
+        }
+
+        executor.shutdown();
+
+        if (errors) {
+            return false;
+        }
+
+        dexBuilder.writeTo(new FileDataStore(new File(options.outputDexFile)));
+
+        return true;
+    }
+
+    /**
+     * Prints the lexical tokens for the given files.
+     *
+     * @param options a SmaliOptions object with the options to use
+     * @param input The files/directories to process
+     * @return true if assembly completed with no errors, or false if errors were encountered
+     */
+    public static boolean printTokens(final SmaliOptions options, List<String> input) throws IOException {
+        TreeSet<File> filesToProcessSet = new TreeSet<File>();
+
+        for (String fileToProcess: input) {
+            File argFile = new File(fileToProcess);
+
+            if (!argFile.exists()) {
+                throw new IllegalArgumentException("Cannot find file or directory \"" + fileToProcess + "\"");
+            }
+
+            if (argFile.isDirectory()) {
+                getSmaliFilesInDir(argFile, filesToProcessSet);
+            } else if (argFile.isFile()) {
+                filesToProcessSet.add(argFile);
+            }
+        }
+
+        boolean errors = false;
+
+        for (final File file: filesToProcessSet) {
+            try {
+                errors |= !printTokensForSingleFile(file, options);
+            } catch (Exception ex) {
+                throw new RuntimeException(ex);
+            }
+        }
+
+        if (errors) {
+            return false;
+        }
+
+        return true;
+    }
+
+    private static void getSmaliFilesInDir(@Nonnull File dir, @Nonnull Set<File> smaliFiles) {
+        File[] files = dir.listFiles();
+        if (files != null) {
+            for(File file: files) {
+                if (file.isDirectory()) {
+                    getSmaliFilesInDir(file, smaliFiles);
+                } else if (file.getName().endsWith(".smali")) {
+                    smaliFiles.add(file);
+                }
+            }
+        }
+    }
+
+    private static boolean assembleSmaliFile(File smaliFile, DexBuilder dexBuilder, SmaliOptions options)
+            throws Exception {
+        FileInputStream fis = null;
+        try {
+            fis = new FileInputStream(smaliFile);
+            InputStreamReader reader = new InputStreamReader(fis, "UTF-8");
+
+            LexerErrorInterface lexer = new smaliFlexLexer(reader, options.apiLevel);
+            ((smaliFlexLexer)lexer).setSourceFile(smaliFile);
+            CommonTokenStream tokens = new CommonTokenStream((TokenSource)lexer);
+
+            if (options.printTokens) {
+                tokens.getTokens();
+
+                for (int i=0; i<tokens.size(); i++) {
+                    Token token = tokens.get(i);
+                    if (token.getChannel() == smaliParser.HIDDEN) {
+                        continue;
+                    }
+
+                    String tokenName;
+                    if (token.getType() == -1) {
+                        tokenName = "EOF";
+                    } else {
+                        tokenName = smaliParser.tokenNames[token.getType()];
+                    }
+                    System.out.println(tokenName + ": " + token.getText());
+                }
+
+                System.out.flush();
+            }
+
+            smaliParser parser = new smaliParser(tokens);
+            parser.setVerboseErrors(options.verboseErrors);
+            parser.setAllowOdex(options.allowOdexOpcodes);
+            parser.setApiLevel(options.apiLevel);
+
+            smaliParser.smali_file_return result = parser.smali_file();
+
+            if (parser.getNumberOfSyntaxErrors() > 0 || lexer.getNumberOfSyntaxErrors() > 0) {
+                return false;
+            }
+
+            CommonTree t = result.getTree();
+
+            CommonTreeNodeStream treeStream = new CommonTreeNodeStream(t);
+            treeStream.setTokenStream(tokens);
+
+            if (options.printTokens) {
+                System.out.println(t.toStringTree());
+            }
+
+            smaliTreeWalker dexGen = new smaliTreeWalker(treeStream);
+            dexGen.setApiLevel(options.apiLevel);
+
+            dexGen.setVerboseErrors(options.verboseErrors);
+            dexGen.setDexBuilder(dexBuilder);
+            dexGen.smali_file();
+
+            return dexGen.getNumberOfSyntaxErrors() == 0;
+        } finally {
+            if (fis != null) {
+                fis.close();
+            }
+        }
+    }
+
+    private static boolean printTokensForSingleFile(File smaliFile, SmaliOptions options)
+            throws Exception {
+        FileInputStream fis = null;
+        try {
+            fis = new FileInputStream(smaliFile);
+            InputStreamReader reader = new InputStreamReader(fis, "UTF-8");
+
+            LexerErrorInterface lexer = new smaliFlexLexer(reader, options.apiLevel);
+            ((smaliFlexLexer)lexer).setSourceFile(smaliFile);
+            CommonTokenStream tokens = new CommonTokenStream((TokenSource)lexer);
+            tokens.fill();
+
+            for (int i=0; i<tokens.size(); i++) {
+                Token token = tokens.get(i);
+                if (token.getChannel() == smaliParser.HIDDEN) {
+                    continue;
+                }
+
+                String tokenName;
+                if (token.getType() == -1) {
+                    tokenName = "EOF";
+                } else {
+                    tokenName = smaliParser.tokenNames[token.getType()];
+                }
+                System.out.println(tokenName + "(\"" + StringUtils.escapeString(token.getText()) + "\")");
+            }
+            System.out.flush();
+
+            return lexer.getNumberOfSyntaxErrors() == 0;
+        } finally {
+            if (fis != null) {
+                fis.close();
+            }
+        }
+    }
+}
diff --git a/smali/src/main/java/org/jf/smali/SmaliMethodParameter.java b/smali/src/main/java/org/jf/smali/SmaliMethodParameter.java
new file mode 100644
index 0000000..f54c04e
--- /dev/null
+++ b/smali/src/main/java/org/jf/smali/SmaliMethodParameter.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.smali;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.primitives.Ints;
+import org.jf.dexlib2.base.BaseMethodParameter;
+import org.jf.dexlib2.iface.Annotation;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Comparator;
+import java.util.Set;
+
+public class SmaliMethodParameter extends BaseMethodParameter implements WithRegister {
+    public final int register;
+    @Nonnull public final String type;
+    @Nonnull public Set<? extends Annotation> annotations;
+    @Nullable public String name;
+
+    public SmaliMethodParameter(int register, @Nonnull String type) {
+        this.register = register;
+        this.type = type;
+        this.annotations = ImmutableSet.of();
+    }
+
+    @Override public int getRegister() { return register; }
+    @Nonnull @Override public String getType() { return type; }
+    @Nonnull @Override public Set<? extends Annotation> getAnnotations() { return annotations; }
+    @Nullable @Override public String getName() { return name; }
+    @Nullable @Override public String getSignature() { return null; }
+
+    public static final Comparator<WithRegister> COMPARATOR = new Comparator<WithRegister>() {
+        @Override public int compare(WithRegister o1, WithRegister o2) {
+            return Ints.compare(o1.getRegister(), o2.getRegister());
+        }
+    };
+}
diff --git a/smali/src/main/java/org/jf/smali/SmaliOptions.java b/smali/src/main/java/org/jf/smali/SmaliOptions.java
new file mode 100644
index 0000000..ac385fe
--- /dev/null
+++ b/smali/src/main/java/org/jf/smali/SmaliOptions.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.smali;
+
+public class SmaliOptions {
+    public int apiLevel = 15;
+    public String outputDexFile = "out.dex";
+
+    public int jobs = Runtime.getRuntime().availableProcessors();
+    public boolean allowOdexOpcodes = false;
+    public boolean verboseErrors = false;
+    public boolean printTokens = false;
+}
diff --git a/smali/src/main/java/org/jf/smali/SmaliTestUtils.java b/smali/src/main/java/org/jf/smali/SmaliTestUtils.java
new file mode 100644
index 0000000..a1a9393
--- /dev/null
+++ b/smali/src/main/java/org/jf/smali/SmaliTestUtils.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2014, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.smali;
+
+import com.google.common.collect.Iterables;
+import org.antlr.runtime.CommonTokenStream;
+import org.antlr.runtime.RecognitionException;
+import org.antlr.runtime.TokenSource;
+import org.antlr.runtime.tree.CommonTree;
+import org.antlr.runtime.tree.CommonTreeNodeStream;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.dexbacked.DexBackedClassDef;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.writer.builder.DexBuilder;
+import org.jf.dexlib2.writer.io.MemoryDataStore;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+
+public class SmaliTestUtils {
+
+    public static DexBackedClassDef compileSmali(String smaliText) throws RecognitionException, IOException {
+        return compileSmali(smaliText, 15);
+    }
+
+    public static DexBackedClassDef compileSmali(String smaliText, int apiLevel)
+            throws RecognitionException, IOException {
+        CommonTokenStream tokens;
+        LexerErrorInterface lexer;
+        DexBuilder dexBuilder = new DexBuilder(Opcodes.forApi(apiLevel));
+
+        Reader reader = new StringReader(smaliText);
+
+        lexer = new smaliFlexLexer(reader, apiLevel);
+        tokens = new CommonTokenStream((TokenSource)lexer);
+
+        smaliParser parser = new smaliParser(tokens);
+        parser.setVerboseErrors(true);
+        parser.setAllowOdex(false);
+        parser.setApiLevel(apiLevel);
+
+        smaliParser.smali_file_return result = parser.smali_file();
+
+        if(parser.getNumberOfSyntaxErrors() > 0 || lexer.getNumberOfSyntaxErrors() > 0) {
+            throw new RuntimeException("Error occurred while compiling text");
+        }
+
+        CommonTree t = result.getTree();
+
+        CommonTreeNodeStream treeStream = new CommonTreeNodeStream(t);
+        treeStream.setTokenStream(tokens);
+
+        smaliTreeWalker dexGen = new smaliTreeWalker(treeStream);
+        dexGen.setApiLevel(apiLevel);
+        dexGen.setVerboseErrors(true);
+        dexGen.setDexBuilder(dexBuilder);
+        dexGen.smali_file();
+
+        if (dexGen.getNumberOfSyntaxErrors() > 0) {
+            throw new RuntimeException("Error occurred while compiling text");
+        }
+
+        MemoryDataStore dataStore = new MemoryDataStore();
+
+        dexBuilder.writeTo(dataStore);
+
+        DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.forApi(apiLevel), dataStore.getBuffer());
+
+        return Iterables.getFirst(dexFile.getClasses(), null);
+    }
+}
diff --git a/smali/src/main/java/org/jf/smali/WithRegister.java b/smali/src/main/java/org/jf/smali/WithRegister.java
new file mode 100644
index 0000000..cd9a48b
--- /dev/null
+++ b/smali/src/main/java/org/jf/smali/WithRegister.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.smali;
+
+public interface WithRegister {
+    int getRegister();
+}
diff --git a/smali/src/main/java/org/jf/smali/util/BlankReader.java b/smali/src/main/java/org/jf/smali/util/BlankReader.java
new file mode 100644
index 0000000..2d3e9c9
--- /dev/null
+++ b/smali/src/main/java/org/jf/smali/util/BlankReader.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.smali.util;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.io.Reader;
+
+public class BlankReader extends Reader {
+    public static final BlankReader INSTANCE = new BlankReader();
+
+    @Override public int read(@Nonnull char[] chars, int i, int i2) throws IOException {
+        return -1;
+    }
+
+    @Override
+    public void close() throws IOException {
+    }
+}
diff --git a/smali/src/main/jflex/smaliLexer.jflex b/smali/src/main/jflex/smaliLexer.jflex
new file mode 100644
index 0000000..68c83c5
--- /dev/null
+++ b/smali/src/main/jflex/smaliLexer.jflex
@@ -0,0 +1,804 @@
+package org.jf.smali;
+
+import static java.lang.Math.toIntExact;
+
+import java.io.*;
+import java.util.Stack;
+import org.antlr.runtime.*;
+import org.jf.smali.util.*;
+import org.jf.util.*;
+import static org.jf.smali.smaliParser.*;
+
+%%
+
+%public
+%class smaliFlexLexer
+%implements TokenSource
+%implements LexerErrorInterface
+%type Token
+%unicode
+%line
+%column
+%char
+
+%ctorarg int apiLevel
+%init{
+    this.apiLevel = apiLevel;
+%init}
+
+%{
+    private StringBuffer sb = new StringBuffer();
+    private String tokenError = null;
+    private int tokenStartLine;
+    private int tokenStartCol;
+    private int tokenStartChar;
+
+    private int lexerErrors = 0;
+
+    private File sourceFile;
+
+    private boolean suppressErrors;
+
+    private int apiLevel;
+
+    private Stack<Integer> stateStack = new Stack<>();
+
+    public Token nextToken() {
+        try {
+            Token token = yylex();
+            if (token instanceof InvalidToken) {
+                InvalidToken invalidToken = (InvalidToken)token;
+                if (!suppressErrors) {
+                    System.err.println(getErrorHeader(invalidToken) + " Error for input '" +
+                        invalidToken.getText() + "': " + invalidToken.getMessage());
+                }
+                lexerErrors++;
+            }
+            return token;
+        }
+        catch (java.io.IOException e) {
+            System.err.println("shouldn't happen: " + e.getMessage());
+            return newToken(EOF);
+        }
+    }
+
+    public void setLine(int line) {
+        this.yyline = line-1;
+    }
+
+    public void setColumn(int column) {
+        this.yycolumn = column;
+    }
+
+    public int getLine() {
+        return this.yyline+1;
+    }
+
+    public int getColumn() {
+        return this.yycolumn;
+    }
+
+    public void setSuppressErrors(boolean suppressErrors) {
+        this.suppressErrors = suppressErrors;
+    }
+
+    public void setSourceFile(File sourceFile) {
+        this.sourceFile = sourceFile;
+    }
+
+    public String getSourceName() {
+        if (sourceFile == null) {
+            return "";
+        }
+        try {
+            return  PathUtil.getRelativeFile(new File("."), sourceFile).getPath();
+        } catch (IOException ex) {
+            return sourceFile.getAbsolutePath();
+        }
+    }
+
+    public int getNumberOfSyntaxErrors() {
+        return lexerErrors;
+    }
+
+    private Token newToken(int type, String text, boolean hidden) {
+        CommonToken token = new CommonToken(type, text);
+        if (hidden) {
+            token.setChannel(Token.HIDDEN_CHANNEL);
+        }
+        // yychar is long, but antlr CommonToken only takes an int.
+        token.setStartIndex(toIntExact(yychar));
+        token.setStopIndex(stopIndex());
+        token.setLine(getLine());
+        token.setCharPositionInLine(getColumn());
+        return token;
+    }
+
+    private Token newToken(int type, String text) {
+        return newToken(type, text, false);
+    }
+
+    private Token newToken(int type, boolean hidden) {
+        return newToken(type, yytext(), hidden);
+    }
+
+    private Token newToken(int type) {
+        return newToken(type, yytext(), false);
+    }
+
+    private Token invalidToken(String message, String text) {
+        InvalidToken token = new InvalidToken(message, text);
+        // yychar is long, but antlr CommonToken only takes an int.
+        token.setStartIndex(toIntExact(yychar));
+        token.setStopIndex(stopIndex());
+        token.setLine(getLine());
+        token.setCharPositionInLine(getColumn());
+
+        return token;
+    }
+
+    private Token invalidToken(String message) {
+        return invalidToken(message, yytext());
+    }
+
+    private void beginStateBasedToken(int state) {
+        stateStack.push(yystate());
+        yybegin(state);
+        sb.setLength(0);
+        tokenStartLine = getLine();
+        tokenStartCol = getColumn();
+        // yychar is long, but antlr CommonToken only takes an int.
+        tokenStartChar = toIntExact(yychar);
+        tokenError = null;
+    }
+
+    private Token endStateBasedToken(int type) {
+        if (tokenError != null) {
+            return invalidStateBasedToken(tokenError);
+        }
+
+        yybegin(stateStack.pop());
+
+        CommonToken token = new CommonToken(type, sb.toString());
+        token.setStartIndex(tokenStartChar);
+        token.setStopIndex(stopIndex());
+        token.setLine(tokenStartLine);
+        token.setCharPositionInLine(tokenStartCol);
+        return token;
+    }
+
+    private void setStateBasedTokenError(String message) {
+        if (tokenError == null) {
+            tokenError = message;
+        }
+    }
+
+    private Token invalidStateBasedToken(String message) {
+        yybegin(stateStack.pop());
+
+        InvalidToken token = new InvalidToken(message, sb.toString());
+        token.setStartIndex(tokenStartChar);
+        token.setStopIndex(stopIndex());
+        token.setLine(tokenStartLine);
+        token.setCharPositionInLine(tokenStartCol);
+        return token;
+    }
+
+    public String getErrorHeader(InvalidToken token) {
+        return getSourceName()+"["+ token.getLine()+","+token.getCharPositionInLine()+"]";
+    }
+
+    public void reset(CharSequence charSequence, int start, int end, int initialState) {
+        zzReader = BlankReader.INSTANCE;
+        zzBuffer = new char[charSequence.length()];
+        for (int i=0; i<charSequence.length(); i++) {
+            zzBuffer[i] = charSequence.charAt(i);
+        }
+
+        yychar = zzCurrentPos = zzMarkedPos = zzStartRead = start;
+        zzEndRead = end;
+        zzAtBOL = true;
+        zzAtEOF = false;
+        yybegin(initialState);
+    }
+
+    private String processQuotedSimpleName(String text) {
+        // strip backticks
+        return text.substring(1, text.length() - 1);
+    }
+
+    private String processQuotedSimpleNameWithSpaces(String text) {
+        if (apiLevel < 30) {
+            setStateBasedTokenError("spaces in class descriptors and member names are not supported prior to API " +
+                "level 30/dex version 040");
+        }
+        return processQuotedSimpleName(text);
+    }
+
+    private int stopIndex() {
+      // jflex yychar is long, but antlr CommonToken only takes an int for
+      // stopIndex.
+      return toIntExact(yychar + yylength() - 1);
+    }
+%}
+
+HexPrefix = 0 [xX]
+
+HexDigit = [0-9a-fA-F]
+HexDigits = [0-9a-fA-F]{4}
+FewerHexDigits = [0-9a-fA-F]{0,3}
+
+Integer1 = 0
+Integer2 = [1-9] [0-9]*
+Integer3 = 0 [0-7]+
+Integer4 = {HexPrefix} {HexDigit}+
+Integer = {Integer1} | {Integer2} | {Integer3} | {Integer4}
+
+DecimalExponent = [eE] -? [0-9]+
+
+BinaryExponent = [pP] -? [0-9]+
+
+/*This can either be a floating point number or an identifier*/
+FloatOrID1 = -? [0-9]+ {DecimalExponent}
+FloatOrID2 = -? {HexPrefix} {HexDigit}+ {BinaryExponent}
+FloatOrID3 = -? [iI][nN][fF][iI][nN][iI][tT][yY]
+FloatOrID4 = [nN][aA][nN]
+FloatOrID =  {FloatOrID1} | {FloatOrID2} | {FloatOrID3} | {FloatOrID4}
+
+
+/*This can only be a float and not an identifier, due to the decimal point*/
+Float1 = -? [0-9]+ "." [0-9]* {DecimalExponent}?
+Float2 = -? "." [0-9]+ {DecimalExponent}?
+Float3 = -? {HexPrefix} {HexDigit}+ "." {HexDigit}* {BinaryExponent}
+Float4 = -? {HexPrefix} "." {HexDigit}+ {BinaryExponent}
+Float =  {Float1} | {Float2} | {Float3} | {Float4}
+
+HighSurrogate = [\ud800-\udbff]
+
+LowSurrogate = [\udc00-\udfff]
+
+SimpleNameCharacter = ({HighSurrogate} {LowSurrogate}) | [A-Za-z0-9$\-_\u00a1-\u1fff\u2010-\u2027\u2030-\ud7ff\ue000-\uffef]
+UnicodeSpace = [\u0020\u00A0\u1680\u2000-\u200A\u202F\u205F\u3000] /* Zs category */
+
+SimpleNameRaw = {SimpleNameCharacter}+
+SimpleNameQuoted = [`] {SimpleNameCharacter}+ [`]
+SimpleNameQuotedWithSpaces = [`] ({SimpleNameCharacter} | {UnicodeSpace})+ [`]
+SimpleName = {SimpleNameRaw} | {SimpleNameQuoted} | {SimpleNameQuotedWithSpaces}
+
+PrimitiveType = [ZBSCIJFD]
+
+ClassDescriptor = L ({SimpleName} "/")* {SimpleName} ;
+
+ArrayPrefix = "["+
+
+Type = {PrimitiveType} | {ClassDescriptor} | {ArrayPrefix} ({ClassDescriptor} | {PrimitiveType})
+
+
+%state PARAM_LIST_OR_ID
+%state PARAM_LIST
+%state ARRAY_DESCRIPTOR
+%state STRING
+%state CHAR
+%state CLASS_DESCRIPTOR_BEGINNING
+%state CLASS_DESCRIPTOR_REMAINING
+
+%%
+
+/*Directives*/
+<YYINITIAL>
+{
+    ".class" { return newToken(CLASS_DIRECTIVE); }
+    ".super" { return newToken(SUPER_DIRECTIVE); }
+    ".implements" { return newToken(IMPLEMENTS_DIRECTIVE); }
+    ".source" { return newToken(SOURCE_DIRECTIVE); }
+    ".field" { return newToken(FIELD_DIRECTIVE); }
+    ".end field" { return newToken(END_FIELD_DIRECTIVE); }
+    ".subannotation" { return newToken(SUBANNOTATION_DIRECTIVE); }
+    ".end subannotation" { return newToken(END_SUBANNOTATION_DIRECTIVE); }
+    ".annotation" { return newToken(ANNOTATION_DIRECTIVE); }
+    ".end annotation" { return newToken(END_ANNOTATION_DIRECTIVE); }
+    ".enum" { return newToken(ENUM_DIRECTIVE); }
+    ".method" { return newToken(METHOD_DIRECTIVE); }
+    ".end method" { return newToken(END_METHOD_DIRECTIVE); }
+    ".registers" { return newToken(REGISTERS_DIRECTIVE); }
+    ".locals" { return newToken(LOCALS_DIRECTIVE); }
+    ".array-data" { return newToken(ARRAY_DATA_DIRECTIVE); }
+    ".end array-data" { return newToken(END_ARRAY_DATA_DIRECTIVE); }
+    ".packed-switch" { return newToken(PACKED_SWITCH_DIRECTIVE); }
+    ".end packed-switch" { return newToken(END_PACKED_SWITCH_DIRECTIVE); }
+    ".sparse-switch" { return newToken(SPARSE_SWITCH_DIRECTIVE); }
+    ".end sparse-switch" { return newToken(END_SPARSE_SWITCH_DIRECTIVE); }
+    ".catch" { return newToken(CATCH_DIRECTIVE); }
+    ".catchall" { return newToken(CATCHALL_DIRECTIVE); }
+    ".line" { return newToken(LINE_DIRECTIVE); }
+    ".param" { return newToken(PARAMETER_DIRECTIVE); }
+    ".end param" { return newToken(END_PARAMETER_DIRECTIVE); }
+    ".local" { return newToken(LOCAL_DIRECTIVE); }
+    ".end local" { return newToken(END_LOCAL_DIRECTIVE); }
+    ".restart local" { return newToken(RESTART_LOCAL_DIRECTIVE); }
+    ".prologue" { return newToken(PROLOGUE_DIRECTIVE); }
+    ".epilogue" { return newToken(EPILOGUE_DIRECTIVE); }
+
+    ".end" { return invalidToken("Invalid directive"); }
+    ".end " [a-zA-z0-9\-_]+ { return invalidToken("Invalid directive"); }
+    ".restart" { return invalidToken("Invalid directive"); }
+    ".restart " [a-zA-z0-9\-_]+ { return invalidToken("Invalid directive"); }
+}
+
+/*Literals*/
+<YYINITIAL> {
+    {Integer} { return newToken(POSITIVE_INTEGER_LITERAL); }
+    - {Integer} { return newToken(NEGATIVE_INTEGER_LITERAL); }
+    -? {Integer} [lL] { return newToken(LONG_LITERAL); }
+    -? {Integer} [sS] { return newToken(SHORT_LITERAL); }
+    -? {Integer} [tT] { return newToken(BYTE_LITERAL); }
+
+    {FloatOrID} [fF] | -? [0-9]+ [fF] { return newToken(FLOAT_LITERAL_OR_ID); }
+    {FloatOrID} [dD]? | -? [0-9]+ [dD] { return newToken(DOUBLE_LITERAL_OR_ID); }
+    {Float} [fF] { return newToken(FLOAT_LITERAL); }
+    {Float} [dD]? { return newToken(DOUBLE_LITERAL); }
+
+    "true"|"false" { return newToken(BOOL_LITERAL); }
+    "null" { return newToken(NULL_LITERAL); }
+
+    "\"" { beginStateBasedToken(STRING); sb.append('"'); }
+
+    ' { beginStateBasedToken(CHAR); sb.append('\''); }
+}
+
+<PARAM_LIST_OR_ID> {
+    {PrimitiveType} { return newToken(PARAM_LIST_OR_ID_PRIMITIVE_TYPE); }
+    [^] { yypushback(1); yybegin(YYINITIAL); }
+    <<EOF>> { yybegin(YYINITIAL); }
+}
+
+<PARAM_LIST> {
+    {PrimitiveType} { return newToken(PRIMITIVE_TYPE); }
+    {ClassDescriptor} {
+        yypushback(yylength());
+        beginStateBasedToken(CLASS_DESCRIPTOR_BEGINNING);
+        sb.append(yytext());
+    }
+    {ArrayPrefix} { return newToken(ARRAY_TYPE_PREFIX); }
+    [^] { yypushback(1); yybegin(YYINITIAL);}
+    <<EOF>> { yybegin(YYINITIAL);}
+}
+
+<CLASS_DESCRIPTOR_BEGINNING> {
+    "L" {SimpleNameRaw} {
+        sb.append(yytext());
+        yybegin(CLASS_DESCRIPTOR_REMAINING);
+    }
+    "L" {SimpleNameQuoted} {
+        sb.append("L");
+        sb.append(processQuotedSimpleName(yytext().substring(1)));
+        yybegin(CLASS_DESCRIPTOR_REMAINING);
+    }
+    "L" {SimpleNameQuotedWithSpaces} {
+        sb.append("L");
+        sb.append(processQuotedSimpleNameWithSpaces(yytext().substring(1)));
+        yybegin(CLASS_DESCRIPTOR_REMAINING);
+    }
+}
+
+<CLASS_DESCRIPTOR_REMAINING> {
+    "/" {SimpleNameRaw} {
+        sb.append(yytext());
+    }
+    "/" {SimpleNameQuoted} {
+        sb.append("/");
+        sb.append(processQuotedSimpleName(yytext().substring(1)));
+    }
+    "/" {SimpleNameQuotedWithSpaces} {
+        sb.append("/");
+        sb.append(processQuotedSimpleNameWithSpaces(yytext().substring(1)));
+    }
+
+    ";" {
+        sb.append(yytext());
+        return endStateBasedToken(CLASS_DESCRIPTOR);
+    }
+}
+
+<STRING> {
+    "\""  { sb.append('"'); return endStateBasedToken(STRING_LITERAL); }
+
+    [^\r\n\"\\]+ { sb.append(yytext()); }
+    "\\b" { sb.append('\b'); }
+    "\\t" { sb.append('\t'); }
+    "\\n" { sb.append('\n'); }
+    "\\f" { sb.append('\f'); }
+    "\\r" { sb.append('\r'); }
+    "\\'" { sb.append('\''); }
+    "\\\"" { sb.append('"'); }
+    "\\\\" { sb.append('\\'); }
+    "\\u" {HexDigits} { sb.append((char)Integer.parseInt(yytext().substring(2,6), 16)); }
+
+    "\\u" {FewerHexDigits} {
+        sb.append(yytext());
+        setStateBasedTokenError("Invalid \\u sequence. \\u must be followed by 4 hex digits");
+    }
+
+    "\\" [^btnfr'\"\\u] {
+        sb.append(yytext());
+        setStateBasedTokenError("Invalid escape sequence " + yytext());
+    }
+
+    [\r\n] { return invalidStateBasedToken("Unterminated string literal"); }
+    <<EOF>> { return invalidStateBasedToken("Unterminated string literal"); }
+}
+
+<CHAR> {
+    ' {
+        sb.append('\'');
+        if (sb.length() == 2) {
+            return invalidStateBasedToken("Empty character literal");
+        } else if (sb.length() > 3) {
+            return invalidStateBasedToken("Character literal with multiple chars");
+        }
+
+        return endStateBasedToken(CHAR_LITERAL);
+    }
+
+    [^\r\n'\\]+ { sb.append(yytext()); }
+    "\\b" { sb.append('\b'); }
+    "\\t" { sb.append('\t'); }
+    "\\n" { sb.append('\n'); }
+    "\\f" { sb.append('\f'); }
+    "\\r" { sb.append('\r'); }
+    "\\'" { sb.append('\''); }
+    "\\\"" { sb.append('"'); }
+    "\\\\" { sb.append('\\'); }
+    "\\u" {HexDigits} { sb.append((char)Integer.parseInt(yytext().substring(2,6), 16)); }
+
+    "\\u" {HexDigit}* {
+        sb.append(yytext());
+        setStateBasedTokenError("Invalid \\u sequence. \\u must be followed by exactly 4 hex digits");
+    }
+
+    "\\" [^btnfr'\"\\u] {
+        sb.append(yytext());
+        setStateBasedTokenError("Invalid escape sequence " + yytext());
+    }
+
+    [\r\n] { return invalidStateBasedToken("Unterminated character literal"); }
+    <<EOF>> { return invalidStateBasedToken("Unterminated character literal"); }
+}
+
+/*Misc*/
+<YYINITIAL> {
+    [vp] [0-9]+ { return newToken(REGISTER); }
+
+    "build" | "runtime" | "system" {
+        return newToken(ANNOTATION_VISIBILITY);
+    }
+
+    "public" | "private" | "protected" | "static" | "final" | "synchronized" | "bridge" | "varargs" | "native" |
+    "abstract" | "strictfp" | "synthetic" | "constructor" | "declared-synchronized" | "interface" | "enum" |
+    "annotation" | "volatile" | "transient" {
+        return newToken(ACCESS_SPEC);
+    }
+
+    "whitelist" | "greylist" | "blacklist" | "greylist-max-o" | "greylist-max-p" | "greylist-max-q" |
+    "core-platform-api" {
+        return newToken(HIDDENAPI_RESTRICTION);
+    }
+
+    "no-error" | "generic-error" | "no-such-class" | "no-such-field" | "no-such-method" | "illegal-class-access" |
+    "illegal-field-access" | "illegal-method-access" | "class-change-error" | "instantiation-error" {
+        return newToken(VERIFICATION_ERROR_TYPE);
+    }
+
+    "inline@0x" {HexDigit}+ { return newToken(INLINE_INDEX); }
+    "vtable@0x" {HexDigit}+ { return newToken(VTABLE_INDEX); }
+    "field@0x" {HexDigit}+ { return newToken(FIELD_OFFSET); }
+
+    "static-put" | "static-get" | "instance-put" | "instance-get" {
+        return newToken(METHOD_HANDLE_TYPE_FIELD);
+    }
+
+    "invoke-instance" | "invoke-constructor" {
+        return newToken(METHOD_HANDLE_TYPE_METHOD);
+    }
+
+    # [^\r\n]* { return newToken(LINE_COMMENT, true); }
+}
+
+/*Instructions*/
+<YYINITIAL> {
+    "goto" {
+        return newToken(INSTRUCTION_FORMAT10t);
+    }
+
+    "return-void" | "nop" {
+        return newToken(INSTRUCTION_FORMAT10x);
+    }
+
+    "return-void-barrier" | "return-void-no-barrier" {
+        return newToken(INSTRUCTION_FORMAT10x_ODEX);
+    }
+
+    "const/4" {
+        return newToken(INSTRUCTION_FORMAT11n);
+    }
+
+    "move-result" | "move-result-wide" | "move-result-object" | "move-exception" | "return" | "return-wide" |
+    "return-object" | "monitor-enter" | "monitor-exit" | "throw" {
+        return newToken(INSTRUCTION_FORMAT11x);
+    }
+
+    "move" | "move-wide" | "move-object" | "array-length" | "neg-int" | "not-int" | "neg-long" | "not-long" |
+    "neg-float" | "neg-double" | "int-to-long" | "int-to-float" | "int-to-double" | "long-to-int" | "long-to-float" |
+    "long-to-double" | "float-to-int" | "float-to-long" | "float-to-double" | "double-to-int" | "double-to-long" |
+    "double-to-float" | "int-to-byte" | "int-to-char" | "int-to-short" {
+        return newToken(INSTRUCTION_FORMAT12x_OR_ID);
+    }
+
+    "add-int/2addr" | "sub-int/2addr" | "mul-int/2addr" | "div-int/2addr" | "rem-int/2addr" | "and-int/2addr" |
+    "or-int/2addr" | "xor-int/2addr" | "shl-int/2addr" | "shr-int/2addr" | "ushr-int/2addr" | "add-long/2addr" |
+    "sub-long/2addr" | "mul-long/2addr" | "div-long/2addr" | "rem-long/2addr" | "and-long/2addr" | "or-long/2addr" |
+    "xor-long/2addr" | "shl-long/2addr" | "shr-long/2addr" | "ushr-long/2addr" | "add-float/2addr" |
+    "sub-float/2addr" | "mul-float/2addr" | "div-float/2addr" | "rem-float/2addr" | "add-double/2addr" |
+    "sub-double/2addr" | "mul-double/2addr" | "div-double/2addr" | "rem-double/2addr" {
+        return newToken(INSTRUCTION_FORMAT12x);
+    }
+
+    "throw-verification-error" {
+        return newToken(INSTRUCTION_FORMAT20bc);
+    }
+
+    "goto/16" {
+        return newToken(INSTRUCTION_FORMAT20t);
+    }
+
+    "sget" | "sget-wide" | "sget-object" | "sget-boolean" | "sget-byte" | "sget-char" | "sget-short" | "sput" |
+    "sput-wide" | "sput-object" | "sput-boolean" | "sput-byte" | "sput-char" | "sput-short" {
+        return newToken(INSTRUCTION_FORMAT21c_FIELD);
+    }
+
+    "sget-volatile" | "sget-wide-volatile" | "sget-object-volatile" | "sput-volatile" | "sput-wide-volatile" |
+    "sput-object-volatile" {
+        return newToken(INSTRUCTION_FORMAT21c_FIELD_ODEX);
+    }
+
+    "const-string" {
+        return newToken(INSTRUCTION_FORMAT21c_STRING);
+    }
+
+    "check-cast" | "new-instance" | "const-class" {
+        return newToken(INSTRUCTION_FORMAT21c_TYPE);
+    }
+
+    "const-method-handle" {
+        return newToken(INSTRUCTION_FORMAT21c_METHOD_HANDLE);
+    }
+
+    "const-method-type" {
+        return newToken(INSTRUCTION_FORMAT21c_METHOD_TYPE);
+    }
+
+    "const/high16" {
+        return newToken(INSTRUCTION_FORMAT21ih);
+    }
+
+    "const-wide/high16" {
+        return newToken(INSTRUCTION_FORMAT21lh);
+    }
+
+    "const/16" | "const-wide/16" {
+        return newToken(INSTRUCTION_FORMAT21s);
+    }
+
+    "if-eqz" | "if-nez" | "if-ltz" | "if-gez" | "if-gtz" | "if-lez" {
+        return newToken(INSTRUCTION_FORMAT21t);
+    }
+
+    "add-int/lit8" | "rsub-int/lit8" | "mul-int/lit8" | "div-int/lit8" | "rem-int/lit8" | "and-int/lit8" |
+    "or-int/lit8" | "xor-int/lit8" | "shl-int/lit8" | "shr-int/lit8" | "ushr-int/lit8" {
+        return newToken(INSTRUCTION_FORMAT22b);
+    }
+
+    "iget" | "iget-wide" | "iget-object" | "iget-boolean" | "iget-byte" | "iget-char" | "iget-short" | "iput" |
+    "iput-wide" | "iput-object" | "iput-boolean" | "iput-byte" | "iput-char" | "iput-short" {
+        return newToken(INSTRUCTION_FORMAT22c_FIELD);
+    }
+
+    "iget-volatile" | "iget-wide-volatile" | "iget-object-volatile" | "iput-volatile" | "iput-wide-volatile" |
+    "iput-object-volatile" {
+        return newToken(INSTRUCTION_FORMAT22c_FIELD_ODEX);
+    }
+
+    "instance-of" | "new-array" {
+        return newToken(INSTRUCTION_FORMAT22c_TYPE);
+    }
+
+    "iget-quick" | "iget-wide-quick" | "iget-object-quick" | "iput-quick" | "iput-wide-quick" | "iput-object-quick" |
+    "iput-boolean-quick" | "iput-byte-quick" | "iput-char-quick" | "iput-short-quick" {
+        return newToken(INSTRUCTION_FORMAT22cs_FIELD);
+    }
+
+    "rsub-int" {
+        return newToken(INSTRUCTION_FORMAT22s_OR_ID);
+    }
+
+    "add-int/lit16" | "mul-int/lit16" | "div-int/lit16" | "rem-int/lit16" | "and-int/lit16" | "or-int/lit16" |
+    "xor-int/lit16" {
+        return newToken(INSTRUCTION_FORMAT22s);
+    }
+
+    "if-eq" | "if-ne" | "if-lt" | "if-ge" | "if-gt" | "if-le" {
+        return newToken(INSTRUCTION_FORMAT22t);
+    }
+
+    "move/from16" | "move-wide/from16" | "move-object/from16" {
+        return newToken(INSTRUCTION_FORMAT22x);
+    }
+
+    "cmpl-float" | "cmpg-float" | "cmpl-double" | "cmpg-double" | "cmp-long" | "aget" | "aget-wide" | "aget-object" |
+    "aget-boolean" | "aget-byte" | "aget-char" | "aget-short" | "aput" | "aput-wide" | "aput-object" | "aput-boolean" |
+    "aput-byte" | "aput-char" | "aput-short" | "add-int" | "sub-int" | "mul-int" | "div-int" | "rem-int" | "and-int" |
+    "or-int" | "xor-int" | "shl-int" | "shr-int" | "ushr-int" | "add-long" | "sub-long" | "mul-long" | "div-long" |
+    "rem-long" | "and-long" | "or-long" | "xor-long" | "shl-long" | "shr-long" | "ushr-long" | "add-float" |
+    "sub-float" | "mul-float" | "div-float" | "rem-float" | "add-double" | "sub-double" | "mul-double" | "div-double" |
+    "rem-double" {
+        return newToken(INSTRUCTION_FORMAT23x);
+    }
+
+    "goto/32" {
+        return newToken(INSTRUCTION_FORMAT30t);
+    }
+
+    "const-string/jumbo" {
+        return newToken(INSTRUCTION_FORMAT31c);
+    }
+
+    "const" {
+        return newToken(INSTRUCTION_FORMAT31i_OR_ID);
+    }
+
+    "const-wide/32" {
+        return newToken(INSTRUCTION_FORMAT31i);
+    }
+
+    "fill-array-data" | "packed-switch" | "sparse-switch" {
+        return newToken(INSTRUCTION_FORMAT31t);
+    }
+
+    "move/16" | "move-wide/16" | "move-object/16" {
+        return newToken(INSTRUCTION_FORMAT32x);
+    }
+
+    "invoke-custom" {
+        return newToken(INSTRUCTION_FORMAT35c_CALL_SITE);
+    }
+
+    "invoke-virtual" | "invoke-super" {
+        return newToken(INSTRUCTION_FORMAT35c_METHOD);
+    }
+    
+    "invoke-direct" | "invoke-static" | "invoke-interface" {
+        return newToken(INSTRUCTION_FORMAT35c_METHOD_OR_METHOD_HANDLE_TYPE);
+    }
+
+    "invoke-direct-empty" {
+        return newToken(INSTRUCTION_FORMAT35c_METHOD_ODEX);
+    }
+
+    "filled-new-array" {
+        return newToken(INSTRUCTION_FORMAT35c_TYPE);
+    }
+
+    "execute-inline" {
+        return newToken(INSTRUCTION_FORMAT35mi_METHOD);
+    }
+
+    "invoke-virtual-quick" | "invoke-super-quick" {
+        return newToken(INSTRUCTION_FORMAT35ms_METHOD);
+    }
+
+    "invoke-custom/range" {
+        return newToken(INSTRUCTION_FORMAT3rc_CALL_SITE);
+    }
+
+    "invoke-virtual/range" | "invoke-super/range" | "invoke-direct/range" | "invoke-static/range" |
+    "invoke-interface/range" {
+        return newToken(INSTRUCTION_FORMAT3rc_METHOD);
+    }
+
+    "invoke-object-init/range" {
+        return newToken(INSTRUCTION_FORMAT3rc_METHOD_ODEX);
+    }
+
+    "filled-new-array/range" {
+        return newToken(INSTRUCTION_FORMAT3rc_TYPE);
+    }
+
+    "execute-inline/range" {
+        return newToken(INSTRUCTION_FORMAT3rmi_METHOD);
+    }
+
+    "invoke-virtual-quick/range" | "invoke-super-quick/range" {
+        return newToken(INSTRUCTION_FORMAT3rms_METHOD);
+    }
+
+    "invoke-polymorphic" {
+        return newToken(INSTRUCTION_FORMAT45cc_METHOD);
+    }
+
+    "invoke-polymorphic/range" {
+        return newToken(INSTRUCTION_FORMAT4rcc_METHOD);
+    }
+
+    "const-wide" {
+        return newToken(INSTRUCTION_FORMAT51l);
+    }
+}
+
+<ARRAY_DESCRIPTOR> {
+    {PrimitiveType} { yybegin(YYINITIAL); return newToken(PRIMITIVE_TYPE); }
+    {ClassDescriptor} {
+        yypushback(yylength());
+        beginStateBasedToken(CLASS_DESCRIPTOR_BEGINNING);
+        sb.append(yytext());
+    }
+    [^] { yypushback(1); yybegin(YYINITIAL); }
+    <<EOF>> { yybegin(YYINITIAL); }
+}
+
+/*Types*/
+<YYINITIAL> {
+    {PrimitiveType} { return newToken(PRIMITIVE_TYPE); }
+    V { return newToken(VOID_TYPE); }
+    {ClassDescriptor} {
+        yypushback(yylength());
+        beginStateBasedToken(CLASS_DESCRIPTOR_BEGINNING);
+    }
+
+    // we have to drop into a separate state so that we don't parse something like
+    // "[I->" as "[" followed by "I-" as a SIMPLE_NAME
+    {ArrayPrefix} {
+      yybegin(ARRAY_DESCRIPTOR);
+      return newToken(ARRAY_TYPE_PREFIX);
+    }
+
+    {PrimitiveType} {PrimitiveType}+ {
+        // go back and re-lex it as a PARAM_LIST_OR_ID
+        yypushback(yylength());
+        yybegin(PARAM_LIST_OR_ID);
+    }
+
+    {Type} {Type}+ {
+        // go back and re-lex it as a PARAM_LIST
+        yypushback(yylength());
+        yybegin(PARAM_LIST);
+    }
+
+    {SimpleNameRaw} { return newToken(SIMPLE_NAME, yytext()); }
+    {SimpleNameQuoted} { return newToken(SIMPLE_NAME, processQuotedSimpleName(yytext())); }
+    {SimpleNameQuotedWithSpaces} { return newToken(SIMPLE_NAME, processQuotedSimpleNameWithSpaces(yytext())); }
+    "<" {SimpleNameRaw} ">" { return newToken(MEMBER_NAME); }
+}
+
+/*Symbols/Whitespace/EOF*/
+<YYINITIAL> {
+    ".." { return newToken(DOTDOT); }
+    "->" { return newToken(ARROW); }
+    "=" { return newToken(EQUAL); }
+    ":" { return newToken(COLON); }
+    "," { return newToken(COMMA); }
+    "{" { return newToken(OPEN_BRACE); }
+    "}" { return newToken(CLOSE_BRACE); }
+    "(" { return newToken(OPEN_PAREN); }
+    ")" { return newToken(CLOSE_PAREN); }
+    "@" { return newToken(AT); }
+    [\r\n\t ]+ { return newToken(WHITE_SPACE, true); }
+    <<EOF>> { return newToken(EOF); }
+}
+
+/*catch all*/
+<YYINITIAL> {
+    "." { return invalidToken("Invalid directive"); }
+    "." [a-zA-z\-_] { return invalidToken("Invalid directive"); }
+    "." [a-zA-z\-_] [a-zA-z0-9\-_]* { return invalidToken("Invalid directive"); }
+    [^] { return invalidToken("Invalid text"); }
+}
diff --git a/smali/src/main/resources/smali.properties b/smali/src/main/resources/smali.properties
new file mode 100644
index 0000000..df22408
--- /dev/null
+++ b/smali/src/main/resources/smali.properties
@@ -0,0 +1 @@
+application.version=${version}
\ No newline at end of file
diff --git a/smali/src/test/antlr/org/jf/smali/expectedTokensTestGrammar.g b/smali/src/test/antlr/org/jf/smali/expectedTokensTestGrammar.g
new file mode 100644
index 0000000..6780b97
--- /dev/null
+++ b/smali/src/test/antlr/org/jf/smali/expectedTokensTestGrammar.g
@@ -0,0 +1,153 @@
+/*
+ * The string related lexical rules are derived from rules from the
+ * Java 1.6 grammar which can be found here:
+ * http://openjdk.java.net/projects/compiler-grammar/antlrworks/Java.g
+ *
+ * Specifically, these rules:
+ *
+ * HEX_PREFIX, HEX_DIGIT, ESCAPE_SEQUENCE, STRING_LITERAL, BASE_STRING_LITERAL
+ *
+ * These rules were originally copyrighted by Terence Parr, and are used here in
+ * accordance with the following license
+ *
+ * [The "BSD licence"]
+ * Copyright (c) 2007-2008 Terence Parr
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ * The remainder of this grammar is released by me (Ben Gruver) under the
+ * following license:
+ *
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+ 
+grammar expectedTokensTestGrammar;
+
+@lexer::header {
+package org.jf.smali;
+}
+
+@parser::header {
+package org.jf.smali;
+
+import java.util.Collections;
+}
+
+@parser::members {
+	public static class ExpectedToken {
+		public final String tokenName;
+		public final String tokenText;
+		
+		public ExpectedToken(String tokenName, String tokenText) {
+			this.tokenName = tokenName;
+			this.tokenText = tokenText;
+		}
+		
+		public ExpectedToken(String tokenName) {
+			this.tokenName = tokenName;
+			this.tokenText = null;
+		}
+	}
+
+	private final ArrayList<ExpectedToken> expectedTokens = new ArrayList<ExpectedToken>();
+	
+	public List<ExpectedToken> getExpectedTokens() {
+		return Collections.unmodifiableList(expectedTokens);
+	}
+}
+
+
+fragment HEX_DIGIT
+	:	('0'..'9')|('A'..'F')|('a'..'f');
+
+fragment HEX_DIGITS
+	:	HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT;
+
+fragment ESCAPE_SEQUENCE[StringBuilder sb]
+	:	'\\'
+		(
+			'b' {sb.append("\b");}
+		|	't' {sb.append("\t");}
+		|	'n' {sb.append("\n");}
+		|	'f' {sb.append("\f");}
+		|	'r' {sb.append("\r");}
+		|	'\"' {sb.append("\"");}
+		|	'\'' {sb.append("'");}
+		|	'\\' {sb.append("\\");}
+		|	'u' HEX_DIGITS {sb.append((char)Integer.parseInt($HEX_DIGITS.text, 16));}
+		);
+
+
+STRING_LITERAL
+	@init {StringBuilder sb = new StringBuilder();}
+	:	BASE_STRING_LITERAL[sb] {setText(sb.toString());};
+
+fragment BASE_STRING_LITERAL[StringBuilder sb]
+	:	'"'
+		(	ESCAPE_SEQUENCE[sb]
+		|	~( '\\' | '"' | '\r' | '\n' ) {sb.append((char)input.LA(-1));}
+		)*
+		'"';
+
+TOKEN_NAME
+	:	(('a'..'z')|('A' .. 'Z')|'_'|('0'..'9'))+;
+	
+WHITE_SPACE
+	:	(' '|'\t'|'\n'|'\r')+ {$channel = HIDDEN;};	
+
+top	:	token*;
+
+token	:	TOKEN_NAME ( '(' STRING_LITERAL ')' )
+		{
+			expectedTokens.add(new ExpectedToken($TOKEN_NAME.getText(), $STRING_LITERAL.getText()));
+		} |
+		TOKEN_NAME
+		{
+			expectedTokens.add(new ExpectedToken($TOKEN_NAME.getText()));
+		};
\ No newline at end of file
diff --git a/smali/src/test/java/org/jf/smali/ByteLiteralTest.java b/smali/src/test/java/org/jf/smali/ByteLiteralTest.java
new file mode 100644
index 0000000..7bf7c54
--- /dev/null
+++ b/smali/src/test/java/org/jf/smali/ByteLiteralTest.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.smali;import org.jf.smali.LiteralTools;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ByteLiteralTest
+{
+
+    @Test
+    public void SuccessHexTests() {
+
+        Assert.assertTrue(LiteralTools.parseByte("0x0T") == 0x0);
+        Assert.assertTrue(LiteralTools.parseByte("0x00") == 0x0);
+        Assert.assertTrue(LiteralTools.parseByte("0x1T") == 0x1);
+        Assert.assertTrue(LiteralTools.parseByte("0x12") == 0x12);
+        Assert.assertTrue(LiteralTools.parseByte("0x7fT") == 0x7f);
+        Assert.assertTrue(LiteralTools.parseByte("0x80t") == Byte.MIN_VALUE);
+        Assert.assertTrue(LiteralTools.parseByte("0xFFt") == -1);
+
+        Assert.assertTrue(LiteralTools.parseByte("-0x00") == 0);
+        Assert.assertTrue(LiteralTools.parseByte("-0x01") == -1);
+        Assert.assertTrue(LiteralTools.parseByte("-0x12") == -0x12);
+        Assert.assertTrue(LiteralTools.parseByte("-0x80") == Byte.MIN_VALUE);
+        Assert.assertTrue(LiteralTools.parseByte("-0x1f") == -0x1f);
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FaileHexTest1() {
+        LiteralTools.parseByte("-0x81");
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FailHexTest2() {
+        LiteralTools.parseByte("-0xFF");
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FailHexTest3() {
+        LiteralTools.parseByte("0x100");
+    }
+
+
+
+    @Test
+    public void SuccessDecTests() {
+        Assert.assertTrue(LiteralTools.parseByte("0") == 0);
+        Assert.assertTrue(LiteralTools.parseByte("1t") == 1);
+        Assert.assertTrue(LiteralTools.parseByte("123") == 123);
+        Assert.assertTrue(LiteralTools.parseByte("127T") == 127);
+        Assert.assertTrue(LiteralTools.parseByte("128") == Byte.MIN_VALUE);
+        Assert.assertTrue(LiteralTools.parseByte("255") == -1);
+
+
+        Assert.assertTrue(LiteralTools.parseByte("-0") == 0);
+        Assert.assertTrue(LiteralTools.parseByte("-1") == -1);
+        Assert.assertTrue(LiteralTools.parseByte("-123") == -123);
+        Assert.assertTrue(LiteralTools.parseByte("-127") == -127);
+        Assert.assertTrue(LiteralTools.parseByte("-128") == Byte.MIN_VALUE);
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FaileDecTest1() {
+        LiteralTools.parseByte("-129");
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FailDecTest2() {
+        LiteralTools.parseByte("-255");
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FailDecTest3() {
+        LiteralTools.parseByte("256");
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FailDecTest4() {
+        LiteralTools.parseByte("260");
+    }
+
+
+    @Test
+    public void SuccessOctTests() {
+        Assert.assertTrue(LiteralTools.parseByte("00") == 00);
+        Assert.assertTrue(LiteralTools.parseByte("01") == 01);
+        Assert.assertTrue(LiteralTools.parseByte("0123t") == 0123);
+        Assert.assertTrue(LiteralTools.parseByte("0177") == Byte.MAX_VALUE);
+        Assert.assertTrue(LiteralTools.parseByte("0200T") == Byte.MIN_VALUE);
+        Assert.assertTrue(LiteralTools.parseByte("0377") == -1);
+
+
+        Assert.assertTrue(LiteralTools.parseByte("-00") == 0);
+        Assert.assertTrue(LiteralTools.parseByte("-01") == -1);
+        Assert.assertTrue(LiteralTools.parseByte("-0123") == -0123);
+        Assert.assertTrue(LiteralTools.parseByte("-0177") == -0177);
+        Assert.assertTrue(LiteralTools.parseByte("-0200") == Byte.MIN_VALUE);
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FaileOctTest1() {
+        LiteralTools.parseByte("-0201");
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FailOctTest2() {
+        LiteralTools.parseByte("-0377");
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FailOctTest3() {
+        LiteralTools.parseByte("0400");
+    }
+}
diff --git a/smali/src/test/java/org/jf/smali/ImplicitReferenceTest.java b/smali/src/test/java/org/jf/smali/ImplicitReferenceTest.java
new file mode 100644
index 0000000..becb01c
--- /dev/null
+++ b/smali/src/test/java/org/jf/smali/ImplicitReferenceTest.java
@@ -0,0 +1,243 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.smali;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import junit.framework.Assert;
+import org.antlr.runtime.RecognitionException;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.ValueType;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.Field;
+import org.jf.dexlib2.iface.Method;
+import org.jf.dexlib2.iface.MethodImplementation;
+import org.jf.dexlib2.iface.instruction.Instruction;
+import org.jf.dexlib2.iface.instruction.formats.Instruction21c;
+import org.jf.dexlib2.iface.instruction.formats.Instruction35c;
+import org.jf.dexlib2.iface.reference.FieldReference;
+import org.jf.dexlib2.iface.reference.MethodReference;
+import org.jf.dexlib2.iface.value.FieldEncodedValue;
+import org.jf.dexlib2.iface.value.MethodEncodedValue;
+import org.jf.dexlib2.iface.value.TypeEncodedValue;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Tests for method/field references that use an implicit type
+ */
+public class ImplicitReferenceTest extends SmaliTestUtils {
+    @Test
+    public void testImplicitMethodReference() throws RecognitionException, IOException {
+        ClassDef classDef = SmaliTestUtils.compileSmali("" +
+                ".class public LHelloWorld;\n" +
+                ".super Ljava/lang/Object;\n" +
+                ".method public static main([Ljava/lang/String;)V\n" +
+                "    .registers 1\n" +
+                "    invoke-static {p0}, toString()V\n" +
+                "    invoke-static {p0}, V()V\n" +
+                "    invoke-static {p0}, I()V\n" +
+                "    return-void\n" +
+                ".end method");
+
+        Method mainMethod = null;
+        for (Method method: classDef.getMethods()) {
+            if (method.getName().equals("main")) {
+                mainMethod = method;
+            }
+        }
+        Assert.assertNotNull(mainMethod);
+
+        MethodImplementation methodImpl = mainMethod.getImplementation();
+        Assert.assertNotNull(methodImpl);
+
+        List<Instruction> instructions = Lists.newArrayList(methodImpl.getInstructions());
+
+        Instruction35c instruction = (Instruction35c)instructions.get(0);
+        Assert.assertNotNull(instruction);
+        Assert.assertEquals(Opcode.INVOKE_STATIC, instruction.getOpcode());
+        MethodReference method = (MethodReference)instruction.getReference();
+        Assert.assertEquals(classDef.getType(), method.getDefiningClass());
+        Assert.assertEquals("toString", method.getName());
+
+        instruction = (Instruction35c)instructions.get(1);
+        Assert.assertNotNull(instruction);
+        Assert.assertEquals(Opcode.INVOKE_STATIC, instruction.getOpcode());
+        method = (MethodReference)instruction.getReference();
+        Assert.assertEquals(classDef.getType(), method.getDefiningClass());
+        Assert.assertEquals("V", method.getName());
+
+        instruction = (Instruction35c)instructions.get(2);
+        Assert.assertNotNull(instruction);
+        Assert.assertEquals(Opcode.INVOKE_STATIC, instruction.getOpcode());
+        method = (MethodReference)instruction.getReference();
+        Assert.assertEquals(classDef.getType(), method.getDefiningClass());
+        Assert.assertEquals("I", method.getName());
+    }
+
+    @Test
+    public void testImplicitMethodLiteral() throws RecognitionException, IOException {
+        ClassDef classDef = SmaliTestUtils.compileSmali("" +
+                ".class public LHelloWorld;\n" +
+                ".super Ljava/lang/Object;\n" +
+                ".field public static field1:Ljava/lang/reflect/Method; = toString()V\n" +
+                ".field public static field2:Ljava/lang/reflect/Method; = V()V\n" +
+                ".field public static field3:Ljava/lang/reflect/Method; = I()V\n" +
+                ".field public static field4:Ljava/lang/Class; = I");
+
+        Map<String, Field> fields = Maps.newHashMap();
+        for (Field field: classDef.getFields()) {
+            fields.put(field.getName(), field);
+        }
+
+        Field field = fields.get("field1");
+        Assert.assertNotNull(field);
+        Assert.assertNotNull(field.getInitialValue());
+        Assert.assertEquals(ValueType.METHOD, field.getInitialValue().getValueType());
+        MethodEncodedValue methodEncodedValue = (MethodEncodedValue)field.getInitialValue();
+        Assert.assertEquals(classDef.getType(), methodEncodedValue.getValue().getDefiningClass());
+        Assert.assertEquals("toString", methodEncodedValue.getValue().getName());
+
+        field = fields.get("field2");
+        Assert.assertNotNull(field);
+        Assert.assertNotNull(field.getInitialValue());
+        Assert.assertEquals(ValueType.METHOD, field.getInitialValue().getValueType());
+        methodEncodedValue = (MethodEncodedValue)field.getInitialValue();
+        Assert.assertEquals(classDef.getType(), methodEncodedValue.getValue().getDefiningClass());
+        Assert.assertEquals("V", methodEncodedValue.getValue().getName());
+
+        field = fields.get("field3");
+        Assert.assertNotNull(field);
+        Assert.assertNotNull(field.getInitialValue());
+        Assert.assertEquals(ValueType.METHOD, field.getInitialValue().getValueType());
+        methodEncodedValue = (MethodEncodedValue)field.getInitialValue();
+        Assert.assertEquals(classDef.getType(), methodEncodedValue.getValue().getDefiningClass());
+        Assert.assertEquals("I", methodEncodedValue.getValue().getName());
+
+        field = fields.get("field4");
+        Assert.assertNotNull(field);
+        Assert.assertNotNull(field.getInitialValue());
+        Assert.assertEquals(ValueType.TYPE, field.getInitialValue().getValueType());
+        TypeEncodedValue typeEncodedValue = (TypeEncodedValue)field.getInitialValue();
+        Assert.assertEquals("I", typeEncodedValue.getValue());
+    }
+
+    @Test
+    public void testImplicitFieldReference() throws RecognitionException, IOException {
+        ClassDef classDef = SmaliTestUtils.compileSmali("" +
+                ".class public LHelloWorld;\n" +
+                ".super Ljava/lang/Object;\n" +
+                ".method public static main([Ljava/lang/String;)V\n" +
+                "    .registers 1\n" +
+                "    sget-object v0, someField:I\n" +
+                "    sget-object v0, V:I\n" +
+                "    sget-object v0, I:I\n" +
+                "    return-void\n" +
+                ".end method");
+
+        Method mainMethod = null;
+        for (Method method: classDef.getMethods()) {
+            if (method.getName().equals("main")) {
+                mainMethod = method;
+            }
+        }
+        Assert.assertNotNull(mainMethod);
+
+        MethodImplementation methodImpl = mainMethod.getImplementation();
+        Assert.assertNotNull(methodImpl);
+
+        List<Instruction> instructions = Lists.newArrayList(methodImpl.getInstructions());
+
+        Instruction21c instruction = (Instruction21c)instructions.get(0);
+        Assert.assertNotNull(instruction);
+        Assert.assertEquals(Opcode.SGET_OBJECT, instruction.getOpcode());
+        FieldReference field = (FieldReference)instruction.getReference();
+        Assert.assertEquals(classDef.getType(), field.getDefiningClass());
+        Assert.assertEquals("someField", field.getName());
+
+        instruction = (Instruction21c)instructions.get(1);
+        Assert.assertNotNull(instruction);
+        Assert.assertEquals(Opcode.SGET_OBJECT, instruction.getOpcode());
+        field = (FieldReference)instruction.getReference();
+        Assert.assertEquals(classDef.getType(), field.getDefiningClass());
+        Assert.assertEquals("V", field.getName());
+
+        instruction = (Instruction21c)instructions.get(2);
+        Assert.assertNotNull(instruction);
+        Assert.assertEquals(Opcode.SGET_OBJECT, instruction.getOpcode());
+        field = (FieldReference)instruction.getReference();
+        Assert.assertEquals(classDef.getType(), field.getDefiningClass());
+        Assert.assertEquals("I", field.getName());
+    }
+
+    @Test
+    public void testImplicitFieldLiteral() throws RecognitionException, IOException {
+        ClassDef classDef = SmaliTestUtils.compileSmali("" +
+                ".class public LHelloWorld;\n" +
+                ".super Ljava/lang/Object;\n" +
+                ".field public static field1:Ljava/lang/reflect/Field; = someField:I\n" +
+                ".field public static field2:Ljava/lang/reflect/Field; = V:I\n" +
+                ".field public static field3:Ljava/lang/reflect/Field; = I:I\n");
+
+        Map<String, Field> fields = Maps.newHashMap();
+        for (Field field: classDef.getFields()) {
+            fields.put(field.getName(), field);
+        }
+
+        Field field = fields.get("field1");
+        Assert.assertNotNull(field);
+        Assert.assertNotNull(field.getInitialValue());
+        Assert.assertEquals(ValueType.FIELD, field.getInitialValue().getValueType());
+        FieldEncodedValue fieldEncodedValue = (FieldEncodedValue)field.getInitialValue();
+        Assert.assertEquals(classDef.getType(), fieldEncodedValue.getValue().getDefiningClass());
+        Assert.assertEquals("someField", fieldEncodedValue.getValue().getName());
+
+        field = fields.get("field2");
+        Assert.assertNotNull(field);
+        Assert.assertNotNull(field.getInitialValue());
+        Assert.assertEquals(ValueType.FIELD, field.getInitialValue().getValueType());
+        fieldEncodedValue = (FieldEncodedValue)field.getInitialValue();
+        Assert.assertEquals(classDef.getType(), fieldEncodedValue.getValue().getDefiningClass());
+        Assert.assertEquals("V", fieldEncodedValue.getValue().getName());
+
+        field = fields.get("field3");
+        Assert.assertNotNull(field);
+        Assert.assertNotNull(field.getInitialValue());
+        Assert.assertEquals(ValueType.FIELD, field.getInitialValue().getValueType());
+        fieldEncodedValue = (FieldEncodedValue)field.getInitialValue();
+        Assert.assertEquals(classDef.getType(), fieldEncodedValue.getValue().getDefiningClass());
+        Assert.assertEquals("I", fieldEncodedValue.getValue().getName());
+    }
+}
diff --git a/smali/src/test/java/org/jf/smali/IntLiteralTest.java b/smali/src/test/java/org/jf/smali/IntLiteralTest.java
new file mode 100644
index 0000000..6cc7fbd
--- /dev/null
+++ b/smali/src/test/java/org/jf/smali/IntLiteralTest.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.smali;import org.jf.smali.LiteralTools;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class IntLiteralTest
+{
+    @Test
+    public void SuccessHexTests() {
+
+        Assert.assertTrue(LiteralTools.parseInt("0x0") == 0x0);
+        Assert.assertTrue(LiteralTools.parseInt("0x00") == 0x0);
+        Assert.assertTrue(LiteralTools.parseInt("0x1") == 0x1);
+        Assert.assertTrue(LiteralTools.parseInt("0x12345678") == 0x12345678);
+        Assert.assertTrue(LiteralTools.parseInt("0x7fffffff") == 0x7fffffff);
+        Assert.assertTrue(LiteralTools.parseInt("0x80000000") == Integer.MIN_VALUE);
+        Assert.assertTrue(LiteralTools.parseInt("0xFFFFFFFF") == -1);
+
+        Assert.assertTrue(LiteralTools.parseInt("-0x00") == 0);
+        Assert.assertTrue(LiteralTools.parseInt("-0x01") == -1);
+        Assert.assertTrue(LiteralTools.parseInt("-0x12345678") == -0x12345678);
+        Assert.assertTrue(LiteralTools.parseInt("-0x80000000") == Integer.MIN_VALUE);
+        Assert.assertTrue(LiteralTools.parseInt("-0x1FFFFFFF") == -0x1FFFFFFF);
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FaileHexTest1() {
+        LiteralTools.parseInt("-0x80000001");
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FailHexTest2() {
+        LiteralTools.parseInt("-0xFFFFFFFF");
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FailHexTest3() {
+        LiteralTools.parseInt("0x100000000");
+    }
+
+
+
+    @Test
+    public void SuccessDecTests() {
+        Assert.assertTrue(LiteralTools.parseInt("0") == 0);
+        Assert.assertTrue(LiteralTools.parseInt("1") == 1);
+        Assert.assertTrue(LiteralTools.parseInt("1234567890") == 1234567890);
+        Assert.assertTrue(LiteralTools.parseInt("2147483647") == 2147483647);
+        Assert.assertTrue(LiteralTools.parseInt("2147483648") == Integer.MIN_VALUE);
+        Assert.assertTrue(LiteralTools.parseInt("4294967295") == -1);
+
+
+        Assert.assertTrue(LiteralTools.parseInt("-0") == 0);
+        Assert.assertTrue(LiteralTools.parseInt("-1") == -1);
+        Assert.assertTrue(LiteralTools.parseInt("-1234567890") == -1234567890);
+        Assert.assertTrue(LiteralTools.parseInt("-2147483647") == -2147483647);
+        Assert.assertTrue(LiteralTools.parseInt("-2147483648") == Integer.MIN_VALUE);
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FaileDecTest1() {
+        LiteralTools.parseInt("-2147483649");
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FailDecTest2() {
+        LiteralTools.parseInt("-4294967295");
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FailDecTest3() {
+        LiteralTools.parseInt("4294967296");
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FailDecTest4() {
+        LiteralTools.parseInt("4294967300");
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FailDecTest5() {
+        LiteralTools.parseInt("8589934592");
+    }
+
+
+    @Test
+    public void SuccessOctTests() {
+        Assert.assertTrue(LiteralTools.parseInt("00") == 00);
+        Assert.assertTrue(LiteralTools.parseInt("01") == 01);
+        Assert.assertTrue(LiteralTools.parseInt("012345670123") == 012345670123);
+        Assert.assertTrue(LiteralTools.parseInt("017777777777") == Integer.MAX_VALUE);
+        Assert.assertTrue(LiteralTools.parseInt("020000000000") == Integer.MIN_VALUE);
+        Assert.assertTrue(LiteralTools.parseInt("037777777777") == -1);
+
+
+        Assert.assertTrue(LiteralTools.parseInt("-00") == 0);
+        Assert.assertTrue(LiteralTools.parseInt("-01") == -1);
+        Assert.assertTrue(LiteralTools.parseInt("-012345670123") == -012345670123);
+        Assert.assertTrue(LiteralTools.parseInt("-017777777777") == -017777777777);
+        Assert.assertTrue(LiteralTools.parseInt("-020000000000") == Integer.MIN_VALUE);
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FaileOctTest1() {
+        LiteralTools.parseInt("-020000000001");
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FailOctTest2() {
+        LiteralTools.parseInt("-037777777777");
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FailOctTest3() {
+        LiteralTools.parseInt("040000000000");
+    }
+}
diff --git a/smali/src/test/java/org/jf/smali/LexerTest.java b/smali/src/test/java/org/jf/smali/LexerTest.java
new file mode 100644
index 0000000..eea1d54
--- /dev/null
+++ b/smali/src/test/java/org/jf/smali/LexerTest.java
@@ -0,0 +1,233 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.smali;import org.antlr.runtime.ANTLRInputStream;
+import org.antlr.runtime.CommonToken;
+import org.antlr.runtime.CommonTokenStream;
+import org.antlr.runtime.RecognitionException;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.HashMap;
+import java.util.List;
+
+import static org.jf.smali.expectedTokensTestGrammarParser.ExpectedToken;
+
+public class LexerTest {
+    private static final HashMap<String, Integer> tokenTypesByName;
+    private static final int MOST_RECENT_API = 10000;
+
+    static {
+        tokenTypesByName = new HashMap<String, Integer>();
+
+        for (int i=0; i<smaliParser.tokenNames.length; i++) {
+            tokenTypesByName.put(smaliParser.tokenNames[i], i);
+        }
+    }
+
+    @Test
+    public void DirectiveTest() {
+        runTest("DirectiveTest");
+    }
+
+    @Test
+    public void ByteLiteralTest() {
+        runTest("ByteLiteralTest");
+    }
+
+    @Test
+    public void ShortLiteralTest() {
+        runTest("ShortLiteralTest");
+    }
+
+    @Test
+    public void IntegerLiteralTest() {
+        runTest("IntegerLiteralTest");
+    }
+
+    @Test
+    public void LongLiteralTest() {
+        runTest("LongLiteralTest");
+    }
+
+    @Test
+    public void FloatLiteralTest() {
+        runTest("FloatLiteralTest");
+    }
+
+    @Test
+    public void CharLiteralTest() {
+        runTest("CharLiteralTest");
+    }
+
+    @Test
+    public void StringLiteralTest() {
+        runTest("StringLiteralTest");
+    }
+
+    @Test
+    public void MiscTest() {
+        runTest("MiscTest");
+    }
+
+    @Test
+    public void CommentTest() {
+        runTest("CommentTest", false);
+    }
+
+    @Test
+    public void InstructionTest() {
+        runTest("InstructionTest", true);
+    }
+
+    @Test
+    public void TypeAndIdentifierTest() {
+        runTest("TypeAndIdentifierTest");
+    }
+
+    @Test
+    public void TypeAndIdentifierTest_api29() {
+        runTest("TypeAndIdentifierTest_api29", 29);
+    }
+
+    @Test
+    public void SymbolTest() {
+        runTest("SymbolTest", false);
+    }
+
+    @Test
+    public void RealSmaliFileTest() {
+        runTest("RealSmaliFileTest", true);
+    }
+
+    public void runTest(String test) {
+        runTest(test, true, MOST_RECENT_API);
+    }
+
+    public void runTest(String test, boolean discardHiddenTokens) {
+        runTest(test, discardHiddenTokens, MOST_RECENT_API);
+    }
+
+    public void runTest(String test, int apiLevel) {
+        runTest(test, true, apiLevel);
+    }
+
+    public void runTest(String test, boolean discardHiddenTokens, int apiLevel) {
+        String smaliFile = String.format("LexerTest%s%s.smali", File.separatorChar, test);
+        String tokensFile = String.format("LexerTest%s%s.tokens", File.separatorChar, test);
+
+        org.jf.smali.expectedTokensTestGrammarLexer expectedTokensLexer = null;
+        try {
+            expectedTokensLexer = new org.jf.smali.expectedTokensTestGrammarLexer(new ANTLRInputStream(
+                    LexerTest.class.getClassLoader().getResourceAsStream(tokensFile)));
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+
+        CommonTokenStream expectedTokensStream = new CommonTokenStream(expectedTokensLexer);
+
+        org.jf.smali.expectedTokensTestGrammarParser expectedTokensParser =
+                new org.jf.smali.expectedTokensTestGrammarParser(expectedTokensStream);
+        try {
+            expectedTokensParser.top();
+        } catch (RecognitionException ex) {
+            throw new RuntimeException(ex);
+        }
+
+        List<ExpectedToken> expectedTokens = expectedTokensParser.getExpectedTokens();
+
+        InputStream smaliStream = LexerTest.class.getClassLoader().getResourceAsStream(smaliFile);
+        if (smaliStream == null) {
+            Assert.fail("Could not load " + smaliFile);
+        }
+        smaliFlexLexer lexer = new smaliFlexLexer(new InputStreamReader(smaliStream),
+            apiLevel);
+        lexer.setSourceFile(new File(test + ".smali"));
+        lexer.setSuppressErrors(true);
+
+        CommonTokenStream tokenStream = new CommonTokenStream(lexer);
+        tokenStream.fill();
+        List tokens = tokenStream.getTokens();
+
+        int expectedTokenIndex = 0;
+        CommonToken token;
+        for (int i=0; i<tokens.size()-1; i++) {
+            token = (CommonToken)tokens.get(i);
+
+            if (discardHiddenTokens && token.getChannel() == smaliParser.HIDDEN) {
+                continue;
+            }
+
+            if (expectedTokenIndex >= expectedTokens.size()) {
+                Assert.fail("Too many tokens");
+            }
+
+            if (token.getType() == smaliParser.INVALID_TOKEN) {
+                Assert.assertTrue("Encountered an INVALID_TOKEN not on the error channel",
+                        token.getChannel() == smaliParser.ERROR_CHANNEL);
+            }
+
+            ExpectedToken expectedToken = expectedTokens.get(expectedTokenIndex++);
+            if (!tokenTypesByName.containsKey(expectedToken.tokenName)) {
+                Assert.fail("Unknown token: " + expectedToken.tokenName);
+            }
+            int expectedTokenType = tokenTypesByName.get(expectedToken.tokenName);
+
+            if (token.getType() != expectedTokenType) {
+                Assert.fail(String.format("Invalid token at index %d. Expecting %s, got %s(%s)",
+                        expectedTokenIndex-1, expectedToken.tokenName, getTokenName(token.getType()), token.getText()));
+            }
+
+            if (expectedToken.tokenText != null) {
+                if (!expectedToken.tokenText.equals(token.getText())) {
+                    Assert.fail(
+                            String.format("Invalid token text at index %d. Expecting text \"%s\", got \"%s\"",
+                                    expectedTokenIndex - 1, expectedToken.tokenText, token.getText()));
+                }
+            }
+        }
+
+        if (expectedTokenIndex < expectedTokens.size()) {
+            Assert.fail(String.format("Not enough tokens. Expecting %d tokens, but got %d", expectedTokens.size(),
+                    expectedTokenIndex));
+        }
+    }
+
+
+
+    private static String getTokenName(int tokenType) {
+        return smaliParser.tokenNames[tokenType];
+    }
+}
diff --git a/smali/src/test/java/org/jf/smali/LongLiteralTest.java b/smali/src/test/java/org/jf/smali/LongLiteralTest.java
new file mode 100644
index 0000000..4659a0b
--- /dev/null
+++ b/smali/src/test/java/org/jf/smali/LongLiteralTest.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.smali;import org.jf.smali.LiteralTools;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class LongLiteralTest
+{
+    @Test
+    public void SuccessHexTests() {
+        Assert.assertTrue(LiteralTools.parseLong("0x0L") == 0x0);
+        Assert.assertTrue(LiteralTools.parseLong("0x00L") == 0x0);
+        Assert.assertTrue(LiteralTools.parseLong("0x1L") == 0x1);
+        Assert.assertTrue(LiteralTools.parseLong("0x1234567890123456L") == 0x1234567890123456L);
+        Assert.assertTrue(LiteralTools.parseLong("0x7fffffffffffffffL") == 0x7fffffffffffffffL);
+        Assert.assertTrue(LiteralTools.parseLong("0x8000000000000000L") == Long.MIN_VALUE);
+        Assert.assertTrue(LiteralTools.parseLong("0xFFFFFFFFFFFFFFFFL") == -1);
+
+        Assert.assertTrue(LiteralTools.parseLong("-0x00L") == 0);
+        Assert.assertTrue(LiteralTools.parseLong("-0x01L") == -1);
+        Assert.assertTrue(LiteralTools.parseLong("-0x1234567890123456L") == -0x1234567890123456L);
+        Assert.assertTrue(LiteralTools.parseLong("-0x8000000000000000L") == Long.MIN_VALUE);
+        Assert.assertTrue(LiteralTools.parseLong("-0x1fffffffffffffffL") == -0x1fffffffffffffffL);
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FaileHexTest1() {
+        LiteralTools.parseLong("-0x8000000000000001");
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FailHexTest2() {
+        LiteralTools.parseLong("-0xFFFFFFFFFFFFFFFF");
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FailHexTest3() {
+        LiteralTools.parseLong("0x10000000000000000");
+    }
+
+    @Test
+    public void SuccessDecTests() {
+        Assert.assertTrue(LiteralTools.parseLong("0L") == 0);
+        Assert.assertTrue(LiteralTools.parseLong("1") == 1);
+        Assert.assertTrue(LiteralTools.parseLong("1234567890123456789") == 1234567890123456789L);
+        Assert.assertTrue(LiteralTools.parseLong("9223372036854775807") == 9223372036854775807L);
+        Assert.assertTrue(LiteralTools.parseLong("9223372036854775808") == Long.MIN_VALUE);
+        Assert.assertTrue(LiteralTools.parseLong("18446744073709551615L") == -1);
+
+        Assert.assertTrue(LiteralTools.parseLong("-0") == 0);
+        Assert.assertTrue(LiteralTools.parseLong("-1") == -1);
+        Assert.assertTrue(LiteralTools.parseLong("-1234567890123456789") == -1234567890123456789L);
+        Assert.assertTrue(LiteralTools.parseLong("-9223372036854775807") == -9223372036854775807L);
+        Assert.assertTrue(LiteralTools.parseLong("-9223372036854775808") == Long.MIN_VALUE);
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FaileDecTest1() {
+        LiteralTools.parseLong("-9223372036854775809");
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FailDecTest2() {
+        LiteralTools.parseLong("-18446744073709551616");
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FailDecTest3() {
+        LiteralTools.parseLong("18446744073709551617");
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FailDecTest4() {
+        LiteralTools.parseLong("18446744073709551700");
+    }
+
+    @Test
+    public void SuccessOctTests() {
+        Assert.assertTrue(LiteralTools.parseLong("00") == 00);
+        Assert.assertTrue(LiteralTools.parseLong("01") == 01);
+        Assert.assertTrue(LiteralTools.parseLong("0123456701234567012345") == 0123456701234567012345L);
+        Assert.assertTrue(LiteralTools.parseLong("0777777777777777777777") == Long.MAX_VALUE);
+        Assert.assertTrue(LiteralTools.parseLong("01000000000000000000000") == Long.MIN_VALUE);
+        Assert.assertTrue(LiteralTools.parseLong("01777777777777777777777") == -1);
+
+        Assert.assertTrue(LiteralTools.parseLong("-00") == 0);
+        Assert.assertTrue(LiteralTools.parseLong("-01") == -1);
+        Assert.assertTrue(LiteralTools.parseLong("-0123456701234567012345") == -0123456701234567012345L);
+        Assert.assertTrue(LiteralTools.parseLong("-0777777777777777777777") == -0777777777777777777777L);
+        Assert.assertTrue(LiteralTools.parseLong("-01000000000000000000000") == Long.MIN_VALUE);
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FaileOctTest1() {
+        LiteralTools.parseLong("-01000000000000000000001");
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FailOctTest2() {
+        LiteralTools.parseLong("-01777777777777777777777");
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FailOctTest3() {
+        LiteralTools.parseLong("02000000000000000000000");
+    }
+}
diff --git a/smali/src/test/java/org/jf/smali/ShortLiteralTest.java b/smali/src/test/java/org/jf/smali/ShortLiteralTest.java
new file mode 100644
index 0000000..2ba22ac
--- /dev/null
+++ b/smali/src/test/java/org/jf/smali/ShortLiteralTest.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.smali;import org.jf.smali.LiteralTools;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ShortLiteralTest
+{
+
+    @Test
+    public void SuccessHexTests() {
+
+        Assert.assertTrue(LiteralTools.parseShort("0x0") == 0x0);
+        Assert.assertTrue(LiteralTools.parseShort("0x00") == 0x0);
+        Assert.assertTrue(LiteralTools.parseShort("0x1") == 0x1);
+        Assert.assertTrue(LiteralTools.parseShort("0x1234") == 0x1234);
+        Assert.assertTrue(LiteralTools.parseShort("0x7fff") == 0x7fff);
+        Assert.assertTrue(LiteralTools.parseShort("0x8000") == Short.MIN_VALUE);
+        Assert.assertTrue(LiteralTools.parseShort("0xFFFF") == -1);
+
+        Assert.assertTrue(LiteralTools.parseShort("-0x00") == 0);
+        Assert.assertTrue(LiteralTools.parseShort("-0x01") == -1);
+        Assert.assertTrue(LiteralTools.parseShort("-0x1234") == -0x1234);
+        Assert.assertTrue(LiteralTools.parseShort("-0x8000") == Short.MIN_VALUE);
+        Assert.assertTrue(LiteralTools.parseShort("-0x1fff") == -0x1fff);
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FaileHexTest1() {
+        LiteralTools.parseShort("-0x8001");
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FailHexTest2() {
+        LiteralTools.parseShort("-0xFFFF");
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FailHexTest3() {
+        LiteralTools.parseShort("0x100000");
+    }
+
+
+
+  @Test
+    public void SuccessDecTests() {
+        Assert.assertTrue(LiteralTools.parseShort("0") == 0);
+        Assert.assertTrue(LiteralTools.parseShort("1") == 1);
+        Assert.assertTrue(LiteralTools.parseShort("12345") == 12345);
+        Assert.assertTrue(LiteralTools.parseShort("32767") == 32767);
+        Assert.assertTrue(LiteralTools.parseShort("32768") == Short.MIN_VALUE);
+        Assert.assertTrue(LiteralTools.parseShort("65535") == -1);
+
+
+        Assert.assertTrue(LiteralTools.parseShort("-0") == 0);
+        Assert.assertTrue(LiteralTools.parseShort("-1") == -1);
+        Assert.assertTrue(LiteralTools.parseShort("-12345") == -12345);
+        Assert.assertTrue(LiteralTools.parseShort("-32767") == -32767);
+        Assert.assertTrue(LiteralTools.parseShort("-32768") == Short.MIN_VALUE);
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FaileDecTest1() {
+        LiteralTools.parseShort("-32769");
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FailDecTest2() {
+        LiteralTools.parseShort("-65535");
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FailDecTest3() {
+        LiteralTools.parseShort("65536");
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FailDecTest4() {
+        LiteralTools.parseShort("65600");
+    }
+
+
+    @Test
+    public void SuccessOctTests() {
+        Assert.assertTrue(LiteralTools.parseShort("00") == 00);
+        Assert.assertTrue(LiteralTools.parseShort("01") == 01);
+        Assert.assertTrue(LiteralTools.parseShort("012345") == 012345);
+        Assert.assertTrue(LiteralTools.parseShort("077777") == Short.MAX_VALUE);
+        Assert.assertTrue(LiteralTools.parseShort("0100000") == Short.MIN_VALUE);
+        Assert.assertTrue(LiteralTools.parseShort("0177777") == -1);
+
+
+        Assert.assertTrue(LiteralTools.parseShort("-00") == 0);
+        Assert.assertTrue(LiteralTools.parseShort("-01") == -1);
+        Assert.assertTrue(LiteralTools.parseShort("-012345") == -012345);
+        Assert.assertTrue(LiteralTools.parseShort("-077777") == -077777);
+        Assert.assertTrue(LiteralTools.parseShort("-0100000") == Short.MIN_VALUE);
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FaileOctTest1() {
+        LiteralTools.parseShort("-0100001");
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FailOctTest2() {
+        LiteralTools.parseShort("-0177777");
+    }
+
+    @Test(expected=NumberFormatException.class)
+    public void FailOctTest3() {
+        LiteralTools.parseShort("0200000");
+    }
+}
diff --git a/smali/src/test/resources/LexerTest/.gitattributes b/smali/src/test/resources/LexerTest/.gitattributes
new file mode 100644
index 0000000..ea5112a
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/.gitattributes
@@ -0,0 +1,2 @@
+# Prevent newlines from being normalized on windows
+*.smali -text
\ No newline at end of file
diff --git a/smali/src/test/resources/LexerTest/ByteLiteralTest.smali b/smali/src/test/resources/LexerTest/ByteLiteralTest.smali
new file mode 100644
index 0000000..99ad38d
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/ByteLiteralTest.smali
@@ -0,0 +1,47 @@
+0x0T
+0x00
+0x1T
+0x12
+0x7fT
+0x80t
+0xFFt
+-0x00
+-0x01
+-0x12
+-0x80
+-0x1f
+-0x1fT
+-0x81
+-0xFF
+-0x100
+0
+1t
+123
+127T
+128
+255
+-0
+-1
+-123
+-123T
+-127
+-128
+-129
+-255
+256
+260
+00
+01
+0123t
+0177
+0200T
+0377
+-00
+-01
+-0123
+-0123t
+-177
+-0200
+-0201
+-0377
+-0400
\ No newline at end of file
diff --git a/smali/src/test/resources/LexerTest/ByteLiteralTest.tokens b/smali/src/test/resources/LexerTest/ByteLiteralTest.tokens
new file mode 100644
index 0000000..83677af
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/ByteLiteralTest.tokens
@@ -0,0 +1,47 @@
+BYTE_LITERAL("0x0T")
+POSITIVE_INTEGER_LITERAL("0x00")
+BYTE_LITERAL("0x1T")
+POSITIVE_INTEGER_LITERAL("0x12")
+BYTE_LITERAL("0x7fT")
+BYTE_LITERAL("0x80t")
+BYTE_LITERAL("0xFFt")
+NEGATIVE_INTEGER_LITERAL("-0x00")
+NEGATIVE_INTEGER_LITERAL("-0x01")
+NEGATIVE_INTEGER_LITERAL("-0x12")
+NEGATIVE_INTEGER_LITERAL("-0x80")
+NEGATIVE_INTEGER_LITERAL("-0x1f")
+BYTE_LITERAL("-0x1fT")
+NEGATIVE_INTEGER_LITERAL("-0x81")
+NEGATIVE_INTEGER_LITERAL("-0xFF")
+NEGATIVE_INTEGER_LITERAL("-0x100")
+POSITIVE_INTEGER_LITERAL("0")
+BYTE_LITERAL("1t")
+POSITIVE_INTEGER_LITERAL("123")
+BYTE_LITERAL("127T")
+POSITIVE_INTEGER_LITERAL("128")
+POSITIVE_INTEGER_LITERAL("255")
+NEGATIVE_INTEGER_LITERAL("-0")
+NEGATIVE_INTEGER_LITERAL("-1")
+NEGATIVE_INTEGER_LITERAL("-123")
+BYTE_LITERAL("-123T")
+NEGATIVE_INTEGER_LITERAL("-127")
+NEGATIVE_INTEGER_LITERAL("-128")
+NEGATIVE_INTEGER_LITERAL("-129")
+NEGATIVE_INTEGER_LITERAL("-255")
+POSITIVE_INTEGER_LITERAL("256")
+POSITIVE_INTEGER_LITERAL("260")
+POSITIVE_INTEGER_LITERAL("00")
+POSITIVE_INTEGER_LITERAL("01")
+BYTE_LITERAL("0123t")
+POSITIVE_INTEGER_LITERAL("0177")
+BYTE_LITERAL("0200T")
+POSITIVE_INTEGER_LITERAL("0377")
+NEGATIVE_INTEGER_LITERAL("-00")
+NEGATIVE_INTEGER_LITERAL("-01")
+NEGATIVE_INTEGER_LITERAL("-0123")
+BYTE_LITERAL("-0123t")
+NEGATIVE_INTEGER_LITERAL("-177")
+NEGATIVE_INTEGER_LITERAL("-0200")
+NEGATIVE_INTEGER_LITERAL("-0201")
+NEGATIVE_INTEGER_LITERAL("-0377")
+NEGATIVE_INTEGER_LITERAL("-0400")
\ No newline at end of file
diff --git a/smali/src/test/resources/LexerTest/CharLiteralTest.smali b/smali/src/test/resources/LexerTest/CharLiteralTest.smali
new file mode 100644
index 0000000..3f5b01f
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/CharLiteralTest.smali
@@ -0,0 +1,40 @@
+' '
+'	'
+'a'
+'A'
+'z'
+'Z'
+'a''a'
+'1'
+'2'
+'\n'
+'\r'
+'\t'
+'\b'
+'\f'
+'\u0030'
+'\uABCD'
+'\uabcd'
+'\\'
+'\''
+'\"'
+'"'
+
+
+'a'a'
+'ab'
+'\a'
+''
+'
+'
+'
+'\u'
+'\u0'
+'\ua'
+'\uab'
+'\u01a'
+'\uz'
+'\u012z'
+
+'a'
+'
\ No newline at end of file
diff --git a/smali/src/test/resources/LexerTest/CharLiteralTest.tokens b/smali/src/test/resources/LexerTest/CharLiteralTest.tokens
new file mode 100644
index 0000000..a8a57ea
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/CharLiteralTest.tokens
@@ -0,0 +1,40 @@
+CHAR_LITERAL("' '")
+CHAR_LITERAL("'\t'")
+CHAR_LITERAL("'a'")
+CHAR_LITERAL("'A'")
+CHAR_LITERAL("'z'")
+CHAR_LITERAL("'Z'")
+CHAR_LITERAL("'a'")CHAR_LITERAL("'a'")
+CHAR_LITERAL("'1'")
+CHAR_LITERAL("'2'")
+CHAR_LITERAL("'\n'")
+CHAR_LITERAL("'\r'")
+CHAR_LITERAL("'\t'")
+CHAR_LITERAL("'\b'")
+CHAR_LITERAL("'\f'")
+CHAR_LITERAL("'\u0030'")
+CHAR_LITERAL("'\uABCD'")
+CHAR_LITERAL("'\uabcd'")
+CHAR_LITERAL("'\\'")
+CHAR_LITERAL("'''")
+CHAR_LITERAL("'\"'")
+CHAR_LITERAL("'\"'")
+
+
+CHAR_LITERAL("'a'") SIMPLE_NAME("a") INVALID_TOKEN("'")
+INVALID_TOKEN("'ab'")
+INVALID_TOKEN("'\\a'")
+INVALID_TOKEN("''")
+INVALID_TOKEN("'")
+INVALID_TOKEN("'")
+INVALID_TOKEN("'")
+INVALID_TOKEN("'\\u'")
+INVALID_TOKEN("'\\u0'")
+INVALID_TOKEN("'\\ua'")
+INVALID_TOKEN("'\\uab'")
+INVALID_TOKEN("'\\u01a'")
+INVALID_TOKEN("'\\uz'")
+INVALID_TOKEN("'\\u012z'")
+
+CHAR_LITERAL("'a'")
+INVALID_TOKEN("'")
\ No newline at end of file
diff --git a/smali/src/test/resources/LexerTest/CommentTest.smali b/smali/src/test/resources/LexerTest/CommentTest.smali
new file mode 100644
index 0000000..dd246cb
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/CommentTest.smali
@@ -0,0 +1,6 @@
+#
+#abcd
+#               abcd
+#0x1234
+0x1234 #0x1234
+invoke-virtual #invoke-virtual
\ No newline at end of file
diff --git a/smali/src/test/resources/LexerTest/CommentTest.tokens b/smali/src/test/resources/LexerTest/CommentTest.tokens
new file mode 100644
index 0000000..b3e084a
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/CommentTest.tokens
@@ -0,0 +1,6 @@
+LINE_COMMENT("#") WHITE_SPACE("\n")
+LINE_COMMENT("#abcd") WHITE_SPACE("\n")
+LINE_COMMENT("#               abcd") WHITE_SPACE("\n")
+LINE_COMMENT("#0x1234") WHITE_SPACE("\n")
+POSITIVE_INTEGER_LITERAL("0x1234") WHITE_SPACE(" ") LINE_COMMENT("#0x1234") WHITE_SPACE("\n")
+INSTRUCTION_FORMAT35c_METHOD("invoke-virtual") WHITE_SPACE(" ") LINE_COMMENT("#invoke-virtual")
\ No newline at end of file
diff --git a/smali/src/test/resources/LexerTest/DirectiveTest.smali b/smali/src/test/resources/LexerTest/DirectiveTest.smali
new file mode 100644
index 0000000..7ceec71
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/DirectiveTest.smali
@@ -0,0 +1,58 @@
+
+.class
+.super
+.implements
+.source
+.field
+.end field
+.subannotation
+.end subannotation
+.annotation
+.end annotation
+.enum
+.method
+.end method
+.registers
+.locals
+.array-data
+.end array-data
+.packed-switch
+.end packed-switch
+.sparse-switch
+.end sparse-switch
+.catch
+.catchall
+.line
+.param
+.end param
+.local
+.end local
+.restart local
+.prologue
+.epilogue
+
+
+.class.super.implements
+.class .super .implements
+.class	.super	.implements
+.class	 .super	 .implements
+    .class
+    .super
+    .implements
+
+
+.blah1234
+.end blah
+.local1234
+.super1234
+.super@
+.super.super
+.supeer
+.end
+.
+.1234.1234
+.
+.parameter
+.end parameter
+
+
diff --git a/smali/src/test/resources/LexerTest/DirectiveTest.tokens b/smali/src/test/resources/LexerTest/DirectiveTest.tokens
new file mode 100644
index 0000000..9b82220
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/DirectiveTest.tokens
@@ -0,0 +1,66 @@
+CLASS_DIRECTIVE(".class")
+SUPER_DIRECTIVE(".super")
+IMPLEMENTS_DIRECTIVE(".implements")
+SOURCE_DIRECTIVE(".source")
+FIELD_DIRECTIVE(".field")
+END_FIELD_DIRECTIVE(".end field")
+SUBANNOTATION_DIRECTIVE(".subannotation")
+END_SUBANNOTATION_DIRECTIVE(".end subannotation")
+ANNOTATION_DIRECTIVE(".annotation")
+END_ANNOTATION_DIRECTIVE(".end annotation")
+ENUM_DIRECTIVE(".enum")
+METHOD_DIRECTIVE(".method")
+END_METHOD_DIRECTIVE(".end method")
+REGISTERS_DIRECTIVE(".registers")
+LOCALS_DIRECTIVE(".locals")
+ARRAY_DATA_DIRECTIVE(".array-data")
+END_ARRAY_DATA_DIRECTIVE(".end array-data")
+PACKED_SWITCH_DIRECTIVE(".packed-switch")
+END_PACKED_SWITCH_DIRECTIVE(".end packed-switch")
+SPARSE_SWITCH_DIRECTIVE(".sparse-switch")
+END_SPARSE_SWITCH_DIRECTIVE(".end sparse-switch")
+CATCH_DIRECTIVE(".catch")
+CATCHALL_DIRECTIVE(".catchall")
+LINE_DIRECTIVE(".line")
+PARAMETER_DIRECTIVE(".param")
+END_PARAMETER_DIRECTIVE(".end param")
+LOCAL_DIRECTIVE(".local")
+END_LOCAL_DIRECTIVE(".end local")
+RESTART_LOCAL_DIRECTIVE(".restart local")
+PROLOGUE_DIRECTIVE(".prologue")
+EPILOGUE_DIRECTIVE(".epilogue")
+
+
+CLASS_DIRECTIVE(".class")
+SUPER_DIRECTIVE(".super")
+IMPLEMENTS_DIRECTIVE(".implements")
+CLASS_DIRECTIVE(".class")
+SUPER_DIRECTIVE(".super")
+IMPLEMENTS_DIRECTIVE(".implements")
+CLASS_DIRECTIVE(".class")
+SUPER_DIRECTIVE(".super")
+IMPLEMENTS_DIRECTIVE(".implements")
+CLASS_DIRECTIVE(".class")
+SUPER_DIRECTIVE(".super")
+IMPLEMENTS_DIRECTIVE(".implements")
+CLASS_DIRECTIVE(".class")
+SUPER_DIRECTIVE(".super")
+IMPLEMENTS_DIRECTIVE(".implements")
+
+
+INVALID_TOKEN(".blah1234")
+INVALID_TOKEN(".end blah")
+INVALID_TOKEN(".local1234")
+INVALID_TOKEN(".super1234")
+SUPER_DIRECTIVE(".super")
+AT("@")
+SUPER_DIRECTIVE(".super")
+SUPER_DIRECTIVE(".super")
+INVALID_TOKEN(".supeer")
+INVALID_TOKEN(".end")
+INVALID_TOKEN(".")
+DOUBLE_LITERAL(".1234")
+DOUBLE_LITERAL(".1234")
+INVALID_TOKEN(".")
+INVALID_TOKEN(".parameter")
+INVALID_TOKEN(".end parameter")
\ No newline at end of file
diff --git a/smali/src/test/resources/LexerTest/FloatLiteralTest.smali b/smali/src/test/resources/LexerTest/FloatLiteralTest.smali
new file mode 100644
index 0000000..71319ff
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/FloatLiteralTest.smali
@@ -0,0 +1,242 @@
+1234E9
+1234e9
+1234e-9
+-1234e9
+-1234e-9
+
+1234E9d
+1234e9D
+1234e-9d
+-1234e9D
+-1234e-9d
+
+1234E9F
+1234e9F
+1234e-9f
+-1234e9F
+-1234e-9f
+
+0x123ABCP1
+0x123ABCp1
+0x123ABCp-1
+-0x123ABCp1
+-0x123ABCp-1
+
+0x123ABCP1D
+0x123ABCp1D
+0x123ABCp-1D
+-0x123ABCp1d
+-0x123ABCp-1d
+
+0x123ABCP1f
+0x123ABCp1F
+0x123ABCp-1f
+-0x123ABCp1F
+-0x123ABCp-1F
+
+infinity
+-infinity
+INFINITY
+-INFINITY
+InFiNiTy
+-InFiNiTy
+
+infinityd
+-infinityD
+INFINITYD
+-INFINITYD
+InFiNiTyd
+-InFiNiTyd
+
+infinityf
+-infinityf
+INFINITYF
+-INFINITYF
+InFiNiTyF
+-InFiNiTyF
+
+nan
+NAN
+NaN
+nAn
+
+nanD
+NAND
+NaND
+nAnd
+
+nanf
+NANf
+NaNf
+nAnF
+
+1234.
+1234.e10
+1234.2
+1234.2e2
+1234.e-10
+-1234.
+-1234.e10
+-1234.2
+-1234.2e2
+-1234.e-10
+
+1234.d
+1234.e10D
+1234.2D
+1234.2e2D
+1234.e-10D
+-1234.D
+-1234.e10D
+-1234.2d
+-1234.2e2d
+-1234.e-10D
+
+1234.F
+1234.e10F
+1234.2f
+1234.2e2f
+1234.e-10F
+-1234.F
+-1234.e10F
+-1234.2f
+-1234.2e2f
+-1234.e-10F
+
+
+.2
+.2e2
+.2e-2
+-.2
+-.2e2
+-.2e-2
+
+
+.2D
+.2e2D
+.2e-2D
+-.2d
+-.2e2d
+-.2e-2d
+
+.2f
+.2e2F
+.2e-2f
+-.2F
+-.2e2F
+-.2e-2F
+
+0x12AB.p10
+0x12AB.p-10
+0x12AB.12ABp10
+0x12AB.12ABp-10
+-0x12AB.p10
+-0x12AB.p-10
+-0x12AB.12ABp10
+-0x12AB.12ABp-10
+
+0x12AB.p10D
+0x12AB.p-10D
+0x12AB.12ABp10d
+0x12AB.12ABp-10D
+-0x12AB.p10D
+-0x12AB.p-10d
+-0x12AB.12ABp10D
+-0x12AB.12ABp-10D
+
+0x12AB.p10f
+0x12AB.p-10f
+0x12AB.12ABp10f
+0x12AB.12ABp-10f
+-0x12AB.p10f
+-0x12AB.p-10f
+-0x12AB.12ABp10f
+-0x12AB.12ABp-10F
+
+0x.12ABp10
+0x.12ABp-10
+-0x.12ABp10
+-0x.12ABp-10
+0x.1234p10
+
+0x.12ABp10d
+0x.12ABp-10D
+-0x.12ABp10D
+-0x.12ABp-10D
+0x.1234p10D
+
+0x.12ABp10F
+0x.12ABp-10f
+-0x.12ABp10f
+-0x.12ABp-10f
+0x.1234p10f
+
+1234F
+1234f
+-1234F
+-1234f
+
+
+1234D
+1234d
+-1234D
+-1234d
+
+
+
+
+1234e
+1234eA
+1234eZ
+1234e-
+1234e-A
+1234e-Z
+-1234e
+-1234eA
+-1234eZ
+-1234e-
+-1234e-A
+-1234e-Z
+
+0x123ABCp
+0x123ABCpA
+0x123ABCpZ
+0x123ABCp-
+0x123ABCp-A
+0x123ABCp-Z
+-0x123ABCp
+-0x123ABCpA
+-0x123ABCpZ
+-0x123ABCp-
+-0x123ABCp-A
+-0x123ABCp-Z
+0x123ABCDE1
+
+infinitye
+-infinitye
+infinityp
+-infinityp
+
+nane
+NANp
+NaNE
+nAnP
+
+1234.e
+1234.1234e
+1234.e-
+-1234.e
+-1234.e-
+1234.p
+1234.p-
+-1234.p
+-1234.p-
+
+.1234e
+.e10
+.p10
+
+1234abcf
+1234abcF
+1234abcd
+1234abcD
\ No newline at end of file
diff --git a/smali/src/test/resources/LexerTest/FloatLiteralTest.tokens b/smali/src/test/resources/LexerTest/FloatLiteralTest.tokens
new file mode 100644
index 0000000..82c9918
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/FloatLiteralTest.tokens
@@ -0,0 +1,241 @@
+DOUBLE_LITERAL_OR_ID("1234E9")
+DOUBLE_LITERAL_OR_ID("1234e9")
+DOUBLE_LITERAL_OR_ID("1234e-9")
+DOUBLE_LITERAL_OR_ID("-1234e9")
+DOUBLE_LITERAL_OR_ID("-1234e-9")
+
+DOUBLE_LITERAL_OR_ID("1234E9d")
+DOUBLE_LITERAL_OR_ID("1234e9D")
+DOUBLE_LITERAL_OR_ID("1234e-9d")
+DOUBLE_LITERAL_OR_ID("-1234e9D")
+DOUBLE_LITERAL_OR_ID("-1234e-9d")
+
+FLOAT_LITERAL_OR_ID("1234E9F")
+FLOAT_LITERAL_OR_ID("1234e9F")
+FLOAT_LITERAL_OR_ID("1234e-9f")
+FLOAT_LITERAL_OR_ID("-1234e9F")
+FLOAT_LITERAL_OR_ID("-1234e-9f")
+
+DOUBLE_LITERAL_OR_ID("0x123ABCP1")
+DOUBLE_LITERAL_OR_ID("0x123ABCp1")
+DOUBLE_LITERAL_OR_ID("0x123ABCp-1")
+DOUBLE_LITERAL_OR_ID("-0x123ABCp1")
+DOUBLE_LITERAL_OR_ID("-0x123ABCp-1")
+
+DOUBLE_LITERAL_OR_ID("0x123ABCP1D")
+DOUBLE_LITERAL_OR_ID("0x123ABCp1D")
+DOUBLE_LITERAL_OR_ID("0x123ABCp-1D")
+DOUBLE_LITERAL_OR_ID("-0x123ABCp1d")
+DOUBLE_LITERAL_OR_ID("-0x123ABCp-1d")
+
+FLOAT_LITERAL_OR_ID("0x123ABCP1f")
+FLOAT_LITERAL_OR_ID("0x123ABCp1F")
+FLOAT_LITERAL_OR_ID("0x123ABCp-1f")
+FLOAT_LITERAL_OR_ID("-0x123ABCp1F")
+FLOAT_LITERAL_OR_ID("-0x123ABCp-1F")
+
+DOUBLE_LITERAL_OR_ID("infinity")
+DOUBLE_LITERAL_OR_ID("-infinity")
+DOUBLE_LITERAL_OR_ID("INFINITY")
+DOUBLE_LITERAL_OR_ID("-INFINITY")
+DOUBLE_LITERAL_OR_ID("InFiNiTy")
+DOUBLE_LITERAL_OR_ID("-InFiNiTy")
+
+DOUBLE_LITERAL_OR_ID("infinityd")
+DOUBLE_LITERAL_OR_ID("-infinityD")
+DOUBLE_LITERAL_OR_ID("INFINITYD")
+DOUBLE_LITERAL_OR_ID("-INFINITYD")
+DOUBLE_LITERAL_OR_ID("InFiNiTyd")
+DOUBLE_LITERAL_OR_ID("-InFiNiTyd")
+
+FLOAT_LITERAL_OR_ID("infinityf")
+FLOAT_LITERAL_OR_ID("-infinityf")
+FLOAT_LITERAL_OR_ID("INFINITYF")
+FLOAT_LITERAL_OR_ID("-INFINITYF")
+FLOAT_LITERAL_OR_ID("InFiNiTyF")
+FLOAT_LITERAL_OR_ID("-InFiNiTyF")
+
+DOUBLE_LITERAL_OR_ID("nan")
+DOUBLE_LITERAL_OR_ID("NAN")
+DOUBLE_LITERAL_OR_ID("NaN")
+DOUBLE_LITERAL_OR_ID("nAn")
+
+DOUBLE_LITERAL_OR_ID("nanD")
+DOUBLE_LITERAL_OR_ID("NAND")
+DOUBLE_LITERAL_OR_ID("NaND")
+DOUBLE_LITERAL_OR_ID("nAnd")
+
+FLOAT_LITERAL_OR_ID("nanf")
+FLOAT_LITERAL_OR_ID("NANf")
+FLOAT_LITERAL_OR_ID("NaNf")
+FLOAT_LITERAL_OR_ID("nAnF")
+
+DOUBLE_LITERAL("1234.")
+DOUBLE_LITERAL("1234.e10")
+DOUBLE_LITERAL("1234.2")
+DOUBLE_LITERAL("1234.2e2")
+DOUBLE_LITERAL("1234.e-10")
+DOUBLE_LITERAL("-1234.")
+DOUBLE_LITERAL("-1234.e10")
+DOUBLE_LITERAL("-1234.2")
+DOUBLE_LITERAL("-1234.2e2")
+DOUBLE_LITERAL("-1234.e-10")
+
+DOUBLE_LITERAL("1234.d")
+DOUBLE_LITERAL("1234.e10D")
+DOUBLE_LITERAL("1234.2D")
+DOUBLE_LITERAL("1234.2e2D")
+DOUBLE_LITERAL("1234.e-10D")
+DOUBLE_LITERAL("-1234.D")
+DOUBLE_LITERAL("-1234.e10D")
+DOUBLE_LITERAL("-1234.2d")
+DOUBLE_LITERAL("-1234.2e2d")
+DOUBLE_LITERAL("-1234.e-10D")
+
+FLOAT_LITERAL("1234.F")
+FLOAT_LITERAL("1234.e10F")
+FLOAT_LITERAL("1234.2f")
+FLOAT_LITERAL("1234.2e2f")
+FLOAT_LITERAL("1234.e-10F")
+FLOAT_LITERAL("-1234.F")
+FLOAT_LITERAL("-1234.e10F")
+FLOAT_LITERAL("-1234.2f")
+FLOAT_LITERAL("-1234.2e2f")
+FLOAT_LITERAL("-1234.e-10F")
+
+
+DOUBLE_LITERAL(".2")
+DOUBLE_LITERAL(".2e2")
+DOUBLE_LITERAL(".2e-2")
+DOUBLE_LITERAL("-.2")
+DOUBLE_LITERAL("-.2e2")
+DOUBLE_LITERAL("-.2e-2")
+
+
+DOUBLE_LITERAL(".2D")
+DOUBLE_LITERAL(".2e2D")
+DOUBLE_LITERAL(".2e-2D")
+DOUBLE_LITERAL("-.2d")
+DOUBLE_LITERAL("-.2e2d")
+DOUBLE_LITERAL("-.2e-2d")
+
+FLOAT_LITERAL(".2f")
+FLOAT_LITERAL(".2e2F")
+FLOAT_LITERAL(".2e-2f")
+FLOAT_LITERAL("-.2F")
+FLOAT_LITERAL("-.2e2F")
+FLOAT_LITERAL("-.2e-2F")
+
+DOUBLE_LITERAL("0x12AB.p10")
+DOUBLE_LITERAL("0x12AB.p-10")
+DOUBLE_LITERAL("0x12AB.12ABp10")
+DOUBLE_LITERAL("0x12AB.12ABp-10")
+DOUBLE_LITERAL("-0x12AB.p10")
+DOUBLE_LITERAL("-0x12AB.p-10")
+DOUBLE_LITERAL("-0x12AB.12ABp10")
+DOUBLE_LITERAL("-0x12AB.12ABp-10")
+
+DOUBLE_LITERAL("0x12AB.p10D")
+DOUBLE_LITERAL("0x12AB.p-10D")
+DOUBLE_LITERAL("0x12AB.12ABp10d")
+DOUBLE_LITERAL("0x12AB.12ABp-10D")
+DOUBLE_LITERAL("-0x12AB.p10D")
+DOUBLE_LITERAL("-0x12AB.p-10d")
+DOUBLE_LITERAL("-0x12AB.12ABp10D")
+DOUBLE_LITERAL("-0x12AB.12ABp-10D")
+
+FLOAT_LITERAL("0x12AB.p10f")
+FLOAT_LITERAL("0x12AB.p-10f")
+FLOAT_LITERAL("0x12AB.12ABp10f")
+FLOAT_LITERAL("0x12AB.12ABp-10f")
+FLOAT_LITERAL("-0x12AB.p10f")
+FLOAT_LITERAL("-0x12AB.p-10f")
+FLOAT_LITERAL("-0x12AB.12ABp10f")
+FLOAT_LITERAL("-0x12AB.12ABp-10F")
+
+DOUBLE_LITERAL("0x.12ABp10")
+DOUBLE_LITERAL("0x.12ABp-10")
+DOUBLE_LITERAL("-0x.12ABp10")
+DOUBLE_LITERAL("-0x.12ABp-10")
+DOUBLE_LITERAL("0x.1234p10")
+
+DOUBLE_LITERAL("0x.12ABp10d")
+DOUBLE_LITERAL("0x.12ABp-10D")
+DOUBLE_LITERAL("-0x.12ABp10D")
+DOUBLE_LITERAL("-0x.12ABp-10D")
+DOUBLE_LITERAL("0x.1234p10D")
+
+FLOAT_LITERAL("0x.12ABp10F")
+FLOAT_LITERAL("0x.12ABp-10f")
+FLOAT_LITERAL("-0x.12ABp10f")
+FLOAT_LITERAL("-0x.12ABp-10f")
+FLOAT_LITERAL("0x.1234p10f")
+
+FLOAT_LITERAL_OR_ID("1234F")
+FLOAT_LITERAL_OR_ID("1234f")
+FLOAT_LITERAL_OR_ID("-1234F")
+FLOAT_LITERAL_OR_ID("-1234f")
+
+DOUBLE_LITERAL_OR_ID("1234D")
+DOUBLE_LITERAL_OR_ID("1234d")
+DOUBLE_LITERAL_OR_ID("-1234D")
+DOUBLE_LITERAL_OR_ID("-1234d")
+
+
+
+
+SIMPLE_NAME("1234e")
+SIMPLE_NAME("1234eA")
+SIMPLE_NAME("1234eZ")
+SIMPLE_NAME("1234e-")
+SIMPLE_NAME("1234e-A")
+SIMPLE_NAME("1234e-Z")
+SIMPLE_NAME("-1234e")
+SIMPLE_NAME("-1234eA")
+SIMPLE_NAME("-1234eZ")
+SIMPLE_NAME("-1234e-")
+SIMPLE_NAME("-1234e-A")
+SIMPLE_NAME("-1234e-Z")
+
+SIMPLE_NAME("0x123ABCp")
+SIMPLE_NAME("0x123ABCpA")
+SIMPLE_NAME("0x123ABCpZ")
+SIMPLE_NAME("0x123ABCp-")
+SIMPLE_NAME("0x123ABCp-A")
+SIMPLE_NAME("0x123ABCp-Z")
+SIMPLE_NAME("-0x123ABCp")
+SIMPLE_NAME("-0x123ABCpA")
+SIMPLE_NAME("-0x123ABCpZ")
+SIMPLE_NAME("-0x123ABCp-")
+SIMPLE_NAME("-0x123ABCp-A")
+SIMPLE_NAME("-0x123ABCp-Z")
+POSITIVE_INTEGER_LITERAL("0x123ABCDE1")
+
+SIMPLE_NAME("infinitye")
+SIMPLE_NAME("-infinitye")
+SIMPLE_NAME("infinityp")
+SIMPLE_NAME("-infinityp")
+
+SIMPLE_NAME("nane")
+SIMPLE_NAME("NANp")
+SIMPLE_NAME("NaNE")
+SIMPLE_NAME("nAnP")
+
+DOUBLE_LITERAL("1234.") SIMPLE_NAME("e")
+DOUBLE_LITERAL("1234.1234") SIMPLE_NAME("e")
+DOUBLE_LITERAL("1234.") SIMPLE_NAME("e-")
+DOUBLE_LITERAL("-1234.") SIMPLE_NAME("e")
+DOUBLE_LITERAL("-1234.") SIMPLE_NAME("e-")
+DOUBLE_LITERAL("1234.") SIMPLE_NAME("p")
+DOUBLE_LITERAL("1234.") SIMPLE_NAME("p-")
+DOUBLE_LITERAL("-1234.") SIMPLE_NAME("p")
+DOUBLE_LITERAL("-1234.") SIMPLE_NAME("p-")
+
+DOUBLE_LITERAL(".1234") SIMPLE_NAME("e")
+INVALID_TOKEN(".e10")
+INVALID_TOKEN(".p10")
+
+SIMPLE_NAME("1234abcf")
+SIMPLE_NAME("1234abcF")
+SIMPLE_NAME("1234abcd")
+SIMPLE_NAME("1234abcD")
\ No newline at end of file
diff --git a/smali/src/test/resources/LexerTest/InstructionTest.smali b/smali/src/test/resources/LexerTest/InstructionTest.smali
new file mode 100644
index 0000000..a682926
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/InstructionTest.smali
@@ -0,0 +1,237 @@
+goto
+return-void
+nop
+return-void-barrier
+return-void-no-barrier
+const/4
+move-result
+move-result-wide
+move-result-object
+move-exception
+return
+return-wide
+move
+move-wide
+move-object
+array-length
+neg-int
+not-int
+neg-long
+not-long
+neg-float
+neg-double
+int-to-long
+int-to-float
+int-to-double
+long-to-int
+long-to-float
+long-to-double
+float-to-int
+float-to-long
+float-to-double
+double-to-int
+double-to-long
+add-int/2addr
+sub-int/2addr
+mul-int/2addr
+div-int/2addr
+rem-int/2addr
+and-int/2addr
+or-int/2addr
+xor-int/2addr
+shl-int/2addr
+shr-int/2addr
+ushr-int/2addr
+add-long/2addr
+sub-long/2addr
+mul-long/2addr
+div-long/2addr
+rem-long/2addr
+and-long/2addr
+or-long/2addr
+xor-long/2addr
+shl-long/2addr
+shr-long/2addr
+ushr-long/2addr
+add-float/2addr
+sub-float/2addr
+mul-float/2addr
+div-float/2addr
+rem-float/2addr
+add-double/2addr
+throw-verification-error
+goto/16
+sget
+sget-wide
+sget-object
+sget-boolean
+sget-byte
+sget-char
+sget-short
+sput
+sput-wide
+sput-object
+sput-boolean
+sput-byte
+sput-char
+sput-short
+sget-volatile
+sget-wide-volatile
+sget-object-volatile
+sput-volatile
+sput-wide-volatile
+sput-object-volatile
+const-string
+check-cast
+new-instance
+const-class
+const-method-handle
+const-method-type
+const/high16
+const-wide/high16
+const/16
+const-wide/16
+if-eqz
+if-nez
+if-ltz
+if-gez
+if-gtz
+if-lez
+add-int/lit8
+rsub-int/lit8
+mul-int/lit8
+div-int/lit8
+rem-int/lit8
+and-int/lit8
+iget
+iget-wide
+iget-object
+iget-boolean
+iget-byte
+iget-char
+iget-short
+iput
+iput-wide
+iput-object
+iput-boolean
+iput-byte
+iput-char
+iput-short
+iget-volatile
+iget-wide-volatile
+iget-object-volatile
+iput-volatile
+iput-wide-volatile
+iput-object-volatile
+instance-of
+new-array
+iget-quick
+iget-wide-quick
+iget-object-quick
+iput-quick
+iput-wide-quick
+iput-object-quick
+iput-boolean-quick
+iput-byte-quick
+iput-char-quick
+iput-short-quick
+rsub-int
+add-int/lit16
+mul-int/lit16
+div-int/lit16
+rem-int/lit16
+and-int/lit16
+or-int/lit16
+if-eq
+if-ne
+if-lt
+if-ge
+if-gt
+if-le
+move/from16
+move-wide/from16
+move-object/from16
+cmpl-float
+cmpg-float
+cmpl-double
+cmpg-double
+cmp-long
+aget
+aget-wide
+aget-object
+aget-boolean
+aget-byte
+aget-char
+aget-short
+aput
+aput-wide
+aput-object
+aput-boolean
+aput-byte
+aput-char
+aput-short
+add-int
+sub-int
+mul-int
+div-int
+rem-int
+and-int
+or-int
+xor-int
+shl-int
+shr-int
+ushr-int
+add-long
+sub-long
+mul-long
+div-long
+rem-long
+and-long
+or-long
+xor-long
+shl-long
+shr-long
+ushr-long
+add-float
+sub-float
+mul-float
+div-float
+rem-float
+add-double
+sub-double
+mul-double
+div-double
+goto/32
+const-string/jumbo
+const
+const-wide/32
+fill-array-data
+packed-switch
+sparse-switch
+move/16
+move-wide/16
+move-object/16
+invoke-custom
+invoke-virtual
+invoke-super
+invoke-direct
+invoke-static
+invoke-interface
+filled-new-array
+invoke-direct-empty
+invoke-object-init/range
+throw-verification-error
+execute-inline
+invoke-virtual-quick
+invoke-super-quick
+invoke-custom/range
+invoke-virtual/range
+invoke-super/range
+invoke-direct/range
+invoke-static/range
+invoke-interface/range
+filled-new-array/range
+execute-inline/range
+invoke-virtual-quick/range
+invoke-super-quick/range
+const-wide
diff --git a/smali/src/test/resources/LexerTest/InstructionTest.tokens b/smali/src/test/resources/LexerTest/InstructionTest.tokens
new file mode 100644
index 0000000..c616639
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/InstructionTest.tokens
@@ -0,0 +1,237 @@
+INSTRUCTION_FORMAT10t("goto")
+INSTRUCTION_FORMAT10x("return-void")
+INSTRUCTION_FORMAT10x("nop")
+INSTRUCTION_FORMAT10x_ODEX("return-void-barrier")
+INSTRUCTION_FORMAT10x_ODEX("return-void-no-barrier")
+INSTRUCTION_FORMAT11n("const/4")
+INSTRUCTION_FORMAT11x("move-result")
+INSTRUCTION_FORMAT11x("move-result-wide")
+INSTRUCTION_FORMAT11x("move-result-object")
+INSTRUCTION_FORMAT11x("move-exception")
+INSTRUCTION_FORMAT11x("return")
+INSTRUCTION_FORMAT11x("return-wide")
+INSTRUCTION_FORMAT12x_OR_ID("move")
+INSTRUCTION_FORMAT12x_OR_ID("move-wide")
+INSTRUCTION_FORMAT12x_OR_ID("move-object")
+INSTRUCTION_FORMAT12x_OR_ID("array-length")
+INSTRUCTION_FORMAT12x_OR_ID("neg-int")
+INSTRUCTION_FORMAT12x_OR_ID("not-int")
+INSTRUCTION_FORMAT12x_OR_ID("neg-long")
+INSTRUCTION_FORMAT12x_OR_ID("not-long")
+INSTRUCTION_FORMAT12x_OR_ID("neg-float")
+INSTRUCTION_FORMAT12x_OR_ID("neg-double")
+INSTRUCTION_FORMAT12x_OR_ID("int-to-long")
+INSTRUCTION_FORMAT12x_OR_ID("int-to-float")
+INSTRUCTION_FORMAT12x_OR_ID("int-to-double")
+INSTRUCTION_FORMAT12x_OR_ID("long-to-int")
+INSTRUCTION_FORMAT12x_OR_ID("long-to-float")
+INSTRUCTION_FORMAT12x_OR_ID("long-to-double")
+INSTRUCTION_FORMAT12x_OR_ID("float-to-int")
+INSTRUCTION_FORMAT12x_OR_ID("float-to-long")
+INSTRUCTION_FORMAT12x_OR_ID("float-to-double")
+INSTRUCTION_FORMAT12x_OR_ID("double-to-int")
+INSTRUCTION_FORMAT12x_OR_ID("double-to-long")
+INSTRUCTION_FORMAT12x("add-int/2addr")
+INSTRUCTION_FORMAT12x("sub-int/2addr")
+INSTRUCTION_FORMAT12x("mul-int/2addr")
+INSTRUCTION_FORMAT12x("div-int/2addr")
+INSTRUCTION_FORMAT12x("rem-int/2addr")
+INSTRUCTION_FORMAT12x("and-int/2addr")
+INSTRUCTION_FORMAT12x("or-int/2addr")
+INSTRUCTION_FORMAT12x("xor-int/2addr")
+INSTRUCTION_FORMAT12x("shl-int/2addr")
+INSTRUCTION_FORMAT12x("shr-int/2addr")
+INSTRUCTION_FORMAT12x("ushr-int/2addr")
+INSTRUCTION_FORMAT12x("add-long/2addr")
+INSTRUCTION_FORMAT12x("sub-long/2addr")
+INSTRUCTION_FORMAT12x("mul-long/2addr")
+INSTRUCTION_FORMAT12x("div-long/2addr")
+INSTRUCTION_FORMAT12x("rem-long/2addr")
+INSTRUCTION_FORMAT12x("and-long/2addr")
+INSTRUCTION_FORMAT12x("or-long/2addr")
+INSTRUCTION_FORMAT12x("xor-long/2addr")
+INSTRUCTION_FORMAT12x("shl-long/2addr")
+INSTRUCTION_FORMAT12x("shr-long/2addr")
+INSTRUCTION_FORMAT12x("ushr-long/2addr")
+INSTRUCTION_FORMAT12x("add-float/2addr")
+INSTRUCTION_FORMAT12x("sub-float/2addr")
+INSTRUCTION_FORMAT12x("mul-float/2addr")
+INSTRUCTION_FORMAT12x("div-float/2addr")
+INSTRUCTION_FORMAT12x("rem-float/2addr")
+INSTRUCTION_FORMAT12x("add-double/2addr")
+INSTRUCTION_FORMAT20bc("throw-verification-error")
+INSTRUCTION_FORMAT20t("goto/16")
+INSTRUCTION_FORMAT21c_FIELD("sget")
+INSTRUCTION_FORMAT21c_FIELD("sget-wide")
+INSTRUCTION_FORMAT21c_FIELD("sget-object")
+INSTRUCTION_FORMAT21c_FIELD("sget-boolean")
+INSTRUCTION_FORMAT21c_FIELD("sget-byte")
+INSTRUCTION_FORMAT21c_FIELD("sget-char")
+INSTRUCTION_FORMAT21c_FIELD("sget-short")
+INSTRUCTION_FORMAT21c_FIELD("sput")
+INSTRUCTION_FORMAT21c_FIELD("sput-wide")
+INSTRUCTION_FORMAT21c_FIELD("sput-object")
+INSTRUCTION_FORMAT21c_FIELD("sput-boolean")
+INSTRUCTION_FORMAT21c_FIELD("sput-byte")
+INSTRUCTION_FORMAT21c_FIELD("sput-char")
+INSTRUCTION_FORMAT21c_FIELD("sput-short")
+INSTRUCTION_FORMAT21c_FIELD_ODEX("sget-volatile")
+INSTRUCTION_FORMAT21c_FIELD_ODEX("sget-wide-volatile")
+INSTRUCTION_FORMAT21c_FIELD_ODEX("sget-object-volatile")
+INSTRUCTION_FORMAT21c_FIELD_ODEX("sput-volatile")
+INSTRUCTION_FORMAT21c_FIELD_ODEX("sput-wide-volatile")
+INSTRUCTION_FORMAT21c_FIELD_ODEX("sput-object-volatile")
+INSTRUCTION_FORMAT21c_STRING("const-string")
+INSTRUCTION_FORMAT21c_TYPE("check-cast")
+INSTRUCTION_FORMAT21c_TYPE("new-instance")
+INSTRUCTION_FORMAT21c_TYPE("const-class")
+INSTRUCTION_FORMAT21c_METHOD_HANDLE("const-method-handle")
+INSTRUCTION_FORMAT21c_METHOD_TYPE("const-method-type")
+INSTRUCTION_FORMAT21ih("const/high16")
+INSTRUCTION_FORMAT21lh("const-wide/high16")
+INSTRUCTION_FORMAT21s("const/16")
+INSTRUCTION_FORMAT21s("const-wide/16")
+INSTRUCTION_FORMAT21t("if-eqz")
+INSTRUCTION_FORMAT21t("if-nez")
+INSTRUCTION_FORMAT21t("if-ltz")
+INSTRUCTION_FORMAT21t("if-gez")
+INSTRUCTION_FORMAT21t("if-gtz")
+INSTRUCTION_FORMAT21t("if-lez")
+INSTRUCTION_FORMAT22b("add-int/lit8")
+INSTRUCTION_FORMAT22b("rsub-int/lit8")
+INSTRUCTION_FORMAT22b("mul-int/lit8")
+INSTRUCTION_FORMAT22b("div-int/lit8")
+INSTRUCTION_FORMAT22b("rem-int/lit8")
+INSTRUCTION_FORMAT22b("and-int/lit8")
+INSTRUCTION_FORMAT22c_FIELD("iget")
+INSTRUCTION_FORMAT22c_FIELD("iget-wide")
+INSTRUCTION_FORMAT22c_FIELD("iget-object")
+INSTRUCTION_FORMAT22c_FIELD("iget-boolean")
+INSTRUCTION_FORMAT22c_FIELD("iget-byte")
+INSTRUCTION_FORMAT22c_FIELD("iget-char")
+INSTRUCTION_FORMAT22c_FIELD("iget-short")
+INSTRUCTION_FORMAT22c_FIELD("iput")
+INSTRUCTION_FORMAT22c_FIELD("iput-wide")
+INSTRUCTION_FORMAT22c_FIELD("iput-object")
+INSTRUCTION_FORMAT22c_FIELD("iput-boolean")
+INSTRUCTION_FORMAT22c_FIELD("iput-byte")
+INSTRUCTION_FORMAT22c_FIELD("iput-char")
+INSTRUCTION_FORMAT22c_FIELD("iput-short")
+INSTRUCTION_FORMAT22c_FIELD_ODEX("iget-volatile")
+INSTRUCTION_FORMAT22c_FIELD_ODEX("iget-wide-volatile")
+INSTRUCTION_FORMAT22c_FIELD_ODEX("iget-object-volatile")
+INSTRUCTION_FORMAT22c_FIELD_ODEX("iput-volatile")
+INSTRUCTION_FORMAT22c_FIELD_ODEX("iput-wide-volatile")
+INSTRUCTION_FORMAT22c_FIELD_ODEX("iput-object-volatile")
+INSTRUCTION_FORMAT22c_TYPE("instance-of")
+INSTRUCTION_FORMAT22c_TYPE("new-array")
+INSTRUCTION_FORMAT22cs_FIELD("iget-quick")
+INSTRUCTION_FORMAT22cs_FIELD("iget-wide-quick")
+INSTRUCTION_FORMAT22cs_FIELD("iget-object-quick")
+INSTRUCTION_FORMAT22cs_FIELD("iput-quick")
+INSTRUCTION_FORMAT22cs_FIELD("iput-wide-quick")
+INSTRUCTION_FORMAT22cs_FIELD("iput-object-quick")
+INSTRUCTION_FORMAT22cs_FIELD("iput-boolean-quick")
+INSTRUCTION_FORMAT22cs_FIELD("iput-byte-quick")
+INSTRUCTION_FORMAT22cs_FIELD("iput-char-quick")
+INSTRUCTION_FORMAT22cs_FIELD("iput-short-quick")
+INSTRUCTION_FORMAT22s_OR_ID("rsub-int")
+INSTRUCTION_FORMAT22s("add-int/lit16")
+INSTRUCTION_FORMAT22s("mul-int/lit16")
+INSTRUCTION_FORMAT22s("div-int/lit16")
+INSTRUCTION_FORMAT22s("rem-int/lit16")
+INSTRUCTION_FORMAT22s("and-int/lit16")
+INSTRUCTION_FORMAT22s("or-int/lit16")
+INSTRUCTION_FORMAT22t("if-eq")
+INSTRUCTION_FORMAT22t("if-ne")
+INSTRUCTION_FORMAT22t("if-lt")
+INSTRUCTION_FORMAT22t("if-ge")
+INSTRUCTION_FORMAT22t("if-gt")
+INSTRUCTION_FORMAT22t("if-le")
+INSTRUCTION_FORMAT22x("move/from16")
+INSTRUCTION_FORMAT22x("move-wide/from16")
+INSTRUCTION_FORMAT22x("move-object/from16")
+INSTRUCTION_FORMAT23x("cmpl-float")
+INSTRUCTION_FORMAT23x("cmpg-float")
+INSTRUCTION_FORMAT23x("cmpl-double")
+INSTRUCTION_FORMAT23x("cmpg-double")
+INSTRUCTION_FORMAT23x("cmp-long")
+INSTRUCTION_FORMAT23x("aget")
+INSTRUCTION_FORMAT23x("aget-wide")
+INSTRUCTION_FORMAT23x("aget-object")
+INSTRUCTION_FORMAT23x("aget-boolean")
+INSTRUCTION_FORMAT23x("aget-byte")
+INSTRUCTION_FORMAT23x("aget-char")
+INSTRUCTION_FORMAT23x("aget-short")
+INSTRUCTION_FORMAT23x("aput")
+INSTRUCTION_FORMAT23x("aput-wide")
+INSTRUCTION_FORMAT23x("aput-object")
+INSTRUCTION_FORMAT23x("aput-boolean")
+INSTRUCTION_FORMAT23x("aput-byte")
+INSTRUCTION_FORMAT23x("aput-char")
+INSTRUCTION_FORMAT23x("aput-short")
+INSTRUCTION_FORMAT23x("add-int")
+INSTRUCTION_FORMAT23x("sub-int")
+INSTRUCTION_FORMAT23x("mul-int")
+INSTRUCTION_FORMAT23x("div-int")
+INSTRUCTION_FORMAT23x("rem-int")
+INSTRUCTION_FORMAT23x("and-int")
+INSTRUCTION_FORMAT23x("or-int")
+INSTRUCTION_FORMAT23x("xor-int")
+INSTRUCTION_FORMAT23x("shl-int")
+INSTRUCTION_FORMAT23x("shr-int")
+INSTRUCTION_FORMAT23x("ushr-int")
+INSTRUCTION_FORMAT23x("add-long")
+INSTRUCTION_FORMAT23x("sub-long")
+INSTRUCTION_FORMAT23x("mul-long")
+INSTRUCTION_FORMAT23x("div-long")
+INSTRUCTION_FORMAT23x("rem-long")
+INSTRUCTION_FORMAT23x("and-long")
+INSTRUCTION_FORMAT23x("or-long")
+INSTRUCTION_FORMAT23x("xor-long")
+INSTRUCTION_FORMAT23x("shl-long")
+INSTRUCTION_FORMAT23x("shr-long")
+INSTRUCTION_FORMAT23x("ushr-long")
+INSTRUCTION_FORMAT23x("add-float")
+INSTRUCTION_FORMAT23x("sub-float")
+INSTRUCTION_FORMAT23x("mul-float")
+INSTRUCTION_FORMAT23x("div-float")
+INSTRUCTION_FORMAT23x("rem-float")
+INSTRUCTION_FORMAT23x("add-double")
+INSTRUCTION_FORMAT23x("sub-double")
+INSTRUCTION_FORMAT23x("mul-double")
+INSTRUCTION_FORMAT23x("div-double")
+INSTRUCTION_FORMAT30t("goto/32")
+INSTRUCTION_FORMAT31c("const-string/jumbo")
+INSTRUCTION_FORMAT31i_OR_ID("const")
+INSTRUCTION_FORMAT31i("const-wide/32")
+INSTRUCTION_FORMAT31t("fill-array-data")
+INSTRUCTION_FORMAT31t("packed-switch")
+INSTRUCTION_FORMAT31t("sparse-switch")
+INSTRUCTION_FORMAT32x("move/16")
+INSTRUCTION_FORMAT32x("move-wide/16")
+INSTRUCTION_FORMAT32x("move-object/16")
+INSTRUCTION_FORMAT35c_CALL_SITE("invoke-custom")
+INSTRUCTION_FORMAT35c_METHOD("invoke-virtual")
+INSTRUCTION_FORMAT35c_METHOD("invoke-super")
+INSTRUCTION_FORMAT35c_METHOD_OR_METHOD_HANDLE_TYPE("invoke-direct")
+INSTRUCTION_FORMAT35c_METHOD_OR_METHOD_HANDLE_TYPE("invoke-static")
+INSTRUCTION_FORMAT35c_METHOD_OR_METHOD_HANDLE_TYPE("invoke-interface")
+INSTRUCTION_FORMAT35c_TYPE("filled-new-array")
+INSTRUCTION_FORMAT35c_METHOD_ODEX("invoke-direct-empty")
+INSTRUCTION_FORMAT3rc_METHOD_ODEX("invoke-object-init/range")
+INSTRUCTION_FORMAT20bc("throw-verification-error")
+INSTRUCTION_FORMAT35mi_METHOD("execute-inline")
+INSTRUCTION_FORMAT35ms_METHOD("invoke-virtual-quick")
+INSTRUCTION_FORMAT35ms_METHOD("invoke-super-quick")
+INSTRUCTION_FORMAT3rc_CALL_SITE("invoke-custom/range")
+INSTRUCTION_FORMAT3rc_METHOD("invoke-virtual/range")
+INSTRUCTION_FORMAT3rc_METHOD("invoke-super/range")
+INSTRUCTION_FORMAT3rc_METHOD("invoke-direct/range")
+INSTRUCTION_FORMAT3rc_METHOD("invoke-static/range")
+INSTRUCTION_FORMAT3rc_METHOD("invoke-interface/range")
+INSTRUCTION_FORMAT3rc_TYPE("filled-new-array/range")
+INSTRUCTION_FORMAT3rmi_METHOD("execute-inline/range")
+INSTRUCTION_FORMAT3rms_METHOD("invoke-virtual-quick/range")
+INSTRUCTION_FORMAT3rms_METHOD("invoke-super-quick/range")
+INSTRUCTION_FORMAT51l("const-wide")
\ No newline at end of file
diff --git a/smali/src/test/resources/LexerTest/IntegerLiteralTest.smali b/smali/src/test/resources/LexerTest/IntegerLiteralTest.smali
new file mode 100644
index 0000000..68eae04
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/IntegerLiteralTest.smali
@@ -0,0 +1,45 @@
+0x0
+0x00
+0x1
+0x12345678
+0x7fffffff
+0x80000000
+0xFFFFFFFF
+-0x00
+-0x01
+-0x12345678
+-0x80000000
+-0x1FFFFFFF
+-0x80000001
+-0xFFFFFFFF
+-0x100000000
+0
+1
+1234567890
+2147483647
+2147483648
+4294967295
+-0
+-1
+-1234567890
+-2147483647
+-2147483648
+-2147483649
+-4294967295
+4294967295
+4294967300
+8589934592
+00
+01
+012345670123
+017777777777
+020000000000
+037777777777
+-00
+-01
+-012345670123
+-017777777777
+-020000000000
+-020000000001
+-037777777777
+0400000000000
\ No newline at end of file
diff --git a/smali/src/test/resources/LexerTest/IntegerLiteralTest.tokens b/smali/src/test/resources/LexerTest/IntegerLiteralTest.tokens
new file mode 100644
index 0000000..a3610ab
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/IntegerLiteralTest.tokens
@@ -0,0 +1,45 @@
+POSITIVE_INTEGER_LITERAL("0x0")
+POSITIVE_INTEGER_LITERAL("0x00")
+POSITIVE_INTEGER_LITERAL("0x1")
+POSITIVE_INTEGER_LITERAL("0x12345678")
+POSITIVE_INTEGER_LITERAL("0x7fffffff")
+POSITIVE_INTEGER_LITERAL("0x80000000")
+POSITIVE_INTEGER_LITERAL("0xFFFFFFFF")
+NEGATIVE_INTEGER_LITERAL("-0x00")
+NEGATIVE_INTEGER_LITERAL("-0x01")
+NEGATIVE_INTEGER_LITERAL("-0x12345678")
+NEGATIVE_INTEGER_LITERAL("-0x80000000")
+NEGATIVE_INTEGER_LITERAL("-0x1FFFFFFF")
+NEGATIVE_INTEGER_LITERAL("-0x80000001")
+NEGATIVE_INTEGER_LITERAL("-0xFFFFFFFF")
+NEGATIVE_INTEGER_LITERAL("-0x100000000")
+POSITIVE_INTEGER_LITERAL("0")
+POSITIVE_INTEGER_LITERAL("1")
+POSITIVE_INTEGER_LITERAL("1234567890")
+POSITIVE_INTEGER_LITERAL("2147483647")
+POSITIVE_INTEGER_LITERAL("2147483648")
+POSITIVE_INTEGER_LITERAL("4294967295")
+NEGATIVE_INTEGER_LITERAL("-0")
+NEGATIVE_INTEGER_LITERAL("-1")
+NEGATIVE_INTEGER_LITERAL("-1234567890")
+NEGATIVE_INTEGER_LITERAL("-2147483647")
+NEGATIVE_INTEGER_LITERAL("-2147483648")
+NEGATIVE_INTEGER_LITERAL("-2147483649")
+NEGATIVE_INTEGER_LITERAL("-4294967295")
+POSITIVE_INTEGER_LITERAL("4294967295")
+POSITIVE_INTEGER_LITERAL("4294967300")
+POSITIVE_INTEGER_LITERAL("8589934592")
+POSITIVE_INTEGER_LITERAL("00")
+POSITIVE_INTEGER_LITERAL("01")
+POSITIVE_INTEGER_LITERAL("012345670123")
+POSITIVE_INTEGER_LITERAL("017777777777")
+POSITIVE_INTEGER_LITERAL("020000000000")
+POSITIVE_INTEGER_LITERAL("037777777777")
+NEGATIVE_INTEGER_LITERAL("-00")
+NEGATIVE_INTEGER_LITERAL("-01")
+NEGATIVE_INTEGER_LITERAL("-012345670123")
+NEGATIVE_INTEGER_LITERAL("-017777777777")
+NEGATIVE_INTEGER_LITERAL("-020000000000")
+NEGATIVE_INTEGER_LITERAL("-020000000001")
+NEGATIVE_INTEGER_LITERAL("-037777777777")
+POSITIVE_INTEGER_LITERAL("0400000000000")
\ No newline at end of file
diff --git a/smali/src/test/resources/LexerTest/LongLiteralTest.smali b/smali/src/test/resources/LexerTest/LongLiteralTest.smali
new file mode 100644
index 0000000..0cde854
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/LongLiteralTest.smali
@@ -0,0 +1,48 @@
+0x0L
+0x00L
+0x1L
+0x1234567890123456L
+0x7fffffffffffffffL
+0x8000000000000000L
+0xFFFFFFFFFFFFFFFFL
+-0x00L
+-0x01L
+-0x1234567890123456L
+-0x8000000000000000L
+-0x1fffffffffffffffL
+-0x8000000000000001
+-0xFFFFFFFFFFFFFFFF
+0x10000000000000000
+0L
+1
+1234567890123456789
+1234567890123456789L
+9223372036854775807
+9223372036854775808
+18446744073709551615L
+-0
+-1
+-1234567890123456789
+-1234567890123456789L
+-9223372036854775807
+-9223372036854775808
+-9223372036854775809
+-18446744073709551616
+18446744073709551617
+18446744073709551700
+00
+01
+0123456701234567012345
+0123456701234567012345L
+0777777777777777777777
+0100000000000000000000
+0177777777777777777777
+-00
+-01
+-0123456701234567012345
+-0123456701234567012345L
+-0777777777777777777777
+-0100000000000000000000
+-0100000000000000000001
+-0177777777777777777777
+-02000000000000000000000
\ No newline at end of file
diff --git a/smali/src/test/resources/LexerTest/LongLiteralTest.tokens b/smali/src/test/resources/LexerTest/LongLiteralTest.tokens
new file mode 100644
index 0000000..f67deb3
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/LongLiteralTest.tokens
@@ -0,0 +1,48 @@
+LONG_LITERAL("0x0L")
+LONG_LITERAL("0x00L")
+LONG_LITERAL("0x1L")
+LONG_LITERAL("0x1234567890123456L")
+LONG_LITERAL("0x7fffffffffffffffL")
+LONG_LITERAL("0x8000000000000000L")
+LONG_LITERAL("0xFFFFFFFFFFFFFFFFL")
+LONG_LITERAL("-0x00L")
+LONG_LITERAL("-0x01L")
+LONG_LITERAL("-0x1234567890123456L")
+LONG_LITERAL("-0x8000000000000000L")
+LONG_LITERAL("-0x1fffffffffffffffL")
+NEGATIVE_INTEGER_LITERAL("-0x8000000000000001")
+NEGATIVE_INTEGER_LITERAL("-0xFFFFFFFFFFFFFFFF")
+POSITIVE_INTEGER_LITERAL("0x10000000000000000")
+LONG_LITERAL("0L")
+POSITIVE_INTEGER_LITERAL("1")
+POSITIVE_INTEGER_LITERAL("1234567890123456789")
+LONG_LITERAL("1234567890123456789L")
+POSITIVE_INTEGER_LITERAL("9223372036854775807")
+POSITIVE_INTEGER_LITERAL("9223372036854775808")
+LONG_LITERAL("18446744073709551615L")
+NEGATIVE_INTEGER_LITERAL("-0")
+NEGATIVE_INTEGER_LITERAL("-1")
+NEGATIVE_INTEGER_LITERAL("-1234567890123456789")
+LONG_LITERAL("-1234567890123456789L")
+NEGATIVE_INTEGER_LITERAL("-9223372036854775807")
+NEGATIVE_INTEGER_LITERAL("-9223372036854775808")
+NEGATIVE_INTEGER_LITERAL("-9223372036854775809")
+NEGATIVE_INTEGER_LITERAL("-18446744073709551616")
+POSITIVE_INTEGER_LITERAL("18446744073709551617")
+POSITIVE_INTEGER_LITERAL("18446744073709551700")
+POSITIVE_INTEGER_LITERAL("00")
+POSITIVE_INTEGER_LITERAL("01")
+POSITIVE_INTEGER_LITERAL("0123456701234567012345")
+LONG_LITERAL("0123456701234567012345L")
+POSITIVE_INTEGER_LITERAL("0777777777777777777777")
+POSITIVE_INTEGER_LITERAL("0100000000000000000000")
+POSITIVE_INTEGER_LITERAL("0177777777777777777777")
+NEGATIVE_INTEGER_LITERAL("-00")
+NEGATIVE_INTEGER_LITERAL("-01")
+NEGATIVE_INTEGER_LITERAL("-0123456701234567012345")
+LONG_LITERAL("-0123456701234567012345L")
+NEGATIVE_INTEGER_LITERAL("-0777777777777777777777")
+NEGATIVE_INTEGER_LITERAL("-0100000000000000000000")
+NEGATIVE_INTEGER_LITERAL("-0100000000000000000001")
+NEGATIVE_INTEGER_LITERAL("-0177777777777777777777")
+NEGATIVE_INTEGER_LITERAL("-02000000000000000000000")
\ No newline at end of file
diff --git a/smali/src/test/resources/LexerTest/MiscTest.smali b/smali/src/test/resources/LexerTest/MiscTest.smali
new file mode 100644
index 0000000..0b6edb4
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/MiscTest.smali
@@ -0,0 +1,96 @@
+true
+false
+null
+p0
+p90
+pab
+v0
+v90
+vab
+
+truefalse
+
+build
+runtime
+system
+
+public
+private
+protected
+static
+final
+synchronized
+bridge
+varargs
+native
+abstract
+strictfp
+synthetic
+constructor
+declared-synchronized
+interface
+enum
+annotation
+volatile
+transient
+
+whitelist
+greylist
+blacklist
+greylist-max-o
+greylist-max-p
+greylist-max-q
+core-platform-api
+
+no-error
+generic-error
+no-such-class
+no-such-field
+no-such-method
+illegal-class-access
+illegal-field-access
+illegal-method-access
+class-change-error
+instantiation-error
+
+invoke-static
+invoke-instance
+invoke-constructor
+invoke-direct
+invoke-interface
+static-put
+static-get
+instance-put
+instance-get
+
+inline@0xABCD
+inline@0x0123
+inline@0x0123ABCD
+
+vtable@0xABCD
+vtable@0x0123
+vtable@0x0123ABCD
+
+field@0xABCD
+field@0x0123
+field@0x0123ABCD
+
+inline@
+inline@zzz
+inline@abcd
+vtable@
+vtable@zzz
+vtable@abcd
+field@
+field@zzz
+field@abcd
+
++0
++10
++01
++0777
++0x1234ABC
++1234
+
++08
++
\ No newline at end of file
diff --git a/smali/src/test/resources/LexerTest/MiscTest.tokens b/smali/src/test/resources/LexerTest/MiscTest.tokens
new file mode 100644
index 0000000..319c01a
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/MiscTest.tokens
@@ -0,0 +1,96 @@
+BOOL_LITERAL("true")
+BOOL_LITERAL("false")
+NULL_LITERAL("null")
+REGISTER("p0")
+REGISTER("p90")
+SIMPLE_NAME("pab")
+REGISTER("v0")
+REGISTER("v90")
+SIMPLE_NAME("vab")
+
+SIMPLE_NAME("truefalse")
+
+ANNOTATION_VISIBILITY("build")
+ANNOTATION_VISIBILITY("runtime")
+ANNOTATION_VISIBILITY("system")
+
+ACCESS_SPEC("public")
+ACCESS_SPEC("private")
+ACCESS_SPEC("protected")
+ACCESS_SPEC("static")
+ACCESS_SPEC("final")
+ACCESS_SPEC("synchronized")
+ACCESS_SPEC("bridge")
+ACCESS_SPEC("varargs")
+ACCESS_SPEC("native")
+ACCESS_SPEC("abstract")
+ACCESS_SPEC("strictfp")
+ACCESS_SPEC("synthetic")
+ACCESS_SPEC("constructor")
+ACCESS_SPEC("declared-synchronized")
+ACCESS_SPEC("interface")
+ACCESS_SPEC("enum")
+ACCESS_SPEC("annotation")
+ACCESS_SPEC("volatile")
+ACCESS_SPEC("transient")
+
+HIDDENAPI_RESTRICTION("whitelist")
+HIDDENAPI_RESTRICTION("greylist")
+HIDDENAPI_RESTRICTION("blacklist")
+HIDDENAPI_RESTRICTION("greylist-max-o")
+HIDDENAPI_RESTRICTION("greylist-max-p")
+HIDDENAPI_RESTRICTION("greylist-max-q")
+HIDDENAPI_RESTRICTION("core-platform-api")
+
+VERIFICATION_ERROR_TYPE("no-error")
+VERIFICATION_ERROR_TYPE("generic-error")
+VERIFICATION_ERROR_TYPE("no-such-class")
+VERIFICATION_ERROR_TYPE("no-such-field")
+VERIFICATION_ERROR_TYPE("no-such-method")
+VERIFICATION_ERROR_TYPE("illegal-class-access")
+VERIFICATION_ERROR_TYPE("illegal-field-access")
+VERIFICATION_ERROR_TYPE("illegal-method-access")
+VERIFICATION_ERROR_TYPE("class-change-error")
+VERIFICATION_ERROR_TYPE("instantiation-error")
+
+INSTRUCTION_FORMAT35c_METHOD_OR_METHOD_HANDLE_TYPE("invoke-static")
+METHOD_HANDLE_TYPE_METHOD("invoke-instance")
+METHOD_HANDLE_TYPE_METHOD("invoke-constructor")
+INSTRUCTION_FORMAT35c_METHOD_OR_METHOD_HANDLE_TYPE("invoke-direct")
+INSTRUCTION_FORMAT35c_METHOD_OR_METHOD_HANDLE_TYPE("invoke-interface")
+METHOD_HANDLE_TYPE_FIELD("static-put")
+METHOD_HANDLE_TYPE_FIELD("static-get")
+METHOD_HANDLE_TYPE_FIELD("instance-put")
+METHOD_HANDLE_TYPE_FIELD("instance-get")
+
+INLINE_INDEX("inline@0xABCD")
+INLINE_INDEX("inline@0x0123")
+INLINE_INDEX("inline@0x0123ABCD")
+
+VTABLE_INDEX("vtable@0xABCD")
+VTABLE_INDEX("vtable@0x0123")
+VTABLE_INDEX("vtable@0x0123ABCD")
+
+FIELD_OFFSET("field@0xABCD")
+FIELD_OFFSET("field@0x0123")
+FIELD_OFFSET("field@0x0123ABCD")
+
+SIMPLE_NAME("inline") AT("@")
+SIMPLE_NAME("inline") AT("@") SIMPLE_NAME("zzz")
+SIMPLE_NAME("inline") AT("@") SIMPLE_NAME("abcd")
+SIMPLE_NAME("vtable") AT("@")
+SIMPLE_NAME("vtable") AT("@") SIMPLE_NAME("zzz")
+SIMPLE_NAME("vtable") AT("@") SIMPLE_NAME("abcd")
+SIMPLE_NAME("field") AT("@")
+SIMPLE_NAME("field") AT("@") SIMPLE_NAME("zzz")
+SIMPLE_NAME("field") AT("@") SIMPLE_NAME("abcd")
+
+INVALID_TOKEN("+") POSITIVE_INTEGER_LITERAL("0")
+INVALID_TOKEN("+") POSITIVE_INTEGER_LITERAL("10")
+INVALID_TOKEN("+") POSITIVE_INTEGER_LITERAL("01")
+INVALID_TOKEN("+") POSITIVE_INTEGER_LITERAL("0777")
+INVALID_TOKEN("+") POSITIVE_INTEGER_LITERAL("0x1234ABC")
+INVALID_TOKEN("+") POSITIVE_INTEGER_LITERAL("1234")
+
+INVALID_TOKEN("+") SIMPLE_NAME("08")
+INVALID_TOKEN("+")
\ No newline at end of file
diff --git a/smali/src/test/resources/LexerTest/RealSmaliFileTest.smali b/smali/src/test/resources/LexerTest/RealSmaliFileTest.smali
new file mode 100644
index 0000000..b1bbcbb
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/RealSmaliFileTest.smali
@@ -0,0 +1,294 @@
+.class public final Lcom/android/internal/telephony/cdma/RuimFileHandler;
+.super Lcom/android/internal/telephony/IccFileHandler;
+.source "RuimFileHandler.java"
+
+
+# static fields
+.field static final LOG_TAG:Ljava/lang/String; = "CDMA"
+
+.field static final CARD_MAX_APPS:I = 0x8
+
+.field mWifiOnUid:I
+
+.field public static mWifiRunning:Z = false
+.field public static mWifiRunning2:Z = true
+
+.field mVideoOnTimer:Lcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;
+
+.field public static final PI:D = 3.141592653589793
+
+.field public static final MAX_VALUE:D = 1.7976931348623157E308
+.field public static final MIN_VALUE:D = 4.9E-324
+.field public static final NEGATIVE_INFINITY:D = -Infinity
+.field public static final NaN:D = NaN
+.field public static final POSITIVE_INFINITY:D = Infinity
+
+# annotations
+.annotation system Ldalvik/annotation/MemberClasses;
+    value = {
+        Lcom/android/internal/util/TypedProperties$TypeException;,
+        Lcom/android/internal/util/TypedProperties$ParseException;
+    }
+.end annotation
+
+.annotation system Ldalvik/annotation/Signature;
+    value = {
+        "Ljava/util/HashMap",
+        "<",
+        "Ljava/lang/String;",
+        "Ljava/lang/Object;",
+        ">;"
+    }
+.end annotation
+
+
+.field final mWindowTimers:Ljava/util/ArrayList;
+    .annotation system Ldalvik/annotation/Signature;
+        value = {
+            "Ljava/util/ArrayList",
+            "<",
+            "Lcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;",
+            ">;"
+        }
+    .end annotation
+.end field
+
+
+# direct methods
+.method static constructor <clinit>()V
+    .registers 1
+
+    .prologue
+    .line 180
+    const/4 v0, 0x0
+
+    sput v0, Lcom/android/internal/os/BatteryStatsImpl;->sKernelWakelockUpdateVersion:I
+
+    .line 182
+    const/4 v0, 0x6
+
+    new-array v0, v0, [I
+
+    fill-array-data v0, :array_14
+
+    sput-object v0, Lcom/android/internal/os/BatteryStatsImpl;->PROC_WAKELOCKS_FORMAT:[I
+
+    .line 3495
+    new-instance v0, Lcom/android/internal/os/BatteryStatsImpl$1;
+
+    invoke-direct {v0}, Lcom/android/internal/os/BatteryStatsImpl$1;-><init>()V
+
+    sput-object v0, Lcom/android/internal/os/BatteryStatsImpl;->CREATOR:Landroid/os/Parcelable$Creator;
+
+    return-void
+
+    .line 182
+    nop
+
+    :array_14
+    .array-data 0x4
+        0x9t 0x10t 0x0t 0x0t
+        0x9t 0x20t 0x0t 0x0t
+        0x9t 0x0t 0x0t 0x0t
+        0x9t 0x0t 0x0t 0x0t
+        0x9t 0x0t 0x0t 0x0t
+        0x9t 0x20t 0x0t 0x0t
+    .end array-data
+.end method
+
+
+# direct methods
+.method constructor <init>(Lcom/android/internal/telephony/cdma/CDMAPhone;)V
+    .registers 2
+    .param p1, phone
+
+    .prologue
+    .line 42
+    invoke-direct {p0, p1}, Lcom/android/internal/telephony/IccFileHandler;-><init>(Lcom/android/internal/telephony/PhoneBase;)V
+
+    .line 43
+    return-void
+.end method
+
+.method protected getEFPath(I)Ljava/lang/String;
+    .registers 3
+    .param p1, efid
+
+    .prologue
+    .line 71
+    sparse-switch p1, :sswitch_data_c
+
+    .line 77
+    invoke-virtual {p0, p1}, Lcom/android/internal/telephony/cdma/RuimFileHandler;->getCommonIccEFPath(I)Ljava/lang/String;
+
+    move-result-object v0
+
+    :goto_7
+    return-object v0
+
+    .line 75
+    :sswitch_8
+    const-string v0, "3F007F25"
+
+    goto :goto_7
+
+    .line 71
+    nop
+
+    :sswitch_data_c
+    .sparse-switch
+        0x6f32 -> :sswitch_8
+        0x6f3c -> :sswitch_8
+        0x6f41 -> :sswitch_8
+    .end sparse-switch
+.end method
+
+.method CardStateFromRILInt(I)Lcom/android/internal/telephony/IccCardStatus$CardState;
+    .registers 6
+    .param p1, state
+
+    .prologue
+    .line 59
+    packed-switch p1, :pswitch_data_26
+
+    .line 64
+    new-instance v1, Ljava/lang/RuntimeException;
+
+    new-instance v2, Ljava/lang/StringBuilder;
+
+    invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V
+
+    const-string v3, "Unrecognized RIL_CardState: "
+
+    invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+
+    move-result-object v2
+
+    invoke-virtual {v2, p1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
+
+    move-result-object v2
+
+    invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
+
+    move-result-object v2
+
+    invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V
+
+    throw v1
+
+    .line 60
+    :pswitch_1c
+    sget-object v0, Lcom/android/internal/telephony/IccCardStatus$CardState;->CARDSTATE_ABSENT:Lcom/android/internal/telephony/IccCardStatus$CardState;
+
+    .line 67
+    .local v0, newState:Lcom/android/internal/telephony/IccCardStatus$CardState;
+    :goto_1e
+    return-object v0
+
+    .line 61
+    .end local v0           #newState:Lcom/android/internal/telephony/IccCardStatus$CardState;
+    :pswitch_1f
+    sget-object v0, Lcom/android/internal/telephony/IccCardStatus$CardState;->CARDSTATE_PRESENT:Lcom/android/internal/telephony/IccCardStatus$CardState;
+
+    .restart local v0       #newState:Lcom/android/internal/telephony/IccCardStatus$CardState;
+    goto :goto_1e
+
+    .line 62
+    .end local v0           #newState:Lcom/android/internal/telephony/IccCardStatus$CardState;
+    :pswitch_22
+    sget-object v0, Lcom/android/internal/telephony/IccCardStatus$CardState;->CARDSTATE_ERROR:Lcom/android/internal/telephony/IccCardStatus$CardState;
+
+    .restart local v0       #newState:Lcom/android/internal/telephony/IccCardStatus$CardState;
+    goto :goto_1e
+
+    .line 59
+    nop
+
+    :pswitch_data_26
+    .packed-switch 0x0
+        :pswitch_1c
+        :pswitch_1f
+        :pswitch_22
+    .end packed-switch
+.end method
+
+.method public setCallForwardingOption(IILjava/lang/String;ILandroid/os/Message;)V
+    .registers 13
+    .param p1, commandInterfaceCFAction
+    .param p2, commandInterfaceCFReason
+    .param p3, dialingNumber
+    .param p4, timerSeconds
+    .param p5, onComplete
+
+    .prologue
+    const/4 v3, 0x1
+
+    const/4 v4, 0x0
+
+    .line 981
+    invoke-direct {p0, p1}, Lcom/android/internal/telephony/gsm/GSMPhone;->isValidCommandInterfaceCFAction(I)Z
+
+    move-result v0
+
+    if-eqz v0, :cond_28
+
+    invoke-direct {p0, p2}, Lcom/android/internal/telephony/gsm/GSMPhone;->isValidCommandInterfaceCFReason(I)Z
+
+    move-result v0
+
+    if-eqz v0, :cond_28
+
+    .line 985
+    if-nez p2, :cond_2b
+
+    .line 986
+    iget-object v0, p0, Lcom/android/internal/telephony/gsm/GSMPhone;->h:Lcom/android/internal/telephony/gsm/GSMPhone$MyHandler;
+
+    const/16 v1, 0xc
+
+    invoke-virtual {p0, p1}, Lcom/android/internal/telephony/gsm/GSMPhone;->isCfEnable(I)Z
+
+    move-result v2
+
+    if-eqz v2, :cond_29
+
+    move v2, v3
+
+    :goto_1b
+    invoke-virtual {v0, v1, v2, v4, p5}, Lcom/android/internal/telephony/gsm/GSMPhone$MyHandler;->obtainMessage(IIILjava/lang/Object;)Landroid/os/Message;
+
+    move-result-object v6
+
+    .line 991
+    .local v6, resp:Landroid/os/Message;
+    :goto_1f
+    iget-object v0, p0, Lcom/android/internal/telephony/gsm/GSMPhone;->mCM:Lcom/android/internal/telephony/CommandsInterface;
+
+    move v1, p1
+
+    move v2, p2
+
+    move-object v4, p3
+
+    move v5, p4
+
+    invoke-interface/range {v0 .. v6}, Lcom/android/internal/telephony/CommandsInterface;->setCallForward(IIILjava/lang/String;ILandroid/os/Message;)V
+
+    .line 998
+    .end local v6           #resp:Landroid/os/Message;
+    :cond_28
+    return-void
+
+    :cond_29
+    move v2, v4
+
+    .line 986
+    goto :goto_1b
+
+    .line 989
+    :cond_2b
+    move-object v6, p5
+
+    .restart local v6       #resp:Landroid/os/Message;
+    goto :goto_1f
+.end method
\ No newline at end of file
diff --git a/smali/src/test/resources/LexerTest/RealSmaliFileTest.tokens b/smali/src/test/resources/LexerTest/RealSmaliFileTest.tokens
new file mode 100644
index 0000000..d7e438a
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/RealSmaliFileTest.tokens
@@ -0,0 +1,800 @@
+CLASS_DIRECTIVE(".class")
+ACCESS_SPEC("public")
+ACCESS_SPEC("final")
+CLASS_DESCRIPTOR("Lcom/android/internal/telephony/cdma/RuimFileHandler;")
+SUPER_DIRECTIVE(".super")
+CLASS_DESCRIPTOR("Lcom/android/internal/telephony/IccFileHandler;")
+SOURCE_DIRECTIVE(".source")
+STRING_LITERAL("\"RuimFileHandler.java\"")
+FIELD_DIRECTIVE(".field")
+ACCESS_SPEC("static")
+ACCESS_SPEC("final")
+SIMPLE_NAME("LOG_TAG")
+COLON(":")
+CLASS_DESCRIPTOR("Ljava/lang/String;")
+EQUAL("=")
+STRING_LITERAL("\"CDMA\"")
+FIELD_DIRECTIVE(".field")
+ACCESS_SPEC("static")
+ACCESS_SPEC("final")
+SIMPLE_NAME("CARD_MAX_APPS")
+COLON(":")
+PRIMITIVE_TYPE("I")
+EQUAL("=")
+POSITIVE_INTEGER_LITERAL("0x8")
+FIELD_DIRECTIVE(".field")
+SIMPLE_NAME("mWifiOnUid")
+COLON(":")
+PRIMITIVE_TYPE("I")
+FIELD_DIRECTIVE(".field")
+ACCESS_SPEC("public")
+ACCESS_SPEC("static")
+SIMPLE_NAME("mWifiRunning")
+COLON(":")
+PRIMITIVE_TYPE("Z")
+EQUAL("=")
+BOOL_LITERAL("false")
+FIELD_DIRECTIVE(".field")
+ACCESS_SPEC("public")
+ACCESS_SPEC("static")
+SIMPLE_NAME("mWifiRunning2")
+COLON(":")
+PRIMITIVE_TYPE("Z")
+EQUAL("=")
+BOOL_LITERAL("true")
+FIELD_DIRECTIVE(".field")
+SIMPLE_NAME("mVideoOnTimer")
+COLON(":")
+CLASS_DESCRIPTOR("Lcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;")
+FIELD_DIRECTIVE(".field")
+ACCESS_SPEC("public")
+ACCESS_SPEC("static")
+ACCESS_SPEC("final")
+SIMPLE_NAME("PI")
+COLON(":")
+PRIMITIVE_TYPE("D")
+EQUAL("=")
+DOUBLE_LITERAL("3.141592653589793")
+FIELD_DIRECTIVE(".field")
+ACCESS_SPEC("public")
+ACCESS_SPEC("static")
+ACCESS_SPEC("final")
+SIMPLE_NAME("MAX_VALUE")
+COLON(":")
+PRIMITIVE_TYPE("D")
+EQUAL("=")
+DOUBLE_LITERAL("1.7976931348623157E308")
+FIELD_DIRECTIVE(".field")
+ACCESS_SPEC("public")
+ACCESS_SPEC("static")
+ACCESS_SPEC("final")
+SIMPLE_NAME("MIN_VALUE")
+COLON(":")
+PRIMITIVE_TYPE("D")
+EQUAL("=")
+DOUBLE_LITERAL("4.9E-324")
+FIELD_DIRECTIVE(".field")
+ACCESS_SPEC("public")
+ACCESS_SPEC("static")
+ACCESS_SPEC("final")
+SIMPLE_NAME("NEGATIVE_INFINITY")
+COLON(":")
+PRIMITIVE_TYPE("D")
+EQUAL("=")
+DOUBLE_LITERAL_OR_ID("-Infinity")
+FIELD_DIRECTIVE(".field")
+ACCESS_SPEC("public")
+ACCESS_SPEC("static")
+ACCESS_SPEC("final")
+DOUBLE_LITERAL_OR_ID("NaN")
+COLON(":")
+PRIMITIVE_TYPE("D")
+EQUAL("=")
+DOUBLE_LITERAL_OR_ID("NaN")
+FIELD_DIRECTIVE(".field")
+ACCESS_SPEC("public")
+ACCESS_SPEC("static")
+ACCESS_SPEC("final")
+SIMPLE_NAME("POSITIVE_INFINITY")
+COLON(":")
+PRIMITIVE_TYPE("D")
+EQUAL("=")
+DOUBLE_LITERAL_OR_ID("Infinity")
+ANNOTATION_DIRECTIVE(".annotation")
+ANNOTATION_VISIBILITY("system")
+CLASS_DESCRIPTOR("Ldalvik/annotation/MemberClasses;")
+SIMPLE_NAME("value")
+EQUAL("=")
+OPEN_BRACE("{")
+CLASS_DESCRIPTOR("Lcom/android/internal/util/TypedProperties$TypeException;")
+COMMA(",")
+CLASS_DESCRIPTOR("Lcom/android/internal/util/TypedProperties$ParseException;")
+CLOSE_BRACE("}")
+END_ANNOTATION_DIRECTIVE(".end annotation")
+ANNOTATION_DIRECTIVE(".annotation")
+ANNOTATION_VISIBILITY("system")
+CLASS_DESCRIPTOR("Ldalvik/annotation/Signature;")
+SIMPLE_NAME("value")
+EQUAL("=")
+OPEN_BRACE("{")
+STRING_LITERAL("\"Ljava/util/HashMap\"")
+COMMA(",")
+STRING_LITERAL("\"<\"")
+COMMA(",")
+STRING_LITERAL("\"Ljava/lang/String;\"")
+COMMA(",")
+STRING_LITERAL("\"Ljava/lang/Object;\"")
+COMMA(",")
+STRING_LITERAL("\">;\"")
+CLOSE_BRACE("}")
+END_ANNOTATION_DIRECTIVE(".end annotation")
+FIELD_DIRECTIVE(".field")
+ACCESS_SPEC("final")
+SIMPLE_NAME("mWindowTimers")
+COLON(":")
+CLASS_DESCRIPTOR("Ljava/util/ArrayList;")
+ANNOTATION_DIRECTIVE(".annotation")
+ANNOTATION_VISIBILITY("system")
+CLASS_DESCRIPTOR("Ldalvik/annotation/Signature;")
+SIMPLE_NAME("value")
+EQUAL("=")
+OPEN_BRACE("{")
+STRING_LITERAL("\"Ljava/util/ArrayList\"")
+COMMA(",")
+STRING_LITERAL("\"<\"")
+COMMA(",")
+STRING_LITERAL("\"Lcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;\"")
+COMMA(",")
+STRING_LITERAL("\">;\"")
+CLOSE_BRACE("}")
+END_ANNOTATION_DIRECTIVE(".end annotation")
+END_FIELD_DIRECTIVE(".end field")
+METHOD_DIRECTIVE(".method")
+ACCESS_SPEC("static")
+ACCESS_SPEC("constructor")
+MEMBER_NAME("<clinit>")
+OPEN_PAREN("(")
+CLOSE_PAREN(")")
+VOID_TYPE("V")
+REGISTERS_DIRECTIVE(".registers")
+POSITIVE_INTEGER_LITERAL("1")
+PROLOGUE_DIRECTIVE(".prologue")
+LINE_DIRECTIVE(".line")
+POSITIVE_INTEGER_LITERAL("180")
+INSTRUCTION_FORMAT11n("const/4")
+REGISTER("v0")
+COMMA(",")
+POSITIVE_INTEGER_LITERAL("0x0")
+INSTRUCTION_FORMAT21c_FIELD("sput")
+REGISTER("v0")
+COMMA(",")
+CLASS_DESCRIPTOR("Lcom/android/internal/os/BatteryStatsImpl;")
+ARROW("->")
+SIMPLE_NAME("sKernelWakelockUpdateVersion")
+COLON(":")
+PRIMITIVE_TYPE("I")
+LINE_DIRECTIVE(".line")
+POSITIVE_INTEGER_LITERAL("182")
+INSTRUCTION_FORMAT11n("const/4")
+REGISTER("v0")
+COMMA(",")
+POSITIVE_INTEGER_LITERAL("0x6")
+INSTRUCTION_FORMAT22c_TYPE("new-array")
+REGISTER("v0")
+COMMA(",")
+REGISTER("v0")
+COMMA(",")
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("I")
+INSTRUCTION_FORMAT31t("fill-array-data")
+REGISTER("v0")
+COMMA(",")
+COLON(":")
+SIMPLE_NAME("array_14")
+INSTRUCTION_FORMAT21c_FIELD("sput-object")
+REGISTER("v0")
+COMMA(",")
+CLASS_DESCRIPTOR("Lcom/android/internal/os/BatteryStatsImpl;")
+ARROW("->")
+SIMPLE_NAME("PROC_WAKELOCKS_FORMAT")
+COLON(":")
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("I")
+LINE_DIRECTIVE(".line")
+POSITIVE_INTEGER_LITERAL("3495")
+INSTRUCTION_FORMAT21c_TYPE("new-instance")
+REGISTER("v0")
+COMMA(",")
+CLASS_DESCRIPTOR("Lcom/android/internal/os/BatteryStatsImpl$1;")
+INSTRUCTION_FORMAT35c_METHOD_OR_METHOD_HANDLE_TYPE("invoke-direct")
+OPEN_BRACE("{")
+REGISTER("v0")
+CLOSE_BRACE("}")
+COMMA(",")
+CLASS_DESCRIPTOR("Lcom/android/internal/os/BatteryStatsImpl$1;")
+ARROW("->")
+MEMBER_NAME("<init>")
+OPEN_PAREN("(")
+CLOSE_PAREN(")")
+VOID_TYPE("V")
+INSTRUCTION_FORMAT21c_FIELD("sput-object")
+REGISTER("v0")
+COMMA(",")
+CLASS_DESCRIPTOR("Lcom/android/internal/os/BatteryStatsImpl;")
+ARROW("->")
+SIMPLE_NAME("CREATOR")
+COLON(":")
+CLASS_DESCRIPTOR("Landroid/os/Parcelable$Creator;")
+INSTRUCTION_FORMAT10x("return-void")
+LINE_DIRECTIVE(".line")
+POSITIVE_INTEGER_LITERAL("182")
+INSTRUCTION_FORMAT10x("nop")
+COLON(":")
+SIMPLE_NAME("array_14")
+ARRAY_DATA_DIRECTIVE(".array-data")
+POSITIVE_INTEGER_LITERAL("0x4")
+BYTE_LITERAL("0x9t")
+BYTE_LITERAL("0x10t")
+BYTE_LITERAL("0x0t")
+BYTE_LITERAL("0x0t")
+BYTE_LITERAL("0x9t")
+BYTE_LITERAL("0x20t")
+BYTE_LITERAL("0x0t")
+BYTE_LITERAL("0x0t")
+BYTE_LITERAL("0x9t")
+BYTE_LITERAL("0x0t")
+BYTE_LITERAL("0x0t")
+BYTE_LITERAL("0x0t")
+BYTE_LITERAL("0x9t")
+BYTE_LITERAL("0x0t")
+BYTE_LITERAL("0x0t")
+BYTE_LITERAL("0x0t")
+BYTE_LITERAL("0x9t")
+BYTE_LITERAL("0x0t")
+BYTE_LITERAL("0x0t")
+BYTE_LITERAL("0x0t")
+BYTE_LITERAL("0x9t")
+BYTE_LITERAL("0x20t")
+BYTE_LITERAL("0x0t")
+BYTE_LITERAL("0x0t")
+END_ARRAY_DATA_DIRECTIVE(".end array-data")
+END_METHOD_DIRECTIVE(".end method")
+METHOD_DIRECTIVE(".method")
+ACCESS_SPEC("constructor")
+MEMBER_NAME("<init>")
+OPEN_PAREN("(")
+CLASS_DESCRIPTOR("Lcom/android/internal/telephony/cdma/CDMAPhone;")
+CLOSE_PAREN(")")
+VOID_TYPE("V")
+REGISTERS_DIRECTIVE(".registers")
+POSITIVE_INTEGER_LITERAL("2")
+PARAMETER_DIRECTIVE(".param")
+REGISTER("p1")
+COMMA(",")
+SIMPLE_NAME("phone")
+PROLOGUE_DIRECTIVE(".prologue")
+LINE_DIRECTIVE(".line")
+POSITIVE_INTEGER_LITERAL("42")
+INSTRUCTION_FORMAT35c_METHOD_OR_METHOD_HANDLE_TYPE("invoke-direct")
+OPEN_BRACE("{")
+REGISTER("p0")
+COMMA(",")
+REGISTER("p1")
+CLOSE_BRACE("}")
+COMMA(",")
+CLASS_DESCRIPTOR("Lcom/android/internal/telephony/IccFileHandler;")
+ARROW("->")
+MEMBER_NAME("<init>")
+OPEN_PAREN("(")
+CLASS_DESCRIPTOR("Lcom/android/internal/telephony/PhoneBase;")
+CLOSE_PAREN(")")
+VOID_TYPE("V")
+LINE_DIRECTIVE(".line")
+POSITIVE_INTEGER_LITERAL("43")
+INSTRUCTION_FORMAT10x("return-void")
+END_METHOD_DIRECTIVE(".end method")
+METHOD_DIRECTIVE(".method")
+ACCESS_SPEC("protected")
+SIMPLE_NAME("getEFPath")
+OPEN_PAREN("(")
+PRIMITIVE_TYPE("I")
+CLOSE_PAREN(")")
+CLASS_DESCRIPTOR("Ljava/lang/String;")
+REGISTERS_DIRECTIVE(".registers")
+POSITIVE_INTEGER_LITERAL("3")
+PARAMETER_DIRECTIVE(".param")
+REGISTER("p1")
+COMMA(",")
+SIMPLE_NAME("efid")
+PROLOGUE_DIRECTIVE(".prologue")
+LINE_DIRECTIVE(".line")
+POSITIVE_INTEGER_LITERAL("71")
+INSTRUCTION_FORMAT31t("sparse-switch")
+REGISTER("p1")
+COMMA(",")
+COLON(":")
+SIMPLE_NAME("sswitch_data_c")
+LINE_DIRECTIVE(".line")
+POSITIVE_INTEGER_LITERAL("77")
+INSTRUCTION_FORMAT35c_METHOD("invoke-virtual")
+OPEN_BRACE("{")
+REGISTER("p0")
+COMMA(",")
+REGISTER("p1")
+CLOSE_BRACE("}")
+COMMA(",")
+CLASS_DESCRIPTOR("Lcom/android/internal/telephony/cdma/RuimFileHandler;")
+ARROW("->")
+SIMPLE_NAME("getCommonIccEFPath")
+OPEN_PAREN("(")
+PRIMITIVE_TYPE("I")
+CLOSE_PAREN(")")
+CLASS_DESCRIPTOR("Ljava/lang/String;")
+INSTRUCTION_FORMAT11x("move-result-object")
+REGISTER("v0")
+COLON(":")
+SIMPLE_NAME("goto_7")
+INSTRUCTION_FORMAT11x("return-object")
+REGISTER("v0")
+LINE_DIRECTIVE(".line")
+POSITIVE_INTEGER_LITERAL("75")
+COLON(":")
+SIMPLE_NAME("sswitch_8")
+INSTRUCTION_FORMAT21c_STRING("const-string")
+REGISTER("v0")
+COMMA(",")
+STRING_LITERAL("\"3F007F25\"")
+INSTRUCTION_FORMAT10t("goto")
+COLON(":")
+SIMPLE_NAME("goto_7")
+LINE_DIRECTIVE(".line")
+POSITIVE_INTEGER_LITERAL("71")
+INSTRUCTION_FORMAT10x("nop")
+COLON(":")
+SIMPLE_NAME("sswitch_data_c")
+SPARSE_SWITCH_DIRECTIVE(".sparse-switch")
+POSITIVE_INTEGER_LITERAL("0x6f32")
+ARROW("->")
+COLON(":")
+SIMPLE_NAME("sswitch_8")
+POSITIVE_INTEGER_LITERAL("0x6f3c")
+ARROW("->")
+COLON(":")
+SIMPLE_NAME("sswitch_8")
+POSITIVE_INTEGER_LITERAL("0x6f41")
+ARROW("->")
+COLON(":")
+SIMPLE_NAME("sswitch_8")
+END_SPARSE_SWITCH_DIRECTIVE(".end sparse-switch")
+END_METHOD_DIRECTIVE(".end method")
+METHOD_DIRECTIVE(".method")
+SIMPLE_NAME("CardStateFromRILInt")
+OPEN_PAREN("(")
+PRIMITIVE_TYPE("I")
+CLOSE_PAREN(")")
+CLASS_DESCRIPTOR("Lcom/android/internal/telephony/IccCardStatus$CardState;")
+REGISTERS_DIRECTIVE(".registers")
+POSITIVE_INTEGER_LITERAL("6")
+PARAMETER_DIRECTIVE(".param")
+REGISTER("p1")
+COMMA(",")
+SIMPLE_NAME("state")
+PROLOGUE_DIRECTIVE(".prologue")
+LINE_DIRECTIVE(".line")
+POSITIVE_INTEGER_LITERAL("59")
+INSTRUCTION_FORMAT31t("packed-switch")
+REGISTER("p1")
+COMMA(",")
+COLON(":")
+SIMPLE_NAME("pswitch_data_26")
+LINE_DIRECTIVE(".line")
+POSITIVE_INTEGER_LITERAL("64")
+INSTRUCTION_FORMAT21c_TYPE("new-instance")
+REGISTER("v1")
+COMMA(",")
+CLASS_DESCRIPTOR("Ljava/lang/RuntimeException;")
+INSTRUCTION_FORMAT21c_TYPE("new-instance")
+REGISTER("v2")
+COMMA(",")
+CLASS_DESCRIPTOR("Ljava/lang/StringBuilder;")
+INSTRUCTION_FORMAT35c_METHOD_OR_METHOD_HANDLE_TYPE("invoke-direct")
+OPEN_BRACE("{")
+REGISTER("v2")
+CLOSE_BRACE("}")
+COMMA(",")
+CLASS_DESCRIPTOR("Ljava/lang/StringBuilder;")
+ARROW("->")
+MEMBER_NAME("<init>")
+OPEN_PAREN("(")
+CLOSE_PAREN(")")
+VOID_TYPE("V")
+INSTRUCTION_FORMAT21c_STRING("const-string")
+REGISTER("v3")
+COMMA(",")
+STRING_LITERAL("\"Unrecognized RIL_CardState: \"")
+INSTRUCTION_FORMAT35c_METHOD("invoke-virtual")
+OPEN_BRACE("{")
+REGISTER("v2")
+COMMA(",")
+REGISTER("v3")
+CLOSE_BRACE("}")
+COMMA(",")
+CLASS_DESCRIPTOR("Ljava/lang/StringBuilder;")
+ARROW("->")
+SIMPLE_NAME("append")
+OPEN_PAREN("(")
+CLASS_DESCRIPTOR("Ljava/lang/String;")
+CLOSE_PAREN(")")
+CLASS_DESCRIPTOR("Ljava/lang/StringBuilder;")
+INSTRUCTION_FORMAT11x("move-result-object")
+REGISTER("v2")
+INSTRUCTION_FORMAT35c_METHOD("invoke-virtual")
+OPEN_BRACE("{")
+REGISTER("v2")
+COMMA(",")
+REGISTER("p1")
+CLOSE_BRACE("}")
+COMMA(",")
+CLASS_DESCRIPTOR("Ljava/lang/StringBuilder;")
+ARROW("->")
+SIMPLE_NAME("append")
+OPEN_PAREN("(")
+PRIMITIVE_TYPE("I")
+CLOSE_PAREN(")")
+CLASS_DESCRIPTOR("Ljava/lang/StringBuilder;")
+INSTRUCTION_FORMAT11x("move-result-object")
+REGISTER("v2")
+INSTRUCTION_FORMAT35c_METHOD("invoke-virtual")
+OPEN_BRACE("{")
+REGISTER("v2")
+CLOSE_BRACE("}")
+COMMA(",")
+CLASS_DESCRIPTOR("Ljava/lang/StringBuilder;")
+ARROW("->")
+SIMPLE_NAME("toString")
+OPEN_PAREN("(")
+CLOSE_PAREN(")")
+CLASS_DESCRIPTOR("Ljava/lang/String;")
+INSTRUCTION_FORMAT11x("move-result-object")
+REGISTER("v2")
+INSTRUCTION_FORMAT35c_METHOD_OR_METHOD_HANDLE_TYPE("invoke-direct")
+OPEN_BRACE("{")
+REGISTER("v1")
+COMMA(",")
+REGISTER("v2")
+CLOSE_BRACE("}")
+COMMA(",")
+CLASS_DESCRIPTOR("Ljava/lang/RuntimeException;")
+ARROW("->")
+MEMBER_NAME("<init>")
+OPEN_PAREN("(")
+CLASS_DESCRIPTOR("Ljava/lang/String;")
+CLOSE_PAREN(")")
+VOID_TYPE("V")
+INSTRUCTION_FORMAT11x("throw")
+REGISTER("v1")
+LINE_DIRECTIVE(".line")
+POSITIVE_INTEGER_LITERAL("60")
+COLON(":")
+SIMPLE_NAME("pswitch_1c")
+INSTRUCTION_FORMAT21c_FIELD("sget-object")
+REGISTER("v0")
+COMMA(",")
+CLASS_DESCRIPTOR("Lcom/android/internal/telephony/IccCardStatus$CardState;")
+ARROW("->")
+SIMPLE_NAME("CARDSTATE_ABSENT")
+COLON(":")
+CLASS_DESCRIPTOR("Lcom/android/internal/telephony/IccCardStatus$CardState;")
+LINE_DIRECTIVE(".line")
+POSITIVE_INTEGER_LITERAL("67")
+LOCAL_DIRECTIVE(".local")
+REGISTER("v0")
+COMMA(",")
+SIMPLE_NAME("newState")
+COLON(":")
+CLASS_DESCRIPTOR("Lcom/android/internal/telephony/IccCardStatus$CardState;")
+COLON(":")
+SIMPLE_NAME("goto_1e")
+INSTRUCTION_FORMAT11x("return-object")
+REGISTER("v0")
+LINE_DIRECTIVE(".line")
+POSITIVE_INTEGER_LITERAL("61")
+END_LOCAL_DIRECTIVE(".end local")
+REGISTER("v0")
+COLON(":")
+SIMPLE_NAME("pswitch_1f")
+INSTRUCTION_FORMAT21c_FIELD("sget-object")
+REGISTER("v0")
+COMMA(",")
+CLASS_DESCRIPTOR("Lcom/android/internal/telephony/IccCardStatus$CardState;")
+ARROW("->")
+SIMPLE_NAME("CARDSTATE_PRESENT")
+COLON(":")
+CLASS_DESCRIPTOR("Lcom/android/internal/telephony/IccCardStatus$CardState;")
+RESTART_LOCAL_DIRECTIVE(".restart local")
+REGISTER("v0")
+INSTRUCTION_FORMAT10t("goto")
+COLON(":")
+SIMPLE_NAME("goto_1e")
+LINE_DIRECTIVE(".line")
+POSITIVE_INTEGER_LITERAL("62")
+END_LOCAL_DIRECTIVE(".end local")
+REGISTER("v0")
+COLON(":")
+SIMPLE_NAME("pswitch_22")
+INSTRUCTION_FORMAT21c_FIELD("sget-object")
+REGISTER("v0")
+COMMA(",")
+CLASS_DESCRIPTOR("Lcom/android/internal/telephony/IccCardStatus$CardState;")
+ARROW("->")
+SIMPLE_NAME("CARDSTATE_ERROR")
+COLON(":")
+CLASS_DESCRIPTOR("Lcom/android/internal/telephony/IccCardStatus$CardState;")
+RESTART_LOCAL_DIRECTIVE(".restart local")
+REGISTER("v0")
+INSTRUCTION_FORMAT10t("goto")
+COLON(":")
+SIMPLE_NAME("goto_1e")
+LINE_DIRECTIVE(".line")
+POSITIVE_INTEGER_LITERAL("59")
+INSTRUCTION_FORMAT10x("nop")
+COLON(":")
+SIMPLE_NAME("pswitch_data_26")
+PACKED_SWITCH_DIRECTIVE(".packed-switch")
+POSITIVE_INTEGER_LITERAL("0x0")
+COLON(":")
+SIMPLE_NAME("pswitch_1c")
+COLON(":")
+SIMPLE_NAME("pswitch_1f")
+COLON(":")
+SIMPLE_NAME("pswitch_22")
+END_PACKED_SWITCH_DIRECTIVE(".end packed-switch")
+END_METHOD_DIRECTIVE(".end method")
+METHOD_DIRECTIVE(".method")
+ACCESS_SPEC("public")
+SIMPLE_NAME("setCallForwardingOption")
+OPEN_PAREN("(")
+PRIMITIVE_TYPE("I")
+PRIMITIVE_TYPE("I")
+CLASS_DESCRIPTOR("Ljava/lang/String;")
+PRIMITIVE_TYPE("I")
+CLASS_DESCRIPTOR("Landroid/os/Message;")
+CLOSE_PAREN(")")
+VOID_TYPE("V")
+REGISTERS_DIRECTIVE(".registers")
+POSITIVE_INTEGER_LITERAL("13")
+PARAMETER_DIRECTIVE(".param")
+REGISTER("p1")
+COMMA(",")
+SIMPLE_NAME("commandInterfaceCFAction")
+PARAMETER_DIRECTIVE(".param")
+REGISTER("p2")
+COMMA(",")
+SIMPLE_NAME("commandInterfaceCFReason")
+PARAMETER_DIRECTIVE(".param")
+REGISTER("p3")
+COMMA(",")
+SIMPLE_NAME("dialingNumber")
+PARAMETER_DIRECTIVE(".param")
+REGISTER("p4")
+COMMA(",")
+SIMPLE_NAME("timerSeconds")
+PARAMETER_DIRECTIVE(".param")
+REGISTER("p5")
+COMMA(",")
+SIMPLE_NAME("onComplete")
+PROLOGUE_DIRECTIVE(".prologue")
+INSTRUCTION_FORMAT11n("const/4")
+REGISTER("v3")
+COMMA(",")
+POSITIVE_INTEGER_LITERAL("0x1")
+INSTRUCTION_FORMAT11n("const/4")
+REGISTER("v4")
+COMMA(",")
+POSITIVE_INTEGER_LITERAL("0x0")
+LINE_DIRECTIVE(".line")
+POSITIVE_INTEGER_LITERAL("981")
+INSTRUCTION_FORMAT35c_METHOD_OR_METHOD_HANDLE_TYPE("invoke-direct")
+OPEN_BRACE("{")
+REGISTER("p0")
+COMMA(",")
+REGISTER("p1")
+CLOSE_BRACE("}")
+COMMA(",")
+CLASS_DESCRIPTOR("Lcom/android/internal/telephony/gsm/GSMPhone;")
+ARROW("->")
+SIMPLE_NAME("isValidCommandInterfaceCFAction")
+OPEN_PAREN("(")
+PRIMITIVE_TYPE("I")
+CLOSE_PAREN(")")
+PRIMITIVE_TYPE("Z")
+INSTRUCTION_FORMAT11x("move-result")
+REGISTER("v0")
+INSTRUCTION_FORMAT21t("if-eqz")
+REGISTER("v0")
+COMMA(",")
+COLON(":")
+SIMPLE_NAME("cond_28")
+INSTRUCTION_FORMAT35c_METHOD_OR_METHOD_HANDLE_TYPE("invoke-direct")
+OPEN_BRACE("{")
+REGISTER("p0")
+COMMA(",")
+REGISTER("p2")
+CLOSE_BRACE("}")
+COMMA(",")
+CLASS_DESCRIPTOR("Lcom/android/internal/telephony/gsm/GSMPhone;")
+ARROW("->")
+SIMPLE_NAME("isValidCommandInterfaceCFReason")
+OPEN_PAREN("(")
+PRIMITIVE_TYPE("I")
+CLOSE_PAREN(")")
+PRIMITIVE_TYPE("Z")
+INSTRUCTION_FORMAT11x("move-result")
+REGISTER("v0")
+INSTRUCTION_FORMAT21t("if-eqz")
+REGISTER("v0")
+COMMA(",")
+COLON(":")
+SIMPLE_NAME("cond_28")
+LINE_DIRECTIVE(".line")
+POSITIVE_INTEGER_LITERAL("985")
+INSTRUCTION_FORMAT21t("if-nez")
+REGISTER("p2")
+COMMA(",")
+COLON(":")
+SIMPLE_NAME("cond_2b")
+LINE_DIRECTIVE(".line")
+POSITIVE_INTEGER_LITERAL("986")
+INSTRUCTION_FORMAT22c_FIELD("iget-object")
+REGISTER("v0")
+COMMA(",")
+REGISTER("p0")
+COMMA(",")
+CLASS_DESCRIPTOR("Lcom/android/internal/telephony/gsm/GSMPhone;")
+ARROW("->")
+SIMPLE_NAME("h")
+COLON(":")
+CLASS_DESCRIPTOR("Lcom/android/internal/telephony/gsm/GSMPhone$MyHandler;")
+INSTRUCTION_FORMAT21s("const/16")
+REGISTER("v1")
+COMMA(",")
+POSITIVE_INTEGER_LITERAL("0xc")
+INSTRUCTION_FORMAT35c_METHOD("invoke-virtual")
+OPEN_BRACE("{")
+REGISTER("p0")
+COMMA(",")
+REGISTER("p1")
+CLOSE_BRACE("}")
+COMMA(",")
+CLASS_DESCRIPTOR("Lcom/android/internal/telephony/gsm/GSMPhone;")
+ARROW("->")
+SIMPLE_NAME("isCfEnable")
+OPEN_PAREN("(")
+PRIMITIVE_TYPE("I")
+CLOSE_PAREN(")")
+PRIMITIVE_TYPE("Z")
+INSTRUCTION_FORMAT11x("move-result")
+REGISTER("v2")
+INSTRUCTION_FORMAT21t("if-eqz")
+REGISTER("v2")
+COMMA(",")
+COLON(":")
+SIMPLE_NAME("cond_29")
+INSTRUCTION_FORMAT12x_OR_ID("move")
+REGISTER("v2")
+COMMA(",")
+REGISTER("v3")
+COLON(":")
+SIMPLE_NAME("goto_1b")
+INSTRUCTION_FORMAT35c_METHOD("invoke-virtual")
+OPEN_BRACE("{")
+REGISTER("v0")
+COMMA(",")
+REGISTER("v1")
+COMMA(",")
+REGISTER("v2")
+COMMA(",")
+REGISTER("v4")
+COMMA(",")
+REGISTER("p5")
+CLOSE_BRACE("}")
+COMMA(",")
+CLASS_DESCRIPTOR("Lcom/android/internal/telephony/gsm/GSMPhone$MyHandler;")
+ARROW("->")
+SIMPLE_NAME("obtainMessage")
+OPEN_PAREN("(")
+PRIMITIVE_TYPE("I")
+PRIMITIVE_TYPE("I")
+PRIMITIVE_TYPE("I")
+CLASS_DESCRIPTOR("Ljava/lang/Object;")
+CLOSE_PAREN(")")
+CLASS_DESCRIPTOR("Landroid/os/Message;")
+INSTRUCTION_FORMAT11x("move-result-object")
+REGISTER("v6")
+LINE_DIRECTIVE(".line")
+POSITIVE_INTEGER_LITERAL("991")
+LOCAL_DIRECTIVE(".local")
+REGISTER("v6")
+COMMA(",")
+SIMPLE_NAME("resp")
+COLON(":")
+CLASS_DESCRIPTOR("Landroid/os/Message;")
+COLON(":")
+SIMPLE_NAME("goto_1f")
+INSTRUCTION_FORMAT22c_FIELD("iget-object")
+REGISTER("v0")
+COMMA(",")
+REGISTER("p0")
+COMMA(",")
+CLASS_DESCRIPTOR("Lcom/android/internal/telephony/gsm/GSMPhone;")
+ARROW("->")
+SIMPLE_NAME("mCM")
+COLON(":")
+CLASS_DESCRIPTOR("Lcom/android/internal/telephony/CommandsInterface;")
+INSTRUCTION_FORMAT12x_OR_ID("move")
+REGISTER("v1")
+COMMA(",")
+REGISTER("p1")
+INSTRUCTION_FORMAT12x_OR_ID("move")
+REGISTER("v2")
+COMMA(",")
+REGISTER("p2")
+INSTRUCTION_FORMAT12x_OR_ID("move-object")
+REGISTER("v4")
+COMMA(",")
+REGISTER("p3")
+INSTRUCTION_FORMAT12x_OR_ID("move")
+REGISTER("v5")
+COMMA(",")
+REGISTER("p4")
+INSTRUCTION_FORMAT3rc_METHOD("invoke-interface/range")
+OPEN_BRACE("{")
+REGISTER("v0")
+DOTDOT("..")
+REGISTER("v6")
+CLOSE_BRACE("}")
+COMMA(",")
+CLASS_DESCRIPTOR("Lcom/android/internal/telephony/CommandsInterface;")
+ARROW("->")
+SIMPLE_NAME("setCallForward")
+OPEN_PAREN("(")
+PRIMITIVE_TYPE("I")
+PRIMITIVE_TYPE("I")
+PRIMITIVE_TYPE("I")
+CLASS_DESCRIPTOR("Ljava/lang/String;")
+PRIMITIVE_TYPE("I")
+CLASS_DESCRIPTOR("Landroid/os/Message;")
+CLOSE_PAREN(")")
+VOID_TYPE("V")
+LINE_DIRECTIVE(".line")
+POSITIVE_INTEGER_LITERAL("998")
+END_LOCAL_DIRECTIVE(".end local")
+REGISTER("v6")
+COLON(":")
+SIMPLE_NAME("cond_28")
+INSTRUCTION_FORMAT10x("return-void")
+COLON(":")
+SIMPLE_NAME("cond_29")
+INSTRUCTION_FORMAT12x_OR_ID("move")
+REGISTER("v2")
+COMMA(",")
+REGISTER("v4")
+LINE_DIRECTIVE(".line")
+POSITIVE_INTEGER_LITERAL("986")
+INSTRUCTION_FORMAT10t("goto")
+COLON(":")
+SIMPLE_NAME("goto_1b")
+LINE_DIRECTIVE(".line")
+POSITIVE_INTEGER_LITERAL("989")
+COLON(":")
+SIMPLE_NAME("cond_2b")
+INSTRUCTION_FORMAT12x_OR_ID("move-object")
+REGISTER("v6")
+COMMA(",")
+REGISTER("p5")
+RESTART_LOCAL_DIRECTIVE(".restart local")
+REGISTER("v6")
+INSTRUCTION_FORMAT10t("goto")
+COLON(":")
+SIMPLE_NAME("goto_1f")
+END_METHOD_DIRECTIVE(".end method")
\ No newline at end of file
diff --git a/smali/src/test/resources/LexerTest/ShortLiteralTest.smali b/smali/src/test/resources/LexerTest/ShortLiteralTest.smali
new file mode 100644
index 0000000..b5bfbbf
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/ShortLiteralTest.smali
@@ -0,0 +1,49 @@
+0x0S
+0x00
+0x1s
+0x1234
+0x7fffS
+0x8000s
+0xFFFF
+-0x00
+-0x01
+-01234
+-01234s
+-0x8000
+-0x1fff
+-0x1fffS
+-0x8001
+-0xFFFF
+-0x100000
+0
+1
+12345
+12345s
+32767
+32678
+65535S
+-0
+-1
+-12345S
+-32767
+-32768s
+-32679s
+-65535s
+65536
+65600
+00
+01
+012345
+012345s
+077777
+0100000
+0177777
+-00
+-01
+-012345
+-012345S
+-077777
+-0100000
+-0100001
+-0177777
+0200000
\ No newline at end of file
diff --git a/smali/src/test/resources/LexerTest/ShortLiteralTest.tokens b/smali/src/test/resources/LexerTest/ShortLiteralTest.tokens
new file mode 100644
index 0000000..d8521c1
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/ShortLiteralTest.tokens
@@ -0,0 +1,49 @@
+SHORT_LITERAL("0x0S")
+POSITIVE_INTEGER_LITERAL("0x00")
+SHORT_LITERAL("0x1s")
+POSITIVE_INTEGER_LITERAL("0x1234")
+SHORT_LITERAL("0x7fffS")
+SHORT_LITERAL("0x8000s")
+POSITIVE_INTEGER_LITERAL("0xFFFF")
+NEGATIVE_INTEGER_LITERAL("-0x00")
+NEGATIVE_INTEGER_LITERAL("-0x01")
+NEGATIVE_INTEGER_LITERAL("-01234")
+SHORT_LITERAL("-01234s")
+NEGATIVE_INTEGER_LITERAL("-0x8000")
+NEGATIVE_INTEGER_LITERAL("-0x1fff")
+SHORT_LITERAL("-0x1fffS")
+NEGATIVE_INTEGER_LITERAL("-0x8001")
+NEGATIVE_INTEGER_LITERAL("-0xFFFF")
+NEGATIVE_INTEGER_LITERAL("-0x100000")
+POSITIVE_INTEGER_LITERAL("0")
+POSITIVE_INTEGER_LITERAL("1")
+POSITIVE_INTEGER_LITERAL("12345")
+SHORT_LITERAL("12345s")
+POSITIVE_INTEGER_LITERAL("32767")
+POSITIVE_INTEGER_LITERAL("32678")
+SHORT_LITERAL("65535S")
+NEGATIVE_INTEGER_LITERAL("-0")
+NEGATIVE_INTEGER_LITERAL("-1")
+SHORT_LITERAL("-12345S")
+NEGATIVE_INTEGER_LITERAL("-32767")
+SHORT_LITERAL("-32768s")
+SHORT_LITERAL("-32679s")
+SHORT_LITERAL("-65535s")
+POSITIVE_INTEGER_LITERAL("65536")
+POSITIVE_INTEGER_LITERAL("65600")
+POSITIVE_INTEGER_LITERAL("00")
+POSITIVE_INTEGER_LITERAL("01")
+POSITIVE_INTEGER_LITERAL("012345")
+SHORT_LITERAL("012345s")
+POSITIVE_INTEGER_LITERAL("077777")
+POSITIVE_INTEGER_LITERAL("0100000")
+POSITIVE_INTEGER_LITERAL("0177777")
+NEGATIVE_INTEGER_LITERAL("-00")
+NEGATIVE_INTEGER_LITERAL("-01")
+NEGATIVE_INTEGER_LITERAL("-012345")
+SHORT_LITERAL("-012345S")
+NEGATIVE_INTEGER_LITERAL("-077777")
+NEGATIVE_INTEGER_LITERAL("-0100000")
+NEGATIVE_INTEGER_LITERAL("-0100001")
+NEGATIVE_INTEGER_LITERAL("-0177777")
+POSITIVE_INTEGER_LITERAL("0200000")
\ No newline at end of file
diff --git a/smali/src/test/resources/LexerTest/StringLiteralTest.smali b/smali/src/test/resources/LexerTest/StringLiteralTest.smali
new file mode 100644
index 0000000..d4eaba5
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/StringLiteralTest.smali
@@ -0,0 +1,43 @@
+""
+" "
+"	"
+"	 "
+"aaaaaaaaaaaaaaaaaaaaaaaaaa"
+"\"\"\"\\"
+"abcd1234"
+"abcd	1234"
+"ABCD""ABCD"
+"1234"
+"\n"
+"\r"
+"\t"
+"\b"
+"\f"
+"\u0030"
+"\uABCD"
+"\uabcd"
+"\\"
+"\'"
+"'"
+"\""
+"\n\r\t\b\f\u0030\uABCD\"\\\''\""
+"\uABCD01234"
+"\uABCDEFGHIJK"
+"\u12341234"
+"\\\\\\\\\\\\\\\""
+
+"a"a"
+"\a"
+"
+"
+"
+"\u"
+"\u0"
+"\ua"
+"\uab"
+"\u01a"
+"\uz"
+"\u012z\u\u\u\uz\""
+
+"abcd"
+"
\ No newline at end of file
diff --git a/smali/src/test/resources/LexerTest/StringLiteralTest.tokens b/smali/src/test/resources/LexerTest/StringLiteralTest.tokens
new file mode 100644
index 0000000..474668c
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/StringLiteralTest.tokens
@@ -0,0 +1,43 @@
+STRING_LITERAL("\"\"")
+STRING_LITERAL("\" \"")
+STRING_LITERAL("\"	\"")
+STRING_LITERAL("\"	 \"")
+STRING_LITERAL("\"aaaaaaaaaaaaaaaaaaaaaaaaaa\"")
+STRING_LITERAL("\"\"\"\"\\\"")
+STRING_LITERAL("\"abcd1234\"")
+STRING_LITERAL("\"abcd	1234\"")
+STRING_LITERAL("\"ABCD\"") STRING_LITERAL("\"ABCD\"")
+STRING_LITERAL("\"1234\"")
+STRING_LITERAL("\"\n\"")
+STRING_LITERAL("\"\r\"")
+STRING_LITERAL("\"\t\"")
+STRING_LITERAL("\"\b\"")
+STRING_LITERAL("\"\f\"")
+STRING_LITERAL("\"\u0030\"")
+STRING_LITERAL("\"\uABCD\"")
+STRING_LITERAL("\"\uabcd\"")
+STRING_LITERAL("\"\\\"")
+STRING_LITERAL("\"\'\"")
+STRING_LITERAL("\"'\"")
+STRING_LITERAL("\"\"\"")
+STRING_LITERAL("\"\n\r\t\b\f\u0030\uABCD\"\\\''\"\"")
+STRING_LITERAL("\"\uABCD01234\"")
+STRING_LITERAL("\"\uABCDEFGHIJK\"")
+STRING_LITERAL("\"\u12341234\"")
+STRING_LITERAL("\"\\\\\\\\\\\\\\\"\"")
+
+STRING_LITERAL("\"a\"") SIMPLE_NAME("a") INVALID_TOKEN("\"")
+INVALID_TOKEN("\"\\a\"")
+INVALID_TOKEN("\"")
+INVALID_TOKEN("\"")
+INVALID_TOKEN("\"")
+INVALID_TOKEN("\"\\u\"")
+INVALID_TOKEN("\"\\u0\"")
+INVALID_TOKEN("\"\\ua\"")
+INVALID_TOKEN("\"\\uab\"")
+INVALID_TOKEN("\"\\u01a\"")
+INVALID_TOKEN("\"\\uz\"")
+INVALID_TOKEN("\"\\u012z\\u\\u\\u\\uz\"\"")
+
+STRING_LITERAL("\"abcd\"")
+INVALID_TOKEN("\"")
\ No newline at end of file
diff --git a/smali/src/test/resources/LexerTest/SymbolTest.smali b/smali/src/test/resources/LexerTest/SymbolTest.smali
new file mode 100644
index 0000000..d443a65
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/SymbolTest.smali
@@ -0,0 +1,20 @@
+..
+->
+=
+:
+,
+{}()
+{ } ( )
+{
+}
+(
+)
+@
+ 
+	
+	 
+	  
+	 	
+ 	
+  	
+

\ No newline at end of file
diff --git a/smali/src/test/resources/LexerTest/SymbolTest.tokens b/smali/src/test/resources/LexerTest/SymbolTest.tokens
new file mode 100644
index 0000000..9d967f7
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/SymbolTest.tokens
@@ -0,0 +1,13 @@
+DOTDOT("..") WHITE_SPACE("\n")
+ARROW("->") WHITE_SPACE("\n")
+EQUAL("=") WHITE_SPACE("\n")
+COLON(":") WHITE_SPACE("\n")
+COMMA(",") WHITE_SPACE("\n")
+OPEN_BRACE("{") CLOSE_BRACE("}") OPEN_PAREN("(") CLOSE_PAREN(")") WHITE_SPACE("\n")
+OPEN_BRACE("{") WHITE_SPACE(" ") CLOSE_BRACE("}") WHITE_SPACE(" ") OPEN_PAREN("(") WHITE_SPACE(" ") CLOSE_PAREN(")") WHITE_SPACE("\n")
+OPEN_BRACE("{") WHITE_SPACE("\n")
+CLOSE_BRACE("}") WHITE_SPACE("\n")
+OPEN_PAREN("(") WHITE_SPACE("\n")
+CLOSE_PAREN(")") WHITE_SPACE("\n")
+AT("@")
+WHITE_SPACE("\n \n\t\n\t \n\t  \n\t \t\n \t\n  \t\n\r\r")
\ No newline at end of file
diff --git a/smali/src/test/resources/LexerTest/TypeAndIdentifierTest.smali b/smali/src/test/resources/LexerTest/TypeAndIdentifierTest.smali
new file mode 100644
index 0000000..f4260ea
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/TypeAndIdentifierTest.smali
@@ -0,0 +1,74 @@
+Z
+B
+S
+C
+I
+J
+F
+D
+V
+
+Ljava/lang/String;
+LI;
+LV;
+LI/I/I;
+L`single`;
+L`java`/lang/String;
+L`java`/`lang`/`String`;
+Lspace/test/`20 a0 1680 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 200a 202f 205f 3000 `;
+
+[Z
+[B
+[S
+[C
+[I
+[J
+[F
+[D
+[Ljava/lang/String;
+[L`java`/lang/String;
+[L`spaaaace spaaaace`;
+[L`spaaaace spaaaace`/`spaaaace spaaaace`;
+[LI/I/I;
+[[LI/I/I;
+[[I
+
+IIIII
+ZBSCIJFD
+ILa;[La;[I
+Ljava/lang/String;Ljava/lang/String;
+IIFFIILjava/lang/String;IIFFII
+[I[I[I
+[I[Z
+[I[Ljava/lang/String;
+
+<init>
+<clinit>
+<blah>
+<init->
+
+Ljava/lang/String
+L`java`/lang/String
+L;
+L``;
+L``
+LI
+L[Ljava/lang/String;
+L`[Ljava/lang/String;
+LInvalidCharIn321\`[`;
+
+[
+[V
+[java/lang/String;
+[;
+
+<linit>
+
+III
+
+[I->clone()Ljava/lang/Object;
+
+`this is the quote that never ends
+`simple_name_in_backticks`
+`simple_name_with_spaces_20 a0 1680 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 200a 202f 205f 3000 `
+
diff --git a/smali/src/test/resources/LexerTest/TypeAndIdentifierTest.tokens b/smali/src/test/resources/LexerTest/TypeAndIdentifierTest.tokens
new file mode 100644
index 0000000..52b62ad
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/TypeAndIdentifierTest.tokens
@@ -0,0 +1,143 @@
+PRIMITIVE_TYPE("Z")
+PRIMITIVE_TYPE("B")
+PRIMITIVE_TYPE("S")
+PRIMITIVE_TYPE("C")
+PRIMITIVE_TYPE("I")
+PRIMITIVE_TYPE("J")
+PRIMITIVE_TYPE("F")
+PRIMITIVE_TYPE("D")
+VOID_TYPE("V")
+
+CLASS_DESCRIPTOR("Ljava/lang/String;")
+CLASS_DESCRIPTOR("LI;")
+CLASS_DESCRIPTOR("LV;")
+CLASS_DESCRIPTOR("LI/I/I;")
+CLASS_DESCRIPTOR("Lsingle;")
+CLASS_DESCRIPTOR("Ljava/lang/String;")
+CLASS_DESCRIPTOR("Ljava/lang/String;")
+CLASS_DESCRIPTOR("Lspace/test/20 a0\u00a01680\u16802000\u20002001\u20012002\u20022003\u20032004\u20042005\u20052006\u20062007\u20072008\u20082009\u2009200a\u200a202f\u202f205f\u205f3000\u3000;")
+
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("Z")
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("B")
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("S")
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("C")
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("I")
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("J")
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("F")
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("D")
+ARRAY_TYPE_PREFIX("[")
+CLASS_DESCRIPTOR("Ljava/lang/String;")
+ARRAY_TYPE_PREFIX("[")
+CLASS_DESCRIPTOR("Ljava/lang/String;")
+ARRAY_TYPE_PREFIX("[")
+CLASS_DESCRIPTOR("Lspaaaace spaaaace;")
+ARRAY_TYPE_PREFIX("[")
+CLASS_DESCRIPTOR("Lspaaaace spaaaace/spaaaace spaaaace;")
+ARRAY_TYPE_PREFIX("[")
+CLASS_DESCRIPTOR("LI/I/I;")
+ARRAY_TYPE_PREFIX("[[")
+CLASS_DESCRIPTOR("LI/I/I;")
+ARRAY_TYPE_PREFIX("[[")
+PRIMITIVE_TYPE("I")
+
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("I")
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("I")
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("I")
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("I")
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("I")
+
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("Z")
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("B")
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("S")
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("C")
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("I")
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("J")
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("F")
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("D")
+
+PRIMITIVE_TYPE("I")
+CLASS_DESCRIPTOR("La;")
+ARRAY_TYPE_PREFIX("[")
+CLASS_DESCRIPTOR("La;")
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("I")
+
+CLASS_DESCRIPTOR("Ljava/lang/String;")
+CLASS_DESCRIPTOR("Ljava/lang/String;")
+
+PRIMITIVE_TYPE("I")
+PRIMITIVE_TYPE("I")
+PRIMITIVE_TYPE("F")
+PRIMITIVE_TYPE("F")
+PRIMITIVE_TYPE("I")
+PRIMITIVE_TYPE("I")
+CLASS_DESCRIPTOR("Ljava/lang/String;")
+PRIMITIVE_TYPE("I")
+PRIMITIVE_TYPE("I")
+PRIMITIVE_TYPE("F")
+PRIMITIVE_TYPE("F")
+PRIMITIVE_TYPE("I")
+PRIMITIVE_TYPE("I")
+
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("I")
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("I")
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("I")
+
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("I")
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("Z")
+
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("I")
+ARRAY_TYPE_PREFIX("[")
+CLASS_DESCRIPTOR("Ljava/lang/String;")
+
+MEMBER_NAME("<init>")
+MEMBER_NAME("<clinit>")
+MEMBER_NAME("<blah>")
+MEMBER_NAME("<init->")
+
+SIMPLE_NAME("Ljava") INVALID_TOKEN("/") SIMPLE_NAME("lang") INVALID_TOKEN("/") SIMPLE_NAME("String")
+SIMPLE_NAME("L") SIMPLE_NAME("java") INVALID_TOKEN("/") SIMPLE_NAME("lang") INVALID_TOKEN("/") SIMPLE_NAME("String")
+SIMPLE_NAME("L") INVALID_TOKEN(";")
+SIMPLE_NAME("L") INVALID_TOKEN("`") INVALID_TOKEN("`") INVALID_TOKEN(";")
+SIMPLE_NAME("L") INVALID_TOKEN("`") INVALID_TOKEN("`")
+SIMPLE_NAME("LI")
+SIMPLE_NAME("L") ARRAY_TYPE_PREFIX("[") CLASS_DESCRIPTOR("Ljava/lang/String;")
+SIMPLE_NAME("L") INVALID_TOKEN("`") ARRAY_TYPE_PREFIX("[") CLASS_DESCRIPTOR("Ljava/lang/String;")
+SIMPLE_NAME("LInvalidCharIn321") INVALID_TOKEN("\\") INVALID_TOKEN("`") ARRAY_TYPE_PREFIX("[") INVALID_TOKEN("`") INVALID_TOKEN(";")
+
+ARRAY_TYPE_PREFIX("[")
+ARRAY_TYPE_PREFIX("[") VOID_TYPE("V")
+ARRAY_TYPE_PREFIX("[") SIMPLE_NAME("java") INVALID_TOKEN("/") SIMPLE_NAME("lang") INVALID_TOKEN("/") SIMPLE_NAME("String") INVALID_TOKEN(";")
+ARRAY_TYPE_PREFIX("[") INVALID_TOKEN(";")
+
+MEMBER_NAME("<linit>")
+
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("I")
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("I")
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("I")
+
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("I")
+ARROW("->")
+SIMPLE_NAME("clone")
+OPEN_PAREN("(")
+CLOSE_PAREN(")")
+CLASS_DESCRIPTOR("Ljava/lang/Object;")
+
+INVALID_TOKEN("`") SIMPLE_NAME("this") SIMPLE_NAME("is") SIMPLE_NAME("the") SIMPLE_NAME("quote") SIMPLE_NAME("that") SIMPLE_NAME("never") SIMPLE_NAME("ends")
+SIMPLE_NAME("simple_name_in_backticks")
+SIMPLE_NAME("simple_name_with_spaces_20 a0\u00a01680\u16802000\u20002001\u20012002\u20022003\u20032004\u20042005\u20052006\u20062007\u20072008\u20082009\u2009200a\u200a202f\u202f205f\u205f3000\u3000")
diff --git a/smali/src/test/resources/LexerTest/TypeAndIdentifierTest_api29.smali b/smali/src/test/resources/LexerTest/TypeAndIdentifierTest_api29.smali
new file mode 100644
index 0000000..f4260ea
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/TypeAndIdentifierTest_api29.smali
@@ -0,0 +1,74 @@
+Z
+B
+S
+C
+I
+J
+F
+D
+V
+
+Ljava/lang/String;
+LI;
+LV;
+LI/I/I;
+L`single`;
+L`java`/lang/String;
+L`java`/`lang`/`String`;
+Lspace/test/`20 a0 1680 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 200a 202f 205f 3000 `;
+
+[Z
+[B
+[S
+[C
+[I
+[J
+[F
+[D
+[Ljava/lang/String;
+[L`java`/lang/String;
+[L`spaaaace spaaaace`;
+[L`spaaaace spaaaace`/`spaaaace spaaaace`;
+[LI/I/I;
+[[LI/I/I;
+[[I
+
+IIIII
+ZBSCIJFD
+ILa;[La;[I
+Ljava/lang/String;Ljava/lang/String;
+IIFFIILjava/lang/String;IIFFII
+[I[I[I
+[I[Z
+[I[Ljava/lang/String;
+
+<init>
+<clinit>
+<blah>
+<init->
+
+Ljava/lang/String
+L`java`/lang/String
+L;
+L``;
+L``
+LI
+L[Ljava/lang/String;
+L`[Ljava/lang/String;
+LInvalidCharIn321\`[`;
+
+[
+[V
+[java/lang/String;
+[;
+
+<linit>
+
+III
+
+[I->clone()Ljava/lang/Object;
+
+`this is the quote that never ends
+`simple_name_in_backticks`
+`simple_name_with_spaces_20 a0 1680 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 200a 202f 205f 3000 `
+
diff --git a/smali/src/test/resources/LexerTest/TypeAndIdentifierTest_api29.tokens b/smali/src/test/resources/LexerTest/TypeAndIdentifierTest_api29.tokens
new file mode 100644
index 0000000..69c6dc3
--- /dev/null
+++ b/smali/src/test/resources/LexerTest/TypeAndIdentifierTest_api29.tokens
@@ -0,0 +1,143 @@
+PRIMITIVE_TYPE("Z")
+PRIMITIVE_TYPE("B")
+PRIMITIVE_TYPE("S")
+PRIMITIVE_TYPE("C")
+PRIMITIVE_TYPE("I")
+PRIMITIVE_TYPE("J")
+PRIMITIVE_TYPE("F")
+PRIMITIVE_TYPE("D")
+VOID_TYPE("V")
+
+CLASS_DESCRIPTOR("Ljava/lang/String;")
+CLASS_DESCRIPTOR("LI;")
+CLASS_DESCRIPTOR("LV;")
+CLASS_DESCRIPTOR("LI/I/I;")
+CLASS_DESCRIPTOR("Lsingle;")
+CLASS_DESCRIPTOR("Ljava/lang/String;")
+CLASS_DESCRIPTOR("Ljava/lang/String;")
+INVALID_TOKEN("Lspace/test/20 a0\u00a01680\u16802000\u20002001\u20012002\u20022003\u20032004\u20042005\u20052006\u20062007\u20072008\u20082009\u2009200a\u200a202f\u202f205f\u205f3000\u3000;")
+
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("Z")
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("B")
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("S")
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("C")
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("I")
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("J")
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("F")
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("D")
+ARRAY_TYPE_PREFIX("[")
+CLASS_DESCRIPTOR("Ljava/lang/String;")
+ARRAY_TYPE_PREFIX("[")
+CLASS_DESCRIPTOR("Ljava/lang/String;")
+ARRAY_TYPE_PREFIX("[")
+INVALID_TOKEN("Lspaaaace spaaaace;")
+ARRAY_TYPE_PREFIX("[")
+INVALID_TOKEN("Lspaaaace spaaaace/spaaaace spaaaace;")
+ARRAY_TYPE_PREFIX("[")
+CLASS_DESCRIPTOR("LI/I/I;")
+ARRAY_TYPE_PREFIX("[[")
+CLASS_DESCRIPTOR("LI/I/I;")
+ARRAY_TYPE_PREFIX("[[")
+PRIMITIVE_TYPE("I")
+
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("I")
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("I")
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("I")
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("I")
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("I")
+
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("Z")
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("B")
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("S")
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("C")
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("I")
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("J")
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("F")
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("D")
+
+PRIMITIVE_TYPE("I")
+CLASS_DESCRIPTOR("La;")
+ARRAY_TYPE_PREFIX("[")
+CLASS_DESCRIPTOR("La;")
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("I")
+
+CLASS_DESCRIPTOR("Ljava/lang/String;")
+CLASS_DESCRIPTOR("Ljava/lang/String;")
+
+PRIMITIVE_TYPE("I")
+PRIMITIVE_TYPE("I")
+PRIMITIVE_TYPE("F")
+PRIMITIVE_TYPE("F")
+PRIMITIVE_TYPE("I")
+PRIMITIVE_TYPE("I")
+CLASS_DESCRIPTOR("Ljava/lang/String;")
+PRIMITIVE_TYPE("I")
+PRIMITIVE_TYPE("I")
+PRIMITIVE_TYPE("F")
+PRIMITIVE_TYPE("F")
+PRIMITIVE_TYPE("I")
+PRIMITIVE_TYPE("I")
+
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("I")
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("I")
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("I")
+
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("I")
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("Z")
+
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("I")
+ARRAY_TYPE_PREFIX("[")
+CLASS_DESCRIPTOR("Ljava/lang/String;")
+
+MEMBER_NAME("<init>")
+MEMBER_NAME("<clinit>")
+MEMBER_NAME("<blah>")
+MEMBER_NAME("<init->")
+
+SIMPLE_NAME("Ljava") INVALID_TOKEN("/") SIMPLE_NAME("lang") INVALID_TOKEN("/") SIMPLE_NAME("String")
+SIMPLE_NAME("L") SIMPLE_NAME("java") INVALID_TOKEN("/") SIMPLE_NAME("lang") INVALID_TOKEN("/") SIMPLE_NAME("String")
+SIMPLE_NAME("L") INVALID_TOKEN(";")
+SIMPLE_NAME("L") INVALID_TOKEN("`") INVALID_TOKEN("`") INVALID_TOKEN(";")
+SIMPLE_NAME("L") INVALID_TOKEN("`") INVALID_TOKEN("`")
+SIMPLE_NAME("LI")
+SIMPLE_NAME("L") ARRAY_TYPE_PREFIX("[") CLASS_DESCRIPTOR("Ljava/lang/String;")
+SIMPLE_NAME("L") INVALID_TOKEN("`") ARRAY_TYPE_PREFIX("[") CLASS_DESCRIPTOR("Ljava/lang/String;")
+SIMPLE_NAME("LInvalidCharIn321") INVALID_TOKEN("\\") INVALID_TOKEN("`") ARRAY_TYPE_PREFIX("[") INVALID_TOKEN("`") INVALID_TOKEN(";")
+
+ARRAY_TYPE_PREFIX("[")
+ARRAY_TYPE_PREFIX("[") VOID_TYPE("V")
+ARRAY_TYPE_PREFIX("[") SIMPLE_NAME("java") INVALID_TOKEN("/") SIMPLE_NAME("lang") INVALID_TOKEN("/") SIMPLE_NAME("String") INVALID_TOKEN(";")
+ARRAY_TYPE_PREFIX("[") INVALID_TOKEN(";")
+
+MEMBER_NAME("<linit>")
+
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("I")
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("I")
+PARAM_LIST_OR_ID_PRIMITIVE_TYPE("I")
+
+ARRAY_TYPE_PREFIX("[")
+PRIMITIVE_TYPE("I")
+ARROW("->")
+SIMPLE_NAME("clone")
+OPEN_PAREN("(")
+CLOSE_PAREN(")")
+CLASS_DESCRIPTOR("Ljava/lang/Object;")
+
+INVALID_TOKEN("`") SIMPLE_NAME("this") SIMPLE_NAME("is") SIMPLE_NAME("the") SIMPLE_NAME("quote") SIMPLE_NAME("that") SIMPLE_NAME("never") SIMPLE_NAME("ends")
+SIMPLE_NAME("simple_name_in_backticks")
+SIMPLE_NAME("simple_name_with_spaces_20 a0\u00a01680\u16802000\u20002001\u20012002\u20022003\u20032004\u20042005\u20052006\u20062007\u20072008\u20082009\u2009200a\u200a202f\u202f205f\u205f3000\u3000")
diff --git a/util/build.gradle b/util/build.gradle
new file mode 100644
index 0000000..296e861
--- /dev/null
+++ b/util/build.gradle
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2012, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+dependencies {
+    compile project(':dexlib2')
+    compile depends.findbugs
+    compile depends.guava
+    compile depends.jcommander
+    testCompile depends.junit
+}
+
+uploadArchives {
+    repositories.mavenDeployer {
+        pom.project {
+            description 'This library contains random utilities used by smali/baksmali/dexlib2'
+            scm {
+                url 'https://github.com/JesusFreke/smali/tree/master/util'
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/util/src/main/java/org/jf/util/ClassFileNameHandler.java b/util/src/main/java/org/jf/util/ClassFileNameHandler.java
new file mode 100644
index 0000000..a223d30
--- /dev/null
+++ b/util/src/main/java/org/jf/util/ClassFileNameHandler.java
@@ -0,0 +1,452 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.Multimap;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.*;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.IntBuffer;
+import java.util.Collection;
+import java.util.regex.Pattern;
+
+/**
+ * This class handles the complexities of translating a class name into a file name. i.e. dealing with case insensitive
+ * file systems, windows reserved filenames, class names with extremely long package/class elements, etc.
+ *
+ * The types of transformations this class does include:
+ * - append a '#123' style numeric suffix if 2 physical representations collide
+ * - replace some number of characters in the middle with a '#' character name if an individual path element is too long
+ * - append a '#' if an individual path element would otherwise be considered a reserved filename
+ */
+public class ClassFileNameHandler {
+    private static final int MAX_FILENAME_LENGTH = 255;
+    // How many characters to reserve in the physical filename for numeric suffixes
+    // Dex files can currently only have 64k classes, so 5 digits plus 1 for an '#' should
+    // be sufficient to handle the case when every class has a conflicting name
+    private static final int NUMERIC_SUFFIX_RESERVE = 6;
+
+    private final int NO_VALUE = -1;
+    private final int CASE_INSENSITIVE = 0;
+    private final int CASE_SENSITIVE = 1;
+    private int forcedCaseSensitivity = NO_VALUE;
+
+    private DirectoryEntry top;
+    private String fileExtension;
+    private boolean modifyWindowsReservedFilenames;
+
+    public ClassFileNameHandler(File path, String fileExtension) {
+        this.top = new DirectoryEntry(path);
+        this.fileExtension = fileExtension;
+        this.modifyWindowsReservedFilenames = isWindows();
+    }
+
+    // for testing
+    public ClassFileNameHandler(File path, String fileExtension, boolean caseSensitive,
+                                boolean modifyWindowsReservedFilenames) {
+        this.top = new DirectoryEntry(path);
+        this.fileExtension = fileExtension;
+        this.forcedCaseSensitivity = caseSensitive?CASE_SENSITIVE:CASE_INSENSITIVE;
+        this.modifyWindowsReservedFilenames = modifyWindowsReservedFilenames;
+    }
+
+    private int getMaxFilenameLength() {
+        return MAX_FILENAME_LENGTH - NUMERIC_SUFFIX_RESERVE;
+    }
+
+    public File getUniqueFilenameForClass(String className) {
+        //class names should be passed in the normal dalvik style, with a leading L, a trailing ;, and using
+        //'/' as a separator.
+        if (className.charAt(0) != 'L' || className.charAt(className.length()-1) != ';') {
+            throw new RuntimeException("Not a valid dalvik class name");
+        }
+
+        int packageElementCount = 1;
+        for (int i=1; i<className.length()-1; i++) {
+            if (className.charAt(i) == '/') {
+                packageElementCount++;
+            }
+        }
+
+        String[] packageElements = new String[packageElementCount];
+        int elementIndex = 0;
+        int elementStart = 1;
+        for (int i=1; i<className.length()-1; i++) {
+            if (className.charAt(i) == '/') {
+                //if the first char after the initial L is a '/', or if there are
+                //two consecutive '/'
+                if (i-elementStart==0) {
+                    throw new RuntimeException("Not a valid dalvik class name");
+                }
+
+                packageElements[elementIndex++] = className.substring(elementStart, i);
+                elementStart = ++i;
+            }
+        }
+
+        //at this point, we have added all the package elements to packageElements, but still need to add
+        //the final class name. elementStart should point to the beginning of the class name
+
+        //this will be true if the class ends in a '/', i.e. Lsome/package/className/;
+        if (elementStart >= className.length()-1) {
+            throw new RuntimeException("Not a valid dalvik class name");
+        }
+
+        packageElements[elementIndex] = className.substring(elementStart, className.length()-1);
+
+        return addUniqueChild(top, packageElements, 0);
+    }
+
+    @Nonnull
+    private File addUniqueChild(@Nonnull DirectoryEntry parent, @Nonnull String[] packageElements,
+                                int packageElementIndex) {
+        if (packageElementIndex == packageElements.length - 1) {
+            FileEntry fileEntry = new FileEntry(parent, packageElements[packageElementIndex] + fileExtension);
+            parent.addChild(fileEntry);
+
+            String physicalName = fileEntry.getPhysicalName();
+
+            // the physical name should be set when adding it as a child to the parent
+            assert  physicalName != null;
+
+            return new File(parent.file, physicalName);
+        } else {
+            DirectoryEntry directoryEntry = new DirectoryEntry(parent, packageElements[packageElementIndex]);
+            directoryEntry = (DirectoryEntry)parent.addChild(directoryEntry);
+            return addUniqueChild(directoryEntry, packageElements, packageElementIndex+1);
+        }
+    }
+
+    private static int utf8Length(String str) {
+        int utf8Length = 0;
+        int i=0;
+        while (i<str.length()) {
+            int c = str.codePointAt(i);
+            utf8Length += utf8Length(c);
+            i += Character.charCount(c);
+        }
+        return utf8Length;
+    }
+
+    private static int utf8Length(int codePoint) {
+        if (codePoint < 0x80) {
+            return 1;
+        } else if (codePoint < 0x800) {
+            return 2;
+        } else if (codePoint < 0x10000) {
+            return 3;
+        } else {
+            return 4;
+        }
+    }
+
+    /**
+     * Shortens an individual file/directory name, removing the necessary number of code points
+     * from the middle of the string such that the utf-8 encoding of the string is at least
+     * bytesToRemove bytes shorter than the original.
+     *
+     * The removed codePoints in the middle of the string will be replaced with a # character.
+     */
+    @Nonnull
+    static String shortenPathComponent(@Nonnull String pathComponent, int bytesToRemove) {
+        // We replace the removed part with a #, so we need to remove 1 extra char
+        bytesToRemove++;
+
+        int[] codePoints;
+        try {
+            IntBuffer intBuffer = ByteBuffer.wrap(pathComponent.getBytes("UTF-32BE")).asIntBuffer();
+            codePoints = new int[intBuffer.limit()];
+            intBuffer.get(codePoints);
+        } catch (UnsupportedEncodingException ex) {
+            throw new RuntimeException(ex);
+        }
+
+        int midPoint = codePoints.length/2;
+
+        int firstEnd = midPoint; // exclusive
+        int secondStart = midPoint+1; // inclusive
+        int bytesRemoved = utf8Length(codePoints[midPoint]);
+
+        // if we have an even number of codepoints, start by removing both middle characters,
+        // unless just removing the first already removes enough bytes
+        if (((codePoints.length % 2) == 0) && bytesRemoved < bytesToRemove) {
+            bytesRemoved += utf8Length(codePoints[secondStart]);
+            secondStart++;
+        }
+
+        while ((bytesRemoved < bytesToRemove) &&
+                (firstEnd > 0 || secondStart < codePoints.length)) {
+            if (firstEnd > 0) {
+                firstEnd--;
+                bytesRemoved += utf8Length(codePoints[firstEnd]);
+            }
+
+            if (bytesRemoved < bytesToRemove && secondStart < codePoints.length) {
+                bytesRemoved += utf8Length(codePoints[secondStart]);
+                secondStart++;
+            }
+        }
+
+        StringBuilder sb = new StringBuilder();
+        for (int i=0; i<firstEnd; i++) {
+            sb.appendCodePoint(codePoints[i]);
+        }
+        sb.append('#');
+        for (int i=secondStart; i<codePoints.length; i++) {
+            sb.appendCodePoint(codePoints[i]);
+        }
+
+        return sb.toString();
+    }
+
+    private static boolean isWindows() {
+        return System.getProperty("os.name").startsWith("Windows");
+    }
+
+    private static Pattern reservedFileNameRegex = Pattern.compile("^(CON|PRN|AUX|NUL|COM[1-9]|LPT[1-9])(\\..*)?$",
+            Pattern.CASE_INSENSITIVE);
+    private static boolean isReservedFileName(String className) {
+        return reservedFileNameRegex.matcher(className).matches();
+    }
+
+    private abstract class FileSystemEntry {
+        @Nullable public final DirectoryEntry parent;
+        @Nonnull public final String logicalName;
+        @Nullable protected String physicalName = null;
+
+        private FileSystemEntry(@Nullable DirectoryEntry parent, @Nonnull String logicalName) {
+            this.parent = parent;
+            this.logicalName = logicalName;
+        }
+
+        @Nonnull public String getNormalizedName(boolean preserveCase) {
+            String elementName = logicalName;
+            if (!preserveCase && parent != null && !parent.isCaseSensitive()) {
+                elementName = elementName.toLowerCase();
+            }
+
+            if (modifyWindowsReservedFilenames && isReservedFileName(elementName)) {
+                elementName = addSuffixBeforeExtension(elementName, "#");
+            }
+
+            int utf8Length = utf8Length(elementName);
+            if (utf8Length > getMaxFilenameLength()) {
+                elementName = shortenPathComponent(elementName, utf8Length - getMaxFilenameLength());
+            }
+            return elementName;
+        }
+
+        @Nullable
+        public String getPhysicalName() {
+            return physicalName;
+        }
+
+        public void setSuffix(int suffix) {
+            if (suffix < 0 || suffix > 99999) {
+                throw new IllegalArgumentException("suffix must be in [0, 100000)");
+            }
+
+            if (this.physicalName != null) {
+                throw new IllegalStateException("The suffix can only be set once");
+            }
+            this.physicalName = makePhysicalName(suffix);
+        }
+
+        protected abstract String makePhysicalName(int suffix);
+    }
+
+    private class DirectoryEntry extends FileSystemEntry {
+        @Nullable private File file = null;
+        private int caseSensitivity = forcedCaseSensitivity;
+
+        // maps a normalized (but not suffixed) entry name to 1 or more FileSystemEntries.
+        // Each FileSystemEntry asociated with a normalized entry name must have a distinct
+        // physical name
+        private final Multimap<String, FileSystemEntry> children = ArrayListMultimap.create();
+
+        public DirectoryEntry(@Nonnull File path) {
+            super(null, path.getName());
+            file = path;
+            physicalName = file.getName();
+        }
+
+        public DirectoryEntry(@Nullable DirectoryEntry parent, @Nonnull String logicalName) {
+            super(parent, logicalName);
+        }
+
+        public synchronized FileSystemEntry addChild(FileSystemEntry entry) {
+            String normalizedChildName = entry.getNormalizedName(false);
+            Collection<FileSystemEntry> entries = children.get(normalizedChildName);
+            if (entry instanceof DirectoryEntry) {
+                for (FileSystemEntry childEntry: entries) {
+                    if (childEntry.logicalName.equals(entry.logicalName)) {
+                        return childEntry;
+                    }
+                }
+            }
+            entry.setSuffix(entries.size());
+            entries.add(entry);
+            return entry;
+        }
+
+        @Override
+        protected String makePhysicalName(int suffix) {
+            if (suffix > 0) {
+                return getNormalizedName(true) + "." + Integer.toString(suffix);
+            }
+            return getNormalizedName(true);
+        }
+
+        @Override
+        public void setSuffix(int suffix) {
+            super.setSuffix(suffix);
+            String physicalName = getPhysicalName();
+            if (parent != null && physicalName != null) {
+                file = new File(parent.file, physicalName);
+            }
+        }
+
+        protected boolean isCaseSensitive() {
+            if (getPhysicalName() == null || file == null) {
+                throw new IllegalStateException("Must call setSuffix() first");
+            }
+
+            if (caseSensitivity != NO_VALUE) {
+                return caseSensitivity == CASE_SENSITIVE;
+            }
+
+            File path = file;
+            if (path.exists() && path.isFile()) {
+                if (!path.delete()) {
+                    throw new ExceptionWithContext("Can't delete %s to make it into a directory",
+                            path.getAbsolutePath());
+                }
+            }
+
+            if (!path.exists() && !path.mkdirs()) {
+                throw new ExceptionWithContext("Couldn't create directory %s", path.getAbsolutePath());
+            }
+
+            try {
+                boolean result = testCaseSensitivity(path);
+                caseSensitivity = result?CASE_SENSITIVE:CASE_INSENSITIVE;
+                return result;
+            } catch (IOException ex) {
+                return false;
+            }
+        }
+
+        private boolean testCaseSensitivity(File path) throws IOException {
+            int num = 1;
+            File f, f2;
+            do {
+                f = new File(path, "test." + num);
+                f2 = new File(path, "TEST." + num++);
+            } while(f.exists() || f2.exists());
+
+            try {
+                try {
+                    FileWriter writer = new FileWriter(f);
+                    writer.write("test");
+                    writer.flush();
+                    writer.close();
+                } catch (IOException ex) {
+                    try {f.delete();} catch (Exception ex2) {}
+                    throw ex;
+                }
+
+                if (f2.exists()) {
+                    return false;
+                }
+
+                if (f2.createNewFile()) {
+                    return true;
+                }
+
+                //the above 2 tests should catch almost all cases. But maybe there was a failure while creating f2
+                //that isn't related to case sensitivity. Let's see if we can open the file we just created using
+                //f2
+                try {
+                    CharBuffer buf = CharBuffer.allocate(32);
+                    FileReader reader = new FileReader(f2);
+
+                    while (reader.read(buf) != -1 && buf.length() < 4);
+                    if (buf.length() == 4 && buf.toString().equals("test")) {
+                        return false;
+                    } else {
+                        //we probably shouldn't get here. If the filesystem was case-sensetive, creating a new
+                        //FileReader should have thrown a FileNotFoundException. Otherwise, we should have opened
+                        //the file and read in the string "test". It's remotely possible that someone else modified
+                        //the file after we created it. Let's be safe and return false here as well
+                        assert(false);
+                        return false;
+                    }
+                } catch (FileNotFoundException ex) {
+                    return true;
+                }
+            } finally {
+                try { f.delete(); } catch (Exception ex) {}
+                try { f2.delete(); } catch (Exception ex) {}
+            }
+        }
+    }
+
+    private class FileEntry extends FileSystemEntry {
+        private FileEntry(@Nullable DirectoryEntry parent, @Nonnull String logicalName) {
+            super(parent, logicalName);
+        }
+
+        @Override
+        protected String makePhysicalName(int suffix) {
+            if (suffix > 0) {
+                return addSuffixBeforeExtension(getNormalizedName(true), '.' + Integer.toString(suffix));
+            }
+            return getNormalizedName(true);
+        }
+    }
+
+    private static String addSuffixBeforeExtension(String pathElement, String suffix) {
+        int extensionStart = pathElement.lastIndexOf('.');
+
+        StringBuilder newName = new StringBuilder(pathElement.length() + suffix.length() + 1);
+        if (extensionStart < 0) {
+            newName.append(pathElement);
+            newName.append(suffix);
+        } else {
+            newName.append(pathElement.subSequence(0, extensionStart));
+            newName.append(suffix);
+            newName.append(pathElement.subSequence(extensionStart, pathElement.length()));
+        }
+        return newName.toString();
+    }
+}
diff --git a/util/src/main/java/org/jf/util/ConsoleUtil.java b/util/src/main/java/org/jf/util/ConsoleUtil.java
new file mode 100644
index 0000000..21e5567
--- /dev/null
+++ b/util/src/main/java/org/jf/util/ConsoleUtil.java
@@ -0,0 +1,110 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.jf.util;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class ConsoleUtil {
+    /**
+     * Attempt to find the width of the console. If it can't get the width, return a default of 80
+     * @return The current console width
+     */
+    public static int getConsoleWidth() {
+        if (System.getProperty("os.name").toLowerCase().contains("windows")) {
+            try {
+                return attemptMode();
+            } catch (Exception ex) {
+            }
+        } else {
+            try {
+                return attemptStty();
+            } catch (Exception ex) {
+            }
+        }
+
+        return 80;
+    }
+
+    private static int attemptStty() {
+        String output = attemptCommand(new String[]{"sh", "-c", "stty size < /dev/tty"});
+        if (output == null) {
+            return 80;
+        }
+
+        String[] vals = output.split(" ");
+        if (vals.length < 2) {
+            return 80;
+        }
+        return Integer.parseInt(vals[1]);
+    }
+
+    private static int attemptMode() {
+        String output = attemptCommand(new String[]{"mode", "con"});
+        if (output == null) {
+            return 80;
+        }
+
+        Pattern pattern = Pattern.compile("Columns:[ \t]*(\\d+)");
+        Matcher m = pattern.matcher(output);
+        if (!m.find()) {
+            return 80;
+        }
+
+        return Integer.parseInt(m.group(1));
+    }
+
+    private static String attemptCommand(String[] command) {
+        StringBuffer buffer = null;
+
+        try {
+
+            Process p = Runtime.getRuntime().exec(command);
+            BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
+
+            String line;
+
+            while ((line = reader.readLine()) != null) {
+                if (buffer == null) {
+                    buffer = new StringBuffer();
+                }
+
+                buffer.append(line);
+            }
+
+            if (buffer != null) {
+                return buffer.toString();
+            }
+            return null;
+        } catch (Exception ex) {
+            return null;
+        }
+    }
+}
diff --git a/util/src/main/java/org/jf/util/LinearSearch.java b/util/src/main/java/org/jf/util/LinearSearch.java
new file mode 100644
index 0000000..3433655
--- /dev/null
+++ b/util/src/main/java/org/jf/util/LinearSearch.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+import java.util.Comparator;
+import java.util.List;
+
+public class LinearSearch {
+    /**
+     * Performs a linear search in a sorted list for key, starting at initialGuess
+     *
+     * @param list The sorted list to search
+     * @param comparator The comparator to use
+     * @param key The key to search for
+     * @param initialGuess An initial guess of the location.
+     * @return If found, the index of the item. If not found, -return + 1 is the index at which the item would be
+     *         inserted
+     */
+    public static <T> int linearSearch(List<? extends T> list, Comparator<T> comparator, T key, int initialGuess) {
+        int guess = initialGuess;
+        if (guess >= list.size()) {
+            guess = list.size()-1;
+        }
+        int comparison = comparator.compare(list.get(guess), key);
+        if (comparison == 0) {
+            return guess;
+        }
+        if (comparison < 0) {
+            guess++;
+            while (guess < list.size()) {
+                comparison = comparator.compare(list.get(guess), key);
+                if (comparison == 0) {
+                    return guess;
+                }
+                if (comparison > 0) {
+                    return -(guess+1);
+                }
+                guess++;
+            }
+            return -(list.size()+1);
+        } else {
+            guess--;
+            while (guess >= 0) {
+                comparison = comparator.compare(list.get(guess), key);
+                if (comparison == 0) {
+                    return guess;
+                }
+                if (comparison < 0) {
+                    return -(guess+2);
+                }
+                guess--;
+            }
+            return -1;
+        }
+    }
+}
diff --git a/util/src/main/java/org/jf/util/PathUtil.java b/util/src/main/java/org/jf/util/PathUtil.java
new file mode 100644
index 0000000..9ba9f30
--- /dev/null
+++ b/util/src/main/java/org/jf/util/PathUtil.java
@@ -0,0 +1,118 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+import com.google.common.collect.Lists;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+public class PathUtil {
+    private PathUtil() {
+    }
+
+    public static File getRelativeFile(File baseFile, File fileToRelativize) throws IOException {
+        if (baseFile.isFile()) {
+            baseFile = baseFile.getParentFile();
+        }
+
+        return new File(getRelativeFileInternal(baseFile.getCanonicalFile(), fileToRelativize.getCanonicalFile()));
+    }
+
+    static String getRelativeFileInternal(File canonicalBaseFile, File canonicalFileToRelativize) {
+        List<String> basePath = getPathComponents(canonicalBaseFile);
+        List<String> pathToRelativize = getPathComponents(canonicalFileToRelativize);
+
+        //if the roots aren't the same (i.e. different drives on a windows machine), we can't construct a relative
+        //path from one to the other, so just return the canonical file
+        if (!basePath.get(0).equals(pathToRelativize.get(0))) {
+            return canonicalFileToRelativize.getPath();
+        }
+
+        int commonDirs;
+        StringBuilder sb = new StringBuilder();
+
+        for (commonDirs=1; commonDirs<basePath.size() && commonDirs<pathToRelativize.size(); commonDirs++) {
+            if (!basePath.get(commonDirs).equals(pathToRelativize.get(commonDirs))) {
+                break;
+            }
+        }
+
+        boolean first = true;
+        for (int i=commonDirs; i<basePath.size(); i++) {
+            if (!first) {
+                sb.append(File.separatorChar);
+            } else {
+                first = false;
+            }
+
+            sb.append("..");
+        }
+
+        first = true;
+        for (int i=commonDirs; i<pathToRelativize.size(); i++) {
+            if (first) {
+                if (sb.length() != 0) {
+                    sb.append(File.separatorChar);
+                }
+                first = false;
+            } else {
+                sb.append(File.separatorChar);
+            }
+            
+            sb.append(pathToRelativize.get(i));
+        }
+
+        if (sb.length() == 0) {
+            return ".";
+        }
+
+        return sb.toString();
+    }
+
+    private static List<String> getPathComponents(File file) {
+        ArrayList<String> path = new ArrayList<String>();
+
+        while (file != null) {
+            File parentFile = file.getParentFile();
+
+            if (parentFile == null) {
+                path.add(file.getPath());
+            } else {
+                path.add(file.getName());
+            }
+
+            file = parentFile;
+        }
+
+        return Lists.reverse(path);
+    }
+}
diff --git a/util/src/main/java/org/jf/util/jcommander/ColonParameterSplitter.java b/util/src/main/java/org/jf/util/jcommander/ColonParameterSplitter.java
new file mode 100644
index 0000000..eb628af
--- /dev/null
+++ b/util/src/main/java/org/jf/util/jcommander/ColonParameterSplitter.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util.jcommander;
+
+import com.beust.jcommander.converters.IParameterSplitter;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * A JCommander parameter splitter that splits a parameter value by colon
+ */
+public class ColonParameterSplitter implements IParameterSplitter {
+    @Override
+    public List<String> split(String value) {
+        return Arrays.asList(value.split(":"));
+    }
+}
diff --git a/util/src/main/java/org/jf/util/jcommander/Command.java b/util/src/main/java/org/jf/util/jcommander/Command.java
new file mode 100644
index 0000000..8fac0fa
--- /dev/null
+++ b/util/src/main/java/org/jf/util/jcommander/Command.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util.jcommander;
+
+import com.beust.jcommander.JCommander;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import org.jf.util.ConsoleUtil;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+public abstract class Command {
+
+    @Nonnull
+    protected final List<JCommander> commandAncestors;
+
+    public Command(@Nonnull List<JCommander> commandAncestors) {
+        this.commandAncestors = commandAncestors;
+    }
+
+    public void usage() {
+        System.out.println(new HelpFormatter()
+                .width(ConsoleUtil.getConsoleWidth())
+                .format(getCommandHierarchy()));
+    }
+
+    protected void setupCommand(JCommander jc) {
+    }
+
+    protected JCommander getJCommander() {
+        JCommander parentJc = Iterables.getLast(commandAncestors);
+        return parentJc.getCommands().get(this.getClass().getAnnotation(ExtendedParameters.class).commandName());
+    }
+
+    public List<JCommander> getCommandHierarchy() {
+        List<JCommander> commandHierarchy = Lists.newArrayList(commandAncestors);
+        commandHierarchy.add(getJCommander());
+        return commandHierarchy;
+    }
+
+    public abstract void run();
+}
diff --git a/util/src/main/java/org/jf/util/jcommander/ExtendedCommands.java b/util/src/main/java/org/jf/util/jcommander/ExtendedCommands.java
new file mode 100644
index 0000000..209d94e
--- /dev/null
+++ b/util/src/main/java/org/jf/util/jcommander/ExtendedCommands.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util.jcommander;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.ParameterDescription;
+import com.beust.jcommander.Parameterized;
+import com.beust.jcommander.Parameters;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.lang.reflect.Field;
+
+/**
+ * Utilities related to "extended" commands - JCommander commands with additional information
+ */
+public class ExtendedCommands {
+
+    @Nonnull
+    private static ExtendedParameters getExtendedParameters(Object command) {
+        ExtendedParameters anno = command.getClass().getAnnotation(ExtendedParameters.class);
+        if (anno == null) {
+            throw new IllegalStateException("All extended commands should have an ExtendedParameters annotation: " +
+                    command.getClass().getCanonicalName());
+        }
+        return anno;
+    }
+
+    @Nonnull
+    public static String commandName(JCommander jc) {
+        return getExtendedParameters(jc.getObjects().get(0)).commandName();
+    }
+
+    @Nonnull
+    public static String commandName(Object command) {
+        return getExtendedParameters(command).commandName();
+    }
+
+    @Nonnull
+    public static String[] commandAliases(JCommander jc) {
+        return commandAliases(jc.getObjects().get(0));
+    }
+
+    @Nonnull
+    public static String[] commandAliases(Object command) {
+        return getExtendedParameters(command).commandAliases();
+    }
+
+    public static boolean includeParametersInUsage(JCommander jc) {
+        return includeParametersInUsage(jc.getObjects().get(0));
+    }
+
+    public static boolean includeParametersInUsage(Object command) {
+        return getExtendedParameters(command).includeParametersInUsage();
+    }
+
+    @Nonnull
+    public static String postfixDescription(JCommander jc) {
+        return postfixDescription(jc.getObjects().get(0));
+    }
+
+    @Nonnull
+    public static String postfixDescription(Object command) {
+        return getExtendedParameters(command).postfixDescription();
+    }
+
+    public static void addExtendedCommand(JCommander jc, Command command) {
+        jc.addCommand(commandName(command), command, commandAliases(command));
+        command.setupCommand(command.getJCommander());
+    }
+
+    @Nonnull
+    public static String[] parameterArgumentNames(ParameterDescription parameterDescription) {
+        Parameterized parameterized = parameterDescription.getParameterized();
+
+        Class cls = parameterDescription.getObject().getClass();
+        Field field = null;
+        while (cls != Object.class) {
+            try {
+                field = cls.getDeclaredField(parameterized.getName());
+            } catch (NoSuchFieldException ex) {
+                cls = cls.getSuperclass();
+                continue;
+            }
+            break;
+        }
+
+        assert field != null;
+        ExtendedParameter extendedParameter = field.getAnnotation(ExtendedParameter.class);
+        if (extendedParameter != null) {
+            return extendedParameter.argumentNames();
+        }
+
+        return new String[0];
+    }
+
+    @Nullable
+    public static JCommander getSubcommand(JCommander jc, String commandName) {
+        if (jc.getCommands().containsKey(commandName)) {
+            return jc.getCommands().get(commandName);
+        } else {
+            for (JCommander command : jc.getCommands().values()) {
+                for (String alias: commandAliases(command)) {
+                    if (commandName.equals(alias)) {
+                        return command;
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
+    @Nullable
+    public static String getCommandDescription(@Nonnull JCommander jc) {
+        Parameters parameters = jc.getObjects().get(0).getClass().getAnnotation(Parameters.class);
+        if (parameters == null) {
+            return null;
+        }
+        return parameters.commandDescription();
+    }
+}
diff --git a/util/src/main/java/org/jf/util/jcommander/ExtendedParameter.java b/util/src/main/java/org/jf/util/jcommander/ExtendedParameter.java
new file mode 100644
index 0000000..81f78c2
--- /dev/null
+++ b/util/src/main/java/org/jf/util/jcommander/ExtendedParameter.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util.jcommander;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ExtendedParameter {
+    String[] argumentNames();
+}
diff --git a/util/src/main/java/org/jf/util/jcommander/ExtendedParameters.java b/util/src/main/java/org/jf/util/jcommander/ExtendedParameters.java
new file mode 100644
index 0000000..965d2b2
--- /dev/null
+++ b/util/src/main/java/org/jf/util/jcommander/ExtendedParameters.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util.jcommander;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ExtendedParameters {
+    boolean includeParametersInUsage() default false;
+    String commandName();
+    String[] commandAliases() default { };
+    String postfixDescription() default "";
+}
diff --git a/util/src/main/java/org/jf/util/jcommander/HelpFormatter.java b/util/src/main/java/org/jf/util/jcommander/HelpFormatter.java
new file mode 100644
index 0000000..662167e
--- /dev/null
+++ b/util/src/main/java/org/jf/util/jcommander/HelpFormatter.java
@@ -0,0 +1,316 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util.jcommander;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.ParameterDescription;
+import com.beust.jcommander.Parameters;
+import com.google.common.base.Joiner;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import org.jf.util.WrappedIndentingWriter;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map.Entry;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class HelpFormatter {
+
+    private int width = 80;
+
+    @Nonnull
+    public HelpFormatter width(int width) {
+        this.width = width;
+        return this;
+    }
+
+    @Nonnull
+    private static ExtendedParameters getExtendedParameters(JCommander jc) {
+        ExtendedParameters anno = jc.getObjects().get(0).getClass().getAnnotation(ExtendedParameters.class);
+        if (anno == null) {
+            throw new IllegalStateException("All commands should have an ExtendedParameters annotation");
+        }
+        return anno;
+    }
+
+    @Nonnull
+    private static List<String> getCommandAliases(JCommander jc) {
+        return Lists.newArrayList(getExtendedParameters(jc).commandAliases());
+    }
+
+    private static boolean includeParametersInUsage(@Nonnull JCommander jc) {
+        return getExtendedParameters(jc).includeParametersInUsage();
+    }
+
+    @Nonnull
+    private static String getPostfixDescription(@Nonnull JCommander jc) {
+        return getExtendedParameters(jc).postfixDescription();
+    }
+
+    private int getParameterArity(ParameterDescription param) {
+        if (param.getParameter().arity() > 0) {
+            return param.getParameter().arity();
+        }
+        Class<?> type = param.getParameterized().getType();
+        if ((type == boolean.class || type == Boolean.class)) {
+            return 0;
+        }
+        return 1;
+    }
+
+    private List<ParameterDescription> getSortedParameters(JCommander jc) {
+        List<ParameterDescription> parameters = Lists.newArrayList(jc.getParameters());
+
+        final Pattern pattern = Pattern.compile("^-*(.*)$");
+
+        Collections.sort(parameters, new Comparator<ParameterDescription>() {
+            @Override public int compare(ParameterDescription o1, ParameterDescription o2) {
+                String s1;
+                Matcher matcher = pattern.matcher(o1.getParameter().names()[0]);
+                if (matcher.matches()) {
+                    s1 = matcher.group(1);
+                } else {
+                    throw new IllegalStateException();
+                }
+
+                String s2;
+                matcher = pattern.matcher(o2.getParameter().names()[0]);
+                if (matcher.matches()) {
+                    s2 = matcher.group(1);
+                } else {
+                    throw new IllegalStateException();
+                }
+
+                return s1.compareTo(s2);
+            }
+        });
+        return parameters;
+    }
+
+    @Nonnull
+    public String format(@Nonnull JCommander... jc) {
+        return format(Arrays.asList(jc));
+    }
+
+    @Nonnull
+    public String format(@Nonnull List<JCommander> commandHierarchy) {
+        try {
+            StringWriter stringWriter = new StringWriter();
+            WrappedIndentingWriter writer = new WrappedIndentingWriter(stringWriter, width - 5, width);
+
+            JCommander leafJc = Iterables.getLast(commandHierarchy);
+
+            writer.write("usage:");
+            writer.indent(2);
+
+            for (JCommander jc: commandHierarchy) {
+                writer.write(" ");
+                writer.write(ExtendedCommands.commandName(jc));
+            }
+
+            if (includeParametersInUsage(leafJc)) {
+                for (ParameterDescription param : leafJc.getParameters()) {
+                    if (!param.getParameter().hidden()) {
+                        writer.write(" [");
+                        writer.write(param.getParameter().getParameter().names()[0]);
+                        writer.write("]");
+                    }
+                }
+            } else {
+                if (!leafJc.getParameters().isEmpty()) {
+                    writer.write(" [<options>]");
+                }
+            }
+
+            if (!leafJc.getCommands().isEmpty()) {
+                writer.write(" [<command [<args>]]");
+            }
+
+            if (leafJc.getMainParameter() != null) {
+                String[] argumentNames = ExtendedCommands.parameterArgumentNames(leafJc.getMainParameter());
+                if (argumentNames.length == 0) {
+                    writer.write(" <args>");
+                } else {
+                    String argumentName = argumentNames[0];
+                    boolean writeAngleBrackets = !argumentName.startsWith("<") && !argumentName.startsWith("[");
+                    writer.write(" ");
+                    if (writeAngleBrackets) {
+                        writer.write("<");
+                    }
+                    writer.write(argumentNames[0]);
+                    if (writeAngleBrackets) {
+                        writer.write(">");
+                    }
+                }
+            }
+
+            writer.deindent(2);
+
+            String commandDescription = ExtendedCommands.getCommandDescription(leafJc);
+            if (commandDescription != null) {
+                writer.write("\n");
+                writer.write(commandDescription);
+            }
+
+            if (!leafJc.getParameters().isEmpty() || leafJc.getMainParameter() != null) {
+                writer.write("\n\nOptions:");
+                writer.indent(2);
+                for (ParameterDescription param : getSortedParameters(leafJc)) {
+                    if (!param.getParameter().hidden()) {
+                        writer.write("\n");
+                        writer.indent(4);
+                        if (!param.getNames().isEmpty()) {
+                            writer.write(Joiner.on(',').join(param.getParameter().names()));
+                        }
+                        if (getParameterArity(param) > 0) {
+                            String[] argumentNames = ExtendedCommands.parameterArgumentNames(param);
+                            for (int i = 0; i < getParameterArity(param); i++) {
+                                writer.write(" ");
+                                if (i < argumentNames.length) {
+                                    writer.write("<");
+                                    writer.write(argumentNames[i]);
+                                    writer.write(">");
+                                } else {
+                                    writer.write("<arg>");
+                                }
+                            }
+                        }
+                        if (param.getDescription() != null && !param.getDescription().isEmpty()) {
+                            writer.write(" - ");
+                            writer.write(param.getDescription());
+                        }
+                        if (param.getDefault() != null) {
+                            String defaultValue = null;
+                            if (param.getParameterized().getType() == Boolean.class ||
+                                    param.getParameterized().getType() == Boolean.TYPE) {
+                                if ((Boolean)param.getDefault()) {
+                                    defaultValue = "True";
+                                }
+                            } else if (List.class.isAssignableFrom(param.getParameterized().getType())) {
+                                if (!((List)param.getDefault()).isEmpty()) {
+                                    defaultValue = param.getDefault().toString();
+                                }
+                            } else {
+                                defaultValue = param.getDefault().toString();
+                            }
+                            if (defaultValue != null) {
+                                writer.write(" (default: ");
+                                writer.write(defaultValue);
+                                writer.write(")");
+                            }
+                        }
+                        writer.deindent(4);
+                    }
+                }
+
+                if (leafJc.getMainParameter() != null) {
+                    String[] argumentNames = ExtendedCommands.parameterArgumentNames(leafJc.getMainParameter());
+                    writer.write("\n");
+                    writer.indent(4);
+                    if (argumentNames.length > 0) {
+                        writer.write("<");
+                        writer.write(argumentNames[0]);
+                        writer.write(">");
+                    } else {
+                        writer.write("<args>");
+                    }
+
+                    if (leafJc.getMainParameterDescription() != null) {
+                        writer.write(" - ");
+                        writer.write(leafJc.getMainParameterDescription());
+                    }
+                    writer.deindent(4);
+                }
+                writer.deindent(2);
+            }
+
+            if (!leafJc.getCommands().isEmpty()) {
+                writer.write("\n\nCommands:");
+                writer.indent(2);
+
+
+                List<Entry<String, JCommander>> entryList = Lists.newArrayList(leafJc.getCommands().entrySet());
+                Collections.sort(entryList, new Comparator<Entry<String, JCommander>>() {
+                    @Override public int compare(Entry<String, JCommander> o1, Entry<String, JCommander> o2) {
+                        return o1.getKey().compareTo(o2.getKey());
+                    }
+                });
+
+                for (Entry<String, JCommander> entry : entryList) {
+                    String commandName = entry.getKey();
+                    JCommander command = entry.getValue();
+
+                    Object arg = command.getObjects().get(0);
+                    Parameters parametersAnno = arg.getClass().getAnnotation(Parameters.class);
+                    if (!parametersAnno.hidden()) {
+                        writer.write("\n");
+                        writer.indent(4);
+                        writer.write(commandName);
+                        List<String> aliases = getCommandAliases(command);
+                        if (!aliases.isEmpty()) {
+                            writer.write("(");
+                            writer.write(Joiner.on(',').join(aliases));
+                            writer.write(")");
+                        }
+
+                        String commandDesc = leafJc.getCommandDescription(commandName);
+                        if (commandDesc != null) {
+                            writer.write(" - ");
+                            writer.write(commandDesc);
+                        }
+                        writer.deindent(4);
+                    }
+                }
+                writer.deindent(2);
+            }
+
+            String postfixDescription = getPostfixDescription(leafJc);
+            if (!postfixDescription.isEmpty()) {
+                writer.write("\n\n");
+                writer.write(postfixDescription);
+            }
+
+            writer.flush();
+
+            return stringWriter.getBuffer().toString();
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+}
diff --git a/util/src/test/java/org/jf/util/ClassFileNameHandlerTest.java b/util/src/test/java/org/jf/util/ClassFileNameHandlerTest.java
new file mode 100644
index 0000000..125fbd2
--- /dev/null
+++ b/util/src/test/java/org/jf/util/ClassFileNameHandlerTest.java
@@ -0,0 +1,245 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+import com.google.common.base.Strings;
+import com.google.common.io.Files;
+import junit.framework.Assert;
+import org.junit.Test;
+
+import java.io.File;
+import java.nio.charset.Charset;
+
+public class ClassFileNameHandlerTest {
+    private final Charset UTF8 = Charset.forName("UTF-8");
+
+    @Test
+    public void test1ByteEncodings() {
+        StringBuilder sb = new StringBuilder();
+        for (int i=0; i<100; i++) {
+            sb.append((char)i);
+        }
+
+        String result = ClassFileNameHandler.shortenPathComponent(sb.toString(), 5);
+        Assert.assertEquals(95, result.getBytes(UTF8).length);
+        Assert.assertEquals(95, result.length());
+    }
+
+    @Test
+    public void test2ByteEncodings() {
+        StringBuilder sb = new StringBuilder();
+        for (int i=0x80; i<0x80+100; i++) {
+            sb.append((char)i);
+        }
+
+        // remove a total of 3 2-byte characters, and then add back in the 1-byte '#'
+        String result = ClassFileNameHandler.shortenPathComponent(sb.toString(), 4);
+        Assert.assertEquals(200, sb.toString().getBytes(UTF8).length);
+        Assert.assertEquals(195, result.getBytes(UTF8).length);
+        Assert.assertEquals(98, result.length());
+
+        // remove a total of 3 2-byte characters, and then add back in the 1-byte '#'
+        result = ClassFileNameHandler.shortenPathComponent(sb.toString(), 5);
+        Assert.assertEquals(200, sb.toString().getBytes(UTF8).length);
+        Assert.assertEquals(195, result.getBytes(UTF8).length);
+        Assert.assertEquals(98, result.length());
+    }
+
+    @Test
+    public void test3ByteEncodings() {
+        StringBuilder sb = new StringBuilder();
+        for (int i=0x800; i<0x800+100; i++) {
+            sb.append((char)i);
+        }
+
+        // remove a total of 3 3-byte characters, and then add back in the 1-byte '#'
+        String result = ClassFileNameHandler.shortenPathComponent(sb.toString(), 6);
+        Assert.assertEquals(300, sb.toString().getBytes(UTF8).length);
+        Assert.assertEquals(292, result.getBytes(UTF8).length);
+        Assert.assertEquals(98, result.length());
+
+        // remove a total of 3 3-byte characters, and then add back in the 1-byte '#'
+        result = ClassFileNameHandler.shortenPathComponent(sb.toString(), 7);
+        Assert.assertEquals(300, sb.toString().getBytes(UTF8).length);
+        Assert.assertEquals(292, result.getBytes(UTF8).length);
+        Assert.assertEquals(98, result.length());
+    }
+
+    @Test
+    public void test4ByteEncodings() {
+        StringBuilder sb = new StringBuilder();
+        for (int i=0x10000; i<0x10000+100; i++) {
+            sb.appendCodePoint(i);
+        }
+
+        // we remove 3 codepoints == 6 characters == 12 bytes, and then add back in the 1-byte '#'
+        String result = ClassFileNameHandler.shortenPathComponent(sb.toString(), 8);
+        Assert.assertEquals(400, sb.toString().getBytes(UTF8).length);
+        Assert.assertEquals(389, result.getBytes(UTF8).length);
+        Assert.assertEquals(195, result.length());
+
+        // we remove 2 codepoints == 4 characters == 8 bytes, and then add back in the 1-byte '#'
+        result = ClassFileNameHandler.shortenPathComponent(sb.toString(), 7);
+        Assert.assertEquals(400, sb.toString().getBytes(UTF8).length);
+        Assert.assertEquals(393, result.getBytes(UTF8).length);
+        Assert.assertEquals(197, result.length());
+    }
+
+    @Test
+    public void testMultipleLongNames() {
+        String filenameFragment = Strings.repeat("a", 512);
+
+        File tempDir = Files.createTempDir();
+        ClassFileNameHandler handler = new ClassFileNameHandler(tempDir, ".smali");
+
+        // put the differentiating character in the middle, where it will get stripped out by the filename shortening
+        // logic
+        File file1 = handler.getUniqueFilenameForClass("La/a/" + filenameFragment  + "1" + filenameFragment + ";");
+        checkFilename(tempDir, file1, "a", "a", Strings.repeat("a", 124) + "#" + Strings.repeat("a", 118) + ".smali");
+
+        File file2 = handler.getUniqueFilenameForClass("La/a/" + filenameFragment + "2" + filenameFragment + ";");
+        checkFilename(tempDir, file2, "a", "a", Strings.repeat("a", 124) + "#" + Strings.repeat("a", 118) + ".1.smali");
+
+        Assert.assertFalse(file1.getAbsolutePath().equals(file2.getAbsolutePath()));
+    }
+
+    @Test
+    public void testBasicFunctionality() {
+        File tempDir = Files.createTempDir();
+        ClassFileNameHandler handler = new ClassFileNameHandler(tempDir, ".smali");
+
+        File file = handler.getUniqueFilenameForClass("La/b/c/d;");
+        checkFilename(tempDir, file, "a", "b", "c", "d.smali");
+
+        file = handler.getUniqueFilenameForClass("La/b/c/e;");
+        checkFilename(tempDir, file, "a", "b", "c", "e.smali");
+
+        file = handler.getUniqueFilenameForClass("La/b/d/d;");
+        checkFilename(tempDir, file, "a", "b", "d", "d.smali");
+
+        file = handler.getUniqueFilenameForClass("La/b;");
+        checkFilename(tempDir, file, "a", "b.smali");
+
+        file = handler.getUniqueFilenameForClass("Lb;");
+        checkFilename(tempDir, file, "b.smali");
+    }
+
+    @Test
+    public void testCaseInsensitiveFilesystem() {
+        File tempDir = Files.createTempDir();
+        ClassFileNameHandler handler = new ClassFileNameHandler(tempDir, ".smali", false, false);
+
+        File file = handler.getUniqueFilenameForClass("La/b/c;");
+        checkFilename(tempDir, file, "a", "b", "c.smali");
+
+        file = handler.getUniqueFilenameForClass("La/b/C;");
+        checkFilename(tempDir, file, "a", "b", "C.1.smali");
+
+        file = handler.getUniqueFilenameForClass("La/B/c;");
+        checkFilename(tempDir, file, "a", "B.1", "c.smali");
+    }
+
+    @Test
+    public void testCaseSensitiveFilesystem() {
+        File tempDir = Files.createTempDir();
+        ClassFileNameHandler handler = new ClassFileNameHandler(tempDir, ".smali", true, false);
+
+        File file = handler.getUniqueFilenameForClass("La/b/c;");
+        checkFilename(tempDir, file, "a", "b", "c.smali");
+
+        file = handler.getUniqueFilenameForClass("La/b/C;");
+        checkFilename(tempDir, file, "a", "b", "C.smali");
+
+        file = handler.getUniqueFilenameForClass("La/B/c;");
+        checkFilename(tempDir, file, "a", "B", "c.smali");
+    }
+
+    @Test
+    public void testWindowsReservedFilenames() {
+        File tempDir = Files.createTempDir();
+        ClassFileNameHandler handler = new ClassFileNameHandler(tempDir, ".smali", false, true);
+
+        File file = handler.getUniqueFilenameForClass("La/con/c;");
+        checkFilename(tempDir, file, "a", "con#", "c.smali");
+
+        file = handler.getUniqueFilenameForClass("La/Con/c;");
+        checkFilename(tempDir, file, "a", "Con#.1", "c.smali");
+
+        file = handler.getUniqueFilenameForClass("La/b/PRN;");
+        checkFilename(tempDir, file, "a", "b", "PRN#.smali");
+
+        file = handler.getUniqueFilenameForClass("La/b/prN;");
+        checkFilename(tempDir, file, "a", "b", "prN#.1.smali");
+
+        file = handler.getUniqueFilenameForClass("La/b/com0;");
+        checkFilename(tempDir, file, "a", "b", "com0.smali");
+
+        for (String reservedName: new String[] {"con", "prn", "aux", "nul", "com1", "com9", "lpt1", "lpt9"}) {
+            file = handler.getUniqueFilenameForClass("L" + reservedName + ";");
+            checkFilename(tempDir, file, reservedName +"#.smali");
+        }
+    }
+
+    @Test
+    public void testIgnoringWindowsReservedFilenames() {
+        File tempDir = Files.createTempDir();
+        ClassFileNameHandler handler = new ClassFileNameHandler(tempDir, ".smali", true, false);
+
+        File file = handler.getUniqueFilenameForClass("La/con/c;");
+        checkFilename(tempDir, file, "a", "con", "c.smali");
+
+        file = handler.getUniqueFilenameForClass("La/Con/c;");
+        checkFilename(tempDir, file, "a", "Con", "c.smali");
+
+        file = handler.getUniqueFilenameForClass("La/b/PRN;");
+        checkFilename(tempDir, file, "a", "b", "PRN.smali");
+
+        file = handler.getUniqueFilenameForClass("La/b/prN;");
+        checkFilename(tempDir, file, "a", "b", "prN.smali");
+
+        file = handler.getUniqueFilenameForClass("La/b/com0;");
+        checkFilename(tempDir, file, "a", "b", "com0.smali");
+
+        for (String reservedName: new String[] {"con", "prn", "aux", "nul", "com1", "com9", "lpt1", "lpt9"}) {
+            file = handler.getUniqueFilenameForClass("L" + reservedName + ";");
+            checkFilename(tempDir, file, reservedName +".smali");
+        }
+    }
+
+    private void checkFilename(File base, File file, String... elements) {
+        for (int i=elements.length-1; i>=0; i--) {
+            Assert.assertEquals(elements[i], file.getName());
+            file = file.getParentFile();
+        }
+        Assert.assertEquals(base.getAbsolutePath(), file.getAbsolutePath());
+    }
+}
diff --git a/util/src/test/java/org/jf/util/LinearSearchTest.java b/util/src/test/java/org/jf/util/LinearSearchTest.java
new file mode 100644
index 0000000..7622468
--- /dev/null
+++ b/util/src/test/java/org/jf/util/LinearSearchTest.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Ordering;
+import junit.framework.Assert;
+import org.junit.Test;
+
+import java.util.List;
+
+public class LinearSearchTest {
+    @Test
+    public void testLinearSearch() {
+        List<Integer> list = Lists.newArrayList(0, 1, 3, 4);
+
+        doTest(list, 5, 10);
+        doTest(list, 5, 4);
+        doTest(list, 5, 3);
+        doTest(list, 5, 2);
+        doTest(list, 5, 1);
+        doTest(list, 5, 0);
+
+        doTest(list, 4, 10);
+        doTest(list, 4, 4);
+        doTest(list, 4, 3);
+        doTest(list, 4, 2);
+        doTest(list, 4, 1);
+        doTest(list, 4, 0);
+
+        doTest(list, 3, 10);
+        doTest(list, 3, 4);
+        doTest(list, 3, 3);
+        doTest(list, 3, 2);
+        doTest(list, 3, 1);
+        doTest(list, 3, 0);
+
+        doTest(list, 2, 10);
+        doTest(list, 2, 4);
+        doTest(list, 2, 3);
+        doTest(list, 2, 2);
+        doTest(list, 2, 1);
+        doTest(list, 2, 0);
+
+        doTest(list, 1, 10);
+        doTest(list, 1, 4);
+        doTest(list, 1, 3);
+        doTest(list, 1, 2);
+        doTest(list, 1, 1);
+        doTest(list, 1, 0);
+
+        doTest(list, 0, 10);
+        doTest(list, 0, 4);
+        doTest(list, 0, 3);
+        doTest(list, 0, 2);
+        doTest(list, 0, 1);
+        doTest(list, 0, 0);
+
+        doTest(list, -1, 10);
+        doTest(list, -1, 4);
+        doTest(list, -1, 3);
+        doTest(list, -1, 2);
+        doTest(list, -1, 1);
+        doTest(list, -1, 0);
+    }
+
+    private void doTest(List<Integer> list, int key, int guess) {
+        int expectedIndex =  Ordering.natural().binarySearch(list, key);
+
+        Assert.assertEquals(expectedIndex, LinearSearch.linearSearch(list, Ordering.<Integer>natural(), key, guess));
+    }
+}
diff --git a/util/src/test/java/org/jf/util/PathUtilTest.java b/util/src/test/java/org/jf/util/PathUtilTest.java
new file mode 100644
index 0000000..cafc41f
--- /dev/null
+++ b/util/src/test/java/org/jf/util/PathUtilTest.java
@@ -0,0 +1,269 @@
+/*
+ * [The "BSD licence"]
+ * Copyright (c) 2010 Ben Gruver
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+import org.junit.*;
+
+import java.io.File;
+
+public class PathUtilTest {
+
+    @Test
+    public void pathUtilTest1() {
+        File[] roots = File.listRoots();
+
+        if (roots.length > 1) {
+            File basePath = new File(roots[0] + "some" + File.separatorChar + "dir" + File.separatorChar + "test.txt");
+            File relativePath = new File(roots[1] + "some" + File.separatorChar + "dir" + File.separatorChar + "test.txt");
+
+            String path = PathUtil.getRelativeFileInternal(basePath, relativePath);
+
+            Assert.assertEquals(path, relativePath.getPath());
+        }
+    }
+
+    @Test
+    public void pathUtilTest2() {
+        File[] roots = File.listRoots();
+
+        File basePath = new File(roots[0] + "some" + File.separatorChar + "dir" + File.separatorChar + "test.txt");
+        File relativePath = new File(roots[0] + "some" + File.separatorChar + "dir" + File.separatorChar + "test.txt");
+
+        String path = PathUtil.getRelativeFileInternal(basePath, relativePath);
+
+        /*the "internal" version of the method in PathUtil doesn't handle the case when the "leaf" of the base path
+        is a file, this is handled by the two public wrappers. Since we're not calling them, the correct return is
+        a single dot"*/
+        Assert.assertEquals(path, ".");
+    }
+
+    @Test
+    public void pathUtilTest3() {
+        File[] roots = File.listRoots();
+
+        File basePath = new File(roots[0] + "some" + File.separatorChar + "dir" + File.separatorChar);
+        File relativePath = new File(roots[0] + "some" + File.separatorChar + "dir" + File.separatorChar);
+
+        String path = PathUtil.getRelativeFileInternal(basePath, relativePath);
+
+        Assert.assertEquals(path, ".");
+    }
+
+    @Test
+    public void pathUtilTest4() {
+        File[] roots = File.listRoots();
+
+        File basePath = new File(roots[0] + "some" + File.separatorChar + "dir");
+        File relativePath = new File(roots[0] + "some" + File.separatorChar + "dir");
+
+        String path = PathUtil.getRelativeFileInternal(basePath, relativePath);
+
+        Assert.assertEquals(path, ".");
+    }
+
+    @Test
+    public void pathUtilTest5() {
+        File[] roots = File.listRoots();
+
+        File basePath = new File(roots[0] + "some" + File.separatorChar + "dir");
+        File relativePath = new File(roots[0] + "some" + File.separatorChar + "dir" + File.separatorChar);
+
+        String path = PathUtil.getRelativeFileInternal(basePath, relativePath);
+
+        Assert.assertEquals(path, ".");
+    }
+
+    @Test
+    public void pathUtilTest6() {
+        File[] roots = File.listRoots();
+
+        File basePath = new File(roots[0] + "some" + File.separatorChar + "dir" + File.separatorChar);
+        File relativePath = new File(roots[0] + "some" + File.separatorChar + "dir");
+
+        String path = PathUtil.getRelativeFileInternal(basePath, relativePath);
+
+        Assert.assertEquals(path, ".");
+    }
+
+    @Test
+    public void pathUtilTest7() {
+        File[] roots = File.listRoots();
+
+        File basePath = new File(roots[0] + "some");
+        File relativePath = new File(roots[0] + "some" + File.separatorChar + "dir");
+
+        String path = PathUtil.getRelativeFileInternal(basePath, relativePath);
+
+        Assert.assertEquals(path, "dir");
+    }
+
+    @Test
+    public void pathUtilTest8() {
+        File[] roots = File.listRoots();
+
+        File basePath = new File(roots[0] + "some" + File.separatorChar);
+        File relativePath = new File(roots[0] + "some" + File.separatorChar + "dir" + File.separatorChar);
+
+        String path = PathUtil.getRelativeFileInternal(basePath, relativePath);
+
+        Assert.assertEquals(path, "dir");
+    }
+
+    @Test
+    public void pathUtilTest9() {
+        File[] roots = File.listRoots();
+
+        File basePath = new File(roots[0] + "some");
+        File relativePath = new File(roots[0] + "some" + File.separatorChar + "dir" + File.separatorChar);
+
+        String path = PathUtil.getRelativeFileInternal(basePath, relativePath);
+
+        Assert.assertEquals(path, "dir");
+    }
+
+    @Test
+    public void pathUtilTest10() {
+        File[] roots = File.listRoots();
+
+        File basePath = new File(roots[0] + "some" + File.separatorChar);
+        File relativePath = new File(roots[0] + "some" + File.separatorChar + "dir");
+
+        String path = PathUtil.getRelativeFileInternal(basePath, relativePath);
+
+        Assert.assertEquals(path, "dir");
+    }
+
+    @Test
+    public void pathUtilTest11() {
+        File[] roots = File.listRoots();
+
+        File basePath = new File(roots[0] + "some");
+        File relativePath = new File(roots[0] + "some" + File.separatorChar + "dir" + File.separatorChar + "dir2");
+
+        String path = PathUtil.getRelativeFileInternal(basePath, relativePath);
+
+        Assert.assertEquals(path, "dir" + File.separatorChar + "dir2");
+    }
+
+    @Test
+    public void pathUtilTest12() {
+        File[] roots = File.listRoots();
+
+        File basePath = new File(roots[0] + "some" + File.separatorChar);
+        File relativePath = new File(roots[0] + "some" + File.separatorChar + "dir" + File.separatorChar + "dir2" + File.separatorChar);
+
+        String path = PathUtil.getRelativeFileInternal(basePath, relativePath);
+
+        Assert.assertEquals(path, "dir" + File.separatorChar + "dir2");
+    }
+
+    @Test
+    public void pathUtilTest13() {
+        File[] roots = File.listRoots();
+
+        File basePath = new File(roots[0] + "some");
+        File relativePath = new File(roots[0] + "some" + File.separatorChar + "dir" + File.separatorChar + "dir2" + File.separatorChar);
+
+        String path = PathUtil.getRelativeFileInternal(basePath, relativePath);
+
+        Assert.assertEquals(path, "dir" + File.separatorChar + "dir2");
+    }
+
+    @Test
+    public void pathUtilTest14() {
+        File[] roots = File.listRoots();
+
+        File basePath = new File(roots[0] + "some" + File.separatorChar);
+        File relativePath = new File(roots[0] + "some" + File.separatorChar + "dir" + File.separatorChar + "dir2");
+
+        String path = PathUtil.getRelativeFileInternal(basePath, relativePath);
+
+        Assert.assertEquals(path, "dir" + File.separatorChar + "dir2");
+    }
+
+    @Test
+    public void pathUtilTest15() {
+        File[] roots = File.listRoots();
+
+        File basePath = new File(roots[0] + "some" + File.separatorChar + "dir3");
+        File relativePath = new File(roots[0] + "some" + File.separatorChar + "dir" + File.separatorChar + "dir2");
+
+        String path = PathUtil.getRelativeFileInternal(basePath, relativePath);
+
+        Assert.assertEquals(path, ".." + File.separatorChar + "dir" + File.separatorChar + "dir2");
+    }
+
+    @Test
+    public void pathUtilTest16() {
+        File[] roots = File.listRoots();
+
+        File basePath = new File(roots[0] + "some2" + File.separatorChar + "dir3");
+        File relativePath = new File(roots[0] + "some" + File.separatorChar + "dir" + File.separatorChar + "dir2");
+
+        String path = PathUtil.getRelativeFileInternal(basePath, relativePath);
+
+        Assert.assertEquals(path, ".." + File.separatorChar + ".." + File.separatorChar + "some" + File.separatorChar + "dir" + File.separatorChar + "dir2");
+    }
+
+    @Test
+    public void pathUtilTest17() {
+        File[] roots = File.listRoots();
+
+        File basePath = new File(roots[0].getPath());
+        File relativePath = new File(roots[0] + "some" + File.separatorChar + "dir" + File.separatorChar + "dir2");
+
+        String path = PathUtil.getRelativeFileInternal(basePath, relativePath);
+
+        Assert.assertEquals(path, "some" + File.separatorChar + "dir" + File.separatorChar + "dir2");
+    }
+
+    @Test
+    public void pathUtilTest18() {
+        File[] roots = File.listRoots();
+
+        File basePath = new File(roots[0] + "some" + File.separatorChar + "dir");
+        File relativePath = new File(roots[0] + "some");
+
+        String path = PathUtil.getRelativeFileInternal(basePath, relativePath);
+
+        Assert.assertEquals(path, "..");
+    }
+
+    @Test
+    public void pathUtilTest19() {
+        File[] roots = File.listRoots();
+
+        File basePath = new File(roots[0] + "some" + File.separatorChar + "dir" + File.separatorChar + "dir2");
+        File relativePath = new File(roots[0] + "some");
+
+        String path = PathUtil.getRelativeFileInternal(basePath, relativePath);
+
+        Assert.assertEquals(path, ".." + File.separatorChar + "..");
+    }
+}